blob: c1779fca594a00ac6c8669d15fe94e2649c89c59 [file] [log] [blame]
{"version":3,"file":"workbox-range-requests.dev.js","sources":["../_version.mjs","../utils/calculateEffectiveBoundaries.mjs","../utils/parseRangeHeader.mjs","../createPartialResponse.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:range-requests:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {Blob} blob A source blob.\n * @param {number|null} start The offset to use as the start of the\n * slice.\n * @param {number|null} end The offset to use as the end of the slice.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the effective boundaries to use given the size of the blob.\n *\n * @private\n */\nfunction calculateEffectiveBoundaries(blob, start, end) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(blob, Blob, {\n moduleName: 'workbox-range-requests',\n funcName: 'calculateEffectiveBoundaries',\n paramName: 'blob',\n });\n }\n\n const blobSize = blob.size;\n\n if (end > blobSize || start < 0) {\n throw new WorkboxError('range-not-satisfiable', {\n size: blobSize,\n end,\n start,\n });\n }\n\n let effectiveStart;\n let effectiveEnd;\n\n if (start === null) {\n effectiveStart = blobSize - end;\n effectiveEnd = blobSize;\n } else if (end === null) {\n effectiveStart = start;\n effectiveEnd = blobSize;\n } else {\n effectiveStart = start;\n // Range values are inclusive, so add 1 to the value.\n effectiveEnd = end + 1;\n }\n\n return {\n start: effectiveStart,\n end: effectiveEnd,\n };\n}\n\nexport {calculateEffectiveBoundaries};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {string} rangeHeader A Range: header value.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the parsed value of the Range: header. If either the `start` or `end` are\n * omitted, then `null` will be returned.\n *\n * @private\n */\nfunction parseRangeHeader(rangeHeader) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(rangeHeader, 'string', {\n moduleName: 'workbox-range-requests',\n funcName: 'parseRangeHeader',\n paramName: 'rangeHeader',\n });\n }\n\n const normalizedRangeHeader = rangeHeader.trim().toLowerCase();\n if (!normalizedRangeHeader.startsWith('bytes=')) {\n throw new WorkboxError('unit-must-be-bytes', {normalizedRangeHeader});\n }\n\n // Specifying multiple ranges separate by commas is valid syntax, but this\n // library only attempts to handle a single, contiguous sequence of bytes.\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax\n if (normalizedRangeHeader.includes(',')) {\n throw new WorkboxError('single-range-only', {normalizedRangeHeader});\n }\n\n const rangeParts = /(\\d*)-(\\d*)/.exec(normalizedRangeHeader);\n // We need either at least one of the start or end values.\n if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) {\n throw new WorkboxError('invalid-range-values', {normalizedRangeHeader});\n }\n\n return {\n start: rangeParts[1] === '' ? null : Number(rangeParts[1]),\n end: rangeParts[2] === '' ? null : Number(rangeParts[2]),\n };\n}\n\nexport {parseRangeHeader};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {calculateEffectiveBoundaries} from\n './utils/calculateEffectiveBoundaries.mjs';\nimport {parseRangeHeader} from './utils/parseRangeHeader.mjs';\n\nimport './_version.mjs';\n\n/**\n * Given a `Request` and `Response` objects as input, this will return a\n * promise for a new `Response`.\n *\n * If the original `Response` already contains partial content (i.e. it has\n * a status of 206), then this assumes it already fulfills the `Range:`\n * requirements, and will return it as-is.\n *\n * @param {Request} request A request, which should contain a Range:\n * header.\n * @param {Response} originalResponse A response.\n * @return {Promise<Response>} Either a `206 Partial Content` response, with\n * the response body set to the slice of content specified by the request's\n * `Range:` header, or a `416 Range Not Satisfiable` response if the\n * conditions of the `Range:` header can't be met.\n *\n * @memberof workbox.rangeRequests\n */\nasync function createPartialResponse(request, originalResponse) {\n try {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'request',\n });\n\n assert.isInstance(originalResponse, Response, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'originalResponse',\n });\n }\n\n if (originalResponse.status === 206) {\n // If we already have a 206, then just pass it through as-is;\n // see https://github.com/GoogleChrome/workbox/issues/1720\n return originalResponse;\n }\n\n const rangeHeader = request.headers.get('range');\n if (!rangeHeader) {\n throw new WorkboxError('no-range-header');\n }\n\n const boundaries = parseRangeHeader(rangeHeader);\n const originalBlob = await originalResponse.blob();\n\n const effectiveBoundaries = calculateEffectiveBoundaries(\n originalBlob, boundaries.start, boundaries.end);\n\n const slicedBlob = originalBlob.slice(effectiveBoundaries.start,\n effectiveBoundaries.end);\n const slicedBlobSize = slicedBlob.size;\n\n const slicedResponse = new Response(slicedBlob, {\n // Status code 206 is for a Partial Content response.\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206\n status: 206,\n statusText: 'Partial Content',\n headers: originalResponse.headers,\n });\n\n slicedResponse.headers.set('Content-Length', slicedBlobSize);\n slicedResponse.headers.set('Content-Range',\n `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` +\n originalBlob.size);\n\n return slicedResponse;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to construct a partial response; returning a ` +\n `416 Range Not Satisfiable response instead.`);\n logger.groupCollapsed(`View details here.`);\n logger.log(error);\n logger.log(request);\n logger.log(originalResponse);\n logger.groupEnd();\n }\n\n return new Response('', {\n status: 416,\n statusText: 'Range Not Satisfiable',\n });\n }\n}\n\nexport {createPartialResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createPartialResponse} from './createPartialResponse.mjs';\n\nimport './_version.mjs';\n\n/**\n * The range request plugin makes it easy for a request with a 'Range' header to\n * be fulfilled by a cached response.\n *\n * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback\n * and returning the appropriate subset of the cached response body.\n *\n * @memberof workbox.rangeRequests\n */\nclass Plugin {\n /**\n * @param {Object} options\n * @param {Request} options.request The original request, which may or may not\n * contain a Range: header.\n * @param {Response} options.cachedResponse The complete cached response.\n * @return {Promise<Response>} If request contains a 'Range' header, then a\n * new response with status 206 whose body is a subset of `cachedResponse` is\n * returned. Otherwise, `cachedResponse` is returned as-is.\n *\n * @private\n */\n async cachedResponseWillBeUsed({request, cachedResponse}) {\n // Only return a sliced response if there's something valid in the cache,\n // and there's a Range: header in the request.\n if (cachedResponse && request.headers.has('range')) {\n return await createPartialResponse(request, cachedResponse);\n }\n\n // If there was no Range: header, or if cachedResponse wasn't valid, just\n // pass it through as-is.\n return cachedResponse;\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createPartialResponse} from './createPartialResponse.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.rangeRequests\n */\n\nexport {\n createPartialResponse,\n Plugin,\n};\n"],"names":["self","_","e","calculateEffectiveBoundaries","blob","start","end","assert","isInstance","Blob","moduleName","funcName","paramName","blobSize","size","WorkboxError","effectiveStart","effectiveEnd","parseRangeHeader","rangeHeader","isType","normalizedRangeHeader","trim","toLowerCase","startsWith","includes","rangeParts","exec","Number","createPartialResponse","request","originalResponse","Request","Response","status","headers","get","boundaries","originalBlob","effectiveBoundaries","slicedBlob","slice","slicedBlobSize","slicedResponse","statusText","set","error","logger","warn","groupCollapsed","log","groupEnd","Plugin","cachedResponseWillBeUsed","cachedResponse","has"],"mappings":"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"}