From bf821cad1d1a517e09124a8850f760172379efb9 Mon Sep 17 00:00:00 2001 From: DrSky Date: Fri, 21 Mar 2025 03:10:19 +0800 Subject: [PATCH 1/2] feat: for customize transforming the segment response data Because the 'response' and 'responseText' property from XMLHttpRequest is readonly, add two customize read-write property: videojsCustomizedResponse,videojsCustomizedResponseText to request object. So can customize transform the response data through videojs.Vhs.xhr.onResponse. eg: request.videojsCustomizedResponse=newResponseData --- src/media-segment-request.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/media-segment-request.js b/src/media-segment-request.js index d5f405eb8..819a2bde5 100644 --- a/src/media-segment-request.js +++ b/src/media-segment-request.js @@ -317,15 +317,23 @@ const handleSegmentResponse = ({ return finishProcessingFn(errorObj, segment); } triggerSegmentEventFn({ type: 'segmentloaded', segment }); + + // because the 'response' and 'responseText' property from XMLHttpRequest is readonly, + // add two customize read-write property: videojsCustomizedResponse,videojsCustomizedResponseText to request object. + let destResponse = request.videojsCustomizedResponse ? request.videojsCustomizedResponse : request.response; + // 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' + let destResponseText = request.videojsCustomizedResponseText ? request.videojsCustomizedResponseText : + (responseType === '' || responseType === 'text' ? request.responseText : null); + const newBytes = // although responseText "should" exist, this guard serves to prevent an error being // thrown for two primary cases: // 1. the mime type override stops working, or is not implemented for a specific // browser // 2. when using mock XHR libraries like sinon that do not allow the override behavior - (responseType === 'arraybuffer' || !request.responseText) ? - request.response : - stringToArrayBuffer(request.responseText.substring(segment.lastReachedChar || 0)); + (responseType === 'arraybuffer' || !destResponseText) ? + destResponse : + stringToArrayBuffer(destResponseText.substring(segment.lastReachedChar || 0)); segment.stats = getRequestStats(request); From b7740b1b6523c591fe29aa1dc9162a0a14f9a840 Mon Sep 17 00:00:00 2001 From: DrSky Date: Fri, 21 Mar 2025 03:58:41 +0800 Subject: [PATCH 2/2] Simplify customization segment response logic --- src/media-segment-request.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/media-segment-request.js b/src/media-segment-request.js index 819a2bde5..0eaf7b64c 100644 --- a/src/media-segment-request.js +++ b/src/media-segment-request.js @@ -318,22 +318,21 @@ const handleSegmentResponse = ({ } triggerSegmentEventFn({ type: 'segmentloaded', segment }); - // because the 'response' and 'responseText' property from XMLHttpRequest is readonly, - // add two customize read-write property: videojsCustomizedResponse,videojsCustomizedResponseText to request object. - let destResponse = request.videojsCustomizedResponse ? request.videojsCustomizedResponse : request.response; - // 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' - let destResponseText = request.videojsCustomizedResponseText ? request.videojsCustomizedResponseText : - (responseType === '' || responseType === 'text' ? request.responseText : null); - - const newBytes = + let newBytes; + // because the 'response' property from XMLHttpRequest is readonly, + // can add customize read-write 'videojsCustomizedResponse' property to request object via the onResponse method. + if (('videojsCustomizedResponse' in request) && request.videojsCustomizedResponse) { + newBytes = request.videojsCustomizedResponse; + } else { // although responseText "should" exist, this guard serves to prevent an error being // thrown for two primary cases: // 1. the mime type override stops working, or is not implemented for a specific // browser // 2. when using mock XHR libraries like sinon that do not allow the override behavior - (responseType === 'arraybuffer' || !destResponseText) ? - destResponse : - stringToArrayBuffer(destResponseText.substring(segment.lastReachedChar || 0)); + newBytes = (responseType === 'arraybuffer' || !request.responseText) ? + request.response : + stringToArrayBuffer(request.responseText.substring(segment.lastReachedChar || 0)); + } segment.stats = getRequestStats(request);