diff --git a/build-config.js b/build-config.js index e05023173..a86ce3212 100644 --- a/build-config.js +++ b/build-config.js @@ -10,7 +10,7 @@ const istanbul = require('rollup-plugin-istanbul'); const fs = require('fs'); const pkgJson = JSON.parse( - fs.readFileSync('./package.json', { encoding: 'utf-8' }) + fs.readFileSync('./package.json', { encoding: 'utf-8' }), ); const BUILD_TYPE = { @@ -53,24 +53,24 @@ const buildConstants = (type, additional = {}) => ({ values: { __VERSION__: JSON.stringify(pkgJson.version), __USE_SUBTITLES__: JSON.stringify( - type === BUILD_TYPE.full || addSubtitleSupport + type === BUILD_TYPE.full || addSubtitleSupport, ), __USE_ALT_AUDIO__: JSON.stringify( - type === BUILD_TYPE.full || addAltAudioSupport + type === BUILD_TYPE.full || addAltAudioSupport, ), __USE_EME_DRM__: JSON.stringify(type === BUILD_TYPE.full || addEMESupport), __USE_CMCD__: JSON.stringify(type === BUILD_TYPE.full || addCMCDSupport), __USE_CONTENT_STEERING__: JSON.stringify( - type === BUILD_TYPE.full || addContentSteeringSupport + type === BUILD_TYPE.full || addContentSteeringSupport, ), __USE_VARIABLE_SUBSTITUTION__: JSON.stringify( - type === BUILD_TYPE.full || addVariableSubstitutionSupport + type === BUILD_TYPE.full || addVariableSubstitutionSupport, ), __USE_M2TS_ADVANCED_CODECS__: JSON.stringify( - type === BUILD_TYPE.full || addM2TSAdvancedCodecSupport + type === BUILD_TYPE.full || addM2TSAdvancedCodecSupport, ), __USE_MEDIA_CAPABILITIES__: JSON.stringify( - type === BUILD_TYPE.full || addMediaCapabilitiesSupport + type === BUILD_TYPE.full || addMediaCapabilitiesSupport, ), ...additional, @@ -132,7 +132,7 @@ const babelTsWithPresetEnvTargets = ({ targets, stripConsole }) => espath.node.callee = importHelper.addNamed( espath, 'isFiniteNumber', - path.resolve('src/polyfills/number') + path.resolve('src/polyfills/number'), ); } else if ( espath.get('callee').matchesPattern('Number.MAX_SAFE_INTEGER') @@ -140,7 +140,7 @@ const babelTsWithPresetEnvTargets = ({ targets, stripConsole }) => espath.node.callee = importHelper.addNamed( espath, 'MAX_SAFE_INTEGER', - path.resolve('src/polyfills/number') + path.resolve('src/polyfills/number'), ); } }, @@ -344,7 +344,7 @@ const configs = Object.entries({ replace( buildConstants(BUILD_TYPE.full, { __IN_WORKER__: JSON.stringify(true), - }) + }), ), buildBabelLegacyBrowsers({ stripConsole: true }), terser(), @@ -377,7 +377,7 @@ const configs = Object.entries({ branch: env.CF_PAGES_BRANCH, commitRef: env.CF_PAGES_COMMIT_SHA, } - : null + : null, ), }, }), diff --git a/demo/benchmark.html b/demo/benchmark.html index 28952bcdb..4add8e2d5 100644 --- a/demo/benchmark.html +++ b/demo/benchmark.html @@ -1,4 +1,4 @@ - + diff --git a/demo/index-light.html b/demo/index-light.html index b89a6c741..478e8d861 100644 --- a/demo/index-light.html +++ b/demo/index-light.html @@ -1,4 +1,4 @@ - + diff --git a/demo/index.html b/demo/index.html index 8c9f30f03..4d1fe6a23 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1,4 +1,4 @@ - + diff --git a/demo/metrics.html b/demo/metrics.html index 0e2e8c6d2..d6f0e3cac 100644 --- a/demo/metrics.html +++ b/demo/metrics.html @@ -1,4 +1,4 @@ - + hls.js metrics page diff --git a/docs/API.md b/docs/API.md index b3afd1001..ed0d49cc3 100644 --- a/docs/API.md +++ b/docs/API.md @@ -235,7 +235,7 @@ You need to provide manifest URL as below: }); hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) { console.log( - 'manifest loaded, found ' + data.levels.length + ' quality level' + 'manifest loaded, found ' + data.levels.length + ' quality level', ); }); hls.loadSource('http://my.streamURL.com/playlist.m3u8'); diff --git a/lint-staged.config.js b/lint-staged.config.js index 52cd22e99..e4136a0c6 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,17 +1,19 @@ const micromatch = require('micromatch'); const prettier = require('prettier'); -const prettierSupportedExtensions = prettier - .getSupportInfo() - .languages.map(({ extensions }) => extensions) - .flat(); const addQuotes = (a) => `"${a}"`; -module.exports = (allStagedFiles) => { +module.exports = async (allStagedFiles) => { + const prettierSupportedExtensions = ( + await prettier.getSupportInfo() + ).languages + .map(({ extensions }) => extensions) + .flat(); + const eslintFiles = micromatch(allStagedFiles, '**/*.{js,ts}'); const prettierFiles = micromatch( allStagedFiles, - prettierSupportedExtensions.map((extension) => `**/*${extension}`) + prettierSupportedExtensions.map((extension) => `**/*${extension}`), ); return [ diff --git a/package-lock.json b/package-lock.json index f20bf0228..a1e674279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,7 @@ "mocha": "10.2.0", "node-fetch": "3.3.2", "npm-run-all": "4.1.5", - "prettier": "2.8.8", + "prettier": "3.0.1", "promise-polyfill": "8.3.0", "rollup": "3.28.0", "rollup-plugin-istanbul": "4.0.0", @@ -10275,15 +10275,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -20680,9 +20680,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true }, "printable-characters": { diff --git a/package.json b/package.json index cae53f9fb..eabf7b50a 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "mocha": "10.2.0", "node-fetch": "3.3.2", "npm-run-all": "4.1.5", - "prettier": "2.8.8", + "prettier": "3.0.1", "promise-polyfill": "8.3.0", "rollup": "3.28.0", "rollup-plugin-istanbul": "4.0.0", diff --git a/rollup.config.js b/rollup.config.js index 035f319df..717245ac3 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -13,20 +13,20 @@ module.exports = ({ configType = [] }) => { } else { // Filter out enabled configs const enabledEntries = configs.filter(([name]) => - requestedConfigs.includes(name) + requestedConfigs.includes(name), ); if (!enabledEntries.length) { throw new Error( `Couldn't find a valid config with the names ${JSON.stringify( - requestedConfigs - )}. Known configs are: ${configs.map(([name]) => name).join(', ')}` + requestedConfigs, + )}. Known configs are: ${configs.map(([name]) => name).join(', ')}`, ); } configEntries = enabledEntries; } console.log( - `Building configs: ${configEntries.map(([name]) => name).join(', ')}.\n` + `Building configs: ${configEntries.map(([name]) => name).join(', ')}.\n`, ); return configEntries.map(([, config]) => config); }; diff --git a/scripts/check-already-published.js b/scripts/check-already-published.js index 2cc8e4ef5..0df8cff12 100755 --- a/scripts/check-already-published.js +++ b/scripts/check-already-published.js @@ -24,8 +24,8 @@ async function versionPublished() { //https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md const response = await fetch( `https://registry.npmjs.org/${encodeURIComponent( - packageJson.name - )}/${encodeURIComponent(packageJson.version)}` + packageJson.name, + )}/${encodeURIComponent(packageJson.version)}`, ); if (response.status === 200) { return true; diff --git a/scripts/get-package-version.js b/scripts/get-package-version.js index 4671f0c7c..5216741ab 100755 --- a/scripts/get-package-version.js +++ b/scripts/get-package-version.js @@ -23,7 +23,7 @@ try { // 1.2.3-0.caaanary.custom => bad // 1.2.3-0.caaanary.custom.0.canary.503 => now lower than 1.2.3-0.canary.501 throw new Error( - `It's possible that "${newVersion}" has a lower precedense than an existing canary version which is not allowed.` + `It's possible that "${newVersion}" has a lower precedense than an existing canary version which is not allowed.`, ); } } else { @@ -44,7 +44,7 @@ try { const suffix = process.env.CF_PAGES ? `pr.${process.env.CF_PAGES_BRANCH.replace( /[^a-zA-Z-]/g, - '-' + '-', )}.${getCommitHash().slice(0, 8)}` : `0.canary.${getCommitNum()}`; @@ -53,18 +53,18 @@ try { if (!versionParser.isGreaterOrEqual(newVersion, latestVersion)) { throw new Error( - `New version "${newVersion}" is not >= latest version "${latestVersion}" on this branch.` + `New version "${newVersion}" is not >= latest version "${latestVersion}" on this branch.`, ); } const foundPreviousVersion = versionParser .getPotentialPreviousStableVersions(`v${newVersion}`) .every((potentialPreviousVersion) => - hasTag(`v${potentialPreviousVersion}`) + hasTag(`v${potentialPreviousVersion}`), ); if (!foundPreviousVersion) { throw new Error( - 'Could not find a previous version. The tag must follow a previous stable version number.' + 'Could not find a previous version. The tag must follow a previous stable version number.', ); } diff --git a/src/config.ts b/src/config.ts index a02802dc9..c2c13915a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -84,7 +84,7 @@ export type DRMSystemConfiguration = { this: Hls, initDataType: string, initData: ArrayBuffer | null, - keyContext: MediaKeySessionContext + keyContext: MediaKeySessionContext, ) => | { initDataType: string; initData: ArrayBuffer | null } | undefined @@ -101,13 +101,13 @@ export type EMEControllerConfig = { xhr: XMLHttpRequest, url: string, keyContext: MediaKeySessionContext, - licenseChallenge: Uint8Array + licenseChallenge: Uint8Array, ) => void | Uint8Array | Promise; licenseResponseCallback?: ( this: Hls, xhr: XMLHttpRequest, url: string, - keyContext: MediaKeySessionContext + keyContext: MediaKeySessionContext, ) => ArrayBuffer; emeEnabled: boolean; widevineLicenseUrl?: string; @@ -532,7 +532,7 @@ function timelineConfig(): TimelineControllerConfig { */ export function mergeConfig( defaultConfig: HlsConfig, - userConfig: Partial + userConfig: Partial, ): HlsConfig { if ( (userConfig.liveSyncDurationCount || @@ -540,7 +540,7 @@ export function mergeConfig( (userConfig.liveSyncDuration || userConfig.liveMaxLatencyDuration) ) { throw new Error( - "Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration" + "Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration", ); } @@ -551,7 +551,7 @@ export function mergeConfig( userConfig.liveSyncDurationCount) ) { throw new Error( - 'Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"' + 'Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"', ); } @@ -561,7 +561,7 @@ export function mergeConfig( userConfig.liveMaxLatencyDuration <= userConfig.liveSyncDuration) ) { throw new Error( - 'Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"' + 'Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"', ); } @@ -609,10 +609,10 @@ export function mergeConfig( if (report.length) { logger.warn( `hls.js config: "${report.join( - '", "' + '", "', )}" setting(s) are deprecated, use "${policyName}": ${JSON.stringify( - userConfig[policyName] - )}` + userConfig[policyName], + )}`, ); } }); @@ -644,7 +644,7 @@ export function enableStreamingMode(config) { if (currentLoader !== FetchLoader && currentLoader !== XhrLoader) { // If a developer has configured their own loader, respect that choice logger.log( - '[config]: Custom loader detected, cannot enable progressive streaming' + '[config]: Custom loader detected, cannot enable progressive streaming', ); config.progressive = false; } else { diff --git a/src/controller/abr-controller.ts b/src/controller/abr-controller.ts index 3797e3cde..90f19ca53 100644 --- a/src/controller/abr-controller.ts +++ b/src/controller/abr-controller.ts @@ -65,7 +65,7 @@ class AbrController implements AbrComponentAPI { return new EwmaBandWidthEstimator( config.abrEwmaSlowVoD, config.abrEwmaFastVoD, - config.abrEwmaDefaultEstimate + config.abrEwmaDefaultEstimate, ); } @@ -106,7 +106,7 @@ class AbrController implements AbrComponentAPI { protected onManifestLoading( event: Events.MANIFEST_LOADING, - data: ManifestLoadingData + data: ManifestLoadingData, ) { this.lastLoadedFragLevel = -1; this.lastLevelLoadSec = 0; @@ -140,7 +140,7 @@ class AbrController implements AbrComponentAPI { protected onLevelSwitching( event: Events.LEVEL_SWITCHING, - data: LevelSwitchingData + data: LevelSwitchingData, ): void { this.clearTimer(); } @@ -161,7 +161,7 @@ class AbrController implements AbrComponentAPI { timeToFirstByteSec: number, bandwidth: number, fragSizeBits: number, - isSwitch: boolean + isSwitch: boolean, ): number { const fragLoadSec = timeToFirstByteSec + fragSizeBits / bandwidth; const playlistLoadSec = isSwitch ? this.lastLevelLoadSec : 0; @@ -284,7 +284,7 @@ class AbrController implements AbrComponentAPI { ttfbEstimate / 1000, bwe, duration * levelNextBitrate, - !levels[nextLoadLevel].details + !levels[nextLoadLevel].details, ); if (fragLevelNextLoadedDelay < bufferStarvationDelay) { break; @@ -305,7 +305,7 @@ class AbrController implements AbrComponentAPI { // If there has been loading progress, sample bandwidth using loading time offset by minimum TTFB time this.bwEstimator.sample( timeLoading - Math.min(ttfbEstimate, ttfb), - stats.loaded + stats.loaded, ); } else { // If there has been no loading progress, sample TTFB @@ -319,7 +319,7 @@ class AbrController implements AbrComponentAPI { Time to underbuffer: ${bufferStarvationDelay.toFixed(3)} s Estimated load time for current fragment: ${fragLoadedDelay.toFixed(3)} s Estimated load time for down switch fragment: ${fragLevelNextLoadedDelay.toFixed( - 3 + 3, )} s TTFB estimate: ${ttfb} Current BW estimate: ${ @@ -336,7 +336,7 @@ class AbrController implements AbrComponentAPI { protected onFragLoaded( event: Events.FRAG_LOADED, - { frag, part }: FragLoadedData + { frag, part }: FragLoadedData, ) { const stats = part ? part.stats : frag.stats; if (frag.type === PlaylistLevelType.MAIN) { @@ -378,7 +378,7 @@ class AbrController implements AbrComponentAPI { protected onFragBuffered( event: Events.FRAG_BUFFERED, - data: FragBufferedData + data: FragBufferedData, ) { const { frag, part } = data; const stats = part?.stats.loaded ? part.stats : frag.stats; @@ -397,7 +397,7 @@ class AbrController implements AbrComponentAPI { stats.loading.start - Math.min( stats.loading.first - stats.loading.start, - this.bwEstimator.getEstimateTTFB() + this.bwEstimator.getEstimateTTFB(), ); this.bwEstimator.sample(processingMs, stats.loaded); stats.bwEstimate = this.getBwEstimate(); @@ -430,7 +430,7 @@ class AbrController implements AbrComponentAPI { 0, maxStartDelay, 1, - 1 + 1, ); if (abrAutoLevel > -1) { return abrAutoLevel; @@ -438,7 +438,7 @@ class AbrController implements AbrComponentAPI { const firstLevel = this.hls.firstLevel; const clamped = Math.min(Math.max(firstLevel, minAutoLevel), maxAutoLevel); logger.warn( - `[abr] Could not find best starting auto level. Defaulting to first in playlist ${firstLevel} clamped to ${clamped}` + `[abr] Could not find best starting auto level. Defaulting to first in playlist ${firstLevel} clamped to ${clamped}`, ); return clamped; } @@ -529,7 +529,7 @@ class AbrController implements AbrComponentAPI { bufferStarvationDelay, 0, bwFactor, - bwUpFactor + bwUpFactor, ); if (bestLevel >= 0) { return bestLevel; @@ -555,10 +555,10 @@ class AbrController implements AbrComponentAPI { maxStarvationDelay = maxLoadingDelay - bitrateTestDelay; logger.info( `[abr] bitrate test took ${Math.round( - 1000 * bitrateTestDelay + 1000 * bitrateTestDelay, )}ms, set first fragment max fetchDuration to ${Math.round( - 1000 * maxStarvationDelay - )} ms` + 1000 * maxStarvationDelay, + )} ms`, ); // don't use conservative factor on bitrate test bwFactor = bwUpFactor = 1; @@ -571,12 +571,12 @@ class AbrController implements AbrComponentAPI { bufferStarvationDelay, maxStarvationDelay, bwFactor, - bwUpFactor + bwUpFactor, ); logger.info( `[abr] ${ bufferStarvationDelay ? 'rebuffering expected' : 'buffer is empty' - }, optimal quality level ${bestLevel}` + }, optimal quality level ${bestLevel}`, ); if (bestLevel > -1) { return bestLevel; @@ -604,7 +604,7 @@ class AbrController implements AbrComponentAPI { bufferStarvationDelay: number, maxStarvationDelay: number, bwFactor: number, - bwUpFactor: number + bwUpFactor: number, ): number { const maxFetchDuration: number = bufferStarvationDelay + maxStarvationDelay; const lastLoadedFragLevel = this.lastLoadedFragLevel; @@ -628,7 +628,7 @@ class AbrController implements AbrComponentAPI { levels, audioTracksByGroup, minAutoLevel, - maxAutoLevel + maxAutoLevel, )); const { codecSet, videoRange, minFramerate, minBitrate } = getStartCodecTier(codecTiers, currentVideoRange, currentBw); @@ -669,13 +669,13 @@ class AbrController implements AbrComponentAPI { mediaCapabilities, currentVideoRange, currentFrameRate, - currentBw + currentBw, ) ) { levelInfo.supportedPromise = getMediaDecodingInfoPromise( levelInfo, audioTracksByGroup, - mediaCapabilities + mediaCapabilities, ); levelInfo.supportedPromise.then((decodingInfo) => { levelInfo.supportedResult = decodingInfo; @@ -683,13 +683,13 @@ class AbrController implements AbrComponentAPI { logger.warn( `[abr] MediaCapabilities decodingInfo error: "${ decodingInfo.error - }" for level ${i} ${JSON.stringify(decodingInfo)}` + }" for level ${i} ${JSON.stringify(decodingInfo)}`, ); } else if (!decodingInfo.supported) { logger.warn( `[abr] Removing unsupported level ${i} after MediaCapabilities decodingInfo check failed ${JSON.stringify( - decodingInfo - )}` + decodingInfo, + )}`, ); if (i > 0) { this.hls.removeLevel(i); @@ -746,7 +746,7 @@ class AbrController implements AbrComponentAPI { ttfbEstimateSec, adjustedbw, bitrate * avgDuration, - levelDetails === undefined + levelDetails === undefined, ); const canSwitchWithinTolerance = @@ -767,28 +767,28 @@ class AbrController implements AbrComponentAPI { if (levelsSkipped.length) { logger.trace( `[abr] Skipped level(s) ${levelsSkipped.join( - ',' + ',', )} of ${maxAutoLevel} max with CODECS and VIDEO-RANGE:"${ levels[levelsSkipped[0]].codecs }" ${levels[levelsSkipped[0]].videoRange}; not compatible with "${ level.codecs - }" ${currentVideoRange}` + }" ${currentVideoRange}`, ); } logger.info( `[abr] switch candidate:${selectionBaseLevel}->${i} adjustedbw(${Math.round( - adjustedbw + adjustedbw, )})-bitrate=${Math.round( - adjustedbw - bitrate + adjustedbw - bitrate, )} ttfb:${ttfbEstimateSec.toFixed( - 1 + 1, )} avgDuration:${avgDuration.toFixed( - 1 + 1, )} maxFetchDuration:${maxFetchDuration.toFixed( - 1 + 1, )} fetchDuration:${fetchDuration.toFixed( - 1 - )} firstSelection:${firstSelection} codecSet:${currentCodecSet} videoRange:${currentVideoRange} hls.loadLevel:${loadLevel}` + 1, + )} firstSelection:${firstSelection} codecSet:${currentCodecSet} videoRange:${currentVideoRange} hls.loadLevel:${loadLevel}`, ); } // as we are looping from highest to lowest, this will return the best achievable quality level diff --git a/src/controller/audio-stream-controller.ts b/src/controller/audio-stream-controller.ts index 3c40a8023..f65e8c6b9 100644 --- a/src/controller/audio-stream-controller.ts +++ b/src/controller/audio-stream-controller.ts @@ -62,14 +62,14 @@ class AudioStreamController constructor( hls: Hls, fragmentTracker: FragmentTracker, - keyLoader: KeyLoader + keyLoader: KeyLoader, ) { super( hls, fragmentTracker, keyLoader, '[audio-stream-controller]', - PlaylistLevelType.AUDIO + PlaylistLevelType.AUDIO, ); this._registerListeners(); } @@ -118,7 +118,7 @@ class AudioStreamController // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value onInitPtsFound( event: Events.INIT_PTS_FOUND, - { frag, id, initPTS, timescale }: InitPTSFoundData + { frag, id, initPTS, timescale }: InitPTSFoundData, ) { // Always update the new INIT PTS // Can change due level switch @@ -146,8 +146,8 @@ class AudioStreamController if (lastCurrentTime > 0 && startPosition === -1) { this.log( `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed( - 3 - )}` + 3, + )}`, ); startPosition = lastCurrentTime; this.state = State.IDLE; @@ -213,7 +213,7 @@ class AudioStreamController } else if (this.videoTrackCC !== this.waitingVideoCC) { // Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found this.log( - `Waiting fragment cc (${frag.cc}) cancelled because video is at cc ${this.videoTrackCC}` + `Waiting fragment cc (${frag.cc}) cancelled because video is at cc ${this.videoTrackCC}`, ); this.clearWaitingFragment(); } else { @@ -222,16 +222,16 @@ class AudioStreamController const bufferInfo = BufferHelper.bufferInfo( this.mediaBuffer, pos, - this.config.maxBufferHole + this.config.maxBufferHole, ); const waitingFragmentAtPosition = fragmentWithinToleranceTest( bufferInfo.end, this.config.maxFragLookUpTolerance, - frag + frag, ); if (waitingFragmentAtPosition < 0) { this.log( - `Waiting fragment cc (${frag.cc}) @ ${frag.start} cancelled because another fragment at ${bufferInfo.end} is needed` + `Waiting fragment cc (${frag.cc}) @ ${frag.start} cancelled because another fragment at ${bufferInfo.end} is needed`, ); this.clearWaitingFragment(); } @@ -304,13 +304,13 @@ class AudioStreamController this.afterBufferFlushed( bufferable, ElementaryStreamTypes.AUDIO, - PlaylistLevelType.AUDIO + PlaylistLevelType.AUDIO, ); } const bufferInfo = this.getFwdBufferInfo( bufferable, - PlaylistLevelType.AUDIO + PlaylistLevelType.AUDIO, ); if (bufferInfo === null) { return; @@ -325,7 +325,7 @@ class AudioStreamController const mainBufferInfo = this.getFwdBufferInfo( this.videoBuffer ? this.videoBuffer : this.media, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); const bufferLen = bufferInfo.len; const maxBufLen = this.getMaxBufferLength(mainBufferInfo?.len); @@ -344,7 +344,7 @@ class AudioStreamController // if everything is buffered from pos to start or if audio buffer upfront, let's seek to start if (bufferInfo.end > start || bufferInfo.nextStart) { this.log( - 'Alt audio track ahead of main track, seek to start of alt audio track' + 'Alt audio track ahead of main track, seek to start of alt audio track', ); media.currentTime = start + 0.05; } @@ -370,7 +370,7 @@ class AudioStreamController trackDetails, bufferInfo, PlaylistLevelType.MAIN, - maxBufLen + maxBufLen, ); } if (!frag) { @@ -413,7 +413,7 @@ class AudioStreamController } return Math.min( Math.max(maxConfigBuffer, mainBufferLength), - this.config.maxMaxBufferLength + this.config.maxMaxBufferLength, ); } @@ -424,7 +424,7 @@ class AudioStreamController onAudioTracksUpdated( event: Events.AUDIO_TRACKS_UPDATED, - { audioTracks }: AudioTracksUpdatedData + { audioTracks }: AudioTracksUpdatedData, ) { this.resetTransmuxer(); this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist)); @@ -432,7 +432,7 @@ class AudioStreamController onAudioTrackSwitching( event: Events.AUDIO_TRACK_SWITCHING, - data: AudioTrackSwitchingData + data: AudioTrackSwitchingData, ) { // if any URL found on new audio track, it is an alternate audio track const altAudio = !!data.url; @@ -505,7 +505,7 @@ class AudioStreamController newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : '' - },duration:${newDetails.totalduration}` + },duration:${newDetails.totalduration}`, ); const track = levels[trackId]; @@ -555,7 +555,7 @@ class AudioStreamController const { config, trackId, levels } = this; if (!levels) { this.warn( - `Audio tracks were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered` + `Audio tracks were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`, ); return; } @@ -580,7 +580,7 @@ class AudioStreamController this.hls, PlaylistLevelType.AUDIO, this._handleTransmuxComplete.bind(this), - this._handleTransmuxerFlush.bind(this) + this._handleTransmuxerFlush.bind(this), ); } @@ -600,7 +600,7 @@ class AudioStreamController frag.stats.chunkCount, payload.byteLength, partIndex, - partial + partial, ); transmuxer.push( payload, @@ -612,11 +612,11 @@ class AudioStreamController details.totalduration, accurateTimeOffset, chunkMeta, - initPTS + initPTS, ); } else { this.log( - `Unknown video PTS for cc ${frag.cc}, waiting for video PTS before demuxing audio frag ${frag.sn} of [${details.startSN} ,${details.endSN}],track ${trackId}` + `Unknown video PTS for cc ${frag.cc}, waiting for video PTS before demuxing audio frag ${frag.sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`, ); const { cache } = (this.waitingData = this.waitingData || { frag, @@ -678,7 +678,7 @@ class AudioStreamController this.state }, audioSwitch: ${ this.switchingTrack ? this.switchingTrack.name : 'false' - }` + }`, ); return; } @@ -745,7 +745,7 @@ class AudioStreamController private onBufferFlushed( event: Events.BUFFER_FLUSHED, - { type }: BufferFlushedData + { type }: BufferFlushedData, ) { if (type === ElementaryStreamTypes.AUDIO) { this.bufferFlushed = true; @@ -792,7 +792,7 @@ class AudioStreamController level, initSegment.tracks, mapFragment, - chunkMeta + chunkMeta, ); hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, { frag: mapFragment, @@ -816,7 +816,7 @@ class AudioStreamController startPTS, endPTS, startDTS, - endDTS + endDTS, ); this.bufferFragmentData(audio, frag, part, chunkMeta); } @@ -828,7 +828,7 @@ class AudioStreamController frag, details, }, - id3 + id3, ); hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3); } @@ -839,7 +839,7 @@ class AudioStreamController frag, details, }, - text + text, ); hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText); } @@ -849,7 +849,7 @@ class AudioStreamController currentLevel: Level, tracks: TrackSet, frag: Fragment, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ) { if (this.state !== State.PARSING) { return; @@ -869,7 +869,7 @@ class AudioStreamController const variantAudioCodecs = currentLevel.audioCodec; this.log( - `Init audio buffer, container:${track.container}, codecs[level/parsed]=[${variantAudioCodecs}/${track.codec}]` + `Init audio buffer, container:${track.container}, codecs[level/parsed]=[${variantAudioCodecs}/${track.codec}]`, ); // SourceBuffer will use track.levelCodec if defined if (variantAudioCodecs && variantAudioCodecs.split(',').length === 1) { @@ -895,7 +895,7 @@ class AudioStreamController protected loadFragment( frag: Fragment, track: Level, - targetBufferTime: number + targetBufferTime: number, ) { // only load if fragment is not loaded or if in audio switch const fragState = this.fragmentTracker.getState(frag); @@ -911,7 +911,7 @@ class AudioStreamController this._loadInitSegment(frag, track); } else if (track.details?.live && !this.initPTS[frag.cc]) { this.log( - `Waiting for video PTS in continuity counter ${frag.cc} of live stream before loading audio fragment ${frag.sn} of level ${this.trackId}` + `Waiting for video PTS in continuity counter ${frag.cc} of live stream before loading audio fragment ${frag.sn} of level ${this.trackId}`, ); this.state = State.WAITING_INIT_PTS; const mainDetails = this.mainDetails; diff --git a/src/controller/audio-track-controller.ts b/src/controller/audio-track-controller.ts index 449f4d72d..ce1ef250b 100644 --- a/src/controller/audio-track-controller.ts +++ b/src/controller/audio-track-controller.ts @@ -66,21 +66,21 @@ class AudioTrackController extends BasePlaylistController { protected onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ): void { this.tracks = data.audioTracks || []; } protected onAudioTrackLoaded( event: Events.AUDIO_TRACK_LOADED, - data: AudioTrackLoadedData + data: AudioTrackLoadedData, ): void { const { id, groupId, details } = data; const trackInActiveGroup = this.tracksInGroup[id]; if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) { this.warn( - `Track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup.groupId}` + `Track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup.groupId}`, ); return; } @@ -88,7 +88,7 @@ class AudioTrackController extends BasePlaylistController { const curDetails = trackInActiveGroup.details; trackInActiveGroup.details = data.details; this.log( - `audio-track ${id} "${trackInActiveGroup.name}" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]` + `audio-track ${id} "${trackInActiveGroup.name}" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`, ); if (id === this.trackId) { @@ -98,14 +98,14 @@ class AudioTrackController extends BasePlaylistController { protected onLevelLoading( event: Events.LEVEL_LOADING, - data: LevelLoadingData + data: LevelLoadingData, ): void { this.switchLevel(data.level); } protected onLevelSwitching( event: Events.LEVEL_SWITCHING, - data: LevelSwitchingData + data: LevelSwitchingData, ): void { this.switchLevel(data.level); } @@ -122,7 +122,7 @@ class AudioTrackController extends BasePlaylistController { this.groupId = audioGroupId || null; const audioTracks = this.tracks.filter( - (track): boolean => !audioGroupId || track.groupId === audioGroupId + (track): boolean => !audioGroupId || track.groupId === audioGroupId, ); // Disable selectDefaultTrack if there are no default tracks @@ -136,7 +136,7 @@ class AudioTrackController extends BasePlaylistController { this.tracksInGroup = audioTracks; const audioTracksUpdated: AudioTracksUpdatedData = { audioTracks }; this.log( - `Updating audio tracks, ${audioTracks.length} track(s) found in group:${audioGroupId}` + `Updating audio tracks, ${audioTracks.length} track(s) found in group:${audioGroupId}`, ); this.hls.trigger(Events.AUDIO_TRACKS_UPDATED, audioTracksUpdated); @@ -197,7 +197,7 @@ class AudioTrackController extends BasePlaylistController { const track = tracks[newId]; const { groupId, name } = track; this.log( - `Switching to audio-track ${newId} "${name}" lang:${track.lang} group:${groupId}` + `Switching to audio-track ${newId} "${name}" lang:${track.lang} group:${groupId}`, ); this.trackId = newId; this.currentTrack = track; @@ -222,7 +222,7 @@ class AudioTrackController extends BasePlaylistController { this.setAudioTrack(trackId); } else { const error = new Error( - `No track found for running audio group-ID: ${this.groupId} track count: ${audioTracks.length}` + `No track found for running audio group-ID: ${this.groupId} track count: ${audioTracks.length}`, ); this.warn(error.message); @@ -271,13 +271,13 @@ class AudioTrackController extends BasePlaylistController { url = hlsUrlParameters.addDirectives(url); } catch (error) { this.warn( - `Could not construct new URL with HLS Delivery Directives: ${error}` + `Could not construct new URL with HLS Delivery Directives: ${error}`, ); } } // track not retrieved yet, or live playlist we need to (re)load it this.log( - `loading audio-track playlist ${id} "${audioTrack.name}" lang:${audioTrack.lang} group:${groupId}` + `loading audio-track playlist ${id} "${audioTrack.name}" lang:${audioTrack.lang} group:${groupId}`, ); this.clearTimer(); this.hls.trigger(Events.AUDIO_TRACK_LOADING, { diff --git a/src/controller/base-playlist-controller.ts b/src/controller/base-playlist-controller.ts index f4cb608b3..38b092942 100644 --- a/src/controller/base-playlist-controller.ts +++ b/src/controller/base-playlist-controller.ts @@ -54,7 +54,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { protected switchParams( playlistUri: string, - previous: LevelDetails | undefined + previous: LevelDetails | undefined, ): HlsUrlParameters | undefined { const renditionReports = previous?.renditionReports; if (renditionReports) { @@ -66,7 +66,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { uri = new self.URL(attr.URI, previous.url).href; } catch (error) { logger.warn( - `Could not construct new URL for Rendition Report: ${error}` + `Could not construct new URL for Rendition Report: ${error}`, ); uri = attr.URI || ''; } @@ -86,7 +86,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { if (this.hls.config.lowLatencyMode) { const currentGoal = Math.min( previous.age - previous.partTarget, - previous.targetduration + previous.targetduration, ); if (part >= 0 && currentGoal > previous.partTarget) { part += 1; @@ -95,7 +95,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { return new HlsUrlParameters( msn, part >= 0 ? part : undefined, - HlsSkip.No + HlsSkip.No, ); } } @@ -109,7 +109,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { } protected shouldLoadPlaylist( - playlist: Level | MediaPlaylist | null | undefined + playlist: Level | MediaPlaylist | null | undefined, ): boolean { return ( this.canLoad && @@ -120,7 +120,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { } protected shouldReloadPlaylist( - playlist: Level | MediaPlaylist | null | undefined + playlist: Level | MediaPlaylist | null | undefined, ): boolean { return ( this.timer === -1 && @@ -132,7 +132,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { protected playlistLoaded( index: number, data: LevelLoadedData | AudioTrackLoadedData | TrackLoadedData, - previousDetails?: LevelDetails + previousDetails?: LevelDetails, ) { const { details, stats } = data; @@ -152,7 +152,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { details.advanced ? 'REFRESHED ' + details.lastPartSn + '-' + details.lastPartIndex : 'MISSED' - }` + }`, ); } // Merge live playlists to adjust fragment starts and fill in delta playlist skipped segments @@ -187,14 +187,14 @@ export default class BasePlaylistController implements NetworkComponentAPI { const cdnAge = lastAdvanced + details.ageHeader; let currentGoal = Math.min( cdnAge - details.partTarget, - details.targetduration * 1.5 + details.targetduration * 1.5, ); if (currentGoal > 0) { if (previousDetails && currentGoal > previousDetails.tuneInGoal) { // If we attempted to get the next or latest playlist update, but currentGoal increased, // then we either can't catchup, or the "age" header cannot be trusted. this.warn( - `CDN Tune-in goal increased from: ${previousDetails.tuneInGoal} to: ${currentGoal} with playlist age: ${details.age}` + `CDN Tune-in goal increased from: ${previousDetails.tuneInGoal} to: ${currentGoal} with playlist age: ${details.age}`, ); currentGoal = 0; } else { @@ -202,7 +202,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { msn += segments; if (part !== undefined) { const parts = Math.round( - (currentGoal % details.targetduration) / details.partTarget + (currentGoal % details.targetduration) / details.partTarget, ); part += parts; } @@ -210,8 +210,8 @@ export default class BasePlaylistController implements NetworkComponentAPI { `CDN Tune-in age: ${ details.ageHeader }s last advanced ${lastAdvanced.toFixed( - 2 - )}s goal: ${currentGoal} skip sn ${segments} to part ${part}` + 2, + )}s goal: ${currentGoal} skip sn ${segments} to part ${part}`, ); } details.tuneInGoal = currentGoal; @@ -220,7 +220,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { details, data.deliveryDirectives, msn, - part + part, ); if (lowLatencyMode || !lastPart) { this.loadPlaylist(deliveryDirectives); @@ -231,7 +231,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { details, data.deliveryDirectives, msn, - part + part, ); } const bufferInfo = this.hls.mainForwardBufferInfo; @@ -239,7 +239,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { const distanceToLiveEdgeMs = (details.edge - position) * 1000; const reloadInterval = computeReloadInterval( details, - distanceToLiveEdgeMs + distanceToLiveEdgeMs, ); if (details.updated && now > this.requestScheduled + reloadInterval) { this.requestScheduled = stats.loading.start; @@ -262,8 +262,8 @@ export default class BasePlaylistController implements NetworkComponentAPI { estimatedTimeUntilUpdate = Math.max(0, estimatedTimeUntilUpdate); this.log( `reload live playlist ${index} in ${Math.round( - estimatedTimeUntilUpdate - )} ms` + estimatedTimeUntilUpdate, + )} ms`, ); // this.log( // `live reload ${details.updated ? 'REFRESHED' : 'MISSED'} @@ -283,7 +283,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { this.timer = self.setTimeout( () => this.loadPlaylist(deliveryDirectives), - estimatedTimeUntilUpdate + estimatedTimeUntilUpdate, ); } else { this.clearTimer(); @@ -294,7 +294,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { details: LevelDetails, previousDeliveryDirectives: HlsUrlParameters | null, msn?: number, - part?: number + part?: number, ): HlsUrlParameters { let skip = getSkipValue(details, msn); if (previousDeliveryDirectives?.skip && details.deltaUpdateFailed) { @@ -326,7 +326,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { this.warn( `Retrying playlist loading ${retryCount + 1}/${ retryConfig.maxNumRetry - } after "${errorDetails}" without delivery-directives` + } after "${errorDetails}" without delivery-directives`, ); this.loadPlaylist(); } else { @@ -336,7 +336,7 @@ export default class BasePlaylistController implements NetworkComponentAPI { this.warn( `Retrying playlist loading ${retryCount + 1}/${ retryConfig.maxNumRetry - } after "${errorDetails}" in ${delay}ms` + } after "${errorDetails}" in ${delay}ms`, ); } // `levelRetry = true` used to inform other controllers that a retry is happening diff --git a/src/controller/base-stream-controller.ts b/src/controller/base-stream-controller.ts index b99bb00a4..09629d090 100644 --- a/src/controller/base-stream-controller.ts +++ b/src/controller/base-stream-controller.ts @@ -109,7 +109,7 @@ export default class BaseStreamController fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, - playlistType: PlaylistLevelType + playlistType: PlaylistLevelType, ) { super(); this.playlistType = playlistType; @@ -152,7 +152,7 @@ export default class BaseStreamController protected _streamEnded( bufferInfo: BufferInfo, - levelDetails: LevelDetails + levelDetails: LevelDetails, ): boolean { // If playlist is live, there is another buffered range after the current range, nothing buffered, media is detached, // of nothing loading/loaded return false @@ -176,7 +176,7 @@ export default class BaseStreamController // part mismatches for independent audio and video playlists/segments. const lastPartBuffered = BufferHelper.isBuffered( this.media, - lastPart.start + lastPart.duration / 2 + lastPart.start + lastPart.duration / 2, ); return lastPartBuffered; } @@ -194,7 +194,7 @@ export default class BaseStreamController protected onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) { const media = (this.media = this.mediaBuffer = data.media); this.onvseeking = this.onMediaSeeking.bind(this) as EventListener; @@ -235,13 +235,13 @@ export default class BaseStreamController const bufferInfo = BufferHelper.bufferInfo( mediaBuffer ? mediaBuffer : media, currentTime, - config.maxBufferHole + config.maxBufferHole, ); this.log( `media seeking to ${ Number.isFinite(currentTime) ? currentTime.toFixed(3) : currentTime - }, state: ${state}` + }, state: ${state}`, ); if (this.state === State.ENDED) { @@ -263,7 +263,7 @@ export default class BaseStreamController if (currentTime < fragStartOffset || pastFragment) { if (pastFragment && fragCurrent.loader) { this.log( - 'seeking outside of buffer while fragment load in progress, cancel fragment load' + 'seeking outside of buffer while fragment load in progress, cancel fragment load', ); fragCurrent.abortRequests(); this.resetLoadingState(); @@ -279,7 +279,7 @@ export default class BaseStreamController currentTime, Infinity, this.playlistType, - true + true, ); this.lastCurrentTime = currentTime; @@ -301,7 +301,7 @@ export default class BaseStreamController protected onManifestLoaded( event: Events.MANIFEST_LOADED, - data: ManifestLoadedData + data: ManifestLoadedData, ): void { this.startTimeOffset = data.startTimeOffset; this.initPTS = []; @@ -338,7 +338,7 @@ export default class BaseStreamController protected loadFragment( frag: Fragment, level: Level, - targetBufferTime: number + targetBufferTime: number, ) { this._loadFragForPlayback(frag, level, targetBufferTime); } @@ -346,16 +346,16 @@ export default class BaseStreamController private _loadFragForPlayback( frag: Fragment, level: Level, - targetBufferTime: number + targetBufferTime: number, ) { const progressCallback: FragmentLoadProgressCallback = ( - data: FragLoadedData + data: FragLoadedData, ) => { if (this.fragContextChanged(frag)) { this.warn( `Fragment ${frag.sn}${ data.part ? ' p: ' + data.part.index : '' - } of level ${frag.level} was dropped during download.` + } of level ${frag.level} was dropped during download.`, ); this.fragmentTracker.removeFragment(frag); return; @@ -407,11 +407,11 @@ export default class BaseStreamController const playlistType = frag.type as PlaylistLevelType; const bufferedInfo = this.getFwdBufferInfo( this.mediaBuffer, - playlistType + playlistType, ); const minForwardBufferLength = Math.max( frag.duration, - bufferedInfo ? bufferedInfo.len : this.config.maxBufferLength + bufferedInfo ? bufferedInfo.len : this.config.maxBufferLength, ); if (this.reduceMaxBufferLength(minForwardBufferLength)) { fragmentTracker.removeFragment(frag); @@ -436,7 +436,7 @@ export default class BaseStreamController protected flushMainBuffer( startOffset: number, endOffset: number, - type: SourceBufferName | null = null + type: SourceBufferName | null = null, ) { if (!(startOffset - endOffset)) { return; @@ -476,7 +476,7 @@ export default class BaseStreamController .decrypt( new Uint8Array(payload), decryptData.key.buffer, - decryptData.iv.buffer + decryptData.iv.buffer, ) .catch((err) => { hls.trigger(Events.ERROR, { @@ -551,7 +551,7 @@ export default class BaseStreamController media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)' - })` + })`, ); if (frag.sn !== 'initSegment') { if (frag.type !== PlaylistLevelType.SUBTITLE) { @@ -565,7 +565,7 @@ export default class BaseStreamController const level = this.levels?.[frag.level]; if (level?.fragmentError) { this.log( - `Resetting level fragment error count of ${level.fragmentError} on frag buffered` + `Resetting level fragment error count of ${level.fragmentError} on frag buffered`, ); level.fragmentError = 0; } @@ -605,26 +605,26 @@ export default class BaseStreamController frag.stats.chunkCount + 1, 0, part ? part.index : -1, - !complete + !complete, ); transmuxer.flush(chunkMeta); } // eslint-disable-next-line @typescript-eslint/no-unused-vars protected _handleFragmentLoadProgress( - frag: PartsLoadedData | FragLoadedData + frag: PartsLoadedData | FragLoadedData, ) {} protected _doFragLoad( frag: Fragment, level: Level, targetBufferTime: number | null = null, - progressCallback?: FragmentLoadProgressCallback + progressCallback?: FragmentLoadProgressCallback, ): Promise { const details = level?.details; if (!this.levels || !details) { throw new Error( - `frag load aborted, missing level${details ? '' : ' detail'}s` + `frag load aborted, missing level${details ? '' : ' detail'}s`, ); } @@ -633,7 +633,7 @@ export default class BaseStreamController this.log( `Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${ this.logPrefix === '[stream-controller]' ? 'level' : 'track' - } ${frag.level}` + } ${frag.level}`, ); this.state = State.KEY_LOADING; this.fragCurrent = frag; @@ -649,7 +649,7 @@ export default class BaseStreamController this.hls.trigger(Events.KEY_LOADING, { frag }); if (this.fragCurrent === null) { keyLoadingPromise = Promise.reject( - new Error(`frag load aborted, context changed in KEY_LOADING`) + new Error(`frag load aborted, context changed in KEY_LOADING`), ); } } else if (!frag.encrypted && details.encryptedFragments.length) { @@ -674,8 +674,8 @@ export default class BaseStreamController }] parts [0-${partIndex}-${partList.length - 1}] ${ this.logPrefix === '[stream-controller]' ? 'level' : 'track' }: ${frag.level}, target: ${parseFloat( - targetBufferTime.toFixed(3) - )}` + targetBufferTime.toFixed(3), + )}`, ); this.nextLoadPosition = part.start + part.duration; this.state = State.FRAG_LOADING; @@ -693,7 +693,7 @@ export default class BaseStreamController frag, part, level, - progressCallback + progressCallback, ); }) .catch((error) => this.handleFragLoadError(error)); @@ -702,7 +702,7 @@ export default class BaseStreamController frag, part, level, - progressCallback + progressCallback, ).catch((error: LoadError) => this.handleFragLoadError(error)); } this.hls.trigger(Events.FRAG_LOADING, { @@ -713,8 +713,8 @@ export default class BaseStreamController if (this.fragCurrent === null) { return Promise.reject( new Error( - `frag load aborted, context changed in FRAG_LOADING parts` - ) + `frag load aborted, context changed in FRAG_LOADING parts`, + ), ); } return result; @@ -733,7 +733,7 @@ export default class BaseStreamController details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : '' }${this.logPrefix === '[stream-controller]' ? 'level' : 'track'}: ${ frag.level - }, target: ${parseFloat(targetBufferTime.toFixed(3))}` + }, target: ${parseFloat(targetBufferTime.toFixed(3))}`, ); // Don't update nextLoadPosition for fragments which are not buffered if (Number.isFinite(frag.sn as number) && !this.bitrateTest) { @@ -759,7 +759,7 @@ export default class BaseStreamController result = Promise.all([ this.fragmentLoader.load( frag, - dataOnProgress ? progressCallback : undefined + dataOnProgress ? progressCallback : undefined, ), keyLoadingPromise, ]) @@ -774,7 +774,7 @@ export default class BaseStreamController this.hls.trigger(Events.FRAG_LOADING, { frag, targetBufferTime }); if (this.fragCurrent === null) { return Promise.reject( - new Error(`frag load aborted, context changed in FRAG_LOADING`) + new Error(`frag load aborted, context changed in FRAG_LOADING`), ); } return result; @@ -784,7 +784,7 @@ export default class BaseStreamController frag: Fragment, fromPart: Part, level: Level, - progressCallback: FragmentLoadProgressCallback + progressCallback: FragmentLoadProgressCallback, ): Promise { return new Promise( (resolve: ResolveFragLoaded, reject: RejectFragLoaded) => { @@ -813,7 +813,7 @@ export default class BaseStreamController .catch(reject); }; loadPart(fromPart); - } + }, ); } @@ -859,13 +859,13 @@ export default class BaseStreamController } protected getCurrentContext( - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ): { frag: Fragment; part: Part | null; level: Level } | null { const { levels, fragCurrent } = this; const { level: levelIndex, sn, part: partIndex } = chunkMeta; if (!levels?.[levelIndex]) { this.warn( - `Levels object was unset while buffering fragment ${sn} of level ${levelIndex}. The current chunk will not be buffered.` + `Levels object was unset while buffering fragment ${sn} of level ${levelIndex}. The current chunk will not be buffered.`, ); return null; } @@ -888,7 +888,7 @@ export default class BaseStreamController frag: Fragment, part: Part | null, chunkMeta: ChunkMetadata, - noBacktracking?: boolean + noBacktracking?: boolean, ) { if (!data || this.state !== State.PARSING) { return; @@ -940,11 +940,11 @@ export default class BaseStreamController const fragDuration = frag.duration; const segmentFraction = Math.min( this.config.maxFragLookUpTolerance * 2, - fragDuration * 0.25 + fragDuration * 0.25, ); const start = Math.max( Math.min(frag.start - segmentFraction, bufferInfo.end - segmentFraction), - currentTime + segmentFraction + currentTime + segmentFraction, ); if (frag.start - start > segmentFraction) { this.flushMainBuffer(start, frag.start); @@ -953,7 +953,7 @@ export default class BaseStreamController protected getFwdBufferInfo( bufferable: Bufferable | null, - type: PlaylistLevelType + type: PlaylistLevelType, ): BufferInfo | null { const pos = this.getLoadPosition(); if (!Number.isFinite(pos)) { @@ -965,7 +965,7 @@ export default class BaseStreamController protected getFwdBufferInfoAtPos( bufferable: Bufferable | null, pos: number, - type: PlaylistLevelType + type: PlaylistLevelType, ): BufferInfo | null { const { config: { maxBufferHole }, @@ -978,7 +978,7 @@ export default class BaseStreamController return BufferHelper.bufferInfo( bufferable, pos, - Math.max(bufferInfo.nextStart, maxBufferHole) + Math.max(bufferInfo.nextStart, maxBufferHole), ); } } @@ -991,7 +991,7 @@ export default class BaseStreamController if (levelBitrate) { maxBufLen = Math.max( (8 * config.maxBufferSize) / levelBitrate, - config.maxBufferLength + config.maxBufferLength, ); } else { maxBufLen = config.maxBufferLength; @@ -1013,11 +1013,11 @@ export default class BaseStreamController protected getAppendedFrag( position: number, - playlistType: PlaylistLevelType = PlaylistLevelType.MAIN + playlistType: PlaylistLevelType = PlaylistLevelType.MAIN, ): Fragment | null { const fragOrPart = this.fragmentTracker.getAppendedFrag( position, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); if (fragOrPart && 'fragment' in fragOrPart) { return fragOrPart.fragment; @@ -1027,7 +1027,7 @@ export default class BaseStreamController protected getNextFragment( pos: number, - levelDetails: LevelDetails + levelDetails: LevelDetails, ): Fragment | null { const fragments = levelDetails.fragments; const fragLen = fragments.length; @@ -1045,7 +1045,7 @@ export default class BaseStreamController const initialLiveManifestSize = config.initialLiveManifestSize; if (fragLen < initialLiveManifestSize) { this.warn( - `Not enough fragments to start playback (have: ${fragLen}, need: ${initialLiveManifestSize})` + `Not enough fragments to start playback (have: ${fragLen}, need: ${initialLiveManifestSize})`, ); return null; } @@ -1094,12 +1094,12 @@ export default class BaseStreamController levelDetails: LevelDetails, bufferInfo: BufferInfo, playlistType: PlaylistLevelType, - maxBufLen: number + maxBufLen: number, ): Fragment | null { const gapStart = frag.gap; const nextFragment = this.getNextFragment( this.nextLoadPosition, - levelDetails + levelDetails, ); if (nextFragment === null) { return nextFragment; @@ -1110,7 +1110,7 @@ export default class BaseStreamController const nextbufferInfo = this.getFwdBufferInfoAtPos( this.mediaBuffer ? this.mediaBuffer : this.media, bufferInfo.nextStart, - playlistType + playlistType, ); if ( nextbufferInfo !== null && @@ -1118,7 +1118,7 @@ export default class BaseStreamController ) { // Returning here might result in not finding an audio and video candiate to skip to this.log( - `buffer full after gaps in "${playlistType}" playlist starting at sn: ${frag.sn}` + `buffer full after gaps in "${playlistType}" playlist starting at sn: ${frag.sn}`, ); return null; } @@ -1138,7 +1138,7 @@ export default class BaseStreamController getNextPart( partList: Part[], frag: Fragment, - targetBufferTime: number + targetBufferTime: number, ): number { let nextPart = -1; let contiguous = false; @@ -1165,7 +1165,7 @@ export default class BaseStreamController private loadedEndOfParts( partList: Part[], - targetBufferTime: number + targetBufferTime: number, ): boolean { const lastPart = partList[partList.length - 1]; return lastPart && targetBufferTime > lastPart.start && lastPart.loaded; @@ -1178,7 +1178,7 @@ export default class BaseStreamController */ protected getInitialLiveFragment( levelDetails: LevelDetails, - fragments: Array + fragments: Array, ): Fragment | null { const fragPrevious = this.fragPrevious; let frag: Fragment | null = null; @@ -1186,12 +1186,12 @@ export default class BaseStreamController if (levelDetails.hasProgramDateTime) { // Prefer using PDT, because it can be accurate enough to choose the correct fragment without knowing the level sliding this.log( - `Live playlist, switching playlist, load frag with same PDT: ${fragPrevious.programDateTime}` + `Live playlist, switching playlist, load frag with same PDT: ${fragPrevious.programDateTime}`, ); frag = findFragmentByPDT( fragments, fragPrevious.endProgramDateTime, - this.config.maxFragLookUpTolerance + this.config.maxFragLookUpTolerance, ); } if (!frag) { @@ -1208,7 +1208,7 @@ export default class BaseStreamController this.log( `Live playlist, switching playlist, load frag with next SN: ${ frag!.sn - }` + }`, ); } } @@ -1218,7 +1218,7 @@ export default class BaseStreamController frag = findFragWithCC(fragments, fragPrevious.cc); if (frag) { this.log( - `Live playlist, switching playlist, load frag with same CC: ${frag.sn}` + `Live playlist, switching playlist, load frag with same CC: ${frag.sn}`, ); } } @@ -1230,7 +1230,7 @@ export default class BaseStreamController frag = this.getFragmentAtPosition( liveStart, this.bitrateTest ? levelDetails.fragmentEnd : levelDetails.edge, - levelDetails + levelDetails, ); } } @@ -1244,7 +1244,7 @@ export default class BaseStreamController protected getFragmentAtPosition( bufferEnd: number, end: number, - levelDetails: LevelDetails + levelDetails: LevelDetails, ): Fragment | null { const { config } = this; let { fragPrevious } = this; @@ -1273,7 +1273,7 @@ export default class BaseStreamController fragPrevious, fragments, bufferEnd, - lookupTolerance + lookupTolerance, ); } else { // reach end of playlist @@ -1349,10 +1349,10 @@ export default class BaseStreamController if (media.readyState) { this.warn( `Playback: ${currentTime.toFixed( - 3 + 3, )} is located too far from the end of live sliding playlist: ${end}, reset currentTime to : ${liveSyncPosition.toFixed( - 3 - )}` + 3, + )}`, ); media.currentTime = liveSyncPosition; } @@ -1362,7 +1362,7 @@ export default class BaseStreamController protected alignPlaylists( details: LevelDetails, - previousDetails?: LevelDetails + previousDetails?: LevelDetails, ): number { const { levels, levelLastLoaded, fragPrevious } = this; const lastLevel: Level | null = @@ -1386,7 +1386,7 @@ export default class BaseStreamController previousDetails ? previousDetails.startSN : 'na' }->${details.startSN} prev-sn: ${ fragPrevious ? fragPrevious.sn : 'na' - } fragments: ${length}` + } fragments: ${length}`, ); return alignedSlidingStart; } @@ -1425,12 +1425,12 @@ export default class BaseStreamController } startPosition = Math.min( Math.max(sliding, startPosition), - sliding + details.totalduration + sliding + details.totalduration, ); this.log( `Start time offset ${startTimeOffset} found in ${ offsetInMultivariantPlaylist ? 'multivariant' : 'media' - } playlist, adjust startPosition to ${startPosition}` + } playlist, adjust startPosition to ${startPosition}`, ); this.startPosition = startPosition; } else if (details.live) { @@ -1463,7 +1463,7 @@ export default class BaseStreamController this.warn( `Fragment ${frag.sn}${part ? ' part ' + part.index : ''} of level ${ frag.level - } was aborted` + } was aborted`, ); this.resetFragmentLoading(frag); } @@ -1481,7 +1481,7 @@ export default class BaseStreamController protected onFragmentOrKeyLoadError( filterType: PlaylistLevelType, - data: ErrorData + data: ErrorData, ) { if (data.chunkMeta && !data.frag) { const context = this.getCurrentContext(data.chunkMeta); @@ -1496,7 +1496,7 @@ export default class BaseStreamController } if (this.fragContextChanged(frag)) { this.warn( - `Frag load error must match current frag to retry ${frag.url} > ${this.fragCurrent?.url}` + `Frag load error must match current frag to retry ${frag.url} > ${this.fragCurrent?.url}`, ); return; } @@ -1519,7 +1519,7 @@ export default class BaseStreamController data.details }, retrying loading ${retryCount + 1}/${ retryConfig.maxNumRetry - } in ${delay}ms` + } in ${delay}ms`, ); errorAction.resolved = true; this.retryDate = self.performance.now() + delay; @@ -1536,7 +1536,7 @@ export default class BaseStreamController } } else { logger.warn( - `${data.details} reached or exceeded max retry (${retryCount})` + `${data.details} reached or exceeded max retry (${retryCount})`, ); return; } @@ -1557,7 +1557,7 @@ export default class BaseStreamController const playlistType = data.parent as PlaylistLevelType; const bufferedInfo = this.getFwdBufferInfo( this.mediaBuffer, - playlistType + playlistType, ); // 0.5 : tolerance needed as some browsers stalls playback before reaching buffered end // reduce max buf len if current position is buffered @@ -1571,7 +1571,7 @@ export default class BaseStreamController // this happens on IE/Edge, refer to https://github.com/video-dev/hls.js/pull/708 // in that case flush the whole audio buffer to recover this.warn( - `Buffer full error while media.currentTime is not buffered, flush ${playlistType} buffer` + `Buffer full error while media.currentTime is not buffered, flush ${playlistType} buffer`, ); } if (data.frag) { @@ -1602,7 +1602,7 @@ export default class BaseStreamController protected afterBufferFlushed( media: Bufferable, bufferType: SourceBufferName, - playlistType: PlaylistLevelType + playlistType: PlaylistLevelType, ) { if (!media) { return; @@ -1613,7 +1613,7 @@ export default class BaseStreamController this.fragmentTracker.detectEvictedFragments( bufferType, bufferedTimeRanges, - playlistType + playlistType, ); if (this.state === State.ENDED) { this.resetLoadingState(); @@ -1646,7 +1646,7 @@ export default class BaseStreamController protected resetWhenMissingContext(chunkMeta: ChunkMetadata) { this.warn( - `The loading context changed while buffering fragment ${chunkMeta.sn} of level ${chunkMeta.level}. This chunk will not be buffered.` + `The loading context changed while buffering fragment ${chunkMeta.sn} of level ${chunkMeta.level}. This chunk will not be buffered.`, ); this.removeUnbufferedFrags(); this.resetStartWhenNotLoaded(this.levelLastLoaded ?? chunkMeta.level); @@ -1659,7 +1659,7 @@ export default class BaseStreamController Infinity, this.playlistType, false, - true + true, ); } @@ -1667,7 +1667,7 @@ export default class BaseStreamController frag: Fragment, part: Part | null, level: Level, - partial: boolean + partial: boolean, ) { const details = level.details as LevelDetails; if (!details) { @@ -1684,7 +1684,7 @@ export default class BaseStreamController // The new transmuxer will be configured with a time offset matching the next fragment start, // preventing the timeline from shifting. this.warn( - `Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration})` + `Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration})`, ); return result || false; } @@ -1696,7 +1696,7 @@ export default class BaseStreamController info.startPTS, info.endPTS, info.startDTS, - info.endDTS + info.endDTS, ); this.hls.trigger(Events.LEVEL_PTS_UPDATED, { details, @@ -1711,11 +1711,11 @@ export default class BaseStreamController } return result; }, - false + false, ); if (!parsed && this.transmuxer?.error === null) { const error = new Error( - `Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing` + `Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`, ); if (level.fragmentError === 0) { // Mark and track the odd empty segment as a gap to avoid reloading @@ -1755,7 +1755,7 @@ export default class BaseStreamController this.fragmentTracker.removeAllFragments(); this.resetTransmuxer(); this.resetStartWhenNotLoaded( - this.levelLastLoaded ?? this.fragCurrent?.level ?? 0 + this.levelLastLoaded ?? this.fragCurrent?.level ?? 0, ); this.resetLoadingState(); } diff --git a/src/controller/buffer-controller.ts b/src/controller/buffer-controller.ts index 5ad8bb04b..65cdc9127 100755 --- a/src/controller/buffer-controller.ts +++ b/src/controller/buffer-controller.ts @@ -157,7 +157,7 @@ export default class BufferController implements ComponentAPI { protected onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ) { // in case of alt audio 2 BUFFER_CODECS events will be triggered, one per stream controller // sourcebuffers will be created all at once when the expected nb of tracks will be reached @@ -173,7 +173,7 @@ export default class BufferController implements ComponentAPI { protected onMediaAttaching( event: Events.MEDIA_ATTACHING, - data: MediaAttachingData + data: MediaAttachingData, ) { const media = (this.media = data.media); if (media && MediaSource) { @@ -203,7 +203,7 @@ export default class BufferController implements ComponentAPI { mediaSource.endOfStream(); } catch (err) { this.warn( - `onMediaDetaching: ${err.message} while calling endOfStream` + `onMediaDetaching: ${err.message} while calling endOfStream`, ); } } @@ -268,7 +268,7 @@ export default class BufferController implements ComponentAPI { protected onBufferCodecs( event: Events.BUFFER_CODECS, - data: BufferCodecsData + data: BufferCodecsData, ) { const sourceBufferCount = this.getSourceBufferTypes().length; @@ -281,16 +281,16 @@ export default class BufferController implements ComponentAPI { data[trackName]; const currentCodedFull = pickMostCompleteCodecName( track.codec, - track.levelCodec + track.levelCodec, ); const currentCodec = currentCodedFull.replace( VIDEO_CODEC_PROFILE_REPLACE, - '$1' + '$1', ); let trackCodec = pickMostCompleteCodecName(codec, levelCodec); const nextCodec = trackCodec.replace( VIDEO_CODEC_PROFILE_REPLACE, - '$1' + '$1', ); if (currentCodec !== nextCodec) { if (trackName.slice(0, 5) === 'audio') { @@ -322,7 +322,7 @@ export default class BufferController implements ComponentAPI { this.bufferCodecEventsExpected = Math.max( this.bufferCodecEventsExpected - 1, - 0 + 0, ); if (this.mediaSource && this.mediaSource.readyState === 'open') { this.checkPendingTracks(); @@ -352,7 +352,7 @@ export default class BufferController implements ComponentAPI { protected onBufferAppending( event: Events.BUFFER_APPENDING, - eventData: BufferAppendingData + eventData: BufferAppendingData, ) { const { hls, operationQueue, tracks } = this; const { data, type, frag, part, chunkMeta } = eventData; @@ -394,7 +394,7 @@ export default class BufferController implements ComponentAPI { const delta = fragStart - sb.timestampOffset; if (Math.abs(delta) >= 0.1) { this.log( - `Updating audio SourceBuffer timestampOffset to ${fragStart} (delta: ${delta}) sn: ${frag.sn})` + `Updating audio SourceBuffer timestampOffset to ${fragStart} (delta: ${delta}) sn: ${frag.sn})`, ); sb.timestampOffset = fragStart; } @@ -463,7 +463,7 @@ export default class BufferController implements ComponentAPI { browser is able to evict some data from sourcebuffer. Retrying can help recover. */ this.warn( - `Failed ${appendErrorCount}/${hls.config.appendErrorMaxRetry} times to append segment in "${type}" sourceBuffer` + `Failed ${appendErrorCount}/${hls.config.appendErrorMaxRetry} times to append segment in "${type}" sourceBuffer`, ); if (appendErrorCount >= hls.config.appendErrorMaxRetry) { event.fatal = true; @@ -477,7 +477,7 @@ export default class BufferController implements ComponentAPI { protected onBufferFlushing( event: Events.BUFFER_FLUSHING, - data: BufferFlushingData + data: BufferFlushingData, ) { const { operationQueue } = this; const flushOperation = (type: SourceBufferName): BufferOperation => ({ @@ -485,7 +485,7 @@ export default class BufferController implements ComponentAPI { this, type, data.startOffset, - data.endOffset + data.endOffset, ), onStart: () => { // logger.debug(`[buffer-controller]: Started flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`); @@ -542,7 +542,7 @@ export default class BufferController implements ComponentAPI { if (buffersAppendedTo.length === 0) { this.warn( - `Fragments must have at least one ElementaryStreamType set. type: ${frag.type} level: ${frag.level} sn: ${frag.sn}` + `Fragments must have at least one ElementaryStreamType set. type: ${frag.type} level: ${frag.level} sn: ${frag.sn}`, ); } @@ -581,7 +581,7 @@ export default class BufferController implements ComponentAPI { if (!mediaSource || mediaSource.readyState !== 'open') { if (mediaSource) { this.log( - `Could not call mediaSource.endOfStream(). mediaSource.readyState: ${mediaSource.readyState}` + `Could not call mediaSource.endOfStream(). mediaSource.readyState: ${mediaSource.readyState}`, ); } return; @@ -595,7 +595,7 @@ export default class BufferController implements ComponentAPI { protected onLevelUpdated( event: Events.LEVEL_UPDATED, - { details }: LevelUpdatedData + { details }: LevelUpdatedData, ) { if (!details.fragments.length) { return; @@ -659,7 +659,7 @@ export default class BufferController implements ComponentAPI { buffered.end(buffered.length - 1) - currentTime < targetDuration * 2 ) { this.log( - `Cannot flush ${type} back buffer while SourceBuffer is in ended state` + `Cannot flush ${type} back buffer while SourceBuffer is in ended state`, ); return; } @@ -720,7 +720,7 @@ export default class BufferController implements ComponentAPI { const start = Math.max(0, fragments[0].start); const end = Math.max(start, start + levelDetails.totalduration); this.log( - `Media Source duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.` + `Media Source duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.`, ); mediaSource.setLiveSeekableRange(start, end); } @@ -750,7 +750,7 @@ export default class BufferController implements ComponentAPI { }); } else { const error = new Error( - 'could not create source buffer for media codec(s)' + 'could not create source buffer for media codec(s)', ); this.hls.trigger(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, @@ -773,7 +773,7 @@ export default class BufferController implements ComponentAPI { const track = tracks[trackName as keyof TrackSet]; if (!track) { throw Error( - `source buffer exists for track ${trackName}, however track does not` + `source buffer exists for track ${trackName}, however track does not`, ); } // use levelCodec as first priority @@ -844,7 +844,7 @@ export default class BufferController implements ComponentAPI { const { media, _objectUrl } = this; if (media && media.src !== _objectUrl) { this.error( - `Media element src was set while attaching MediaSource (${_objectUrl} > ${media.src})` + `Media element src was set while attaching MediaSource (${_objectUrl} > ${media.src})`, ); } }; @@ -889,13 +889,13 @@ export default class BufferController implements ComponentAPI { private removeExecutor( type: SourceBufferName, startOffset: number, - endOffset: number + endOffset: number, ) { const { media, mediaSource, operationQueue, sourceBuffer } = this; const sb = sourceBuffer[type]; if (!media || !mediaSource || !sb) { this.warn( - `Attempting to remove from the ${type} SourceBuffer, but it does not exist` + `Attempting to remove from the ${type} SourceBuffer, but it does not exist`, ); operationQueue.shiftAndExecuteNext(type); return; @@ -911,7 +911,7 @@ export default class BufferController implements ComponentAPI { if (removeEnd > removeStart && (!sb.ending || sb.ended)) { sb.ended = false; this.log( - `Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer` + `Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer`, ); sb.remove(removeStart, removeEnd); } else { @@ -926,7 +926,7 @@ export default class BufferController implements ComponentAPI { if (!sb) { if (!this.pendingTracks[type]) { throw new Error( - `Attempting to append to the ${type} SourceBuffer, but it does not exist` + `Attempting to append to the ${type} SourceBuffer, but it does not exist`, ); } return; @@ -941,7 +941,7 @@ export default class BufferController implements ComponentAPI { // upon completion, since we already do it here private blockBuffers( onUnblocked: () => void, - buffers: Array = this.getSourceBufferTypes() + buffers: Array = this.getSourceBufferTypes(), ) { if (!buffers.length) { this.log('Blocking operation requested, but no SourceBuffers exist'); @@ -952,7 +952,7 @@ export default class BufferController implements ComponentAPI { // logger.debug(`[buffer-controller]: Blocking ${buffers} SourceBuffer`); const blockingOperations = buffers.map((type) => - operationQueue.appendBlocker(type as SourceBufferName) + operationQueue.appendBlocker(type as SourceBufferName), ); Promise.all(blockingOperations).then(() => { // logger.debug(`[buffer-controller]: Blocking operation resolved; unblocking ${buffers} SourceBuffer`); @@ -976,7 +976,7 @@ export default class BufferController implements ComponentAPI { private addBufferListener( type: SourceBufferName, event: string, - fn: Function + fn: Function, ) { const buffer = this.sourceBuffer[type]; if (!buffer) { diff --git a/src/controller/buffer-operation-queue.ts b/src/controller/buffer-operation-queue.ts index e4b5aaa4c..48799b4da 100644 --- a/src/controller/buffer-operation-queue.ts +++ b/src/controller/buffer-operation-queue.ts @@ -21,7 +21,7 @@ export default class BufferOperationQueue { public append( operation: BufferOperation, type: SourceBufferName, - pending?: boolean + pending?: boolean, ) { const queue = this.queues[type]; queue.push(operation); @@ -62,7 +62,7 @@ export default class BufferOperationQueue { operation.execute(); } catch (error) { logger.warn( - `[buffer-operation-queue]: Exception executing "${type}" SourceBuffer operation: ${error}` + `[buffer-operation-queue]: Exception executing "${type}" SourceBuffer operation: ${error}`, ); operation.onError(error); diff --git a/src/controller/cap-level-controller.ts b/src/controller/cap-level-controller.ts index 722331e50..6613780b7 100644 --- a/src/controller/cap-level-controller.ts +++ b/src/controller/cap-level-controller.ts @@ -78,7 +78,7 @@ class CapLevelController implements ComponentAPI { protected onFpsDropLevelCapping( event: Events.FPS_DROP_LEVEL_CAPPING, - data: FPSDropLevelCappingData + data: FPSDropLevelCappingData, ) { // Don't add a restricted level more than once const level = this.hls.levels[data.droppedLevel]; @@ -93,7 +93,7 @@ class CapLevelController implements ComponentAPI { protected onMediaAttaching( event: Events.MEDIA_ATTACHING, - data: MediaAttachingData + data: MediaAttachingData, ) { this.media = data.media instanceof HTMLVideoElement ? data.media : null; this.clientRect = null; @@ -104,7 +104,7 @@ class CapLevelController implements ComponentAPI { protected onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ) { const hls = this.hls; this.restrictedLevels = []; @@ -117,7 +117,7 @@ class CapLevelController implements ComponentAPI { private onLevelsUpdated( event: Events.LEVELS_UPDATED, - data: LevelsUpdatedData + data: LevelsUpdatedData, ) { if (this.timer && Number.isFinite(this.autoLevelCapping)) { this.detectPlayerSize(); @@ -128,7 +128,7 @@ class CapLevelController implements ComponentAPI { // to the first level protected onBufferCodecs( event: Events.BUFFER_CODECS, - data: BufferCodecsData + data: BufferCodecsData, ) { const hls = this.hls; if (hls.config.capLevelToPlayerSize && data.video) { @@ -153,7 +153,7 @@ class CapLevelController implements ComponentAPI { const maxLevel = this.getMaxLevel(levels.length - 1); if (maxLevel !== this.autoLevelCapping) { logger.log( - `Setting autoLevelCapping to ${maxLevel}: ${levels[maxLevel].height}p@${levels[maxLevel].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}` + `Setting autoLevelCapping to ${maxLevel}: ${levels[maxLevel].height}p@${levels[maxLevel].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`, ); } hls.autoLevelCapping = maxLevel; @@ -180,14 +180,14 @@ class CapLevelController implements ComponentAPI { } const validLevels = levels.filter( - (level, index) => this.isLevelAllowed(level) && index <= capLevelIndex + (level, index) => this.isLevelAllowed(level) && index <= capLevelIndex, ); this.clientRect = null; return CapLevelController.getMaxLevelByMediaSize( validLevels, this.mediaWidth, - this.mediaHeight + this.mediaHeight, ); } @@ -274,7 +274,7 @@ class CapLevelController implements ComponentAPI { static getMaxLevelByMediaSize( levels: Array, width: number, - height: number + height: number, ): number { if (!levels?.length) { return -1; @@ -284,7 +284,7 @@ class CapLevelController implements ComponentAPI { // to determine whether we've chosen the greatest bandwidth for the media's dimensions const atGreatestBandwidth = ( curLevel: Level, - nextLevel: Level | undefined + nextLevel: Level | undefined, ) => { if (!nextLevel) { return true; diff --git a/src/controller/cmcd-controller.ts b/src/controller/cmcd-controller.ts index 8c92c3d2f..3aaf40132 100644 --- a/src/controller/cmcd-controller.ts +++ b/src/controller/cmcd-controller.ts @@ -83,7 +83,7 @@ export default class CMCDController implements ComponentAPI { private onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) { this.media = data.media; this.media.addEventListener('waiting', this.onWaiting); @@ -104,7 +104,7 @@ export default class CMCDController implements ComponentAPI { private onBufferCreated( event: Events.BUFFER_CREATED, - data: BufferCreatedData + data: BufferCreatedData, ) { this.audioBuffer = data.tracks.audio?.buffer; this.videoBuffer = data.tracks.video?.buffer; @@ -297,7 +297,7 @@ export default class CMCDController implements ComponentAPI { const info = BufferHelper.bufferInfo( buffer, media.currentTime, - this.config.maxBufferHole + this.config.maxBufferHole, ); return info.len * 1000; @@ -337,7 +337,7 @@ export default class CMCDController implements ComponentAPI { load( context: PlaylistLoaderContext, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ) { apply(context); this.loader.load(context, config, callbacks); @@ -379,7 +379,7 @@ export default class CMCDController implements ComponentAPI { load( context: FragmentLoaderContext, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ) { apply(context); this.loader.load(context, config, callbacks); diff --git a/src/controller/content-steering-controller.ts b/src/controller/content-steering-controller.ts index 60e5445ae..0a33d8200 100644 --- a/src/controller/content-steering-controller.ts +++ b/src/controller/content-steering-controller.ts @@ -96,7 +96,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { if (this.updated) { const ttl = Math.max( this.timeToLoad * 1000 - (performance.now() - this.updated), - 0 + 0, ); this.scheduleRefresh(this.uri, ttl); } else { @@ -148,7 +148,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { private onManifestLoaded( event: Events.MANIFEST_LOADED, - data: ManifestLoadedData + data: ManifestLoadedData, ) { const { contentSteering } = data; if (contentSteering === null) { @@ -163,7 +163,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { private onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ) { this.audioTracks = data.audioTracks; this.subtitleTracks = data.subtitleTracks; @@ -203,14 +203,14 @@ export default class ContentSteeringController implements NetworkComponentAPI { if (pathwayLevels.length === 0) { const pathwayId = levels[0].pathwayId; this.log( - `No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to "${pathwayId}"` + `No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to "${pathwayId}"`, ); pathwayLevels = this.getLevelsForPathway(pathwayId); this.pathwayId = pathwayId; } if (pathwayLevels.length !== levels.length) { this.log( - `Found ${pathwayLevels.length}/${levels.length} levels in Pathway "${this.pathwayId}"` + `Found ${pathwayLevels.length}/${levels.length} levels in Pathway "${this.pathwayId}"`, ); return pathwayLevels; } @@ -261,7 +261,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { levelAfterChange.bitrate !== selectedLevel.bitrate ) { this.log( - `Unstable Pathways change from bitrate ${selectedLevel.bitrate} to ${levelAfterChange.bitrate}` + `Unstable Pathways change from bitrate ${selectedLevel.bitrate} to ${levelAfterChange.bitrate}`, ); } this.hls.nextLoadLevel = selectedIndex; @@ -295,7 +295,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { baseLevel.uri, baseLevel.attrs['STABLE-VARIANT-ID'], 'PER-VARIANT-URIS', - uriReplacement + uriReplacement, ); const attributes = new AttrList(baseLevel.attrs); attributes['PATHWAY-ID'] = cloneId; @@ -316,20 +316,20 @@ export default class ContentSteeringController implements NetworkComponentAPI { addGroupId(clonedLevel, 'audio', clonedAudioGroupId); addGroupId(clonedLevel, 'text', clonedSubtitleGroupId); return clonedLevel; - } + }, ); levels.push(...clonedVariants); cloneRenditionGroups( this.audioTracks, audioGroupCloneMap, uriReplacement, - cloneId + cloneId, ); cloneRenditionGroups( this.subtitleTracks, subtitleGroupCloneMap, uriReplacement, - cloneId + cloneId, ); }); } @@ -377,7 +377,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { response: LoaderResponse, stats: LoaderStats, context: LoaderContext, - networkDetails: any + networkDetails: any, ) => { this.log(`Loaded steering manifest: "${url}"`); const steeringData = response.data as SteeringManifest; @@ -398,7 +398,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { } catch (error) { this.enabled = false; this.log( - `Failed to parse Steering Manifest RELOAD-URI: ${reloadUri}` + `Failed to parse Steering Manifest RELOAD-URI: ${reloadUri}`, ); return; } @@ -423,10 +423,10 @@ export default class ContentSteeringController implements NetworkComponentAPI { error: { code: number; text: string }, context: LoaderContext, networkDetails: any, - stats: LoaderStats + stats: LoaderStats, ) => { this.log( - `Error loading steering manifest: ${error.code} ${error.text} (${context.url})` + `Error loading steering manifest: ${error.code} ${error.text} (${context.url})`, ); this.stopLoad(); if (error.code === 410) { @@ -452,7 +452,7 @@ export default class ContentSteeringController implements NetworkComponentAPI { onTimeout: ( stats: LoaderStats, context: LoaderContext, - networkDetails: any + networkDetails: any, ) => { this.log(`Timeout loading steering manifest (${context.url})`); this.scheduleRefresh(this.uri || context.url); @@ -475,7 +475,7 @@ function cloneRenditionGroups( tracks: MediaPlaylist[] | null, groupCloneMap: Record, uriReplacement: UriReplacement, - cloneId: string + cloneId: string, ) { if (!tracks) { return; @@ -491,7 +491,7 @@ function cloneRenditionGroups( track.url, track.attrs['STABLE-RENDITION-ID'], 'PER-RENDITION-URIS', - uriReplacement + uriReplacement, ); clonedTrack.groupId = clonedTrack.attrs['GROUP-ID'] = groupCloneMap[audioGroupId]; @@ -506,7 +506,7 @@ function performUriReplacement( uri: string, stableId: string | undefined, perOptionKey: 'PER-VARIANT-URIS' | 'PER-RENDITION-URIS', - uriReplacement: UriReplacement + uriReplacement: UriReplacement, ): string { const { HOST: host, diff --git a/src/controller/eme-controller.ts b/src/controller/eme-controller.ts index ff9092da8..a623c542c 100644 --- a/src/controller/eme-controller.ts +++ b/src/controller/eme-controller.ts @@ -148,7 +148,7 @@ class EMEController implements ComponentAPI { } throw new Error( - `no license server URL configured for key-system "${keySystem}"` + `no license server URL configured for key-system "${keySystem}"`, ); } @@ -164,7 +164,7 @@ class EMEController implements ComponentAPI { } private attemptKeySystemAccess( - keySystemsToAttempt: KeySystems[] + keySystemsToAttempt: KeySystems[], ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> { const levels = this.hls.levels; const uniqueCodec = (value: string | undefined, i, a): value is string => @@ -185,7 +185,7 @@ class EMEController implements ComponentAPI { keySystem: KeySystems; mediaKeys: MediaKeys; }) => void, - reject: (Error) => void + reject: (Error) => void, ) => { const attempt = (keySystems) => { const keySystem = keySystems.shift(); @@ -205,20 +205,20 @@ class EMEController implements ComponentAPI { error, fatal: true, }, - error.message - ) + error.message, + ), ); } }); }; attempt(keySystemsToAttempt); - } + }, ); } private requestMediaKeySystemAccess( keySystem: KeySystems, - supportedConfigurations: MediaKeySystemConfiguration[] + supportedConfigurations: MediaKeySystemConfiguration[], ): Promise { const { requestMediaKeySystemAccessFunc } = this.config; if (!(typeof requestMediaKeySystemAccessFunc === 'function')) { @@ -238,14 +238,14 @@ class EMEController implements ComponentAPI { private getMediaKeysPromise( keySystem: KeySystems, audioCodecs: string[], - videoCodecs: string[] + videoCodecs: string[], ): Promise { // This can throw, but is caught in event handler callpath const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations( keySystem, audioCodecs, videoCodecs, - this.config.drmSystemOptions + this.config.drmSystemOptions, ); const keySystemAccessPromises: KeySystemAccessPromises = this.keySystemAccessPromises[keySystem]; @@ -253,12 +253,12 @@ class EMEController implements ComponentAPI { if (!keySystemAccess) { this.log( `Requesting encrypted media "${keySystem}" key-system access with config: ${JSON.stringify( - mediaKeySystemConfigs - )}` + mediaKeySystemConfigs, + )}`, ); keySystemAccess = this.requestMediaKeySystemAccess( keySystem, - mediaKeySystemConfigs + mediaKeySystemConfigs, ); const keySystemAccessPromises: KeySystemAccessPromises = (this.keySystemAccessPromises[keySystem] = { @@ -266,12 +266,12 @@ class EMEController implements ComponentAPI { }); keySystemAccess.catch((error) => { this.log( - `Failed to obtain access to key-system "${keySystem}": ${error}` + `Failed to obtain access to key-system "${keySystem}": ${error}`, ); }); return keySystemAccess.then((mediaKeySystemAccess) => { this.log( - `Access for key-system "${mediaKeySystemAccess.keySystem}" obtained` + `Access for key-system "${mediaKeySystemAccess.keySystem}" obtained`, ); const certificateRequest = this.fetchServerCertificate(keySystem); @@ -286,7 +286,7 @@ class EMEController implements ComponentAPI { return this.setMediaKeysServerCertificate( mediaKeys, keySystem, - certificate + certificate, ); } return mediaKeys; @@ -295,7 +295,7 @@ class EMEController implements ComponentAPI { keySystemAccessPromises.mediaKeys.catch((error) => { this.error( - `Failed to create media-keys for "${keySystem}"}: ${error}` + `Failed to create media-keys for "${keySystem}"}: ${error}`, ); }); @@ -316,8 +316,8 @@ class EMEController implements ComponentAPI { }): MediaKeySessionContext { this.log( `Creating key-system session "${keySystem}" keyId: ${Hex.hexDump( - decryptdata.keyId! || [] - )}` + decryptdata.keyId! || [], + )}`, ); const mediaKeysSession = mediaKeys.createSession(); @@ -339,7 +339,7 @@ class EMEController implements ComponentAPI { const decryptdata = mediaKeySessionContext.decryptdata; if (decryptdata.pssh) { const keySessionContext = this.createMediaKeySessionContext( - mediaKeySessionContext + mediaKeySessionContext, ); const keyId = this.getKeyIdString(decryptdata); const scheme = 'cenc'; @@ -348,7 +348,7 @@ class EMEController implements ComponentAPI { keySessionContext, scheme, decryptdata.pssh, - 'expired' + 'expired', ); } else { this.warn(`Could not renew expired session. Missing pssh initData.`); @@ -368,14 +368,14 @@ class EMEController implements ComponentAPI { private updateKeySession( mediaKeySessionContext: MediaKeySessionContext, - data: Uint8Array + data: Uint8Array, ): Promise { const keySession = mediaKeySessionContext.mediaKeysSession; this.log( `Updating key-session "${keySession.sessionId}" for keyID ${Hex.hexDump( - mediaKeySessionContext.decryptdata?.keyId! || [] + mediaKeySessionContext.decryptdata?.keyId! || [], )} - } (data length: ${data ? data.byteLength : data})` + } (data length: ${data ? data.byteLength : data})`, ); return keySession.update(data); } @@ -386,7 +386,7 @@ class EMEController implements ComponentAPI { this.log( `Selecting key-system from fragment (sn: ${frag.sn} ${frag.type}: ${ frag.level - }) key formats ${keyFormats.join(', ')}` + }) key formats ${keyFormats.join(', ')}`, ); this.keyFormatPromise = this.getKeyFormatPromise(keyFormats); } @@ -394,14 +394,14 @@ class EMEController implements ComponentAPI { } private getKeyFormatPromise( - keyFormats: KeySystemFormats[] + keyFormats: KeySystemFormats[], ): Promise { return new Promise((resolve, reject) => { const keySystemsInConfig = getKeySystemsForConfig(this.config); const keySystemsToAttempt = keyFormats .map(keySystemFormatToKeySystemDomain) .filter( - (value) => !!value && keySystemsInConfig.indexOf(value) !== -1 + (value) => !!value && keySystemsInConfig.indexOf(value) !== -1, ) as any as KeySystems[]; return this.getKeySystemSelectionPromise(keySystemsToAttempt) .then(({ keySystem }) => { @@ -410,7 +410,7 @@ class EMEController implements ComponentAPI { resolve(keySystemFormat); } else { reject( - new Error(`Unable to find format for key-system "${keySystem}"`) + new Error(`Unable to find format for key-system "${keySystem}"`), ); } }) @@ -433,7 +433,7 @@ class EMEController implements ComponentAPI { ({ keySystem, mediaKeys }) => { this.throwIfDestroyed(); this.log( - `Handle encrypted media sn: ${data.frag.sn} ${data.frag.type}: ${data.frag.level} using key ${keyDetails}` + `Handle encrypted media sn: ${data.frag.sn} ${data.frag.type}: ${data.frag.level} using key ${keyDetails}`, ); return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => { @@ -448,10 +448,10 @@ class EMEController implements ComponentAPI { keySessionContext, scheme, decryptdata.pssh, - 'playlist-key' + 'playlist-key', ); }); - } + }, ); keySessionContextPromise.catch((error) => this.handleError(error)); @@ -484,13 +484,13 @@ class EMEController implements ComponentAPI { } private getKeySystemForKeyPromise( - decryptdata: LevelKey + decryptdata: LevelKey, ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> { const keyId = this.getKeyIdString(decryptdata); const mediaKeySessionContext = this.keyIdToKeySessionPromise[keyId]; if (!mediaKeySessionContext) { const keySystem = keySystemFormatToKeySystemDomain( - decryptdata.keyFormat as KeySystemFormats + decryptdata.keyFormat as KeySystemFormats, ); const keySystemsToAttempt = keySystem ? [keySystem] @@ -501,7 +501,7 @@ class EMEController implements ComponentAPI { } private getKeySystemSelectionPromise( - keySystemsToAttempt: KeySystems[] + keySystemsToAttempt: KeySystems[], ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> | never { if (!keySystemsToAttempt.length) { keySystemsToAttempt = getKeySystemsForConfig(this.config); @@ -515,7 +515,7 @@ class EMEController implements ComponentAPI { }, `Missing key-system license configuration options ${JSON.stringify({ drmSystems: this.config.drmSystems, - })}` + })}`, ); } return this.attemptKeySystemAccess(keySystemsToAttempt); @@ -565,7 +565,7 @@ class EMEController implements ComponentAPI { keyId = psshInfo.data.subarray(8, 24); } keySystemDomain = keySystemIdToKeySystemDomain( - psshInfo.systemId as KeySystemIds + psshInfo.systemId as KeySystemIds, ); } @@ -599,7 +599,7 @@ class EMEController implements ComponentAPI { keyContext, initDataType, initData, - 'encrypted-event-key-match' + 'encrypted-event-key-match', ); }); break; @@ -615,7 +615,7 @@ class EMEController implements ComponentAPI { const decryptdata = new LevelKey( 'ISO-23001-7', keyIdHex, - keySystemToKeySystemFormat(keySystem) ?? '' + keySystemToKeySystemFormat(keySystem) ?? '', ); decryptdata.pssh = new Uint8Array(initData); decryptdata.keyId = keyId as Uint8Array; @@ -630,10 +630,10 @@ class EMEController implements ComponentAPI { keySessionContext, initDataType, initData, - 'encrypted-event-no-match' + 'encrypted-event-no-match', ); }); - } + }, ); } keySessionContextPromise.catch((error) => this.handleError(error)); @@ -645,7 +645,7 @@ class EMEController implements ComponentAPI { private attemptSetMediaKeys( keySystem: KeySystems, - mediaKeys: MediaKeys + mediaKeys: MediaKeys, ): Promise { const queue = this.setMediaKeysQueue.slice(); @@ -655,7 +655,7 @@ class EMEController implements ComponentAPI { const setMediaKeysPromise = Promise.all(queue).then(() => { if (!this.media) { throw new Error( - 'Attempted to set mediaKeys without media element attached' + 'Attempted to set mediaKeys without media element attached', ); } return this.media.setMediaKeys(mediaKeys); @@ -665,7 +665,7 @@ class EMEController implements ComponentAPI { this.log(`Media-keys set for "${keySystem}"`); queue.push(setMediaKeysPromise!); this.setMediaKeysQueue = this.setMediaKeysQueue.filter( - (p) => queue.indexOf(p) === -1 + (p) => queue.indexOf(p) === -1, ); }); } @@ -678,7 +678,7 @@ class EMEController implements ComponentAPI { | 'playlist-key' | 'encrypted-event-key-match' | 'encrypted-event-no-match' - | 'expired' + | 'expired', ): Promise | never { const generateRequestFilter = this.config.drmSystems?.[context.keySystem]?.generateRequest; @@ -688,7 +688,7 @@ class EMEController implements ComponentAPI { generateRequestFilter.call(this.hls, initDataType, initData, context); if (!mappedInitData) { throw new Error( - 'Invalid response from configured generateRequest filter' + 'Invalid response from configured generateRequest filter', ); } initDataType = mappedInitData.initDataType; @@ -712,7 +712,7 @@ class EMEController implements ComponentAPI { this.log( `Generating key-session request for "${reason}": ${keyId} (init data type: ${initDataType} length: ${ initData ? initData.byteLength : null - })` + })`, ); const licenseStatus = new EventEmitter(); @@ -725,7 +725,7 @@ class EMEController implements ComponentAPI { } const { messageType, message } = event; this.log( - `"${messageType}" message event for session "${keySession.sessionId}" message size: ${message.byteLength}` + `"${messageType}" message event for session "${keySession.sessionId}" message size: ${message.byteLength}`, ); if ( messageType === 'license-request' || @@ -746,7 +746,7 @@ class EMEController implements ComponentAPI { }; context.mediaKeysSession.onkeystatuseschange = ( - event: MediaKeyMessageEvent + event: MediaKeyMessageEvent, ) => { const keySession = context.mediaKeysSession; if (!keySession) { @@ -777,8 +777,8 @@ class EMEController implements ComponentAPI { details: ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED, fatal: false, }, - 'HDCP level output restricted' - ) + 'HDCP level output restricted', + ), ); } else if (keyStatus === 'internal-error') { reject( @@ -788,8 +788,8 @@ class EMEController implements ComponentAPI { details: ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR, fatal: true, }, - `key status changed to "${keyStatus}"` - ) + `key status changed to "${keyStatus}"`, + ), ); } else if (keyStatus === 'expired') { reject(new Error('key expired while generating request')); @@ -797,14 +797,14 @@ class EMEController implements ComponentAPI { this.warn(`unhandled key status change "${keyStatus}"`); } }); - } + }, ); return context.mediaKeysSession .generateRequest(initDataType, initData) .then(() => { this.log( - `Request generated for key-session "${context.mediaKeysSession?.sessionId}" keyId: ${keyId}` + `Request generated for key-session "${context.mediaKeysSession?.sessionId}" keyId: ${keyId}`, ); }) .catch((error) => { @@ -815,7 +815,7 @@ class EMEController implements ComponentAPI { error, fatal: false, }, - `Error generating key-session request: ${error}` + `Error generating key-session request: ${error}`, ); }) .then(() => keyUsablePromise) @@ -837,18 +837,18 @@ class EMEController implements ComponentAPI { `key status change "${status}" for keyStatuses keyId: ${Hex.hexDump( 'buffer' in keyId ? new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength) - : new Uint8Array(keyId) + : new Uint8Array(keyId), )} session keyId: ${Hex.hexDump( - new Uint8Array(mediaKeySessionContext.decryptdata.keyId || []) - )} uri: ${mediaKeySessionContext.decryptdata.uri}` + new Uint8Array(mediaKeySessionContext.decryptdata.keyId || []), + )} uri: ${mediaKeySessionContext.decryptdata.uri}`, ); mediaKeySessionContext.keyStatus = status; - } + }, ); } private fetchServerCertificate( - keySystem: KeySystems + keySystem: KeySystems, ): Promise { const config = this.config; const Loader = config.loader; @@ -890,8 +890,8 @@ class EMEController implements ComponentAPI { ...response, }, }, - `"${keySystem}" certificate request failed (${url}). Status: ${response.code} (${response.text})` - ) + `"${keySystem}" certificate request failed (${url}). Status: ${response.code} (${response.text})`, + ), ); }, onTimeout: (stats, context, networkDetails) => { @@ -908,8 +908,8 @@ class EMEController implements ComponentAPI { data: undefined, }, }, - `"${keySystem}" certificate request timed out (${url})` - ) + `"${keySystem}" certificate request timed out (${url})`, + ), ); }, onAbort: (stats, context, networkDetails) => { @@ -923,7 +923,7 @@ class EMEController implements ComponentAPI { private setMediaKeysServerCertificate( mediaKeys: MediaKeys, keySystem: KeySystems, - cert: BufferSource + cert: BufferSource, ): Promise { return new Promise((resolve, reject) => { mediaKeys @@ -932,7 +932,7 @@ class EMEController implements ComponentAPI { this.log( `setServerCertificate ${ success ? 'success' : 'not supported by CDM' - } (${cert?.byteLength}) on "${keySystem}"` + } (${cert?.byteLength}) on "${keySystem}"`, ); resolve(mediaKeys); }) @@ -946,8 +946,8 @@ class EMEController implements ComponentAPI { error, fatal: true, }, - error.message - ) + error.message, + ), ); }); }); @@ -955,7 +955,7 @@ class EMEController implements ComponentAPI { private renewLicense( context: MediaKeySessionContext, - keyMessage: ArrayBuffer + keyMessage: ArrayBuffer, ): Promise { return this.requestLicense(context, new Uint8Array(keyMessage)).then( (data: ArrayBuffer) => { @@ -968,17 +968,17 @@ class EMEController implements ComponentAPI { error, fatal: true, }, - error.message + error.message, ); - } + }, ); - } + }, ); } private unpackPlayReadyKeyMessage( xhr: XMLHttpRequest, - licenseChallenge: Uint8Array + licenseChallenge: Uint8Array, ): Uint8Array { // On Edge, the raw license message is UTF-16-encoded XML. We need // to unpack the Challenge element (base64-encoded string containing the @@ -987,7 +987,7 @@ class EMEController implements ComponentAPI { // For PlayReady CDMs, we need to dig the Challenge out of the XML. const xmlString = String.fromCharCode.apply( null, - new Uint16Array(licenseChallenge.buffer) + new Uint16Array(licenseChallenge.buffer), ); if (!xmlString.includes('PlayReadyKeyMessage')) { // This does not appear to be a wrapped message as on Edge. Some @@ -999,7 +999,7 @@ class EMEController implements ComponentAPI { } const keyMessageXml = new DOMParser().parseFromString( xmlString, - 'application/xml' + 'application/xml', ); // Set request headers. const headers = keyMessageXml.querySelectorAll('HttpHeader'); @@ -1026,7 +1026,7 @@ class EMEController implements ComponentAPI { xhr: XMLHttpRequest, url: string, keysListItem: MediaKeySessionContext, - licenseChallenge: Uint8Array + licenseChallenge: Uint8Array, ): Promise<{ xhr: XMLHttpRequest; licenseChallenge: Uint8Array }> { const licenseXhrSetup = this.config.licenseXhrSetup; @@ -1046,7 +1046,7 @@ class EMEController implements ComponentAPI { xhr, url, keysListItem, - licenseChallenge + licenseChallenge, ); }) .catch((error: Error) => { @@ -1062,7 +1062,7 @@ class EMEController implements ComponentAPI { xhr, url, keysListItem, - licenseChallenge + licenseChallenge, ); }) .then((licenseXhrSetupResult) => { @@ -1079,7 +1079,7 @@ class EMEController implements ComponentAPI { private requestLicense( keySessionContext: MediaKeySessionContext, - licenseChallenge: Uint8Array + licenseChallenge: Uint8Array, ): Promise { const keyLoadPolicy = this.config.keyLoadPolicy.default; return new Promise((resolve, reject) => { @@ -1098,7 +1098,7 @@ class EMEController implements ComponentAPI { this.log( `License received ${ data instanceof ArrayBuffer ? data.byteLength : data - }` + }`, ); const licenseResponseCallback = this.config.licenseResponseCallback; if (licenseResponseCallback) { @@ -1107,7 +1107,7 @@ class EMEController implements ComponentAPI { this.hls, xhr, url, - keySessionContext + keySessionContext, ); } catch (error) { this.error(error); @@ -1136,18 +1136,18 @@ class EMEController implements ComponentAPI { text: xhr.statusText, }, }, - `License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})` - ) + `License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})`, + ), ); } else { const attemptsLeft = maxNumRetry - this._requestLicenseFailureCount + 1; this.warn( - `Retrying license request, ${attemptsLeft} attempts left` + `Retrying license request, ${attemptsLeft} attempts left`, ); this.requestLicense(keySessionContext, licenseChallenge).then( resolve, - reject + reject, ); } } @@ -1166,18 +1166,18 @@ class EMEController implements ComponentAPI { if (keySessionContext.keySystem == KeySystems.PLAYREADY) { licenseChallenge = this.unpackPlayReadyKeyMessage( xhr, - licenseChallenge + licenseChallenge, ); } xhr.send(licenseChallenge); - } + }, ); }); } private onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) { if (!this.config.emeEnabled) { return; @@ -1212,15 +1212,15 @@ class EMEController implements ComponentAPI { EMEController.CDMCleanupPromise = Promise.all( mediaKeysList .map((mediaKeySessionContext) => - this.removeSession(mediaKeySessionContext) + this.removeSession(mediaKeySessionContext), ) .concat( media?.setMediaKeys(null).catch((error) => { this.log( - `Could not clear media keys: ${error}. media.src: ${media?.src}` + `Could not clear media keys: ${error}. media.src: ${media?.src}`, ); - }) - ) + }), + ), ) .then(() => { if (keySessionCount) { @@ -1230,7 +1230,7 @@ class EMEController implements ComponentAPI { }) .catch((error) => { this.log( - `Could not close sessions and clear media keys: ${error}. media.src: ${media?.src}` + `Could not close sessions and clear media keys: ${error}. media.src: ${media?.src}`, ); }); } @@ -1241,7 +1241,7 @@ class EMEController implements ComponentAPI { private onManifestLoaded( event: Events.MANIFEST_LOADED, - { sessionKeys }: ManifestLoadedData + { sessionKeys }: ManifestLoadedData, ) { if (!sessionKeys || !this.config.emeEnabled) { return; @@ -1256,22 +1256,22 @@ class EMEController implements ComponentAPI { } return formats; }, - [] + [], ); this.log( - `Selecting key-system from session-keys ${keyFormats.join(', ')}` + `Selecting key-system from session-keys ${keyFormats.join(', ')}`, ); this.keyFormatPromise = this.getKeyFormatPromise(keyFormats); } } private removeSession( - mediaKeySessionContext: MediaKeySessionContext + mediaKeySessionContext: MediaKeySessionContext, ): Promise | void { const { mediaKeysSession, licenseXhr } = mediaKeySessionContext; if (mediaKeysSession) { this.log( - `Remove licenses and keys and close session ${mediaKeysSession.sessionId}` + `Remove licenses and keys and close session ${mediaKeysSession.sessionId}`, ); mediaKeysSession.onmessage = null; mediaKeysSession.onkeystatuseschange = null; @@ -1305,7 +1305,7 @@ class EMEKeyError extends Error { public readonly data: ErrorData; constructor( data: Omit & { error?: Error }, - message: string + message: string, ) { super(message); data.error ||= new Error(message); diff --git a/src/controller/error-controller.ts b/src/controller/error-controller.ts index a3949bfb9..49c38af40 100644 --- a/src/controller/error-controller.ts +++ b/src/controller/error-controller.ts @@ -159,7 +159,7 @@ export default class ErrorController implements NetworkComponentAPI { ) { data.errorAction = this.getPlaylistRetryOrSwitchAction( data, - levelIndex + levelIndex, ); } else { // Escalate to fatal if not retrying or switching @@ -173,7 +173,7 @@ export default class ErrorController implements NetworkComponentAPI { if (typeof context?.level === 'number') { data.errorAction = this.getPlaylistRetryOrSwitchAction( data, - context.level + context.level, ); } return; @@ -194,7 +194,7 @@ export default class ErrorController implements NetworkComponentAPI { // otherwise allow playlist retry count to reach max error retries data.errorAction = this.getPlaylistRetryOrSwitchAction( data, - hls.loadLevel + hls.loadLevel, ); data.errorAction.action = NetworkErrorAction.SendAlternateToPenaltyBox; @@ -224,7 +224,7 @@ export default class ErrorController implements NetworkComponentAPI { case ErrorDetails.BUFFER_APPEND_ERROR: data.errorAction = this.getLevelSwitchAction( data, - data.level ?? hls.loadLevel + data.level ?? hls.loadLevel, ); return; case ErrorDetails.INTERNAL_EXCEPTION: @@ -255,7 +255,7 @@ export default class ErrorController implements NetworkComponentAPI { private getPlaylistRetryOrSwitchAction( data: ErrorData, - levelIndex: number | null | undefined + levelIndex: number | null | undefined, ): IErrorAction { const hls = this.hls; const retryConfig = getRetryConfig(hls.config.playlistLoadPolicy, data); @@ -265,7 +265,7 @@ export default class ErrorController implements NetworkComponentAPI { retryConfig, retryCount, isTimeoutError(data), - httpStatus + httpStatus, ); if (retry) { return { @@ -292,11 +292,11 @@ export default class ErrorController implements NetworkComponentAPI { const { fragLoadPolicy, keyLoadPolicy } = hls.config; const retryConfig = getRetryConfig( data.details.startsWith('key') ? keyLoadPolicy : fragLoadPolicy, - data + data, ); const fragmentErrors = hls.levels.reduce( (acc, level) => acc + level.fragmentError, - 0 + 0, ); // Switch levels when out of retried or level index out of bounds if (level) { @@ -308,7 +308,7 @@ export default class ErrorController implements NetworkComponentAPI { retryConfig, fragmentErrors, isTimeoutError(data), - httpStatus + httpStatus, ); if (retry) { return { @@ -332,7 +332,7 @@ export default class ErrorController implements NetworkComponentAPI { private getLevelSwitchAction( data: ErrorData, - levelIndex: number | null | undefined + levelIndex: number | null | undefined, ): IErrorAction { const hls = this.hls; if (levelIndex === null || levelIndex === undefined) { @@ -371,7 +371,7 @@ export default class ErrorController implements NetworkComponentAPI { isVideoCodecError && levels.some( ({ codecSet, audioCodec }) => - level.codecSet !== codecSet && level.audioCodec === audioCodec + level.codecSet !== codecSet && level.audioCodec === audioCodec, ); const { type: playlistErrorType, groupId: playlistErrorGroupId } = data.context ?? {}; @@ -391,7 +391,7 @@ export default class ErrorController implements NetworkComponentAPI { const fragCandidate = findFragmentByPTS( data.frag, levelDetails.fragments, - data.frag.start + data.frag.start, ); if (fragCandidate?.gap) { continue; @@ -491,7 +491,7 @@ export default class ErrorController implements NetworkComponentAPI { errorAction.resolved = true; } this.warn( - `Restricting playback to HDCP-LEVEL of "${hls.maxHdcpLevel}" or lower` + `Restricting playback to HDCP-LEVEL of "${hls.maxHdcpLevel}" or lower`, ); break; } @@ -536,7 +536,7 @@ export default class ErrorController implements NetworkComponentAPI { this.warn( `Switching to Redundant Stream ${newUrlId + 1}/${redundantLevels}: "${ level.url[newUrlId] - }" after ${data.details}` + }" after ${data.details}`, ); this.playlistError = 0; hls.levels.forEach((lv) => { @@ -566,7 +566,7 @@ export default class ErrorController implements NetworkComponentAPI { function checkExpired( penalizedRendition: PenalizedRendition, data: ErrorData, - currentPenaltyState: PenalizedRendition | undefined + currentPenaltyState: PenalizedRendition | undefined, ): boolean { // Expire penalty for switching back to rendition after RENDITION_PENALTY_DURATION_MS if ( @@ -582,7 +582,7 @@ function checkExpired( const candidateFrag = findFragmentByPTS( null, lastErrorDetails.fragments, - position + position, ); if (candidateFrag && !candidateFrag.gap) { return true; diff --git a/src/controller/fps-controller.ts b/src/controller/fps-controller.ts index 62f010229..8419f3f9c 100644 --- a/src/controller/fps-controller.ts +++ b/src/controller/fps-controller.ts @@ -46,7 +46,7 @@ class FPSController implements ComponentAPI { protected onMediaAttaching( event: Events.MEDIA_ATTACHING, - data: MediaAttachingData + data: MediaAttachingData, ) { const config = this.hls.config; if (config.capLevelOnFPSDrop) { @@ -60,7 +60,7 @@ class FPSController implements ComponentAPI { self.clearInterval(this.timer); this.timer = self.setInterval( this.checkFPSInterval.bind(this), - config.fpsDroppedMonitoringPeriod + config.fpsDroppedMonitoringPeriod, ); } } @@ -68,7 +68,7 @@ class FPSController implements ComponentAPI { checkFPS( video: HTMLVideoElement, decodedFrames: number, - droppedFrames: number + droppedFrames: number, ) { const currentTime = performance.now(); if (decodedFrames) { @@ -92,7 +92,7 @@ class FPSController implements ComponentAPI { let currentLevel = hls.currentLevel; logger.warn( 'drop FPS ratio greater than max allowed value for currentLevel: ' + - currentLevel + currentLevel, ); if ( currentLevel > 0 && @@ -124,14 +124,14 @@ class FPSController implements ComponentAPI { this.checkFPS( video, videoPlaybackQuality.totalVideoFrames, - videoPlaybackQuality.droppedVideoFrames + videoPlaybackQuality.droppedVideoFrames, ); } else { // HTMLVideoElement doesn't include the webkit types this.checkFPS( video, (video as any).webkitDecodedFrameCount as number, - (video as any).webkitDroppedFrameCount as number + (video as any).webkitDroppedFrameCount as number, ); } } diff --git a/src/controller/fragment-finders.ts b/src/controller/fragment-finders.ts index 8be62d979..51aa92313 100644 --- a/src/controller/fragment-finders.ts +++ b/src/controller/fragment-finders.ts @@ -10,7 +10,7 @@ import { Fragment } from '../loader/fragment'; export function findFragmentByPDT( fragments: Array, PDTValue: number | null, - maxFragLookUpTolerance: number + maxFragLookUpTolerance: number, ): Fragment | null { if ( PDTValue === null || @@ -57,7 +57,7 @@ export function findFragmentByPTS( fragPrevious: Fragment | null, fragments: Array, bufferEnd: number = 0, - maxFragLookUpTolerance: number = 0 + maxFragLookUpTolerance: number = 0, ): Fragment | null { let fragNext: Fragment | null = null; if (fragPrevious) { @@ -79,7 +79,7 @@ export function findFragmentByPTS( // We might be seeking past the tolerance so find the best match const foundFragment = BinarySearch.search( fragments, - fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance) + fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance), ); if (foundFragment && (foundFragment !== fragPrevious || !fragNext)) { return foundFragment; @@ -98,7 +98,7 @@ export function findFragmentByPTS( export function fragmentWithinToleranceTest( bufferEnd = 0, maxFragLookUpTolerance = 0, - candidate: Fragment + candidate: Fragment, ) { // eagerly accept an accurate match (no tolerance) if ( @@ -123,7 +123,7 @@ export function fragmentWithinToleranceTest( // Set the lookup tolerance to be small enough to detect the current segment - ensures we don't skip over very small segments const candidateLookupTolerance = Math.min( maxFragLookUpTolerance, - candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0) + candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0), ); if ( candidate.start + candidate.duration - candidateLookupTolerance <= @@ -152,12 +152,12 @@ export function fragmentWithinToleranceTest( export function pdtWithinToleranceTest( pdtBufferEnd: number, maxFragLookUpTolerance: number, - candidate: Fragment + candidate: Fragment, ): boolean { const candidateLookupTolerance = Math.min( maxFragLookUpTolerance, - candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0) + candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0), ) * 1000; // endProgramDateTime can be null, default to zero @@ -167,7 +167,7 @@ export function pdtWithinToleranceTest( export function findFragWithCC( fragments: Fragment[], - cc: number + cc: number, ): Fragment | null { return BinarySearch.search(fragments, (candidate) => { if (candidate.cc < cc) { diff --git a/src/controller/fragment-tracker.ts b/src/controller/fragment-tracker.ts index 66ba26c89..4a61e30e8 100644 --- a/src/controller/fragment-tracker.ts +++ b/src/controller/fragment-tracker.ts @@ -77,7 +77,7 @@ export class FragmentTracker implements ComponentAPI { */ public getAppendedFrag( position: number, - levelType: PlaylistLevelType + levelType: PlaylistLevelType, ): Fragment | Part | null { const activeParts = this.activePartLists[levelType]; if (activeParts) { @@ -106,7 +106,7 @@ export class FragmentTracker implements ComponentAPI { */ public getBufferedFrag( position: number, - levelType: PlaylistLevelType + levelType: PlaylistLevelType, ): Fragment | null { const { fragments } = this; const keys = Object.keys(fragments); @@ -131,7 +131,7 @@ export class FragmentTracker implements ComponentAPI { elementaryStream: SourceBufferName, timeRange: TimeRanges, playlistType: PlaylistLevelType, - appendedPart?: Part | null + appendedPart?: Part | null, ) { if (this.timeRanges) { this.timeRanges[elementaryStream] = timeRange; @@ -161,7 +161,7 @@ export class FragmentTracker implements ComponentAPI { const isNotBuffered = !this.isTimeBuffered( time.startPTS, time.endPTS, - timeRange + timeRange, ); if (isNotBuffered) { // Unregister partial fragment as it needs to load again to be reused @@ -200,7 +200,7 @@ export class FragmentTracker implements ComponentAPI { frag, part, partial, - timeRange + timeRange, ); }); fragmentEntity.loaded = null; @@ -225,7 +225,7 @@ export class FragmentTracker implements ComponentAPI { return; } this.activePartLists[levelType] = activeParts.filter( - (part) => (part.fragment.sn as number) >= snToKeep + (part) => (part.fragment.sn as number) >= snToKeep, ); } @@ -254,7 +254,7 @@ export class FragmentTracker implements ComponentAPI { fragment: Fragment, part: Part | null, partial: boolean, - timeRange: TimeRanges + timeRange: TimeRanges, ): FragmentBufferedRange { const buffered: FragmentBufferedRange = { time: [], @@ -354,7 +354,7 @@ export class FragmentTracker implements ComponentAPI { private isTimeBuffered( startPTS: number, endPTS: number, - timeRange: TimeRanges + timeRange: TimeRanges, ): boolean { let startTime; let endTime; @@ -397,7 +397,7 @@ export class FragmentTracker implements ComponentAPI { private onBufferAppended( event: Events.BUFFER_APPENDED, - data: BufferAppendedData + data: BufferAppendedData, ) { const { frag, part, timeRanges } = data; if (frag.sn === 'initSegment') { @@ -419,7 +419,7 @@ export class FragmentTracker implements ComponentAPI { elementaryStream, timeRange, playlistType, - part + part, ); }); } @@ -442,7 +442,7 @@ export class FragmentTracker implements ComponentAPI { end: number, playlistType: PlaylistLevelType, withGapOnly?: boolean, - unbufferedOnly?: boolean + unbufferedOnly?: boolean, ) { if (withGapOnly && !this.hasGaps) { return; @@ -474,7 +474,7 @@ export class FragmentTracker implements ComponentAPI { if (activeParts) { const snToRemove = fragment.sn; this.activePartLists[fragment.type] = activeParts.filter( - (part) => part.fragment.sn !== snToRemove + (part) => part.fragment.sn !== snToRemove, ); } delete this.fragments[fragKey]; diff --git a/src/controller/gap-controller.ts b/src/controller/gap-controller.ts index 8ab35c5ea..2e1ba7434 100644 --- a/src/controller/gap-controller.ts +++ b/src/controller/gap-controller.ts @@ -64,8 +64,8 @@ export default class GapController { const stalledDuration = self.performance.now() - stalled; logger.warn( `playback not stuck anymore @${currentTime}, after ${Math.round( - stalledDuration - )}ms` + stalledDuration, + )}ms`, ); this.stallReported = false; } @@ -161,7 +161,7 @@ export default class GapController { const bufferedWithHoles = BufferHelper.bufferInfo( media, currentTime, - config.maxBufferHole + config.maxBufferHole, ); this._tryFixBufferStall(bufferedWithHoles, stalledDuration); } @@ -174,7 +174,7 @@ export default class GapController { */ private _tryFixBufferStall( bufferInfo: BufferInfo, - stalledDurationMs: number + stalledDurationMs: number, ) { const { config, fragmentTracker, media } = this; if (media === null) { @@ -226,7 +226,7 @@ export default class GapController { const error = new Error( `Playback stalling at @${ media.currentTime - } due to low buffer (${JSON.stringify(bufferInfo)})` + } due to low buffer (${JSON.stringify(bufferInfo)})`, ); logger.warn(error.message); hls.trigger(Events.ERROR, { @@ -268,7 +268,7 @@ export default class GapController { if (currentTime === 0) { const startFrag = fragmentTracker.getAppendedFrag( 0, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); if (startFrag && startTime < startFrag.end) { startGap = true; @@ -279,7 +279,7 @@ export default class GapController { partial || fragmentTracker.getAppendedFrag( currentTime, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); if (startProvisioned) { let moreToLoad = false; @@ -301,17 +301,17 @@ export default class GapController { } const targetTime = Math.max( startTime + SKIP_BUFFER_RANGE_START, - currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS + currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS, ); logger.warn( - `skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}` + `skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`, ); this.moved = true; this.stalled = null; media.currentTime = targetTime; if (partial && !partial.gap) { const error = new Error( - `fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}` + `fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`, ); hls.trigger(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, @@ -344,7 +344,7 @@ export default class GapController { const targetTime = currentTime + (nudgeRetry + 1) * config.nudgeOffset; // playback stalled in buffered area ... let's nudge currentTime to try to overcome this const error = new Error( - `Nudging 'currentTime' from ${currentTime} to ${targetTime}` + `Nudging 'currentTime' from ${currentTime} to ${targetTime}`, ); logger.warn(error.message); media.currentTime = targetTime; @@ -356,7 +356,7 @@ export default class GapController { }); } else { const error = new Error( - `Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges` + `Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges`, ); logger.error(error.message); hls.trigger(Events.ERROR, { diff --git a/src/controller/id3-track-controller.ts b/src/controller/id3-track-controller.ts index 4250d62ce..d6da59785 100644 --- a/src/controller/id3-track-controller.ts +++ b/src/controller/id3-track-controller.ts @@ -61,7 +61,7 @@ function hexToArrayBuffer(str): ArrayBuffer { .replace(/^0x/, '') .replace(/([\da-fA-F]{2}) ?/g, '0x$1 ') .replace(/ +$/, '') - .split(' ') + .split(' '), ).buffer; } class ID3TrackController implements ComponentAPI { @@ -110,7 +110,7 @@ class ID3TrackController implements ComponentAPI { // Add ID3 metatadata text track. protected onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ): void { this.media = data.media; } @@ -154,7 +154,7 @@ class ID3TrackController implements ComponentAPI { onFragParsingMetadata( event: Events.FRAG_PARSING_METADATA, - data: FragParsingMetadataData + data: FragParsingMetadataData, ) { if (!this.media) { return; @@ -238,7 +238,7 @@ class ID3TrackController implements ComponentAPI { onBufferFlushing( event: Events.BUFFER_FLUSHING, - { startOffset, endOffset, type }: BufferFlushingData + { startOffset, endOffset, type }: BufferFlushingData, ) { const { id3Track, hls } = this; if (!hls) { @@ -282,7 +282,7 @@ class ID3TrackController implements ComponentAPI { // Remove cues from track not found in details.dateRanges if (id3Track) { const idsToRemove = Object.keys(dateRangeCuesAppended).filter( - (id) => !ids.includes(id) + (id) => !ids.includes(id), ); for (let i = idsToRemove.length; i--; ) { const id = idsToRemove[i]; @@ -314,7 +314,7 @@ class ID3TrackController implements ComponentAPI { let durationKnown = appendedDateRangeCues?.durationKnown || false; const startTime = dateRangeDateToTimelineSeconds( dateRange.startDate, - dateTimeOffset + dateTimeOffset, ); let endTime = MAX_CUE_ENDTIME; const endDate = dateRange.endDate; @@ -338,7 +338,7 @@ class ID3TrackController implements ComponentAPI { if (nextDateRangeWithSameClass) { endTime = dateRangeDateToTimelineSeconds( nextDateRangeWithSameClass.startDate, - dateTimeOffset + dateTimeOffset, ); durationKnown = true; } diff --git a/src/controller/latency-controller.ts b/src/controller/latency-controller.ts index 707079f4b..bacaaf560 100644 --- a/src/controller/latency-controller.ts +++ b/src/controller/latency-controller.ts @@ -67,7 +67,7 @@ export default class LatencyController implements ComponentAPI { targetLatency + Math.min( this.stallCount * liveSyncOnStallIncrease, - maxLiveSyncOnStallIncrease + maxLiveSyncOnStallIncrease, ) ); } @@ -147,7 +147,7 @@ export default class LatencyController implements ComponentAPI { private onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachingData + data: MediaAttachingData, ) { this.media = data.media; this.media.addEventListener('timeupdate', this.timeupdateHandler); @@ -168,7 +168,7 @@ export default class LatencyController implements ComponentAPI { private onLevelUpdated( event: Events.LEVEL_UPDATED, - { details }: LevelUpdatedData + { details }: LevelUpdatedData, ) { this.levelDetails = details; if (details.advanced) { @@ -186,7 +186,7 @@ export default class LatencyController implements ComponentAPI { this.stallCount++; if (this.levelDetails?.live) { logger.warn( - '[playback-rate-controller]: Stall detected, adjusting target latency' + '[playback-rate-controller]: Stall detected, adjusting target latency', ); } } @@ -219,7 +219,7 @@ export default class LatencyController implements ComponentAPI { // Playback further than one target duration from target can be considered DVR playback. const liveMinLatencyDuration = Math.min( this.maxLatency, - targetLatency + levelDetails.targetduration + targetLatency + levelDetails.targetduration, ); const inLiveRange = distanceFromTarget < liveMinLatencyDuration; if ( @@ -232,7 +232,7 @@ export default class LatencyController implements ComponentAPI { const rate = Math.round( (2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled))) * - 20 + 20, ) / 20; media.playbackRate = Math.min(max, Math.max(1, rate)); } else if (media.playbackRate !== 1 && media.playbackRate !== 0) { diff --git a/src/controller/level-controller.ts b/src/controller/level-controller.ts index e76bd11a7..c529f2449 100644 --- a/src/controller/level-controller.ts +++ b/src/controller/level-controller.ts @@ -50,7 +50,7 @@ export default class LevelController extends BasePlaylistController { constructor( hls: Hls, - contentSteeringController: ContentSteeringController | null + contentSteeringController: ContentSteeringController | null, ) { super(hls, '[level-controller]'); this.steering = contentSteeringController; @@ -108,14 +108,14 @@ export default class LevelController extends BasePlaylistController { private onManifestLoading( event: Events.MANIFEST_LOADING, - data: ManifestLoadingData + data: ManifestLoadingData, ) { this.resetLevels(); } protected onManifestLoaded( event: Events.MANIFEST_LOADED, - data: ManifestLoadedData + data: ManifestLoadedData, ) { const levels: Level[] = []; const levelSet: { [key: string]: Level } = {}; @@ -169,7 +169,7 @@ export default class LevelController extends BasePlaylistController { private filterAndSortMediaOptions( unfilteredLevels: Level[], - data: ManifestLoadedData + data: ManifestLoadedData, ) { let audioTracks: MediaPlaylist[] = []; let subtitleTracks: MediaPlaylist[] = []; @@ -189,14 +189,14 @@ export default class LevelController extends BasePlaylistController { (!audioCodec || areCodecsMediaSourceSupported(audioCodec, 'audio')) && (!videoCodec || areCodecsMediaSourceSupported(videoCodec, 'video')) ); - } + }, ); // remove audio-only and invalid video-range levels if we also have levels with video codecs or RESOLUTION signalled if ((resolutionFound || videoCodecFound) && audioCodecFound) { levels = levels.filter( ({ videoCodec, videoRange, width, height }) => - (!!videoCodec || !!(width && height)) && isVideoRange(videoRange) + (!!videoCodec || !!(width && height)) && isVideoRange(videoRange), ); } @@ -207,12 +207,12 @@ export default class LevelController extends BasePlaylistController { if (unfilteredLevels.length) { this.warn( `One or more CODECS in variant not supported: ${JSON.stringify( - unfilteredLevels[0].attrs - )}` + unfilteredLevels[0].attrs, + )}`, ); } const error = new Error( - 'no level with compatible codecs found in manifest' + 'no level with compatible codecs found in manifest', ); this.hls.trigger(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, @@ -231,7 +231,7 @@ export default class LevelController extends BasePlaylistController { audioTracks = data.audioTracks.filter( (track) => !track.audioCodec || - areCodecsMediaSourceSupported(track.audioCodec, 'audio') + areCodecsMediaSourceSupported(track.audioCodec, 'audio'), ); // Assign ids after filtering as array indices by group-id assignTrackIdsByGroup(audioTracks); @@ -298,13 +298,13 @@ export default class LevelController extends BasePlaylistController { const firstLevelBitrate = firstLevelInPlaylist.bitrate; const bandwidthEstimate = this.hls.bandwidthEstimate; this.log( - `manifest loaded, ${levels.length} level(s) found, first bitrate: ${firstLevelBitrate}` + `manifest loaded, ${levels.length} level(s) found, first bitrate: ${firstLevelBitrate}`, ); // Update default bwe to first variant bitrate as long it has not been configured or set if (this.hls.userConfig?.abrEwmaDefaultEstimate === undefined) { const startingBwEstimate = Math.min( firstLevelBitrate, - this.hls.config.abrEwmaDefaultEstimateMax + this.hls.config.abrEwmaDefaultEstimateMax, ); if ( startingBwEstimate > bandwidthEstimate && @@ -401,7 +401,7 @@ export default class LevelController extends BasePlaylistController { pathwayId ? ' with Pathway ' + pathwayId : '' } from level ${lastLevelIndex}${ lastPathwayId ? ' with Pathway ' + lastPathwayId : '' - }` + }`, ); const levelSwitchingData: LevelSwitchingData = Object.assign({}, level, { @@ -482,7 +482,7 @@ export default class LevelController extends BasePlaylistController { // reset errors on the successful load of a fragment protected onFragBuffered( event: Events.FRAG_BUFFERED, - { frag }: FragBufferedData + { frag }: FragBufferedData, ) { if (frag !== undefined && frag.type === PlaylistLevelType.MAIN) { const el = frag.elementaryStreams; @@ -492,7 +492,7 @@ export default class LevelController extends BasePlaylistController { const level = this._levels[frag.level]; if (level?.loadError) { this.log( - `Resetting level error count of ${level.loadError} on frag buffered` + `Resetting level error count of ${level.loadError} on frag buffered`, ); level.loadError = 0; } @@ -526,7 +526,7 @@ export default class LevelController extends BasePlaylistController { protected onAudioTrackSwitched( event: Events.AUDIO_TRACK_SWITCHED, - data: TrackSwitchedData + data: TrackSwitchedData, ) { const currentLevel = this.currentLevel; if (!currentLevel) { @@ -568,7 +568,7 @@ export default class LevelController extends BasePlaylistController { url = hlsUrlParameters.addDirectives(url); } catch (error) { this.warn( - `Could not construct new URL with HLS Delivery Directives: ${error}` + `Could not construct new URL with HLS Delivery Directives: ${error}`, ); } } @@ -584,7 +584,7 @@ export default class LevelController extends BasePlaylistController { : '' } with${pathwayId ? ' Pathway ' + pathwayId : ''} URI ${id + 1}/${ currentLevel.url.length - } ${url}` + } ${url}`, ); // console.log('Current audio track group ID:', this.hls.audioTracks[this.hls.audioTrack].groupId); @@ -625,12 +625,12 @@ export default class LevelController extends BasePlaylistController { level.url = level.url.filter(filterLevelAndGroupByIdIndex); if (level.audioGroupIds) { level.audioGroupIds = level.audioGroupIds.filter( - filterLevelAndGroupByIdIndex + filterLevelAndGroupByIdIndex, ); } if (level.textGroupIds) { level.textGroupIds = level.textGroupIds.filter( - filterLevelAndGroupByIdIndex + filterLevelAndGroupByIdIndex, ); } level.urlId = 0; @@ -658,7 +658,7 @@ export default class LevelController extends BasePlaylistController { private onLevelsUpdated( event: Events.LEVELS_UPDATED, - { levels }: LevelsUpdatedData + { levels }: LevelsUpdatedData, ) { this._levels = levels; } diff --git a/src/controller/stream-controller.ts b/src/controller/stream-controller.ts index 4276fbf92..05c84019e 100644 --- a/src/controller/stream-controller.ts +++ b/src/controller/stream-controller.ts @@ -60,14 +60,14 @@ export default class StreamController constructor( hls: Hls, fragmentTracker: FragmentTracker, - keyLoader: KeyLoader + keyLoader: KeyLoader, ) { super( hls, fragmentTracker, keyLoader, '[stream-controller]', - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); this._registerListeners(); } @@ -83,7 +83,7 @@ export default class StreamController hls.on( Events.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, - this + this, ); hls.on(Events.ERROR, this.onError, this); hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); @@ -104,7 +104,7 @@ export default class StreamController hls.off( Events.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, - this + this, ); hls.off(Events.ERROR, this.onError, this); hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this); @@ -147,8 +147,8 @@ export default class StreamController if (lastCurrentTime > 0 && startPosition === -1) { this.log( `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed( - 3 - )}` + 3, + )}`, ); startPosition = lastCurrentTime; } @@ -336,7 +336,7 @@ export default class StreamController levelDetails, bufferInfo, PlaylistLevelType.MAIN, - maxBufLen + maxBufLen, ); } if (!frag) { @@ -352,7 +352,7 @@ export default class StreamController protected loadFragment( frag: Fragment, level: Level, - targetBufferTime: number + targetBufferTime: number, ) { // Check if fragment is not loaded const fragState = this.fragmentTracker.getState(frag); @@ -365,7 +365,7 @@ export default class StreamController this._loadInitSegment(frag, level); } else if (this.bitrateTest) { this.log( - `Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered` + `Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`, ); this._loadBitrateTestFrag(frag, level); } else { @@ -380,7 +380,7 @@ export default class StreamController private getBufferedFrag(position) { return this.fragmentTracker.getBufferedFrag( position, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); } @@ -464,10 +464,10 @@ export default class StreamController Math.min( Math.max( fragDuration - this.config.maxFragLookUpTolerance, - fragDuration * 0.5 + fragDuration * 0.5, ), - fragDuration * 0.75 - ) + fragDuration * 0.75, + ), ); this.flushMainBuffer(startPts, Number.POSITIVE_INFINITY); } @@ -499,13 +499,13 @@ export default class StreamController super.flushMainBuffer( startOffset, endOffset, - this.altAudio ? 'video' : null + this.altAudio ? 'video' : null, ); } protected onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) { super.onMediaAttached(event, data); const media = data.media; @@ -517,7 +517,7 @@ export default class StreamController this.config, media, this.fragmentTracker, - this.hls + this.hls, ); } @@ -555,7 +555,7 @@ export default class StreamController this.warn( `Main forward buffer length on "seeked" event ${ bufferInfo ? bufferInfo.len : 'empty' - })` + })`, ); return; } @@ -577,7 +577,7 @@ export default class StreamController private onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ) { let aac = false; let heaac = false; @@ -598,7 +598,7 @@ export default class StreamController this.audioCodecSwitch = aac && heaac && !changeTypeSupported(); if (this.audioCodecSwitch) { this.log( - 'Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC' + 'Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC', ); } @@ -636,7 +636,7 @@ export default class StreamController newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : '' - }, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration}` + }, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration}`, ); const curLevel = levels[newLevelId]; @@ -698,7 +698,7 @@ export default class StreamController const { levels } = this; if (!levels) { this.warn( - `Levels were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered` + `Levels were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`, ); return; } @@ -706,7 +706,7 @@ export default class StreamController const details = currentLevel.details as LevelDetails; if (!details) { this.warn( - `Dropping fragment ${frag.sn} of level ${frag.level} after level details were reset` + `Dropping fragment ${frag.sn} of level ${frag.level} after level details were reset`, ); this.fragmentTracker.removeFragment(frag); return; @@ -726,7 +726,7 @@ export default class StreamController this.hls, PlaylistLevelType.MAIN, this._handleTransmuxComplete.bind(this), - this._handleTransmuxerFlush.bind(this) + this._handleTransmuxerFlush.bind(this), )); const partIndex = part ? part.index : -1; const partial = partIndex !== -1; @@ -736,7 +736,7 @@ export default class StreamController frag.stats.chunkCount, payload.byteLength, partIndex, - partial + partial, ); const initPTS = this.initPTS[frag.cc]; @@ -750,13 +750,13 @@ export default class StreamController details.totalduration, accurateTimeOffset, chunkMeta, - initPTS + initPTS, ); } private onAudioTrackSwitching( event: Events.AUDIO_TRACK_SWITCHING, - data: AudioTrackSwitchingData + data: AudioTrackSwitchingData, ) { // if any URL found on new audio track, it is an alternate audio track const fromAltAudio = this.altAudio; @@ -767,7 +767,7 @@ export default class StreamController if (!altAudio) { if (this.mediaBuffer !== this.media) { this.log( - 'Switching on main audio, use media.buffered to schedule main fragment loading' + 'Switching on main audio, use media.buffered to schedule main fragment loading', ); this.mediaBuffer = this.media; const fragCurrent = this.fragCurrent; @@ -801,7 +801,7 @@ export default class StreamController private onAudioTrackSwitched( event: Events.AUDIO_TRACK_SWITCHED, - data: AudioTrackSwitchedData + data: AudioTrackSwitchedData, ) { const trackId = data.id; const altAudio = !!this.hls.audioTracks[trackId].url; @@ -810,7 +810,7 @@ export default class StreamController // if we switched on alternate audio, ensure that main fragment scheduling is synced with video sourcebuffer buffered if (videoBuffer && this.mediaBuffer !== videoBuffer) { this.log( - 'Switching on alternate audio, use video.buffered to schedule main fragment loading' + 'Switching on alternate audio, use video.buffered to schedule main fragment loading', ); this.mediaBuffer = videoBuffer; } @@ -821,7 +821,7 @@ export default class StreamController private onBufferCreated( event: Events.BUFFER_CREATED, - data: BufferCreatedData + data: BufferCreatedData, ) { const tracks = data.tracks; let mediaTrack; @@ -845,7 +845,7 @@ export default class StreamController } if (alternate && mediaTrack) { this.log( - `Alternate track found, use ${name}.buffered to schedule main fragment loading` + `Alternate track found, use ${name}.buffered to schedule main fragment loading`, ); this.mediaBuffer = mediaTrack.buffer; } else { @@ -864,7 +864,7 @@ export default class StreamController this.warn( `Fragment ${frag.sn}${part ? ' p: ' + part.index : ''} of level ${ frag.level - } finished buffering, but was aborted. state: ${this.state}` + } finished buffering, but was aborted. state: ${this.state}`, ); if (this.state === State.PARSED) { this.state = State.IDLE; @@ -873,7 +873,7 @@ export default class StreamController } const stats = part ? part.stats : frag.stats; this.fragLastKbps = Math.round( - (8 * stats.total) / (stats.buffering.end - stats.loading.first) + (8 * stats.total) / (stats.buffering.end - stats.loading.first), ); if (frag.sn !== 'initSegment') { this.fragPrevious = frag; @@ -959,7 +959,7 @@ export default class StreamController private onBufferFlushed( event: Events.BUFFER_FLUSHED, - { type }: BufferFlushedData + { type }: BufferFlushedData, ) { if ( type !== ElementaryStreamTypes.AUDIO || @@ -976,7 +976,7 @@ export default class StreamController private onLevelsUpdated( event: Events.LEVELS_UPDATED, - data: LevelsUpdatedData + data: LevelsUpdatedData, ) { if (this.level > -1 && this.fragCurrent) { this.level = this.fragCurrent.level; @@ -1003,7 +1003,7 @@ export default class StreamController if (startPosition >= 0 && currentTime < startPosition) { if (media.seeking) { this.log( - `could not seek to ${startPosition}, already seeking at ${currentTime}` + `could not seek to ${startPosition}, already seeking at ${currentTime}`, ); return; } @@ -1020,7 +1020,7 @@ export default class StreamController this.startPosition = startPosition; } this.log( - `seek to target start position ${startPosition} from current time ${currentTime}` + `seek to target start position ${startPosition} from current time ${currentTime}`, ); media.currentTime = startPosition; } @@ -1095,7 +1095,7 @@ export default class StreamController level, initSegment.tracks, mapFragment, - chunkMeta + chunkMeta, ); hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, { frag: mapFragment, @@ -1164,7 +1164,7 @@ export default class StreamController endPTS, frag.start, endDTS, - true + true, ); } } @@ -1173,7 +1173,7 @@ export default class StreamController startPTS, endPTS, startDTS, - endDTS + endDTS, ); if (this.backtrackFragment) { this.backtrackFragment = frag; @@ -1183,7 +1183,7 @@ export default class StreamController frag, part, chunkMeta, - isFirstFragment || isFirstInDiscontinuity + isFirstFragment || isFirstInDiscontinuity, ); } else if (isFirstFragment || isFirstInDiscontinuity) { // Mark segment with a gap to avoid loop loading @@ -1209,7 +1209,7 @@ export default class StreamController startPTS, endPTS, startDTS, - endDTS + endDTS, ); this.bufferFragmentData(audio, frag, part, chunkMeta); } @@ -1238,7 +1238,7 @@ export default class StreamController currentLevel: Level, tracks: TrackSet, frag: Fragment, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ) { if (this.state !== State.PARSING) { return; @@ -1283,7 +1283,7 @@ export default class StreamController } if (currentLevel.audioCodec && currentLevel.audioCodec !== audioCodec) { this.log( - `Swapping manifest audio codec "${currentLevel.audioCodec}" for "${audioCodec}"` + `Swapping manifest audio codec "${currentLevel.audioCodec}" for "${audioCodec}"`, ); } audio.levelCodec = audioCodec; @@ -1293,7 +1293,7 @@ export default class StreamController audio.container }, codecs[selected/level/parsed]=[${audioCodec || ''}/${ currentLevel.audioCodec || '' - }/${audio.codec}]` + }/${audio.codec}]`, ); } if (video) { @@ -1304,12 +1304,12 @@ export default class StreamController video.container }, codecs[level/parsed]=[${currentLevel.videoCodec || ''}/${ video.codec - }]` + }]`, ); } if (audiovideo) { this.log( - `Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]` + `Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]`, ); } this.hls.trigger(Events.BUFFER_CODECS, tracks); @@ -1335,7 +1335,7 @@ export default class StreamController public getMainFwdBufferInfo(): BufferInfo | null { return this.getFwdBufferInfo( this.mediaBuffer ? this.mediaBuffer : this.media, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); } diff --git a/src/controller/subtitle-stream-controller.ts b/src/controller/subtitle-stream-controller.ts index 0642450fb..b8dd0bde0 100644 --- a/src/controller/subtitle-stream-controller.ts +++ b/src/controller/subtitle-stream-controller.ts @@ -47,14 +47,14 @@ export class SubtitleStreamController constructor( hls: Hls, fragmentTracker: FragmentTracker, - keyLoader: KeyLoader + keyLoader: KeyLoader, ) { super( hls, fragmentTracker, keyLoader, '[subtitle-stream-controller]', - PlaylistLevelType.SUBTITLE + PlaylistLevelType.SUBTITLE, ); this._registerListeners(); } @@ -124,7 +124,7 @@ export class SubtitleStreamController onSubtitleFragProcessed( event: Events.SUBTITLE_FRAG_PROCESSED, - data: SubtitleFragProcessed + data: SubtitleFragProcessed, ) { const { frag, success } = data; this.fragPrevious = frag; @@ -187,7 +187,7 @@ export class SubtitleStreamController this.fragmentTracker.removeFragmentsInRange( startOffset, endOffsetSubtitles, - PlaylistLevelType.SUBTITLE + PlaylistLevelType.SUBTITLE, ); } } @@ -217,11 +217,11 @@ export class SubtitleStreamController // Got all new subtitle levels. onSubtitleTracksUpdated( event: Events.SUBTITLE_TRACKS_UPDATED, - { subtitleTracks }: SubtitleTracksUpdatedData + { subtitleTracks }: SubtitleTracksUpdatedData, ) { if (subtitleOptionsIdentical(this.levels, subtitleTracks)) { this.levels = subtitleTracks.map( - (mediaPlaylist) => new Level(mediaPlaylist) + (mediaPlaylist) => new Level(mediaPlaylist), ); return; } @@ -234,7 +234,7 @@ export class SubtitleStreamController this.fragmentTracker.removeFragmentsInRange( 0, Number.POSITIVE_INFINITY, - PlaylistLevelType.SUBTITLE + PlaylistLevelType.SUBTITLE, ); this.fragPrevious = null; this.mediaBuffer = null; @@ -242,7 +242,7 @@ export class SubtitleStreamController onSubtitleTrackSwitch( event: Events.SUBTITLE_TRACK_SWITCH, - data: TrackSwitchedData + data: TrackSwitchedData, ) { this.currentTrackId = data.id; @@ -266,7 +266,7 @@ export class SubtitleStreamController // Got a new set of subtitle fragments. onSubtitleTrackLoaded( event: Events.SUBTITLE_TRACK_LOADED, - data: TrackLoadedData + data: TrackLoadedData, ) { const { details: newDetails, id: trackId } = data; const { currentTrackId, levels } = this; @@ -324,7 +324,7 @@ export class SubtitleStreamController null, newDetails.fragments, this.media.currentTime, - 0 + 0, ); if (!foundFrag) { this.warn('Subtitle playlist not aligned with playback'); @@ -356,7 +356,7 @@ export class SubtitleStreamController .decrypt( new Uint8Array(payload), decryptData.key.buffer, - decryptData.iv.buffer + decryptData.iv.buffer, ) .catch((err) => { hls.trigger(Events.ERROR, { @@ -404,13 +404,13 @@ export class SubtitleStreamController const bufferedInfo = BufferHelper.bufferedInfo( this.tracksBuffered[this.currentTrackId] || [], currentTime, - config.maxBufferHole + config.maxBufferHole, ); const { end: targetBufferTime, len: bufferLen } = bufferedInfo; const mainBufferInfo = this.getFwdBufferInfo( this.media, - PlaylistLevelType.MAIN + PlaylistLevelType.MAIN, ); const trackDetails = track.details as LevelDetails; const maxBufLen = @@ -434,7 +434,7 @@ export class SubtitleStreamController fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), - lookupTolerance + lookupTolerance, ); if ( !foundFrag && @@ -482,7 +482,7 @@ export class SubtitleStreamController protected loadFragment( frag: Fragment, level: Level, - targetBufferTime: number + targetBufferTime: number, ) { this.fragCurrent = frag; if (frag.sn === 'initSegment') { @@ -495,7 +495,7 @@ export class SubtitleStreamController get mediaBufferTimeRanges(): Bufferable { return new BufferableInstance( - this.tracksBuffered[this.currentTrackId] || [] + this.tracksBuffered[this.currentTrackId] || [], ); } } @@ -507,12 +507,12 @@ class BufferableInstance implements Bufferable { const getRange = ( name: 'start' | 'end', index: number, - length: number + length: number, ): number => { index = index >>> 0; if (index > length - 1) { throw new DOMException( - `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length})` + `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length})`, ); } return timeranges[index][name]; diff --git a/src/controller/subtitle-track-controller.ts b/src/controller/subtitle-track-controller.ts index 24884fb1f..7034107c3 100644 --- a/src/controller/subtitle-track-controller.ts +++ b/src/controller/subtitle-track-controller.ts @@ -79,7 +79,7 @@ class SubtitleTrackController extends BasePlaylistController { // Listen for subtitle track change, then extract the current track ID. protected onMediaAttached( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ): void { this.media = data.media; if (!this.media) { @@ -99,7 +99,7 @@ class SubtitleTrackController extends BasePlaylistController { } else { this.media.textTracks.addEventListener( 'change', - this.asyncPollTrackChange + this.asyncPollTrackChange, ); } } @@ -108,7 +108,7 @@ class SubtitleTrackController extends BasePlaylistController { self.clearInterval(this.subtitlePollingInterval); this.subtitlePollingInterval = self.setInterval( this.trackChangeListener, - timeout + timeout, ); } @@ -121,7 +121,7 @@ class SubtitleTrackController extends BasePlaylistController { if (!this.useTextTrackPolling) { this.media.textTracks.removeEventListener( 'change', - this.asyncPollTrackChange + this.asyncPollTrackChange, ); } @@ -150,14 +150,14 @@ class SubtitleTrackController extends BasePlaylistController { // Fired whenever a new manifest is loaded. protected onManifestParsed( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ): void { this.tracks = data.subtitleTracks; } protected onSubtitleTrackLoaded( event: Events.SUBTITLE_TRACK_LOADED, - data: TrackLoadedData + data: TrackLoadedData, ): void { const { id, details } = data; const { trackId } = this; @@ -171,7 +171,7 @@ class SubtitleTrackController extends BasePlaylistController { const curDetails = currentTrack.details; currentTrack.details = data.details; this.log( - `subtitle track ${id} loaded [${details.startSN}-${details.endSN}]` + `subtitle track ${id} loaded [${details.startSN}-${details.endSN}]`, ); if (id === this.trackId) { @@ -181,14 +181,14 @@ class SubtitleTrackController extends BasePlaylistController { protected onLevelLoading( event: Events.LEVEL_LOADING, - data: LevelLoadingData + data: LevelLoadingData, ): void { this.switchLevel(data.level); } protected onLevelSwitching( event: Events.LEVEL_SWITCHING, - data: LevelSwitchingData + data: LevelSwitchingData, ): void { this.switchLevel(data.level); } @@ -204,7 +204,7 @@ class SubtitleTrackController extends BasePlaylistController { : undefined; if (this.groupId !== textGroupId) { const subtitleTracks = this.tracks.filter( - (track): boolean => !textGroupId || track.groupId === textGroupId + (track): boolean => !textGroupId || track.groupId === textGroupId, ); this.tracksInGroup = subtitleTracks; const initialTrackId = @@ -215,7 +215,7 @@ class SubtitleTrackController extends BasePlaylistController { subtitleTracks, }; this.log( - `Updating subtitle tracks, ${subtitleTracks.length} track(s) found in "${textGroupId}" group-id` + `Updating subtitle tracks, ${subtitleTracks.length} track(s) found in "${textGroupId}" group-id`, ); this.hls.trigger(Events.SUBTITLE_TRACKS_UPDATED, subtitleTracksUpdated); @@ -289,7 +289,7 @@ class SubtitleTrackController extends BasePlaylistController { url = hlsUrlParameters.addDirectives(url); } catch (error) { this.warn( - `Could not construct new URL with HLS Delivery Directives: ${error}` + `Could not construct new URL with HLS Delivery Directives: ${error}`, ); } } @@ -316,7 +316,7 @@ class SubtitleTrackController extends BasePlaylistController { const textTracks = filterSubtitleTracks(media.textTracks); const groupTracks = textTracks.filter( - (track) => (track as any).groupId === this.groupId + (track) => (track as any).groupId === this.groupId, ); if (newId === -1) { [].slice.call(textTracks).forEach((track) => { @@ -341,7 +341,7 @@ class SubtitleTrackController extends BasePlaylistController { */ private setSubtitleTrack( newId: number, - lastTrack: MediaPlaylist | undefined + lastTrack: MediaPlaylist | undefined, ): void { const tracks = this.tracksInGroup; @@ -376,7 +376,7 @@ class SubtitleTrackController extends BasePlaylistController { `Switching to subtitle-track ${newId}` + (track ? ` "${track.name}" lang:${track.lang} group:${track.groupId}` - : '') + : ''), ); this.trackId = newId; if (track) { diff --git a/src/controller/timeline-controller.ts b/src/controller/timeline-controller.ts index 512de7b6e..a4394162b 100644 --- a/src/controller/timeline-controller.ts +++ b/src/controller/timeline-controller.ts @@ -149,7 +149,7 @@ export class TimelineController implements ComponentAPI { startTime: number, endTime: number, screen: CaptionScreen, - cueRanges: Array<[number, number]> + cueRanges: Array<[number, number]>, ) { // skip cues which overlap more than 50% with previously parsed time ranges let merged = false; @@ -159,7 +159,7 @@ export class TimelineController implements ComponentAPI { cueRange[0], cueRange[1], startTime, - endTime + endTime, ); if (overlap >= 0) { cueRange[0] = Math.min(cueRange[0], startTime); @@ -190,7 +190,7 @@ export class TimelineController implements ComponentAPI { // Triggered when an initial PTS is found; used for synchronisation of WebVTT. private onInitPtsFound( event: Events.INIT_PTS_FOUND, - { frag, id, initPTS, timescale }: InitPTSFoundData + { frag, id, initPTS, timescale }: InitPTSFoundData, ) { const { unparsedVttFrags } = this; if (id === 'main') { @@ -274,7 +274,7 @@ export class TimelineController implements ComponentAPI { private createTextTrack( kind: TextTrackKind, label: string, - lang?: string + lang?: string, ): TextTrack | undefined { const media = this.media; if (!media) { @@ -285,7 +285,7 @@ export class TimelineController implements ComponentAPI { private onMediaAttaching( event: Events.MEDIA_ATTACHING, - data: MediaAttachingData + data: MediaAttachingData, ) { this.media = data.media; this._cleanTracks(); @@ -338,7 +338,7 @@ export class TimelineController implements ComponentAPI { private onSubtitleTracksUpdated( event: Events.SUBTITLE_TRACKS_UPDATED, - data: SubtitleTracksUpdatedData + data: SubtitleTracksUpdatedData, ) { const tracks: Array = data.subtitleTracks || []; const hasIMSC1 = tracks.some((track) => track.textCodec === IMSC1_CODEC); @@ -379,7 +379,7 @@ export class TimelineController implements ComponentAPI { textTrack = this.createTextTrack( textTrackKind, track.name, - track.lang + track.lang, ); if (textTrack) { textTrack.mode = 'disabled'; @@ -408,7 +408,7 @@ export class TimelineController implements ComponentAPI { } private _captionsOrSubtitlesFromCharacteristics( - track: MediaPlaylist + track: MediaPlaylist, ): TextTrackKind { if (track.attrs.CHARACTERISTICS) { if ( @@ -424,12 +424,12 @@ export class TimelineController implements ComponentAPI { private onManifestLoaded( event: Events.MANIFEST_LOADED, - data: ManifestLoadedData + data: ManifestLoadedData, ) { if (this.config.enableCEA708Captions && data.captions) { data.captions.forEach((captionsTrack) => { const instreamIdMatch = /(?:CC|SERVICE)([1-4])/.exec( - captionsTrack.instreamId as string + captionsTrack.instreamId as string, ); if (!instreamIdMatch) { return; @@ -483,7 +483,7 @@ export class TimelineController implements ComponentAPI { private onFragLoaded( event: Events.FRAG_LOADED, - data: FragDecryptedData | FragLoadedData + data: FragDecryptedData | FragLoadedData, ) { const { frag, payload } = data; if (frag.type === PlaylistLevelType.SUBTITLE) { @@ -543,7 +543,7 @@ export class TimelineController implements ComponentAPI { frag: frag, error, }); - } + }, ); } @@ -593,7 +593,7 @@ export class TimelineController implements ComponentAPI { frag: frag, error, }); - } + }, ); } @@ -610,7 +610,7 @@ export class TimelineController implements ComponentAPI { }, () => { trackPlaylistMedia.textCodec = 'wvtt'; - } + }, ); } } @@ -639,7 +639,7 @@ export class TimelineController implements ComponentAPI { private onFragDecrypted( event: Events.FRAG_DECRYPTED, - data: FragDecryptedData + data: FragDecryptedData, ) { const { frag } = data; if (frag.type === PlaylistLevelType.SUBTITLE) { @@ -654,7 +654,7 @@ export class TimelineController implements ComponentAPI { private onFragParsingUserdata( event: Events.FRAG_PARSING_USERDATA, - data: FragParsingUserdataData + data: FragParsingUserdataData, ) { if (!this.enabled) { return; @@ -685,7 +685,7 @@ export class TimelineController implements ComponentAPI { onBufferFlushing( event: Events.BUFFER_FLUSHING, - { startOffset, endOffset, endOffsetSubtitles, type }: BufferFlushingData + { startOffset, endOffset, endOffsetSubtitles, type }: BufferFlushingData, ) { const { media } = this; if (!media || media.currentTime < endOffset) { @@ -696,7 +696,7 @@ export class TimelineController implements ComponentAPI { if (!type || type === 'video') { const { captionsTracks } = this; Object.keys(captionsTracks).forEach((trackName) => - removeCuesInRange(captionsTracks[trackName], startOffset, endOffset) + removeCuesInRange(captionsTracks[trackName], startOffset, endOffset), ); } if (this.config.renderTextTracksNatively) { @@ -707,8 +707,8 @@ export class TimelineController implements ComponentAPI { removeCuesInRange( textTracks[trackName], startOffset, - endOffsetSubtitles - ) + endOffsetSubtitles, + ), ); } } @@ -745,7 +745,7 @@ export class TimelineController implements ComponentAPI { function canReuseVttTextTrack( inUseTrack: (TextTrack & { textTrack1?; textTrack2? }) | null, - manifestTrack: MediaPlaylist + manifestTrack: MediaPlaylist, ): boolean { return ( !!inUseTrack && diff --git a/src/crypt/decrypter.ts b/src/crypt/decrypter.ts index c71747eb7..ada612153 100644 --- a/src/crypt/decrypter.ts +++ b/src/crypt/decrypter.ts @@ -81,7 +81,7 @@ export default class Decrypter { public decrypt( data: Uint8Array | ArrayBuffer, key: ArrayBuffer, - iv: ArrayBuffer + iv: ArrayBuffer, ): Promise { if (this.useSoftware) { return new Promise((resolve, reject) => { @@ -102,7 +102,7 @@ export default class Decrypter { public softwareDecrypt( data: Uint8Array, key: ArrayBuffer, - iv: ArrayBuffer + iv: ArrayBuffer, ): ArrayBuffer | null { const { currentIV, currentResult, remainderData } = this; this.logOnce('JS AES decrypt'); @@ -146,7 +146,7 @@ export default class Decrypter { public webCryptoDecrypt( data: Uint8Array, key: ArrayBuffer, - iv: ArrayBuffer + iv: ArrayBuffer, ): Promise { const subtle = this.subtle; if (this.key !== key || !this.fastAesKey) { @@ -166,7 +166,7 @@ export default class Decrypter { }) .catch((err) => { logger.warn( - `[decrypter]: WebCrypto Error, disable WebCrypto API, ${err.name}: ${err.message}` + `[decrypter]: WebCrypto Error, disable WebCrypto API, ${err.name}: ${err.message}`, ); return this.onWebCryptoError(data, key, iv); diff --git a/src/demux/audio/aacdemuxer.ts b/src/demux/audio/aacdemuxer.ts index d2909b00d..0137d3c80 100644 --- a/src/demux/audio/aacdemuxer.ts +++ b/src/demux/audio/aacdemuxer.ts @@ -22,7 +22,7 @@ class AACDemuxer extends BaseAudioDemuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ) { super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration); this._audioTrack = { @@ -72,14 +72,14 @@ class AACDemuxer extends BaseAudioDemuxer { this.observer, data, offset, - track.manifestCodec + track.manifestCodec, ); const frame = ADTS.appendFrame( track, data, offset, this.basePTS as number, - this.frameIndex + this.frameIndex, ); if (frame && frame.missing === 0) { return frame; diff --git a/src/demux/audio/ac3-demuxer.ts b/src/demux/audio/ac3-demuxer.ts index 6aea398b6..316c1282c 100644 --- a/src/demux/audio/ac3-demuxer.ts +++ b/src/demux/audio/ac3-demuxer.ts @@ -16,7 +16,7 @@ export class AC3Demuxer extends BaseAudioDemuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ) { super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration); this._audioTrack = { @@ -41,14 +41,14 @@ export class AC3Demuxer extends BaseAudioDemuxer { appendFrame( track: DemuxedAudioTrack, data: Uint8Array, - offset: number + offset: number, ): AudioFrame | void { const frameLength = appendFrame( track, data, offset, this.basePTS as number, - this.frameIndex + this.frameIndex, ); if (frameLength !== -1) { const sample = track.samples[track.samples.length - 1]; @@ -86,7 +86,7 @@ export function appendFrame( data: Uint8Array, start: number, pts: number, - frameIndex: number + frameIndex: number, ): number { if (start + 8 > data.length) { return -1; // not enough bytes left diff --git a/src/demux/audio/adts.ts b/src/demux/audio/adts.ts index cb76f1e7a..e76e8f677 100644 --- a/src/demux/audio/adts.ts +++ b/src/demux/audio/adts.ts @@ -29,7 +29,7 @@ export function getAudioConfig( observer, data: Uint8Array, offset: number, - audioCodec: string + audioCodec: string, ): AudioConfig | void { let adtsObjectType: number; let adtsExtensionSamplingIndex: number; @@ -57,7 +57,7 @@ export function getAudioConfig( // byte 3 adtsChannelConfig |= (data[offset + 3] & 0xc0) >>> 6; logger.log( - `manifest codec:${audioCodec}, ADTS type:${adtsObjectType}, samplingIndex:${adtsSamplingIndex}` + `manifest codec:${audioCodec}, ADTS type:${adtsObjectType}, samplingIndex:${adtsSamplingIndex}`, ); // firefox: freq less than 24kHz = AAC SBR (HE-AAC) if (/firefox/i.test(userAgent)) { @@ -230,7 +230,7 @@ export function initTrackConfig( observer: HlsEventEmitter, data: Uint8Array, offset: number, - audioCodec: string + audioCodec: string, ) { if (!track.samplerate) { const config = getAudioConfig(observer, data, offset, audioCodec); @@ -243,7 +243,7 @@ export function initTrackConfig( track.codec = config.codec; track.manifestCodec = config.manifestCodec; logger.log( - `parsed codec:${track.codec}, rate:${config.samplerate}, channels:${config.channelCount}` + `parsed codec:${track.codec}, rate:${config.samplerate}, channels:${config.channelCount}`, ); } } @@ -254,7 +254,7 @@ export function getFrameDuration(samplerate: number): number { export function parseFrameHeader( data: Uint8Array, - offset: number + offset: number, ): FrameHeader | void { // The protection skip bit tells us if we have 2 bytes of CRC data at the end of the ADTS header const headerLength = getHeaderLength(data, offset); @@ -273,7 +273,7 @@ export function appendFrame( data: Uint8Array, offset: number, pts: number, - frameIndex: number + frameIndex: number, ): AudioFrame { const frameDuration = getFrameDuration(track.samplerate as number); const stamp = pts + frameIndex * frameDuration; diff --git a/src/demux/audio/base-audio-demuxer.ts b/src/demux/audio/base-audio-demuxer.ts index 4facd88a5..fb8c12a24 100644 --- a/src/demux/audio/base-audio-demuxer.ts +++ b/src/demux/audio/base-audio-demuxer.ts @@ -28,7 +28,7 @@ class BaseAudioDemuxer implements Demuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ) { this._id3Track = { type: 'id3', @@ -59,7 +59,7 @@ class BaseAudioDemuxer implements Demuxer { appendFrame( track: DemuxedAudioTrack, data: Uint8Array, - offset: number + offset: number, ): AudioFrame | void {} // feed incoming data to the front of the parsing pipeline @@ -147,10 +147,12 @@ class BaseAudioDemuxer implements Demuxer { demuxSampleAes( data: Uint8Array, keyData: KeyData, - timeOffset: number + timeOffset: number, ): Promise { return Promise.reject( - new Error(`[${this}] This demuxer does not support Sample-AES decryption`) + new Error( + `[${this}] This demuxer does not support Sample-AES decryption`, + ), ); } @@ -182,7 +184,7 @@ class BaseAudioDemuxer implements Demuxer { export const initPTSFn = ( timestamp: number | undefined, timeOffset: number, - initPTS: RationalTimestamp | null + initPTS: RationalTimestamp | null, ): number => { if (Number.isFinite(timestamp as number)) { return timestamp! * 90; diff --git a/src/demux/audio/mp3demuxer.ts b/src/demux/audio/mp3demuxer.ts index 3e5b27ea3..f9e173edb 100644 --- a/src/demux/audio/mp3demuxer.ts +++ b/src/demux/audio/mp3demuxer.ts @@ -12,7 +12,7 @@ class MP3Demuxer extends BaseAudioDemuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ) { super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration); this._audioTrack = { @@ -76,7 +76,7 @@ class MP3Demuxer extends BaseAudioDemuxer { data, offset, this.basePTS, - this.frameIndex + this.frameIndex, ); } } diff --git a/src/demux/audio/mpegaudio.ts b/src/demux/audio/mpegaudio.ts index 490a9669c..bd90221be 100644 --- a/src/demux/audio/mpegaudio.ts +++ b/src/demux/audio/mpegaudio.ts @@ -60,7 +60,7 @@ export function appendFrame( data: Uint8Array, offset: number, pts: number, - frameIndex: number + frameIndex: number, ) { // Using http://www.datavoyage.com/mpgscript/mpeghdr.htm as a reference if (offset + 24 > data.length) { diff --git a/src/demux/chunk-cache.ts b/src/demux/chunk-cache.ts index d96df4623..28f6da55b 100644 --- a/src/demux/chunk-cache.ts +++ b/src/demux/chunk-cache.ts @@ -29,7 +29,7 @@ export default class ChunkCache { function concatUint8Arrays( chunks: Array, - dataLength: number + dataLength: number, ): Uint8Array { const result = new Uint8Array(dataLength); let offset = 0; diff --git a/src/demux/id3.ts b/src/demux/id3.ts index 1959a9d35..f0ca55ff5 100644 --- a/src/demux/id3.ts +++ b/src/demux/id3.ts @@ -91,7 +91,7 @@ export const isFooter = (data: Uint8Array, offset: number): boolean => { */ export const getID3Data = ( data: Uint8Array, - offset: number + offset: number, ): Uint8Array | undefined => { const front = offset; let length = 0; @@ -222,7 +222,7 @@ export const decodeFrame = (frame: RawFrame): Frame | undefined => { }; const decodePrivFrame = ( - frame: RawFrame + frame: RawFrame, ): DecodedFrame | undefined => { /* Format: \0 @@ -279,7 +279,7 @@ const decodeURLFrame = (frame: RawFrame): DecodedFrame | undefined => { let index = 1; const description: string = utf8ArrayToStr( frame.data.subarray(index), - true + true, ); index += description.length + 1; @@ -296,7 +296,7 @@ const decodeURLFrame = (frame: RawFrame): DecodedFrame | undefined => { }; const readTimeStamp = ( - timeStampFrame: DecodedFrame + timeStampFrame: DecodedFrame, ): number | undefined => { if (timeStampFrame.data.byteLength === 8) { const data = new Uint8Array(timeStampFrame.data); @@ -328,7 +328,7 @@ const readTimeStamp = ( */ export const utf8ArrayToStr = ( array: Uint8Array, - exitOnNull: boolean = false + exitOnNull: boolean = false, ): string => { const decoder = getTextDecoder(); if (decoder) { @@ -381,7 +381,7 @@ export const utf8ArrayToStr = ( char2 = array[i++]; char3 = array[i++]; out += String.fromCharCode( - ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) + ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0), ); break; default: diff --git a/src/demux/inject-worker.ts b/src/demux/inject-worker.ts index f35e71189..5640023b1 100644 --- a/src/demux/inject-worker.ts +++ b/src/demux/inject-worker.ts @@ -19,7 +19,7 @@ export function injectWorker(): WorkerContext { ], { type: 'text/javascript', - } + }, ); const objectURL = self.URL.createObjectURL(blob); const worker = new self.Worker(objectURL); diff --git a/src/demux/mp4demuxer.ts b/src/demux/mp4demuxer.ts index 041ef54e4..6cf6a30d0 100644 --- a/src/demux/mp4demuxer.ts +++ b/src/demux/mp4demuxer.ts @@ -45,19 +45,19 @@ class MP4Demuxer implements Demuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ) { const videoTrack = (this.videoTrack = dummyTrack( 'video', - 1 + 1, ) as PassthroughTrack); const audioTrack = (this.audioTrack = dummyTrack( 'audio', - 1 + 1, ) as DemuxedAudioTrack); const captionTrack = (this.txtTrack = dummyTrack( 'text', - 1 + 1, ) as DemuxedUserdataTrack); this.id3Track = dummyTrack('id3', 1) as DemuxedMetadataTrack; @@ -148,7 +148,7 @@ class MP4Demuxer implements Demuxer { private extractID3Track( videoTrack: PassthroughTrack, - timeOffset: number + timeOffset: number, ): DemuxedMetadataTrack { const id3Track = this.id3Track as DemuxedMetadataTrack; if (videoTrack.samples.length) { @@ -188,10 +188,10 @@ class MP4Demuxer implements Demuxer { demuxSampleAes( data: Uint8Array, keyData: KeyData, - timeOffset: number + timeOffset: number, ): Promise { return Promise.reject( - new Error('The MP4 demuxer does not support SAMPLE-AES decryption') + new Error('The MP4 demuxer does not support SAMPLE-AES decryption'), ); } diff --git a/src/demux/sample-aes.ts b/src/demux/sample-aes.ts index e07898833..2999daa32 100644 --- a/src/demux/sample-aes.ts +++ b/src/demux/sample-aes.ts @@ -29,7 +29,7 @@ class SampleAesDecrypter { return this.decrypter.decrypt( encryptedData, this.keyData.key.buffer, - this.keyData.iv.buffer + this.keyData.iv.buffer, ); } @@ -37,7 +37,7 @@ class SampleAesDecrypter { private decryptAacSample( samples: AudioSample[], sampleIndex: number, - callback: () => void + callback: () => void, ) { const curUnit = samples[sampleIndex].unit; if (curUnit.length <= 16) { @@ -47,11 +47,11 @@ class SampleAesDecrypter { } const encryptedData = curUnit.subarray( 16, - curUnit.length - (curUnit.length % 16) + curUnit.length - (curUnit.length % 16), ); const encryptedBuffer = encryptedData.buffer.slice( encryptedData.byteOffset, - encryptedData.byteOffset + encryptedData.length + encryptedData.byteOffset + encryptedData.length, ); this.decryptBuffer(encryptedBuffer).then((decryptedBuffer: ArrayBuffer) => { @@ -67,7 +67,7 @@ class SampleAesDecrypter { decryptAacSamples( samples: AudioSample[], sampleIndex: number, - callback: () => void + callback: () => void, ) { for (; ; sampleIndex++) { if (sampleIndex >= samples.length) { @@ -100,7 +100,7 @@ class SampleAesDecrypter { ) { encryptedData.set( decodedData.subarray(inputPos, inputPos + 16), - outputPos + outputPos, ); } @@ -109,7 +109,7 @@ class SampleAesDecrypter { getAvcDecryptedUnit( decodedData: Uint8Array, - decryptedData: ArrayLike | ArrayBuffer | SharedArrayBuffer + decryptedData: ArrayLike | ArrayBuffer | SharedArrayBuffer, ) { const uint8DecryptedData = new Uint8Array(decryptedData); let inputPos = 0; @@ -120,7 +120,7 @@ class SampleAesDecrypter { ) { decodedData.set( uint8DecryptedData.subarray(inputPos, inputPos + 16), - outputPos + outputPos, ); } @@ -132,7 +132,7 @@ class SampleAesDecrypter { sampleIndex: number, unitIndex: number, callback: () => void, - curUnit: VideoSampleUnit + curUnit: VideoSampleUnit, ) { const decodedData = discardEPB(curUnit.data); const encryptedData = this.getAvcEncryptedData(decodedData); @@ -144,7 +144,7 @@ class SampleAesDecrypter { if (!this.decrypter.isSync()) { this.decryptAvcSamples(samples, sampleIndex, unitIndex + 1, callback); } - } + }, ); } @@ -152,7 +152,7 @@ class SampleAesDecrypter { samples: DemuxedVideoTrackBase['samples'], sampleIndex: number, unitIndex: number, - callback: () => void + callback: () => void, ) { if (samples instanceof Uint8Array) { throw new Error('Cannot decrypt samples of type Uint8Array'); @@ -183,7 +183,7 @@ class SampleAesDecrypter { sampleIndex, unitIndex, callback, - curUnit + curUnit, ); if (!this.decrypter.isSync()) { diff --git a/src/demux/transmuxer-interface.ts b/src/demux/transmuxer-interface.ts index f1e642bc5..ed1f603f4 100644 --- a/src/demux/transmuxer-interface.ts +++ b/src/demux/transmuxer-interface.ts @@ -42,7 +42,7 @@ export default class TransmuxerInterface { hls: Hls, id: PlaylistLevelType, onTransmuxComplete: (transmuxResult: TransmuxerResult) => void, - onFlush: (chunkMeta: ChunkMetadata) => void + onFlush: (chunkMeta: ChunkMetadata) => void, ) { const config = hls.config; this.hls = hls; @@ -93,7 +93,7 @@ export default class TransmuxerInterface { worker.addEventListener('message', this.onwmsg as any); worker.onerror = (event) => { const error = new Error( - `${event.message} (${event.filename}:${event.lineno})` + `${event.message} (${event.filename}:${event.lineno})`, ); config.enableWorker = false; logger.warn(`Error in "${id}" Web Worker, fallback to inline`); @@ -115,7 +115,7 @@ export default class TransmuxerInterface { } catch (err) { logger.warn( `Error setting up "${id}" Web Worker, fallback to inline`, - err + err, ); this.resetWorker(); this.error = null; @@ -124,7 +124,7 @@ export default class TransmuxerInterface { m2tsTypeSupported, config, vendor, - id + id, ); } return; @@ -136,7 +136,7 @@ export default class TransmuxerInterface { m2tsTypeSupported, config, vendor, - id + id, ); } @@ -186,7 +186,7 @@ export default class TransmuxerInterface { duration: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata, - defaultInitPTS?: RationalTimestamp + defaultInitPTS?: RationalTimestamp, ): void { chunkMeta.transmuxing.start = self.performance.now(); const { transmuxer } = this; @@ -224,7 +224,7 @@ export default class TransmuxerInterface { accurateTimeOffset, trackSwitch, timeOffset, - initSegmentChange + initSegmentChange, ); if (!contiguous || discontinuity || initSegmentChange) { logger.log(`[transmuxer-interface, ${frag.type}]: Starting new transmux session for sn: ${chunkMeta.sn} p: ${chunkMeta.part} level: ${chunkMeta.level} id: ${chunkMeta.id} @@ -239,7 +239,7 @@ export default class TransmuxerInterface { videoCodec, initSegmentData, duration, - defaultInitPTS + defaultInitPTS, ); this.configureTransmuxer(config); } @@ -258,14 +258,14 @@ export default class TransmuxerInterface { chunkMeta, state, }, - data instanceof ArrayBuffer ? [data] : [] + data instanceof ArrayBuffer ? [data] : [], ); } else if (transmuxer) { const transmuxResult = transmuxer.push( data, decryptdata, chunkMeta, - state + state, ); if (isPromise(transmuxResult)) { transmuxer.async = true; @@ -277,7 +277,7 @@ export default class TransmuxerInterface { this.transmuxerError( error, chunkMeta, - 'transmuxer-interface push error' + 'transmuxer-interface push error', ); }); } else { @@ -311,13 +311,13 @@ export default class TransmuxerInterface { this.transmuxerError( error, chunkMeta, - 'transmuxer-interface flush error' + 'transmuxer-interface flush error', ); }); } else { this.handleFlushResult( transmuxResult as Array, - chunkMeta + chunkMeta, ); } } @@ -326,7 +326,7 @@ export default class TransmuxerInterface { private transmuxerError( error: Error, chunkMeta: ChunkMetadata, - reason: string + reason: string, ) { if (!this.hls) { return; @@ -345,7 +345,7 @@ export default class TransmuxerInterface { private handleFlushResult( results: Array, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ) { results.forEach((result) => { this.handleTransmuxComplete(result); diff --git a/src/demux/transmuxer-worker.ts b/src/demux/transmuxer-worker.ts index 88dfba93f..f150c4839 100644 --- a/src/demux/transmuxer-worker.ts +++ b/src/demux/transmuxer-worker.ts @@ -44,7 +44,7 @@ function startWorker(self) { data.typeSupported, config, data.vendor, - data.id + data.id, ); enableLogs(config.debug, data.id); forwardWorkerLogs(); @@ -61,7 +61,7 @@ function startWorker(self) { data.data, data.decryptdata, data.chunkMeta, - data.state + data.state, ); if (isPromise(transmuxResult)) { self.transmuxer.async = true; @@ -113,7 +113,7 @@ function startWorker(self) { handleFlushResult( self, transmuxResult as Array, - id + id, ); } break; @@ -126,7 +126,7 @@ function startWorker(self) { function emitTransmuxComplete( self: any, - transmuxResult: TransmuxerResult + transmuxResult: TransmuxerResult, ): boolean { if (isEmptyResult(transmuxResult.remuxResult)) { return false; @@ -141,7 +141,7 @@ function emitTransmuxComplete( } self.postMessage( { event: 'transmuxComplete', data: transmuxResult }, - transferable + transferable, ); return true; } @@ -150,7 +150,7 @@ function emitTransmuxComplete( // in order to minimize message passing overhead function addToTransferable( transferable: Array, - track: RemuxedTrack + track: RemuxedTrack, ) { if (track.data1) { transferable.push(track.data1.buffer); @@ -163,11 +163,11 @@ function addToTransferable( function handleFlushResult( self: any, results: Array, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ) { const parsed = results.reduce( (parsed, result) => emitTransmuxComplete(self, result) || parsed, - false + false, ); if (!parsed) { // Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING diff --git a/src/demux/transmuxer.ts b/src/demux/transmuxer.ts index 0b41db45f..62f7a19fe 100644 --- a/src/demux/transmuxer.ts +++ b/src/demux/transmuxer.ts @@ -65,7 +65,7 @@ export default class Transmuxer { typeSupported: TypeSupported, config: HlsConfig, vendor: string, - id: PlaylistLevelType + id: PlaylistLevelType, ) { this.observer = observer; this.typeSupported = typeSupported; @@ -85,7 +85,7 @@ export default class Transmuxer { data: ArrayBuffer, decryptdata: DecryptData | null, chunkMeta: ChunkMetadata, - state?: TransmuxState + state?: TransmuxState, ): TransmuxerResult | Promise { const stats = chunkMeta.transmuxing; stats.executeStart = now(); @@ -122,7 +122,7 @@ export default class Transmuxer { let decryptedData = decrypter.softwareDecrypt( uintData, keyData.key.buffer, - keyData.iv.buffer + keyData.iv.buffer, ); // For Low-Latency HLS Parts, decrypt in place, since part parsing is expected on push progress const loadingParts = chunkMeta.part > -1; @@ -143,7 +143,7 @@ export default class Transmuxer { const result = this.push( decryptedData, null, - chunkMeta + chunkMeta, ) as TransmuxerResult; this.decryptionPromise = null; return result; @@ -175,7 +175,7 @@ export default class Transmuxer { audioCodec, videoCodec, duration, - decryptdata + decryptdata, ); } @@ -192,7 +192,7 @@ export default class Transmuxer { keyData, timeOffset, accurateTimeOffset, - chunkMeta + chunkMeta, ); const currentState = this.currentTransmuxState; @@ -206,7 +206,7 @@ export default class Transmuxer { // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type) flush( - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ): TransmuxerResult[] | Promise { const stats = chunkMeta.transmuxing; stats.executeStart = now(); @@ -231,7 +231,7 @@ export default class Transmuxer { if (decryptedData) { // Push always returns a TransmuxerResult if decryptdata is null transmuxResults.push( - this.push(decryptedData, null, chunkMeta) as TransmuxerResult + this.push(decryptedData, null, chunkMeta) as TransmuxerResult, ); } } @@ -259,14 +259,14 @@ export default class Transmuxer { private flushRemux( transmuxResults: TransmuxerResult[], demuxResult: DemuxerResult, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ) { const { audioTrack, videoTrack, id3Track, textTrack } = demuxResult; const { accurateTimeOffset, timeOffset } = this.currentTransmuxState; logger.log( `[transmuxer.ts]: Flushed fragment ${chunkMeta.sn}${ chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '' - } of level ${chunkMeta.level}` + } of level ${chunkMeta.level}`, ); const remuxResult = this.remuxer!.remux( audioTrack, @@ -276,7 +276,7 @@ export default class Transmuxer { timeOffset, accurateTimeOffset, true, - this.id + this.id, ); transmuxResults.push({ remuxResult, @@ -309,7 +309,7 @@ export default class Transmuxer { audioCodec: string | undefined, videoCodec: string | undefined, trackDuration: number, - decryptdata: DecryptData | null + decryptdata: DecryptData | null, ) { const { demuxer, remuxer } = this; if (!demuxer || !remuxer) { @@ -319,13 +319,13 @@ export default class Transmuxer { initSegmentData, audioCodec, videoCodec, - trackDuration + trackDuration, ); remuxer.resetInitSegment( initSegmentData, audioCodec, videoCodec, - decryptdata + decryptdata, ); } @@ -345,7 +345,7 @@ export default class Transmuxer { keyData: KeyData | null, timeOffset: number, accurateTimeOffset: boolean, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ): TransmuxerResult | Promise { let result: TransmuxerResult | Promise; if (keyData && keyData.method === 'SAMPLE-AES') { @@ -354,14 +354,14 @@ export default class Transmuxer { keyData, timeOffset, accurateTimeOffset, - chunkMeta + chunkMeta, ); } else { result = this.transmuxUnencrypted( data, timeOffset, accurateTimeOffset, - chunkMeta + chunkMeta, ); } return result; @@ -371,7 +371,7 @@ export default class Transmuxer { data: Uint8Array, timeOffset: number, accurateTimeOffset: boolean, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ): TransmuxerResult { const { audioTrack, videoTrack, id3Track, textTrack } = ( this.demuxer as Demuxer @@ -384,7 +384,7 @@ export default class Transmuxer { timeOffset, accurateTimeOffset, false, - this.id + this.id, ); return { remuxResult, @@ -397,7 +397,7 @@ export default class Transmuxer { decryptData: KeyData, timeOffset: number, accurateTimeOffset: boolean, - chunkMeta: ChunkMetadata + chunkMeta: ChunkMetadata, ): Promise { return (this.demuxer as Demuxer) .demuxSampleAes(data, decryptData, timeOffset) @@ -410,7 +410,7 @@ export default class Transmuxer { timeOffset, accurateTimeOffset, false, - this.id + this.id, ); return { remuxResult, @@ -463,7 +463,7 @@ export default class Transmuxer { function getEncryptionType( data: Uint8Array, - decryptData: DecryptData | null + decryptData: DecryptData | null, ): KeyData | null { let encryptionType: KeyData | null = null; if ( @@ -499,7 +499,7 @@ export class TransmuxConfig { videoCodec: string | undefined, initSegmentData: Uint8Array | undefined, duration: number, - defaultInitPts?: RationalTimestamp + defaultInitPts?: RationalTimestamp, ) { this.audioCodec = audioCodec; this.videoCodec = videoCodec; @@ -523,7 +523,7 @@ export class TransmuxState { accurateTimeOffset: boolean, trackSwitch: boolean, timeOffset: number, - initSegmentChange: boolean + initSegmentChange: boolean, ) { this.discontinuity = discontinuity; this.contiguous = contiguous; diff --git a/src/demux/tsdemuxer.ts b/src/demux/tsdemuxer.ts index 9266d56de..cd5e969eb 100644 --- a/src/demux/tsdemuxer.ts +++ b/src/demux/tsdemuxer.ts @@ -79,7 +79,7 @@ class TSDemuxer implements Demuxer { constructor( observer: HlsEventEmitter, config: HlsConfig, - typeSupported: TypeSupported + typeSupported: TypeSupported, ) { this.observer = observer; this.config = config; @@ -91,7 +91,7 @@ class TSDemuxer implements Demuxer { const syncOffset = TSDemuxer.syncOffset(data); if (syncOffset > 0) { logger.warn( - `MPEG2-TS detected but first sync word found @ offset ${syncOffset}` + `MPEG2-TS detected but first sync word found @ offset ${syncOffset}`, ); } return syncOffset !== -1; @@ -117,7 +117,7 @@ class TSDemuxer implements Demuxer { scanwindow = Math.min( packetStart + PACKET_LENGTH * 99, - data.length - PACKET_LENGTH + data.length - PACKET_LENGTH, ) + 1; } } @@ -150,7 +150,7 @@ class TSDemuxer implements Demuxer { */ static createTrack( type: 'audio' | 'video' | 'id3' | 'text', - duration?: number + duration?: number, ): DemuxedTrack { return { container: @@ -174,7 +174,7 @@ class TSDemuxer implements Demuxer { initSegment: Uint8Array | undefined, audioCodec: string, videoCodec: string, - trackDuration: number + trackDuration: number, ) { this.pmtParsed = false; this._pmtId = -1; @@ -182,7 +182,7 @@ class TSDemuxer implements Demuxer { this._videoTrack = TSDemuxer.createTrack('video') as DemuxedVideoTrack; this._audioTrack = TSDemuxer.createTrack( 'audio', - trackDuration + trackDuration, ) as DemuxedAudioTrack; this._id3Track = TSDemuxer.createTrack('id3') as DemuxedMetadataTrack; this._txtTrack = TSDemuxer.createTrack('text') as DemuxedUserdataTrack; @@ -217,7 +217,7 @@ class TSDemuxer implements Demuxer { data: Uint8Array, timeOffset: number, isSampleAes = false, - flush = false + flush = false, ): DemuxerResult { if (!isSampleAes) { this.sampleAes = null; @@ -263,7 +263,7 @@ class TSDemuxer implements Demuxer { this.remainderData = new Uint8Array( data.buffer, len, - data.buffer.byteLength - len + data.buffer.byteLength - len, ); } @@ -295,7 +295,7 @@ class TSDemuxer implements Demuxer { textTrack, pes, false, - this._duration + this._duration, ); } @@ -360,7 +360,7 @@ class TSDemuxer implements Demuxer { data, offset, this.typeSupported, - isSampleAes + isSampleAes, ); // only update track id if track PID found while parsing PMT @@ -387,7 +387,7 @@ class TSDemuxer implements Demuxer { if (unknownPID !== null && !pmtParsed) { logger.warn( - `MPEG-TS PMT found at ${start} after unknown PID '${unknownPID}'. Backtracking to sync byte @${syncOffset} to parse all TS packets.` + `MPEG-TS PMT found at ${start} after unknown PID '${unknownPID}'. Backtracking to sync byte @${syncOffset} to parse all TS packets.`, ); unknownPID = null; // we set it to -188, the += 188 in the for loop will reset start to 0 @@ -410,7 +410,7 @@ class TSDemuxer implements Demuxer { if (tsPacketErrors > 0) { const error = new Error( - `Found ${tsPacketErrors} TS packet/s that do not start with 0x47` + `Found ${tsPacketErrors} TS packet/s that do not start with 0x47`, ); this.observer.emit(Events.ERROR, Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, @@ -473,7 +473,7 @@ class TSDemuxer implements Demuxer { textTrack as DemuxedUserdataTrack, pes, true, - this._duration + this._duration, ); videoTrack.pesData = null; } else { @@ -499,7 +499,7 @@ class TSDemuxer implements Demuxer { } else { if (audioData?.size) { logger.log( - 'last AAC PES packet truncated,might overlap between fragments' + 'last AAC PES packet truncated,might overlap between fragments', ); } @@ -519,25 +519,25 @@ class TSDemuxer implements Demuxer { public demuxSampleAes( data: Uint8Array, keyData: KeyData, - timeOffset: number + timeOffset: number, ): Promise { const demuxResult = this.demux( data, timeOffset, true, - !this.config.progressive + !this.config.progressive, ); const sampleAes = (this.sampleAes = new SampleAesDecrypter( this.observer, this.config, - keyData + keyData, )); return this.decrypt(demuxResult, sampleAes); } private decrypt( demuxResult: DemuxerResult, - sampleAes: SampleAesDecrypter + sampleAes: SampleAesDecrypter, ): Promise { return new Promise((resolve) => { const { audioTrack, videoTrack } = demuxResult; @@ -578,7 +578,7 @@ class TSDemuxer implements Demuxer { const frameOverflowBytes = sampleLength - frameMissingBytes; aacOverFlow.sample.unit.set( data.subarray(0, frameMissingBytes), - frameOverflowBytes + frameOverflowBytes, ); track.samples.push(aacOverFlow.sample); startOffset = aacOverFlow.missing; @@ -621,7 +621,7 @@ class TSDemuxer implements Demuxer { this.observer, data, offset, - this.audioCodec as string + this.audioCodec as string, ); let pts: number; @@ -675,7 +675,7 @@ class TSDemuxer implements Demuxer { data, offset, pts, - frameIndex + frameIndex, ); if (frame) { offset += frame.length; @@ -740,7 +740,7 @@ function parsePMT( data: Uint8Array, offset: number, typeSupported: TypeSupported, - isSampleAes: boolean + isSampleAes: boolean, ) { const result = { audioPid: -1, @@ -848,7 +848,7 @@ function parsePMT( if (__USE_M2TS_ADVANCED_CODECS__) { if (typeSupported.ac3 !== true) { logger.log( - 'AC-3 audio found, not supported in this browser for now' + 'AC-3 audio found, not supported in this browser for now', ); } else { result.audioPid = pid; @@ -945,8 +945,8 @@ function parsePES(stream: ElementaryStreamData): PES | null { if (pesPts - pesDts > 60 * 90000) { logger.warn( `${Math.round( - (pesPts - pesDts) / 90000 - )}s delta between PTS and DTS, align them` + (pesPts - pesDts) / 90000, + )}s delta between PTS and DTS, align them`, ); pesPts = pesDts; } diff --git a/src/demux/video/avc-video-parser.ts b/src/demux/video/avc-video-parser.ts index d36464f48..f326dba31 100644 --- a/src/demux/video/avc-video-parser.ts +++ b/src/demux/video/avc-video-parser.ts @@ -19,7 +19,7 @@ class AvcVideoParser extends BaseVideoParser { textTrack: DemuxedUserdataTrack, pes: PES, last: boolean, - duration: number + duration: number, ) { const units = this.parseAVCNALu(track, pes.data); const debug = false; @@ -37,7 +37,7 @@ class AvcVideoParser extends BaseVideoParser { false, pes.pts, pes.dts, - '' + '', ); } @@ -80,7 +80,7 @@ class AvcVideoParser extends BaseVideoParser { true, pes.pts, pes.dts, - '' + '', ); } @@ -107,7 +107,7 @@ class AvcVideoParser extends BaseVideoParser { true, pes.pts, pes.dts, - '' + '', ); } @@ -128,7 +128,7 @@ class AvcVideoParser extends BaseVideoParser { unit.data, 1, pes.pts as number, - textTrack.samples + textTrack.samples, ); break; // SPS @@ -186,7 +186,7 @@ class AvcVideoParser extends BaseVideoParser { false, pes.pts, pes.dts, - debug ? 'AUD ' : '' + debug ? 'AUD ' : '', ); break; // Filler Data @@ -215,7 +215,7 @@ class AvcVideoParser extends BaseVideoParser { private parseAVCNALu( track: DemuxedVideoTrack, - array: Uint8Array + array: Uint8Array, ): Array<{ data: Uint8Array; type: number; @@ -280,7 +280,7 @@ class AvcVideoParser extends BaseVideoParser { // strip last bytes lastUnit.data = lastUnit.data.subarray( 0, - lastUnit.data.byteLength - lastState + lastUnit.data.byteLength - lastState, ); } } @@ -290,7 +290,7 @@ class AvcVideoParser extends BaseVideoParser { // logger.log('first NALU found with overflow:' + overflow); lastUnit.data = appendUint8Array( lastUnit.data, - array.subarray(0, overflow) + array.subarray(0, overflow), ); lastUnit.state = 0; } diff --git a/src/demux/video/base-video-parser.ts b/src/demux/video/base-video-parser.ts index 5662d8c8a..4c17a3769 100644 --- a/src/demux/video/base-video-parser.ts +++ b/src/demux/video/base-video-parser.ts @@ -13,7 +13,7 @@ class BaseVideoParser { key: boolean, pts: number | undefined, dts: number | undefined, - debug: string + debug: string, ): ParsedVideoSample { return { key, @@ -27,7 +27,7 @@ class BaseVideoParser { } protected getLastNalUnit( - samples: VideoSample[] + samples: VideoSample[], ): VideoSampleUnit | undefined { let VideoSample = this.VideoSample; let lastUnit: VideoSampleUnit | undefined; @@ -44,7 +44,7 @@ class BaseVideoParser { protected pushAccessUnit( VideoSample: ParsedVideoSample, - videoTrack: DemuxedVideoTrack + videoTrack: DemuxedVideoTrack, ) { if (VideoSample.units.length && VideoSample.frame) { // if sample does not have PTS/DTS, patch with last sample PTS/DTS @@ -65,7 +65,7 @@ class BaseVideoParser { } if (VideoSample.debug.length) { logger.log( - VideoSample.pts + '/' + VideoSample.dts + ':' + VideoSample.debug + VideoSample.pts + '/' + VideoSample.dts + ':' + VideoSample.debug, ); } } diff --git a/src/demux/video/exp-golomb.ts b/src/demux/video/exp-golomb.ts index 7267477f8..e6d7ae632 100644 --- a/src/demux/video/exp-golomb.ts +++ b/src/demux/video/exp-golomb.ts @@ -338,7 +338,7 @@ class ExpGolomb { width: Math.ceil( (picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - - frameCropRightOffset * 2 + frameCropRightOffset * 2, ), height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - diff --git a/src/events.ts b/src/events.ts index 41c914413..45367bab1 100644 --- a/src/events.ts +++ b/src/events.ts @@ -173,212 +173,212 @@ export enum Events { export interface HlsListeners { [Events.MEDIA_ATTACHING]: ( event: Events.MEDIA_ATTACHING, - data: MediaAttachingData + data: MediaAttachingData, ) => void; [Events.MEDIA_ATTACHED]: ( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) => void; [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void; [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void; [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void; [Events.BUFFER_CODECS]: ( event: Events.BUFFER_CODECS, - data: BufferCodecsData + data: BufferCodecsData, ) => void; [Events.BUFFER_CREATED]: ( event: Events.BUFFER_CREATED, - data: BufferCreatedData + data: BufferCreatedData, ) => void; [Events.BUFFER_APPENDING]: ( event: Events.BUFFER_APPENDING, - data: BufferAppendingData + data: BufferAppendingData, ) => void; [Events.BUFFER_APPENDED]: ( event: Events.BUFFER_APPENDED, - data: BufferAppendedData + data: BufferAppendedData, ) => void; [Events.BUFFER_EOS]: (event: Events.BUFFER_EOS, data: BufferEOSData) => void; [Events.BUFFER_FLUSHING]: ( event: Events.BUFFER_FLUSHING, - data: BufferFlushingData + data: BufferFlushingData, ) => void; [Events.BUFFER_FLUSHED]: ( event: Events.BUFFER_FLUSHED, - data: BufferFlushedData + data: BufferFlushedData, ) => void; [Events.MANIFEST_LOADING]: ( event: Events.MANIFEST_LOADING, - data: ManifestLoadingData + data: ManifestLoadingData, ) => void; [Events.MANIFEST_LOADED]: ( event: Events.MANIFEST_LOADED, - data: ManifestLoadedData + data: ManifestLoadedData, ) => void; [Events.MANIFEST_PARSED]: ( event: Events.MANIFEST_PARSED, - data: ManifestParsedData + data: ManifestParsedData, ) => void; [Events.LEVEL_SWITCHING]: ( event: Events.LEVEL_SWITCHING, - data: LevelSwitchingData + data: LevelSwitchingData, ) => void; [Events.LEVEL_SWITCHED]: ( event: Events.LEVEL_SWITCHED, - data: LevelSwitchedData + data: LevelSwitchedData, ) => void; [Events.LEVEL_LOADING]: ( event: Events.LEVEL_LOADING, - data: LevelLoadingData + data: LevelLoadingData, ) => void; [Events.LEVEL_LOADED]: ( event: Events.LEVEL_LOADED, - data: LevelLoadedData + data: LevelLoadedData, ) => void; [Events.LEVEL_UPDATED]: ( event: Events.LEVEL_UPDATED, - data: LevelUpdatedData + data: LevelUpdatedData, ) => void; [Events.LEVEL_PTS_UPDATED]: ( event: Events.LEVEL_PTS_UPDATED, - data: LevelPTSUpdatedData + data: LevelPTSUpdatedData, ) => void; [Events.LEVELS_UPDATED]: ( event: Events.LEVELS_UPDATED, - data: LevelsUpdatedData + data: LevelsUpdatedData, ) => void; [Events.AUDIO_TRACKS_UPDATED]: ( event: Events.AUDIO_TRACKS_UPDATED, - data: AudioTracksUpdatedData + data: AudioTracksUpdatedData, ) => void; [Events.AUDIO_TRACK_SWITCHING]: ( event: Events.AUDIO_TRACK_SWITCHING, - data: AudioTrackSwitchingData + data: AudioTrackSwitchingData, ) => void; [Events.AUDIO_TRACK_SWITCHED]: ( event: Events.AUDIO_TRACK_SWITCHED, - data: AudioTrackSwitchedData + data: AudioTrackSwitchedData, ) => void; [Events.AUDIO_TRACK_LOADING]: ( event: Events.AUDIO_TRACK_LOADING, - data: TrackLoadingData + data: TrackLoadingData, ) => void; [Events.AUDIO_TRACK_LOADED]: ( event: Events.AUDIO_TRACK_LOADED, - data: AudioTrackLoadedData + data: AudioTrackLoadedData, ) => void; [Events.SUBTITLE_TRACKS_UPDATED]: ( event: Events.SUBTITLE_TRACKS_UPDATED, - data: SubtitleTracksUpdatedData + data: SubtitleTracksUpdatedData, ) => void; [Events.SUBTITLE_TRACKS_CLEARED]: ( - event: Events.SUBTITLE_TRACKS_CLEARED + event: Events.SUBTITLE_TRACKS_CLEARED, ) => void; [Events.SUBTITLE_TRACK_SWITCH]: ( event: Events.SUBTITLE_TRACK_SWITCH, - data: SubtitleTrackSwitchData + data: SubtitleTrackSwitchData, ) => void; [Events.SUBTITLE_TRACK_LOADING]: ( event: Events.SUBTITLE_TRACK_LOADING, - data: TrackLoadingData + data: TrackLoadingData, ) => void; [Events.SUBTITLE_TRACK_LOADED]: ( event: Events.SUBTITLE_TRACK_LOADED, - data: SubtitleTrackLoadedData + data: SubtitleTrackLoadedData, ) => void; [Events.SUBTITLE_FRAG_PROCESSED]: ( event: Events.SUBTITLE_FRAG_PROCESSED, - data: SubtitleFragProcessedData + data: SubtitleFragProcessedData, ) => void; [Events.CUES_PARSED]: ( event: Events.CUES_PARSED, - data: CuesParsedData + data: CuesParsedData, ) => void; [Events.NON_NATIVE_TEXT_TRACKS_FOUND]: ( event: Events.NON_NATIVE_TEXT_TRACKS_FOUND, - data: NonNativeTextTracksData + data: NonNativeTextTracksData, ) => void; [Events.INIT_PTS_FOUND]: ( event: Events.INIT_PTS_FOUND, - data: InitPTSFoundData + data: InitPTSFoundData, ) => void; [Events.FRAG_LOADING]: ( event: Events.FRAG_LOADING, - data: FragLoadingData + data: FragLoadingData, ) => void; // [Events.FRAG_LOAD_PROGRESS]: TodoEventType [Events.FRAG_LOAD_EMERGENCY_ABORTED]: ( event: Events.FRAG_LOAD_EMERGENCY_ABORTED, - data: FragLoadEmergencyAbortedData + data: FragLoadEmergencyAbortedData, ) => void; [Events.FRAG_LOADED]: ( event: Events.FRAG_LOADED, - data: FragLoadedData + data: FragLoadedData, ) => void; [Events.FRAG_DECRYPTED]: ( event: Events.FRAG_DECRYPTED, - data: FragDecryptedData + data: FragDecryptedData, ) => void; [Events.FRAG_PARSING_INIT_SEGMENT]: ( event: Events.FRAG_PARSING_INIT_SEGMENT, - data: FragParsingInitSegmentData + data: FragParsingInitSegmentData, ) => void; [Events.FRAG_PARSING_USERDATA]: ( event: Events.FRAG_PARSING_USERDATA, - data: FragParsingUserdataData + data: FragParsingUserdataData, ) => void; [Events.FRAG_PARSING_METADATA]: ( event: Events.FRAG_PARSING_METADATA, - data: FragParsingMetadataData + data: FragParsingMetadataData, ) => void; // [Events.FRAG_PARSING_DATA]: TodoEventType [Events.FRAG_PARSED]: ( event: Events.FRAG_PARSED, - data: FragParsedData + data: FragParsedData, ) => void; [Events.FRAG_BUFFERED]: ( event: Events.FRAG_BUFFERED, - data: FragBufferedData + data: FragBufferedData, ) => void; [Events.FRAG_CHANGED]: ( event: Events.FRAG_CHANGED, - data: FragChangedData + data: FragChangedData, ) => void; [Events.FPS_DROP]: (event: Events.FPS_DROP, data: FPSDropData) => void; [Events.FPS_DROP_LEVEL_CAPPING]: ( event: Events.FPS_DROP_LEVEL_CAPPING, - data: FPSDropLevelCappingData + data: FPSDropLevelCappingData, ) => void; [Events.ERROR]: (event: Events.ERROR, data: ErrorData) => void; [Events.DESTROYING]: (event: Events.DESTROYING) => void; [Events.KEY_LOADING]: ( event: Events.KEY_LOADING, - data: KeyLoadingData + data: KeyLoadingData, ) => void; [Events.KEY_LOADED]: (event: Events.KEY_LOADED, data: KeyLoadedData) => void; [Events.LIVE_BACK_BUFFER_REACHED]: ( event: Events.LIVE_BACK_BUFFER_REACHED, - data: LiveBackBufferData + data: LiveBackBufferData, ) => void; [Events.BACK_BUFFER_REACHED]: ( event: Events.BACK_BUFFER_REACHED, - data: BackBufferData + data: BackBufferData, ) => void; [Events.STEERING_MANIFEST_LOADED]: ( event: Events.STEERING_MANIFEST_LOADED, - data: SteeringManifestLoadedData + data: SteeringManifestLoadedData, ) => void; } export interface HlsEventEmitter { on( event: E, listener: HlsListeners[E], - context?: Context + context?: Context, ): void; once( event: E, listener: HlsListeners[E], - context?: Context + context?: Context, ): void; removeAllListeners(event?: E): void; @@ -386,14 +386,14 @@ export interface HlsEventEmitter { event: E, listener?: HlsListeners[E], context?: Context, - once?: boolean + once?: boolean, ): void; listeners(event: E): HlsListeners[E][]; emit( event: E, name: E, - eventObject: Parameters[1] + eventObject: Parameters[1], ): boolean; listenerCount(event: E): number; } diff --git a/src/hls.ts b/src/hls.ts index c63f670c1..d6b055a87 100644 --- a/src/hls.ts +++ b/src/hls.ts @@ -153,7 +153,7 @@ export default class Hls implements HlsEventEmitter { : null; const levelController = (this.levelController = new LevelController( this, - contentSteering + contentSteering, )); // FragmentTracker must be defined before StreamController because the order of event handling is important const fragmentTracker = new FragmentTracker(this); @@ -161,7 +161,7 @@ export default class Hls implements HlsEventEmitter { const streamController = (this.streamController = new StreamController( this, fragmentTracker, - keyLoader + keyLoader, )); // Cap level controller uses streamController to flush the buffer @@ -190,37 +190,37 @@ export default class Hls implements HlsEventEmitter { this.audioTrackController = this.createController( config.audioTrackController, - networkControllers + networkControllers, ); const AudioStreamControllerClass = config.audioStreamController; if (AudioStreamControllerClass) { networkControllers.push( - new AudioStreamControllerClass(this, fragmentTracker, keyLoader) + new AudioStreamControllerClass(this, fragmentTracker, keyLoader), ); } // subtitleTrackController must be defined before subtitleStreamController because the order of event handling is important this.subtitleTrackController = this.createController( config.subtitleTrackController, - networkControllers + networkControllers, ); const SubtitleStreamControllerClass = config.subtitleStreamController; if (SubtitleStreamControllerClass) { networkControllers.push( - new SubtitleStreamControllerClass(this, fragmentTracker, keyLoader) + new SubtitleStreamControllerClass(this, fragmentTracker, keyLoader), ); } this.createController(config.timelineController, coreComponents); keyLoader.emeController = this.emeController = this.createController( config.emeController, - coreComponents + coreComponents, ); this.cmcdController = this.createController( config.cmcdController, - coreComponents + coreComponents, ); this.latencyController = this.createController( LatencyController, - coreComponents + coreComponents, ); this.coreComponents = coreComponents; @@ -249,7 +249,7 @@ export default class Hls implements HlsEventEmitter { on( event: E, listener: HlsListeners[E], - context: Context = this as any + context: Context = this as any, ) { this._emitter.on(event, listener, context); } @@ -257,7 +257,7 @@ export default class Hls implements HlsEventEmitter { once( event: E, listener: HlsListeners[E], - context: Context = this as any + context: Context = this as any, ) { this._emitter.once(event, listener, context); } @@ -270,7 +270,7 @@ export default class Hls implements HlsEventEmitter { event: E, listener?: HlsListeners[E] | undefined, context: Context = this as any, - once?: boolean | undefined + once?: boolean | undefined, ) { this._emitter.off(event, listener, context, once); } @@ -282,14 +282,14 @@ export default class Hls implements HlsEventEmitter { emit( event: E, name: E, - eventObject: Parameters[1] + eventObject: Parameters[1], ): boolean { return this._emitter.emit(event, name, eventObject); } trigger( event: E, - eventObject: Parameters[1] + eventObject: Parameters[1], ): boolean { if (this.config.debug) { return this.emit(event, event, eventObject); @@ -303,7 +303,7 @@ export default class Hls implements HlsEventEmitter { '. Error message: "' + error.message + '". Here is a stacktrace:', - error + error, ); // Prevent recursion in error event handlers that throw #5497 if (!this.triggeringException) { @@ -380,7 +380,7 @@ export default class Hls implements HlsEventEmitter { url, { alwaysNormalize: true, - } + }, )); logger.log(`loadSource:${loadingSource}`); if ( diff --git a/src/loader/date-range.ts b/src/loader/date-range.ts index 9ef0692c0..f841d8bbb 100644 --- a/src/loader/date-range.ts +++ b/src/loader/date-range.ts @@ -47,7 +47,7 @@ export class DateRange { dateRangeAttr[key] !== previousAttr[key] ) { logger.warn( - `DATERANGE tag attribute: "${key}" does not match for tags with ID: "${dateRangeAttr.ID}"` + `DATERANGE tag attribute: "${key}" does not match for tags with ID: "${dateRangeAttr.ID}"`, ); this._badValueForSameId = key; break; @@ -57,7 +57,7 @@ export class DateRange { dateRangeAttr = Object.assign( new AttrList({}), previousAttr, - dateRangeAttr + dateRangeAttr, ); } this.attr = dateRangeAttr; @@ -96,7 +96,7 @@ export class DateRange { get duration(): number | null { if (DateRangeAttribute.DURATION in this.attr) { const duration = this.attr.decimalFloatingPoint( - DateRangeAttribute.DURATION + DateRangeAttribute.DURATION, ); if (Number.isFinite(duration)) { return duration; @@ -110,7 +110,7 @@ export class DateRange { get plannedDuration(): number | null { if (DateRangeAttribute.PLANNED_DURATION in this.attr) { return this.attr.decimalFloatingPoint( - DateRangeAttribute.PLANNED_DURATION + DateRangeAttribute.PLANNED_DURATION, ); } return null; diff --git a/src/loader/fragment-loader.ts b/src/loader/fragment-loader.ts index b7e94d9b6..25152f2f6 100644 --- a/src/loader/fragment-loader.ts +++ b/src/loader/fragment-loader.ts @@ -41,7 +41,7 @@ export default class FragmentLoader { load( frag: Fragment, - onProgress?: FragmentLoadProgressCallback + onProgress?: FragmentLoadProgressCallback, ): Promise { const url = frag.url; if (!url) { @@ -52,10 +52,10 @@ export default class FragmentLoader { fatal: false, frag, error: new Error( - `Fragment does not have a ${url ? 'part list' : 'url'}` + `Fragment does not have a ${url ? 'part list' : 'url'}`, ), networkDetails: null, - }) + }), ); } this.abort(); @@ -85,7 +85,7 @@ export default class FragmentLoader { : (new DefaultILoader(config) as Loader)); const loaderContext = createLoaderContext(frag); const loadPolicy = getLoaderConfigWithoutReties( - config.fragLoadPolicy.default + config.fragLoadPolicy.default, ); const loaderConfig: LoaderConfiguration = { loadPolicy, @@ -124,7 +124,7 @@ export default class FragmentLoader { error: new Error(`HTTP Error ${response.code} ${response.text}`), networkDetails, stats, - }) + }), ); }, onAbort: (stats, context, networkDetails) => { @@ -138,7 +138,7 @@ export default class FragmentLoader { error: new Error('Aborted'), networkDetails, stats, - }) + }), ); }, onTimeout: (stats, context, networkDetails) => { @@ -152,7 +152,7 @@ export default class FragmentLoader { error: new Error(`Timeout after ${loaderConfig.timeout}ms`), networkDetails, stats, - }) + }), ); }, onProgress: (stats, context, data, networkDetails) => { @@ -172,7 +172,7 @@ export default class FragmentLoader { public loadPart( frag: Fragment, part: Part, - onProgress: FragmentLoadProgressCallback + onProgress: FragmentLoadProgressCallback, ): Promise { this.abort(); @@ -197,7 +197,7 @@ export default class FragmentLoader { const loaderContext = createLoaderContext(frag, part); // Should we define another load policy for parts? const loadPolicy = getLoaderConfigWithoutReties( - config.fragLoadPolicy.default + config.fragLoadPolicy.default, ); const loaderConfig: LoaderConfiguration = { loadPolicy, @@ -239,7 +239,7 @@ export default class FragmentLoader { error: new Error(`HTTP Error ${response.code} ${response.text}`), networkDetails, stats, - }) + }), ); }, onAbort: (stats, context, networkDetails) => { @@ -255,7 +255,7 @@ export default class FragmentLoader { error: new Error('Aborted'), networkDetails, stats, - }) + }), ); }, onTimeout: (stats, context, networkDetails) => { @@ -270,7 +270,7 @@ export default class FragmentLoader { error: new Error(`Timeout after ${loaderConfig.timeout}ms`), networkDetails, stats, - }) + }), ); }, }); @@ -286,7 +286,7 @@ export default class FragmentLoader { const estTotalParts = Math.round(frag.duration / part.duration); const estLoadedParts = Math.min( Math.round(fragStats.loaded / partTotal), - estTotalParts + estTotalParts, ); const estRemainingParts = estTotalParts - estLoadedParts; const estRemainingBytes = @@ -319,7 +319,7 @@ export default class FragmentLoader { function createLoaderContext( frag: Fragment, - part: Part | null = null + part: Part | null = null, ): FragmentLoaderContext { const segment: BaseSegment = part || frag; const loaderContext: FragmentLoaderContext = { @@ -395,5 +395,5 @@ export interface FragLoadFailResult extends ErrorData { } export type FragmentLoadProgressCallback = ( - result: FragLoadedData | PartsLoadedData + result: FragLoadedData | PartsLoadedData, ) => void; diff --git a/src/loader/fragment.ts b/src/loader/fragment.ts index a60875440..9c0abea7b 100644 --- a/src/loader/fragment.ts +++ b/src/loader/fragment.ts @@ -235,7 +235,7 @@ export class Fragment extends BaseSegment { endPTS: number, startDTS: number, endDTS: number, - partial: boolean = false + partial: boolean = false, ) { const { elementaryStreams } = this; const info = elementaryStreams[type]; @@ -282,7 +282,7 @@ export class Part extends BaseSegment { frag: Fragment, baseurl: string, index: number, - previous?: Part + previous?: Part, ) { super(baseurl); this.duration = partAttrs.decimalFloatingPoint('DURATION'); diff --git a/src/loader/key-loader.ts b/src/loader/key-loader.ts index 0c40495d0..71545063b 100644 --- a/src/loader/key-loader.ts +++ b/src/loader/key-loader.ts @@ -74,7 +74,7 @@ export default class KeyLoader implements ComponentAPI { details: ErrorDetails = ErrorDetails.KEY_LOAD_ERROR, error: Error, networkDetails?: any, - response?: { url: string; data: undefined; code: number; text: string } + response?: { url: string; data: undefined; code: number; text: string }, ): LoadError { return new LoadError({ type: ErrorTypes.NETWORK_ERROR, @@ -89,7 +89,7 @@ export default class KeyLoader implements ComponentAPI { loadClear( loadingFrag: Fragment, - encryptedFragments: Fragment[] + encryptedFragments: Fragment[], ): void | Promise { if (this.emeController && this.config.emeEnabled) { // access key-system with nearest key on start (loaidng frag is unencrypted) @@ -126,7 +126,7 @@ export default class KeyLoader implements ComponentAPI { loadInternal( frag: Fragment, - keySystemFormat?: KeySystemFormats + keySystemFormat?: KeySystemFormats, ): Promise { if (keySystemFormat) { frag.setKeyFormat(keySystemFormat); @@ -136,10 +136,10 @@ export default class KeyLoader implements ComponentAPI { const error = new Error( keySystemFormat ? `Expected frag.decryptdata to be defined after setting format ${keySystemFormat}` - : 'Missing decryption data on fragment in onKeyLoading' + : 'Missing decryption data on fragment in onKeyLoading', ); return Promise.reject( - this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, error) + this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, error), ); } const uri = decryptdata.uri; @@ -148,8 +148,8 @@ export default class KeyLoader implements ComponentAPI { this.createKeyLoadError( frag, ErrorDetails.KEY_LOAD_ERROR, - new Error(`Invalid key URI: "${uri}"`) - ) + new Error(`Invalid key URI: "${uri}"`), + ), ); } let keyInfo = this.keyUriToKeyInfo[uri]; @@ -201,9 +201,9 @@ export default class KeyLoader implements ComponentAPI { frag, ErrorDetails.KEY_LOAD_ERROR, new Error( - `Key supplied with unsupported METHOD: "${decryptdata.method}"` - ) - ) + `Key supplied with unsupported METHOD: "${decryptdata.method}"`, + ), + ), ); } } @@ -218,7 +218,7 @@ export default class KeyLoader implements ComponentAPI { (keySessionContext) => { keyInfo.mediaKeySessionContext = keySessionContext; return keyLoadedData; - } + }, )).catch((error) => { // Remove promise for license renewal or retry keyInfo.keyLoadPromise = null; @@ -260,7 +260,7 @@ export default class KeyLoader implements ComponentAPI { response: LoaderResponse, stats: LoaderStats, context: KeyLoaderContext, - networkDetails: any + networkDetails: any, ) => { const { frag, keyInfo, url: uri } = context; if (!frag.decryptdata || keyInfo !== this.keyUriToKeyInfo[uri]) { @@ -269,13 +269,13 @@ export default class KeyLoader implements ComponentAPI { frag, ErrorDetails.KEY_LOAD_ERROR, new Error('after key load, decryptdata unset or changed'), - networkDetails - ) + networkDetails, + ), ); } keyInfo.decryptdata.key = frag.decryptdata.key = new Uint8Array( - response.data as ArrayBuffer + response.data as ArrayBuffer, ); // detach fragment key loader on load success @@ -288,7 +288,7 @@ export default class KeyLoader implements ComponentAPI { response: { code: number; text: string }, context: KeyLoaderContext, networkDetails: any, - stats: LoaderStats + stats: LoaderStats, ) => { this.resetLoader(context); reject( @@ -296,18 +296,18 @@ export default class KeyLoader implements ComponentAPI { frag, ErrorDetails.KEY_LOAD_ERROR, new Error( - `HTTP Error ${response.code} loading key ${response.text}` + `HTTP Error ${response.code} loading key ${response.text}`, ), networkDetails, - { url: loaderContext.url, data: undefined, ...response } - ) + { url: loaderContext.url, data: undefined, ...response }, + ), ); }, onTimeout: ( stats: LoaderStats, context: KeyLoaderContext, - networkDetails: any + networkDetails: any, ) => { this.resetLoader(context); reject( @@ -315,15 +315,15 @@ export default class KeyLoader implements ComponentAPI { frag, ErrorDetails.KEY_LOAD_TIMEOUT, new Error('key loading timed out'), - networkDetails - ) + networkDetails, + ), ); }, onAbort: ( stats: LoaderStats, context: KeyLoaderContext, - networkDetails: any + networkDetails: any, ) => { this.resetLoader(context); reject( @@ -331,8 +331,8 @@ export default class KeyLoader implements ComponentAPI { frag, ErrorDetails.INTERNAL_ABORTED, new Error('key loading aborted'), - networkDetails - ) + networkDetails, + ), ); }, }; diff --git a/src/loader/level-details.ts b/src/loader/level-details.ts index 5ac1f65b3..b128f3856 100644 --- a/src/loader/level-details.ts +++ b/src/loader/level-details.ts @@ -88,7 +88,7 @@ export class LevelDetails { get hasProgramDateTime(): boolean { if (this.fragments.length) { return Number.isFinite( - this.fragments[this.fragments.length - 1].programDateTime as number + this.fragments[this.fragments.length - 1].programDateTime as number, ); } return false; diff --git a/src/loader/level-key.ts b/src/loader/level-key.ts index 0a18a7728..3db1b2582 100644 --- a/src/loader/level-key.ts +++ b/src/loader/level-key.ts @@ -43,7 +43,7 @@ export class LevelKey implements DecryptData { uri: string, format: string, formatversions: number[] = [1], - iv: Uint8Array | null = null + iv: Uint8Array | null = null, ) { this.method = method; this.uri = uri; @@ -95,7 +95,7 @@ export class LevelKey implements DecryptData { // It must have an IV defined. We cannot substitute the Segment Number in. if (this.method === 'AES-128' && !this.iv) { logger.warn( - `missing IV for initialization segment with method="${this.method}" - compliance issue` + `missing IV for initialization segment with method="${this.method}" - compliance issue`, ); } // Explicitly set sn to resulting value from implicit conversions 'initSegment' values for IV generation. @@ -107,7 +107,7 @@ export class LevelKey implements DecryptData { this.uri, 'identity', this.keyFormatVersions, - iv + iv, ); return decryptdata; } @@ -126,7 +126,7 @@ export class LevelKey implements DecryptData { if (keyBytes.length >= 22) { this.keyId = keyBytes.subarray( keyBytes.length - 22, - keyBytes.length - 6 + keyBytes.length - 6, ); } break; @@ -141,17 +141,17 @@ export class LevelKey implements DecryptData { const keyBytesUtf16 = new Uint16Array( keyBytes.buffer, keyBytes.byteOffset, - keyBytes.byteLength / 2 + keyBytes.byteLength / 2, ); const keyByteStr = String.fromCharCode.apply( null, - Array.from(keyBytesUtf16) + Array.from(keyBytesUtf16), ); // Parse Playready WRMHeader XML const xmlKeyBytes = keyByteStr.substring( keyByteStr.indexOf('<'), - keyByteStr.length + keyByteStr.length, ); const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlKeyBytes, 'text/xml'); diff --git a/src/loader/m3u8-parser.ts b/src/loader/m3u8-parser.ts index edd072b5a..50cdd7419 100644 --- a/src/loader/m3u8-parser.ts +++ b/src/loader/m3u8-parser.ts @@ -57,7 +57,7 @@ const LEVEL_PLAYLIST_REGEX_FAST = new RegExp( /#EXT-X-PROGRAM-DATE-TIME:(.+)/.source, // next segment's program date/time group 5 => the datetime spec /#.*/.source, // All other non-segment oriented tags will match with all groups empty ].join('|'), - 'g' + 'g', ); const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp( @@ -70,13 +70,13 @@ const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp( /#EXT-X-(DISCONTINUITY|ENDLIST|GAP)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source, - ].join('|') + ].join('|'), ); export default class M3U8Parser { static findGroup( groups: Array, - mediaGroupId: string + mediaGroupId: string, ): AudioGroup | undefined { for (let i = 0; i < groups.length; i++) { const group = groups[i]; @@ -108,7 +108,7 @@ export default class M3U8Parser { static parseMasterPlaylist( string: string, - baseurl: string + baseurl: string, ): ParsedMultivariantPlaylist { const hasVariableRefs = __USE_VARIABLE_SUBSTITUTION__ ? hasVariableReferences(string) @@ -166,7 +166,7 @@ export default class M3U8Parser { setCodecs( ((attrs.CODECS as string) || '').split(/[ ,]+/).filter((c) => c), - level + level, ); if (level.videoCodec && level.videoCodec.indexOf('avc1') !== -1) { @@ -212,7 +212,7 @@ export default class M3U8Parser { parsed.sessionKeys.push(sessionKey); } else { logger.warn( - `[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: "${attributes}"` + `[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: "${attributes}"`, ); } break; @@ -237,13 +237,13 @@ export default class M3U8Parser { substituteVariablesInAttributes( parsed, contentSteeringAttributes, - ['SERVER-URI', 'PATHWAY-ID'] + ['SERVER-URI', 'PATHWAY-ID'], ); } parsed.contentSteering = { uri: M3U8Parser.resolve( contentSteeringAttributes['SERVER-URI'], - baseurl + baseurl, ), pathwayId: contentSteeringAttributes['PATHWAY-ID'] || '.', }; @@ -277,7 +277,7 @@ export default class M3U8Parser { static parseMasterPlaylistMedia( string: string, baseurl: string, - parsed: ParsedMultivariantPlaylist + parsed: ParsedMultivariantPlaylist, ): ParsedMultivariantMediaOptions { let result: RegExpExecArray | null; const results: ParsedMultivariantMediaOptions = {}; @@ -354,7 +354,7 @@ export default class M3U8Parser { id: number, type: PlaylistLevelType, levelUrlId: number, - multivariantVariableList: VariableMap | null + multivariantVariableList: VariableMap | null, ): LevelDetails { const level = new LevelDetails(baseurl); const fragments: M3U8ParserFragments = level.fragments; @@ -484,7 +484,7 @@ export default class M3U8Parser { currentSN += skippedSegments; } const recentlyRemovedDateranges = skipAttrs.enumeratedString( - 'RECENTLY-REMOVED-DATERANGES' + 'RECENTLY-REMOVED-DATERANGES', ); if (recentlyRemovedDateranges) { level.recentlyRemovedDateranges = @@ -534,12 +534,12 @@ export default class M3U8Parser { substituteVariablesInAttributes( level, dateRangeAttr, - dateRangeAttr.clientAttrs + dateRangeAttr.clientAttrs, ); } const dateRange = new DateRange( dateRangeAttr, - level.dateRanges[dateRangeAttr.ID] + level.dateRanges[dateRangeAttr.ID], ); if (dateRange.isValid || level.skippedSegments) { level.dateRanges[dateRange.id] = dateRange; @@ -563,7 +563,7 @@ export default class M3U8Parser { importVariableDefinition( level, variableAttributes, - multivariantVariableList + multivariantVariableList, ); } else { addVariableDefinition(level, variableAttributes, baseurl); @@ -632,14 +632,14 @@ export default class M3U8Parser { level.canBlockReload = serverControlAttrs.bool('CAN-BLOCK-RELOAD'); level.canSkipUntil = serverControlAttrs.optionalFloat( 'CAN-SKIP-UNTIL', - 0 + 0, ); level.canSkipDateRanges = level.canSkipUntil > 0 && serverControlAttrs.bool('CAN-SKIP-DATERANGES'); level.partHoldBack = serverControlAttrs.optionalFloat( 'PART-HOLD-BACK', - 0 + 0, ); level.holdBack = serverControlAttrs.optionalFloat('HOLD-BACK', 0); break; @@ -669,7 +669,7 @@ export default class M3U8Parser { frag, baseurl, index, - previousFragmentPart + previousFragmentPart, ); partList.push(part); frag.duration += part.duration; @@ -758,7 +758,7 @@ export default class M3U8Parser { function parseKey( keyTagAttributes: string, baseurl: string, - parsed: ParsedMultivariantPlaylist | LevelDetails + parsed: ParsedMultivariantPlaylist | LevelDetails, ): LevelKey { // https://tools.ietf.org/html/rfc8216#section-4.3.2.4 const keyAttrs = new AttrList(keyTagAttributes); @@ -796,7 +796,7 @@ function parseKey( resolvedUri, decryptkeyformat, keyFormatVersions, - decryptiv + decryptiv, ); } @@ -832,7 +832,7 @@ function assignCodec(media, groupItem, codecProperty) { function backfillProgramDateTimes( fragments: M3U8ParserFragments, - firstPdtIndex: number + firstPdtIndex: number, ) { let fragPrev = fragments[firstPdtIndex] as Fragment; for (let i = firstPdtIndex; i--; ) { @@ -864,7 +864,7 @@ function setInitSegment( frag: Fragment, mapAttrs: AttrList, id: number, - levelkeys: { [key: string]: LevelKey } | undefined + levelkeys: { [key: string]: LevelKey } | undefined, ) { frag.relurl = mapAttrs.URI; if (mapAttrs.BYTERANGE) { @@ -881,7 +881,7 @@ function setInitSegment( function setFragLevelKeys( frag: Fragment, levelkeys: { [key: string]: LevelKey }, - level: LevelDetails + level: LevelDetails, ) { frag.levelkeys = levelkeys; const { encryptedFragments } = level; @@ -890,7 +890,7 @@ function setFragLevelKeys( encryptedFragments[encryptedFragments.length - 1].levelkeys !== levelkeys) && Object.keys(levelkeys).some( - (format) => levelkeys![format].isCommonEncryption + (format) => levelkeys![format].isCommonEncryption, ) ) { encryptedFragments.push(frag); diff --git a/src/loader/playlist-loader.ts b/src/loader/playlist-loader.ts index b2da54666..339632587 100644 --- a/src/loader/playlist-loader.ts +++ b/src/loader/playlist-loader.ts @@ -35,7 +35,7 @@ import type { MediaAttributes } from '../types/media-playlist'; import type { LoaderConfig, RetryConfig } from '../config'; function mapContextToLevelType( - context: PlaylistLoaderContext + context: PlaylistLoaderContext, ): PlaylistLevelType { const { type } = context; @@ -51,7 +51,7 @@ function mapContextToLevelType( function getResponseUrl( response: LoaderResponse, - context: PlaylistLoaderContext + context: PlaylistLoaderContext, ): string { let url = response.url; // responseURL not supported on some browsers (it is used to detect URL redirection) @@ -101,7 +101,7 @@ class PlaylistLoader implements NetworkComponentAPI { * Returns defaults or configured loader-type overloads (pLoader and loader config params) */ private createInternalLoader( - context: PlaylistLoaderContext + context: PlaylistLoaderContext, ): Loader { const config = this.hls.config; const PLoader = config.pLoader; @@ -114,7 +114,7 @@ class PlaylistLoader implements NetworkComponentAPI { } private getInternalLoader( - context: PlaylistLoaderContext + context: PlaylistLoaderContext, ): Loader | undefined { return this.loaders[context.type]; } @@ -147,7 +147,7 @@ class PlaylistLoader implements NetworkComponentAPI { private onManifestLoading( event: Events.MANIFEST_LOADING, - data: ManifestLoadingData + data: ManifestLoadingData, ) { const { url } = data; this.variableList = null; @@ -175,7 +175,7 @@ class PlaylistLoader implements NetworkComponentAPI { private onAudioTrackLoading( event: Events.AUDIO_TRACK_LOADING, - data: TrackLoadingData + data: TrackLoadingData, ) { const { id, groupId, url, deliveryDirectives } = data; this.load({ @@ -191,7 +191,7 @@ class PlaylistLoader implements NetworkComponentAPI { private onSubtitleTrackLoading( event: Events.SUBTITLE_TRACK_LOADING, - data: TrackLoadingData + data: TrackLoadingData, ) { const { id, groupId, url, deliveryDirectives } = data; this.load({ @@ -220,7 +220,7 @@ class PlaylistLoader implements NetworkComponentAPI { return; } logger.log( - `[playlist-loader]: aborting previous loader for type: ${context.type}` + `[playlist-loader]: aborting previous loader for type: ${context.type}`, ); loader.abort(); } @@ -267,11 +267,11 @@ class PlaylistLoader implements NetworkComponentAPI { loadPolicy = Object.assign({}, loadPolicy, { maxTimeToFirstByteMs: Math.min( maxLowLatencyPlaylistRefresh, - loadPolicy.maxTimeToFirstByteMs + loadPolicy.maxTimeToFirstByteMs, ), maxLoadTimeMs: Math.min( maxLowLatencyPlaylistRefresh, - loadPolicy.maxTimeToFirstByteMs + loadPolicy.maxTimeToFirstByteMs, ), }); } @@ -304,7 +304,7 @@ class PlaylistLoader implements NetworkComponentAPI { context, new Error('no EXTM3U delimiter'), networkDetails || null, - stats + stats, ); return; } @@ -316,7 +316,7 @@ class PlaylistLoader implements NetworkComponentAPI { stats, context, networkDetails || null, - loader + loader, ); } else { this.handleMasterPlaylist(response, stats, context, networkDetails); @@ -328,7 +328,7 @@ class PlaylistLoader implements NetworkComponentAPI { networkDetails, false, response, - stats + stats, ); }, onTimeout: (stats, context, networkDetails) => { @@ -337,7 +337,7 @@ class PlaylistLoader implements NetworkComponentAPI { networkDetails, true, undefined, - stats + stats, ); }, }; @@ -351,7 +351,7 @@ class PlaylistLoader implements NetworkComponentAPI { response: LoaderResponse, stats: LoaderStats, context: PlaylistLoaderContext, - networkDetails: any + networkDetails: any, ): void { const hls = this.hls; const string = response.data as string; @@ -366,7 +366,7 @@ class PlaylistLoader implements NetworkComponentAPI { context, parsedResult.playlistParsingError, networkDetails, - stats + stats, ); return; } @@ -391,7 +391,7 @@ class PlaylistLoader implements NetworkComponentAPI { if (audioTracks.length) { // check if we have found an audio track embedded in main playlist (audio track without URI attribute) const embeddedAudioFound: boolean = audioTracks.some( - (audioTrack) => !audioTrack.url + (audioTrack) => !audioTrack.url, ); // if no embedded audio track defined, but audio codec signaled in quality level, @@ -404,7 +404,7 @@ class PlaylistLoader implements NetworkComponentAPI { !levels[0].attrs.AUDIO ) { logger.log( - '[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one' + '[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one', ); audioTracks.unshift({ type: 'main', @@ -442,7 +442,7 @@ class PlaylistLoader implements NetworkComponentAPI { stats: LoaderStats, context: PlaylistLoaderContext, networkDetails: any, - loader: Loader | undefined + loader: Loader | undefined, ): void { const hls = this.hls; const { id, level, type } = context; @@ -459,7 +459,7 @@ class PlaylistLoader implements NetworkComponentAPI { levelId, levelType, levelUrlId, - this.variableList + this.variableList, ); // We have done our first request (Manifest-type) and receive @@ -501,7 +501,7 @@ class PlaylistLoader implements NetworkComponentAPI { stats, context, networkDetails, - loader + loader, ); } @@ -510,7 +510,7 @@ class PlaylistLoader implements NetworkComponentAPI { context: PlaylistLoaderContext, error: Error, networkDetails: any, - stats: LoaderStats + stats: LoaderStats, ): void { this.hls.trigger(Events.ERROR, { type: ErrorTypes.NETWORK_ERROR, @@ -532,7 +532,7 @@ class PlaylistLoader implements NetworkComponentAPI { networkDetails: any, timeout = false, response: { code: number; text: string } | undefined, - stats: LoaderStats + stats: LoaderStats, ): void { let message = `A network ${ timeout @@ -611,7 +611,7 @@ class PlaylistLoader implements NetworkComponentAPI { stats: LoaderStats, context: PlaylistLoaderContext, networkDetails: any, - loader: Loader | undefined + loader: Loader | undefined, ): void { const hls = this.hls; const { type, level, id, groupId, deliveryDirectives } = context; diff --git a/src/remux/aac-helper.ts b/src/remux/aac-helper.ts index ce20d9187..f7cd4cf3e 100644 --- a/src/remux/aac-helper.ts +++ b/src/remux/aac-helper.ts @@ -5,7 +5,7 @@ class AAC { static getSilentFrame( codec?: string, - channelCount?: number + channelCount?: number, ): Uint8Array | undefined { switch (codec) { case 'mp4a.40.2': diff --git a/src/remux/mp4-generator.ts b/src/remux/mp4-generator.ts index 54c06a6ef..910b2be3b 100644 --- a/src/remux/mp4-generator.ts +++ b/src/remux/mp4-generator.ts @@ -258,7 +258,7 @@ class MP4 { majorBrand, minorVersion, majorBrand, - avc1Brand + avc1Brand, ); MP4.DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, dref)); } @@ -338,7 +338,7 @@ class MP4 { 0xc4, // 'und' language (undetermined) 0x00, 0x00, - ]) + ]), ); } @@ -347,7 +347,7 @@ class MP4 { MP4.types.mdia, MP4.mdhd(track.timescale, track.duration), MP4.hdlr(track.type), - MP4.minf(track) + MP4.minf(track), ); } @@ -363,7 +363,7 @@ class MP4 { (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff, // sequence_number - ]) + ]), ); } @@ -373,14 +373,14 @@ class MP4 { MP4.types.minf, MP4.box(MP4.types.smhd, MP4.SMHD), MP4.DINF, - MP4.stbl(track) + MP4.stbl(track), ); } else { return MP4.box( MP4.types.minf, MP4.box(MP4.types.vmhd, MP4.VMHD), MP4.DINF, - MP4.stbl(track) + MP4.stbl(track), ); } } @@ -389,7 +389,7 @@ class MP4 { return MP4.box( MP4.types.moof, MP4.mfhd(sn), - MP4.traf(track, baseMediaDecodeTime) + MP4.traf(track, baseMediaDecodeTime), ); } @@ -405,7 +405,7 @@ class MP4 { null, [MP4.types.moov, MP4.mvhd(tracks[0].timescale, tracks[0].duration)] .concat(boxes) - .concat(MP4.mvex(tracks)) + .concat(MP4.mvex(tracks)), ); } @@ -566,7 +566,7 @@ class MP4 { MP4.box(MP4.types.stts, MP4.STTS), MP4.box(MP4.types.stsc, MP4.STSC), MP4.box(MP4.types.stsz, MP4.STSZ), - MP4.box(MP4.types.stco, MP4.STCO) + MP4.box(MP4.types.stco, MP4.STCO), ); } @@ -613,8 +613,8 @@ class MP4 { .concat([ track.pps.length, // numOfPictureParameterSets ]) - .concat(pps) - ) + .concat(pps), + ), ); // "PPS" const width = track.width; const height = track.height; @@ -719,7 +719,7 @@ class MP4 { 0x2d, 0xc6, 0xc0, - ]) + ]), ), // avgBitrate MP4.box( MP4.types.pasp, @@ -732,8 +732,8 @@ class MP4 { (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff, - ]) - ) + ]), + ), ); } @@ -772,7 +772,7 @@ class MP4 { ] .concat([configlen]) .concat(track.config) - .concat([0x06, 0x01, 0x02]) + .concat([0x06, 0x01, 0x02]), ); // GASpecificConfig)); // length + audio config descriptor } @@ -814,7 +814,7 @@ class MP4 { return MP4.box( MP4.types.mp4a, MP4.audioStsd(track), - MP4.box(MP4.types.esds, MP4.esds(track)) + MP4.box(MP4.types.esds, MP4.esds(track)), ); } @@ -826,7 +826,7 @@ class MP4 { return MP4.box( MP4.types['ac-3'], MP4.audioStsd(track), - MP4.box(MP4.types.dac3, track.config) + MP4.box(MP4.types.dac3, track.config), ); } @@ -950,7 +950,7 @@ class MP4 { height & 0xff, 0x00, 0x00, // height - ]) + ]), ); } @@ -958,10 +958,10 @@ class MP4 { const sampleDependencyTable = MP4.sdtp(track); const id = track.id; const upperWordBaseMediaDecodeTime = Math.floor( - baseMediaDecodeTime / (UINT32_MAX + 1) + baseMediaDecodeTime / (UINT32_MAX + 1), ); const lowerWordBaseMediaDecodeTime = Math.floor( - baseMediaDecodeTime % (UINT32_MAX + 1) + baseMediaDecodeTime % (UINT32_MAX + 1), ); return MP4.box( MP4.types.traf, @@ -976,7 +976,7 @@ class MP4 { (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID - ]) + ]), ), MP4.box( MP4.types.tfdt, @@ -993,7 +993,7 @@ class MP4 { (lowerWordBaseMediaDecodeTime >> 16) & 0xff, (lowerWordBaseMediaDecodeTime >> 8) & 0xff, lowerWordBaseMediaDecodeTime & 0xff, - ]) + ]), ), MP4.trun( track, @@ -1003,9 +1003,9 @@ class MP4 { 8 + // traf header 16 + // mfhd 8 + // moof header - 8 + 8, ), // mdat header - sampleDependencyTable + sampleDependencyTable, ); } @@ -1047,7 +1047,7 @@ class MP4 { 0x01, 0x00, 0x01, // default_sample_flags - ]) + ]), ); } @@ -1078,7 +1078,7 @@ class MP4 { (offset >>> 8) & 0xff, offset & 0xff, // data_offset ], - 0 + 0, ); for (i = 0; i < len; i++) { sample = samples[i]; @@ -1108,7 +1108,7 @@ class MP4 { (cts >>> 8) & 0xff, cts & 0xff, // sample_composition_time_offset ], - 12 + 16 * i + 12 + 16 * i, ); } return MP4.box(MP4.types.trun, array); diff --git a/src/remux/mp4-remuxer.ts b/src/remux/mp4-remuxer.ts index 3145dd6d6..44708230c 100644 --- a/src/remux/mp4-remuxer.ts +++ b/src/remux/mp4-remuxer.ts @@ -55,7 +55,7 @@ export default class MP4Remuxer implements Remuxer { observer: HlsEventEmitter, config: HlsConfig, typeSupported, - vendor = '' + vendor = '', ) { this.observer = observer; this.config = config; @@ -119,7 +119,7 @@ export default class MP4Remuxer implements Remuxer { timeOffset: number, accurateTimeOffset: boolean, flush: boolean, - playlistType: PlaylistLevelType + playlistType: PlaylistLevelType, ): RemuxerResult { let video: RemuxedTrack | undefined; let audio: RemuxedTrack | undefined; @@ -152,7 +152,7 @@ export default class MP4Remuxer implements Remuxer { audioTrack, videoTrack, timeOffset, - accurateTimeOffset + accurateTimeOffset, ); } @@ -166,7 +166,7 @@ export default class MP4Remuxer implements Remuxer { independent = true; if (firstKeyFrameIndex > 0) { logger.warn( - `[mp4-remuxer]: Dropped ${firstKeyFrameIndex} out of ${length} video samples due to a missing keyframe` + `[mp4-remuxer]: Dropped ${firstKeyFrameIndex} out of ${length} video samples due to a missing keyframe`, ); const startPTS = this.getVideoStartPts(videoTrack.samples); videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex); @@ -177,7 +177,7 @@ export default class MP4Remuxer implements Remuxer { firstKeyFramePTS = videoTimeOffset; } else if (firstKeyFrameIndex === -1) { logger.warn( - `[mp4-remuxer]: No keyframe found out of ${length} video samples` + `[mp4-remuxer]: No keyframe found out of ${length} video samples`, ); independent = false; } @@ -203,13 +203,13 @@ export default class MP4Remuxer implements Remuxer { // if initSegment was generated without audio samples, regenerate it again if (!audioTrack.samplerate) { logger.warn( - '[mp4-remuxer]: regenerate InitSegment as audio detected' + '[mp4-remuxer]: regenerate InitSegment as audio detected', ); initSegment = this.generateIS( audioTrack, videoTrack, timeOffset, - accurateTimeOffset + accurateTimeOffset, ); } audio = this.remuxAudio( @@ -221,27 +221,27 @@ export default class MP4Remuxer implements Remuxer { enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset - : undefined + : undefined, ); if (enoughVideoSamples) { const audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0; // if initSegment was generated without video samples, regenerate it again if (!videoTrack.inputTimeScale) { logger.warn( - '[mp4-remuxer]: regenerate InitSegment as video detected' + '[mp4-remuxer]: regenerate InitSegment as video detected', ); initSegment = this.generateIS( audioTrack, videoTrack, timeOffset, - accurateTimeOffset + accurateTimeOffset, ); } video = this.remuxVideo( videoTrack, videoTimeOffset, isVideoContiguous, - audioTrackLength + audioTrackLength, ); } } else if (enoughVideoSamples) { @@ -249,7 +249,7 @@ export default class MP4Remuxer implements Remuxer { videoTrack, videoTimeOffset, isVideoContiguous, - 0 + 0, ); } if (video) { @@ -267,7 +267,7 @@ export default class MP4Remuxer implements Remuxer { id3Track, timeOffset, this._initPTS, - this._initDTS + this._initDTS, ); } @@ -275,7 +275,7 @@ export default class MP4Remuxer implements Remuxer { text = flushTextTrackUserdataCueSamples( textTrack, timeOffset, - this._initPTS + this._initPTS, ); } } @@ -294,7 +294,7 @@ export default class MP4Remuxer implements Remuxer { audioTrack: DemuxedAudioTrack, videoTrack: DemuxedVideoTrack, timeOffset: number, - accurateTimeOffset: boolean + accurateTimeOffset: boolean, ): InitSegmentData | undefined { const audioSamples = audioTrack.samples; const videoSamples = videoTrack.samples; @@ -378,7 +378,7 @@ export default class MP4Remuxer implements Remuxer { const startOffset = Math.round(timescale * timeOffset); initDTS = Math.min( initDTS as number, - normalizePts(videoSamples[0].dts, startPTS) - startOffset + normalizePts(videoSamples[0].dts, startPTS) - startOffset, ); initPTS = Math.min(initPTS as number, startPTS - startOffset); } else { @@ -414,7 +414,7 @@ export default class MP4Remuxer implements Remuxer { track: DemuxedVideoTrack, timeOffset: number, contiguous: boolean, - audioTrackLength: number + audioTrackLength: number, ): RemuxedTrack | undefined { const timeScale: number = track.inputTimeScale; const inputSamples: Array = track.samples; @@ -483,15 +483,15 @@ export default class MP4Remuxer implements Remuxer { logger.warn( `AVC: ${toMsFromMpegTsClock( delta, - true - )} ms (${delta}dts) hole between fragments detected, filling it` + true, + )} ms (${delta}dts) hole between fragments detected, filling it`, ); } else { logger.warn( `AVC: ${toMsFromMpegTsClock( -delta, - true - )} ms (${delta}dts) overlapping between fragments detected` + true, + )} ms (${delta}dts) overlapping between fragments detected`, ); } if (!foundOverlap || nextAvcDts >= inputSamples[0].pts) { @@ -502,11 +502,11 @@ export default class MP4Remuxer implements Remuxer { logger.log( `Video: First PTS/DTS adjusted: ${toMsFromMpegTsClock( firstPTS, - true + true, )}/${toMsFromMpegTsClock( firstDTS, - true - )}, delta: ${toMsFromMpegTsClock(delta, true)} ms` + true, + )}, delta: ${toMsFromMpegTsClock(delta, true)} ms`, ); } } @@ -621,7 +621,7 @@ export default class MP4Remuxer implements Remuxer { deltaToFrameEnd / 90 } ms to the next segment; using duration ${ mp4SampleDuration / 90 - } ms for the last video frame.` + } ms for the last video frame.`, ); } else { mp4SampleDuration = lastFrameDuration; @@ -631,7 +631,7 @@ export default class MP4Remuxer implements Remuxer { } } const compositionTimeOffset = Math.round( - VideoSample.pts - VideoSample.dts + VideoSample.pts - VideoSample.dts, ); minDtsDelta = Math.min(minDtsDelta, mp4SampleDuration); maxDtsDelta = Math.max(maxDtsDelta, mp4SampleDuration); @@ -643,8 +643,8 @@ export default class MP4Remuxer implements Remuxer { VideoSample.key, mp4SampleDuration, mp4SampleLength, - compositionTimeOffset - ) + compositionTimeOffset, + ), ); } @@ -666,7 +666,7 @@ export default class MP4Remuxer implements Remuxer { outputSamples[0].cts === 0 ) { logger.warn( - 'Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.' + 'Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.', ); let dts = firstDTS; for (let i = 0, len = outputSamples.length; i < len; i++) { @@ -699,7 +699,7 @@ export default class MP4Remuxer implements Remuxer { firstDTS, Object.assign({}, track, { samples: outputSamples, - }) + }), ); const type: SourceBufferName = 'video'; const data = { @@ -736,7 +736,7 @@ export default class MP4Remuxer implements Remuxer { timeOffset: number, contiguous: boolean, accurateTimeOffset: boolean, - videoTimeOffset?: number + videoTimeOffset?: number, ): RemuxedTrack | undefined { const inputTimeScale: number = track.inputTimeScale; const mp4timeScale: number = track.samplerate @@ -775,7 +775,7 @@ export default class MP4Remuxer implements Remuxer { Math.abs(timeOffsetMpegTS - nextAudioPts) < 9000) || Math.abs( normalizePts(inputSamples[0].pts - initTime, timeOffsetMpegTS) - - nextAudioPts + nextAudioPts, ) < 20 * inputSampleDuration)) as boolean); @@ -830,10 +830,10 @@ export default class MP4Remuxer implements Remuxer { if (i === 0) { logger.warn( `Audio frame @ ${(pts / inputTimeScale).toFixed( - 3 + 3, )}s overlaps nextAudioPts by ${Math.round( - (1000 * delta) / inputTimeScale - )} ms.` + (1000 * delta) / inputTimeScale, + )} ms.`, ); this.nextAudioPts = nextAudioPts = nextPts = pts; } @@ -864,18 +864,18 @@ export default class MP4Remuxer implements Remuxer { `[mp4-remuxer]: Injecting ${missing} audio frame @ ${( nextPts / inputTimeScale ).toFixed(3)}s due to ${Math.round( - (1000 * delta) / inputTimeScale - )} ms gap.` + (1000 * delta) / inputTimeScale, + )} ms gap.`, ); for (let j = 0; j < missing; j++) { const newStamp = Math.max(nextPts as number, 0); let fillFrame = AAC.getSilentFrame( track.manifestCodec || track.codec, - track.channelCount + track.channelCount, ); if (!fillFrame) { logger.log( - '[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.' + '[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.', ); fillFrame = sample.unit.subarray(); } @@ -969,7 +969,7 @@ export default class MP4Remuxer implements Remuxer { : MP4.moof( track.sequenceNumber++, firstPTS! / scaleFactor, - Object.assign({}, track, { samples: outputSamples }) + Object.assign({}, track, { samples: outputSamples }), ); // Clear the track samples. This also clears the samples array in the demuxer, since the reference is shared @@ -998,7 +998,7 @@ export default class MP4Remuxer implements Remuxer { track: DemuxedAudioTrack, timeOffset: number, contiguous: boolean, - videoData: Fragment + videoData: Fragment, ): RemuxedTrack | undefined { const inputTimeScale: number = track.inputTimeScale; const mp4timeScale: number = track.samplerate @@ -1021,14 +1021,14 @@ export default class MP4Remuxer implements Remuxer { // silent frame const silentFrame: Uint8Array | undefined = AAC.getSilentFrame( track.manifestCodec || track.codec, - track.channelCount + track.channelCount, ); logger.warn('[mp4-remuxer]: remux empty Audio'); // Can't remux if we can't generate a silent frame... if (!silentFrame) { logger.trace( - '[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec' + '[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec', ); return; } @@ -1080,7 +1080,7 @@ export function flushTextTrackMetadataCueSamples( track: DemuxedMetadataTrack, timeOffset: number, initPTS: RationalTimestamp, - initDTS: RationalTimestamp + initDTS: RationalTimestamp, ): RemuxedMetadata | undefined { const length = track.samples.length; if (!length) { @@ -1094,12 +1094,12 @@ export function flushTextTrackMetadataCueSamples( sample.pts = normalizePts( sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale, - timeOffset * inputTimeScale + timeOffset * inputTimeScale, ) / inputTimeScale; sample.dts = normalizePts( sample.dts - (initDTS.baseTime * inputTimeScale) / initDTS.timescale, - timeOffset * inputTimeScale + timeOffset * inputTimeScale, ) / inputTimeScale; } const samples = track.samples; @@ -1112,7 +1112,7 @@ export function flushTextTrackMetadataCueSamples( export function flushTextTrackUserdataCueSamples( track: DemuxedUserdataTrack, timeOffset: number, - initPTS: RationalTimestamp + initPTS: RationalTimestamp, ): RemuxedUserdata | undefined { const length = track.samples.length; if (!length) { @@ -1127,7 +1127,7 @@ export function flushTextTrackUserdataCueSamples( sample.pts = normalizePts( sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale, - timeOffset * inputTimeScale + timeOffset * inputTimeScale, ) / inputTimeScale; } track.samples.sort((a, b) => a.pts - b.pts); @@ -1157,7 +1157,7 @@ class Mp4Sample { isKeyframe: boolean, duration: number, size: number, - cts: number + cts: number, ) { this.duration = duration; this.size = size; diff --git a/src/remux/passthrough-remuxer.ts b/src/remux/passthrough-remuxer.ts index f8c426082..666ecaee2 100644 --- a/src/remux/passthrough-remuxer.ts +++ b/src/remux/passthrough-remuxer.ts @@ -56,7 +56,7 @@ class PassThroughRemuxer implements Remuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - decryptdata: DecryptData | null + decryptdata: DecryptData | null, ) { this.audioCodec = audioCodec; this.videoCodec = videoCodec; @@ -77,14 +77,14 @@ class PassThroughRemuxer implements Remuxer { if (initData.audio) { audioCodec = getParsedTrackCodec( initData.audio, - ElementaryStreamTypes.AUDIO + ElementaryStreamTypes.AUDIO, ); } if (initData.video) { videoCodec = getParsedTrackCodec( initData.video, - ElementaryStreamTypes.VIDEO + ElementaryStreamTypes.VIDEO, ); } @@ -112,7 +112,7 @@ class PassThroughRemuxer implements Remuxer { }; } else { logger.warn( - '[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.' + '[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.', ); } this.initTracks = tracks; @@ -124,7 +124,7 @@ class PassThroughRemuxer implements Remuxer { id3Track: DemuxedMetadataTrack, textTrack: DemuxedUserdataTrack, timeOffset: number, - accurateTimeOffset: boolean + accurateTimeOffset: boolean, ): RemuxerResult { let { initPTS, lastEndTime } = this; const result: RemuxerResult = { @@ -178,7 +178,7 @@ class PassThroughRemuxer implements Remuxer { initSegment.initPTS = decodeTime - timeOffset; if (initPTS && initPTS.timescale === 1) { logger.warn( - `Adjusting initPTS by ${initSegment.initPTS - initPTS.baseTime}` + `Adjusting initPTS by ${initSegment.initPTS - initPTS.baseTime}`, ); } this.initPTS = initPTS = { @@ -232,14 +232,14 @@ class PassThroughRemuxer implements Remuxer { id3Track, timeOffset, initPTS, - initPTS + initPTS, ); if (textTrack.samples.length) { result.text = flushTextTrackUserdataCueSamples( textTrack, timeOffset, - initPTS + initPTS, ); } @@ -251,7 +251,7 @@ function isInvalidInitPts( initPTS: RationalTimestamp | null, startDTS: number, timeOffset: number, - duration: number + duration: number, ): initPTS is null { if (initPTS === null) { return true; @@ -264,7 +264,7 @@ function isInvalidInitPts( function getParsedTrackCodec( track: InitDataTrack, - type: ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO + type: ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO, ): string { const parsedCodec = track?.codec; if (parsedCodec && parsedCodec.length > 4) { @@ -283,7 +283,7 @@ function getParsedTrackCodec( } const result = 'mp4a.40.5'; logger.info( - `Parsed audio codec "${parsedCodec}" or audio object type not handled. Using "${result}"` + `Parsed audio codec "${parsedCodec}" or audio object type not handled. Using "${result}"`, ); return result; } diff --git a/src/types/demuxer.ts b/src/types/demuxer.ts index da655df12..011c79122 100644 --- a/src/types/demuxer.ts +++ b/src/types/demuxer.ts @@ -5,12 +5,12 @@ export interface Demuxer { data: Uint8Array, timeOffset: number, isSampleAes?: boolean, - flush?: boolean + flush?: boolean, ): DemuxerResult; demuxSampleAes( data: Uint8Array, keyData: KeyData, - timeOffset: number + timeOffset: number, ): Promise; flush(timeOffset?: number): DemuxerResult | Promise; destroy(): void; @@ -18,7 +18,7 @@ export interface Demuxer { initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - trackDuration: number + trackDuration: number, ); resetTimeStamp(defaultInitPTS?: RationalTimestamp | null): void; resetContiguity(): void; diff --git a/src/types/level.ts b/src/types/level.ts index 4be3d477d..2688da0dc 100755 --- a/src/types/level.ts +++ b/src/types/level.ts @@ -207,7 +207,7 @@ export class Level { export function addGroupId( level: Level, type: string, - id: string | undefined + id: string | undefined, ): void { if (!id) { return; diff --git a/src/types/loader.ts b/src/types/loader.ts index 789479a0e..a887eb905 100644 --- a/src/types/loader.ts +++ b/src/types/loader.ts @@ -99,14 +99,14 @@ export type LoaderOnSuccess = ( response: LoaderResponse, stats: LoaderStats, context: T, - networkDetails: any + networkDetails: any, ) => void; export type LoaderOnProgress = ( stats: LoaderStats, context: T, data: string | ArrayBuffer, - networkDetails: any + networkDetails: any, ) => void; export type LoaderOnError = ( @@ -118,19 +118,19 @@ export type LoaderOnError = ( }, context: T, networkDetails: any, - stats: LoaderStats + stats: LoaderStats, ) => void; export type LoaderOnTimeout = ( stats: LoaderStats, context: T, - networkDetails: any + networkDetails: any, ) => void; export type LoaderOnAbort = ( stats: LoaderStats, context: T, - networkDetails: any + networkDetails: any, ) => void; export interface LoaderCallbacks { @@ -147,7 +147,7 @@ export interface Loader { load( context: T, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ): void; /** * `getCacheAge()` is called by hls.js to get the duration that a given object diff --git a/src/types/remuxer.ts b/src/types/remuxer.ts index d5034fb27..8264e5e80 100644 --- a/src/types/remuxer.ts +++ b/src/types/remuxer.ts @@ -21,13 +21,13 @@ export interface Remuxer { timeOffset: number, accurateTimeOffset: boolean, flush: boolean, - playlistType: PlaylistLevelType + playlistType: PlaylistLevelType, ): RemuxerResult; resetInitSegment( initSegment: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, - decryptdata: DecryptData | null + decryptdata: DecryptData | null, ): void; resetTimeStamp(defaultInitPTS: RationalTimestamp | null): void; resetNextTimestamp(): void; diff --git a/src/types/transmuxer.ts b/src/types/transmuxer.ts index 2f13549c8..fc0c644be 100644 --- a/src/types/transmuxer.ts +++ b/src/types/transmuxer.ts @@ -30,7 +30,7 @@ export class ChunkMetadata { id: number, size = 0, part = -1, - partial = false + partial = false, ) { this.level = level; this.sn = sn; diff --git a/src/utils/binary-search.ts b/src/utils/binary-search.ts index 8cd269469..0a2822220 100644 --- a/src/utils/binary-search.ts +++ b/src/utils/binary-search.ts @@ -18,7 +18,7 @@ const BinarySearch = { */ search: function ( list: T[], - comparisonFn: BinarySearchComparison + comparisonFn: BinarySearchComparison, ): T | null { let minIndex: number = 0; let maxIndex: number = list.length - 1; diff --git a/src/utils/buffer-helper.ts b/src/utils/buffer-helper.ts index 778ef1d94..e8ab42118 100644 --- a/src/utils/buffer-helper.ts +++ b/src/utils/buffer-helper.ts @@ -55,7 +55,7 @@ export class BufferHelper { static bufferInfo( media: Bufferable | null, pos: number, - maxHoleDuration: number + maxHoleDuration: number, ): BufferInfo { try { if (media) { @@ -79,7 +79,7 @@ export class BufferHelper { static bufferedInfo( buffered: BufferTimeRange[], pos: number, - maxHoleDuration: number + maxHoleDuration: number, ): { len: number; start: number; diff --git a/src/utils/cea-608-parser.ts b/src/utils/cea-608-parser.ts index 53ff5f2c8..1a6d6570a 100644 --- a/src/utils/cea-608-parser.ts +++ b/src/utils/cea-608-parser.ts @@ -412,13 +412,13 @@ export class Row { if (this.pos < 0) { this.logger.log( VerboseLevel.DEBUG, - 'Negative cursor position ' + this.pos + 'Negative cursor position ' + this.pos, ); this.pos = 0; } else if (this.pos > NR_COLS) { this.logger.log( VerboseLevel.DEBUG, - 'Too large cursor position ' + this.pos + 'Too large cursor position ' + this.pos, ); this.pos = NR_COLS; } @@ -461,7 +461,7 @@ export class Row { char + ') at position ' + this.pos + - '. Skipping it!' + '. Skipping it!', ); return; } @@ -601,7 +601,7 @@ export class CaptionScreen { setPAC(pacData: PACData) { this.logger.log( VerboseLevel.INFO, - () => 'pacData = ' + JSON.stringify(pacData) + () => 'pacData = ' + JSON.stringify(pacData), ); let newRow = pacData.row - 1; if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) { @@ -627,7 +627,7 @@ export class CaptionScreen { if (prevLineTime !== null && time !== null && prevLineTime < time) { for (let i = 0; i < this.nrRollUpRows; i++) { this.rows[newRow - this.nrRollUpRows + i + 1].copy( - lastOutputScreen.rows[topRowIndex + i] + lastOutputScreen.rows[topRowIndex + i], ); } } @@ -658,7 +658,7 @@ export class CaptionScreen { setBkgData(bkgData: Partial) { this.logger.log( VerboseLevel.INFO, - () => 'bkgData = ' + JSON.stringify(bkgData) + () => 'bkgData = ' + JSON.stringify(bkgData), ); this.backSpace(); this.setPen(bkgData); @@ -673,7 +673,7 @@ export class CaptionScreen { if (this.nrRollUpRows === null) { this.logger.log( VerboseLevel.DEBUG, - 'roll_up but nrRollUpRows not set yet' + 'roll_up but nrRollUpRows not set yet', ); return; // Not properly setup } @@ -745,7 +745,7 @@ class Cea608Channel { constructor( channelNumber: number, outputFilter: OutputFilter, - logger: CaptionsLogger + logger: CaptionsLogger, ) { this.chNr = channelNumber; this.outputFilter = outputFilter; @@ -818,12 +818,12 @@ class Cea608Channel { this.writeScreen === this.displayedMemory ? 'DISP' : 'NON_DISP'; this.logger.log( VerboseLevel.INFO, - () => screen + ': ' + this.writeScreen.getDisplayText(true) + () => screen + ': ' + this.writeScreen.getDisplayText(true), ); if (this.mode === 'MODE_PAINT-ON' || this.mode === 'MODE_ROLL-UP') { this.logger.log( VerboseLevel.TEXT, - () => 'DISPLAYED: ' + this.displayedMemory.getDisplayText(true) + () => 'DISPLAYED: ' + this.displayedMemory.getDisplayText(true), ); this.outputDataUpdate(); } @@ -925,7 +925,7 @@ class Cea608Channel { this.writeScreen = this.nonDisplayedMemory; this.logger.log( VerboseLevel.TEXT, - () => 'DISP: ' + this.displayedMemory.getDisplayText() + () => 'DISP: ' + this.displayedMemory.getDisplayText(), ); } this.outputDataUpdate(true); @@ -976,7 +976,7 @@ class Cea608Channel { this.outputFilter.newCue( this.cueStartTime!, time, - this.lastOutputScreen + this.lastOutputScreen, ); if (dispatch && this.outputFilter.dispatchCue) { this.outputFilter.dispatchCue(); @@ -1065,7 +1065,7 @@ class Cea608Parser { numArrayToHexArray([byteList[i], byteList[i + 1]]) + '] -> (' + numArrayToHexArray([a, b]) + - ')' + ')', ); } @@ -1093,7 +1093,7 @@ class Cea608Parser { } else { this.logger.log( VerboseLevel.WARNING, - 'No channel found yet. TEXT-MODE?' + 'No channel found yet. TEXT-MODE?', ); } } @@ -1104,7 +1104,7 @@ class Cea608Parser { "Couldn't parse cleaned data " + numArrayToHexArray([a, b]) + ' orig: ' + - numArrayToHexArray([byteList[i], byteList[i + 1]]) + numArrayToHexArray([byteList[i], byteList[i + 1]]), ); } } @@ -1129,7 +1129,7 @@ class Cea608Parser { setLastCmd(null, null, cmdHistory); this.logger.log( VerboseLevel.DEBUG, - 'Repeated command (' + numArrayToHexArray([a, b]) + ') is dropped' + 'Repeated command (' + numArrayToHexArray([a, b]) + ') is dropped', ); return true; } @@ -1196,7 +1196,7 @@ class Cea608Parser { if (chNr !== this.currentChannel) { this.logger.log( VerboseLevel.ERROR, - 'Mismatch channel in midrow parsing' + 'Mismatch channel in midrow parsing', ); return false; } @@ -1207,7 +1207,7 @@ class Cea608Parser { channel.ccMIDROW(b); this.logger.log( VerboseLevel.DEBUG, - 'MIDROW (' + numArrayToHexArray([a, b]) + ')' + 'MIDROW (' + numArrayToHexArray([a, b]) + ')', ); return true; } @@ -1324,7 +1324,10 @@ class Cea608Parser { this.logger.log( VerboseLevel.INFO, - "Special char '" + getCharForByte(oneCode) + "' in channel " + channelNr + "Special char '" + + getCharForByte(oneCode) + + "' in channel " + + channelNr, ); charCodes = [oneCode]; } else if (a >= 0x20 && a <= 0x7f) { @@ -1334,7 +1337,7 @@ class Cea608Parser { const hexCodes = numArrayToHexArray(charCodes); this.logger.log( VerboseLevel.DEBUG, - 'Char codes = ' + hexCodes.join(',') + 'Char codes = ' + hexCodes.join(','), ); setLastCmd(a, b, this.cmdHistory); } @@ -1403,7 +1406,7 @@ class Cea608Parser { function setLastCmd( a: number | null, b: number | null, - cmdHistory: CmdHistory + cmdHistory: CmdHistory, ) { cmdHistory.a = a; cmdHistory.b = b; diff --git a/src/utils/codecs.ts b/src/utils/codecs.ts index 8c65e297f..cda781d57 100644 --- a/src/utils/codecs.ts +++ b/src/utils/codecs.ts @@ -88,7 +88,7 @@ export function isCodecType(codec: string, type: CodecType): boolean { export function areCodecsMediaSourceSupported( codecs: string, - type: CodecType + type: CodecType, ): boolean { return !codecs .split(',') @@ -123,7 +123,7 @@ const CODEC_COMPATIBLE_NAMES: CodecNameCache = {}; type LowerCaseCodecType = 'flac' | 'opus'; function getCodecCompatibleNameLower( - lowerCaseCodec: LowerCaseCodecType + lowerCaseCodec: LowerCaseCodecType, ): string { if (CODEC_COMPATIBLE_NAMES[lowerCaseCodec]) { return CODEC_COMPATIBLE_NAMES[lowerCaseCodec]!; @@ -150,13 +150,13 @@ function getCodecCompatibleNameLower( const AUDIO_CODEC_REGEXP = /flac|opus/i; export function getCodecCompatibleName(codec: string): string { return codec.replace(AUDIO_CODEC_REGEXP, (m) => - getCodecCompatibleNameLower(m.toLowerCase() as LowerCaseCodecType) + getCodecCompatibleNameLower(m.toLowerCase() as LowerCaseCodecType), ); } export function pickMostCompleteCodecName( parsedCodec: string, - levelCodec: string + levelCodec: string, ): string { // Parsing of mp4a codecs strings in mp4-tools from media is incomplete as of d8c6c7a // so use level codec is parsed codec is unavailable or incomplete diff --git a/src/utils/cues.ts b/src/utils/cues.ts index 43f746bb7..a6fefe30b 100644 --- a/src/utils/cues.ts +++ b/src/utils/cues.ts @@ -10,7 +10,7 @@ export interface CuesInterface { track: TextTrack | null, startTime: number, endTime: number, - captionScreen: CaptionScreen + captionScreen: CaptionScreen, ): VTTCue[]; } @@ -19,7 +19,7 @@ const Cues: CuesInterface = { track: TextTrack | null, startTime: number, endTime: number, - captionScreen: CaptionScreen + captionScreen: CaptionScreen, ): VTTCue[] { const result: VTTCue[] = []; let row: Row; diff --git a/src/utils/discontinuities.ts b/src/utils/discontinuities.ts index 9c5521c29..afcce6b97 100644 --- a/src/utils/discontinuities.ts +++ b/src/utils/discontinuities.ts @@ -8,7 +8,7 @@ import type { RequiredProperties } from '../types/general'; export function findFirstFragWithCC( fragments: Fragment[], - cc: number + cc: number, ): Fragment | null { for (let i = 0, len = fragments.length; i < len; i++) { if (fragments[i]?.cc === cc) { @@ -21,7 +21,7 @@ export function findFirstFragWithCC( export function shouldAlignOnDiscontinuities( lastFrag: Fragment | null, lastLevel: Level, - details: LevelDetails + details: LevelDetails, ): lastLevel is RequiredProperties { if (lastLevel.details) { if ( @@ -37,7 +37,7 @@ export function shouldAlignOnDiscontinuities( // Find the first frag in the previous level which matches the CC of the first frag of the new level export function findDiscontinuousReferenceFrag( prevDetails: LevelDetails, - curDetails: LevelDetails + curDetails: LevelDetails, ) { const prevFrags = prevDetails.fragments; const curFrags = curDetails.fragments; @@ -91,7 +91,7 @@ export function adjustSlidingStart(sliding: number, details: LevelDetails) { export function alignStream( lastFrag: Fragment | null, lastLevel: Level | null, - details: LevelDetails + details: LevelDetails, ) { if (!lastLevel) { return; @@ -125,16 +125,16 @@ export function alignStream( function alignDiscontinuities( lastFrag: Fragment | null, details: LevelDetails, - lastLevel: Level + lastLevel: Level, ) { if (shouldAlignOnDiscontinuities(lastFrag, lastLevel, details)) { const referenceFrag = findDiscontinuousReferenceFrag( lastLevel.details, - details + details, ); if (referenceFrag && Number.isFinite(referenceFrag.start)) { logger.log( - `Adjusting PTS using last level due to CC increase within current level ${details.url}` + `Adjusting PTS using last level due to CC increase within current level ${details.url}`, ); adjustSlidingStart(referenceFrag.start, details); } @@ -156,7 +156,7 @@ function alignDiscontinuities( */ export function alignMediaPlaylistByPDT( details: LevelDetails, - refDetails: LevelDetails + refDetails: LevelDetails, ) { if (!details.hasProgramDateTime || !refDetails.hasProgramDateTime) { return; diff --git a/src/utils/error-helper.ts b/src/utils/error-helper.ts index 044e6be31..7ffccc400 100644 --- a/src/utils/error-helper.ts +++ b/src/utils/error-helper.ts @@ -15,7 +15,7 @@ export function isTimeoutError(error: ErrorData): boolean { export function getRetryConfig( loadPolicy: LoadPolicy, - error: ErrorData + error: ErrorData, ): RetryConfig | null { const isTimeout = isTimeoutError(error); return loadPolicy.default[`${isTimeout ? 'timeout' : 'error'}Retry`]; @@ -23,19 +23,19 @@ export function getRetryConfig( export function getRetryDelay( retryConfig: RetryConfig, - retryCount: number + retryCount: number, ): number { // exponential backoff capped to max retry delay const backoffFactor = retryConfig.backoff === 'linear' ? 1 : Math.pow(2, retryCount); return Math.min( backoffFactor * retryConfig.retryDelayMs, - retryConfig.maxRetryDelayMs + retryConfig.maxRetryDelayMs, ); } export function getLoaderConfigWithoutReties( - loderConfig: LoaderConfig + loderConfig: LoaderConfig, ): LoaderConfig { return { ...loderConfig, @@ -50,7 +50,7 @@ export function shouldRetry( retryConfig: RetryConfig | null | undefined, retryCount: number, isTimeout: boolean, - httpStatus?: number | undefined + httpStatus?: number | undefined, ): retryConfig is RetryConfig & boolean { return ( !!retryConfig && diff --git a/src/utils/ewma-bandwidth-estimator.ts b/src/utils/ewma-bandwidth-estimator.ts index 661fcfa30..ee2677a6b 100644 --- a/src/utils/ewma-bandwidth-estimator.ts +++ b/src/utils/ewma-bandwidth-estimator.ts @@ -21,7 +21,7 @@ class EwmaBandWidthEstimator { slow: number, fast: number, defaultEstimate: number, - defaultTTFB: number = 100 + defaultTTFB: number = 100, ) { this.defaultEstimate_ = defaultEstimate; this.minWeight_ = 0.001; diff --git a/src/utils/fetch-loader.ts b/src/utils/fetch-loader.ts index 15d112fc1..6e038d760 100644 --- a/src/utils/fetch-loader.ts +++ b/src/utils/fetch-loader.ts @@ -75,7 +75,7 @@ class FetchLoader implements Loader { this.callbacks.onAbort( this.stats, this.context as LoaderContext, - this.response + this.response, ); } } @@ -83,7 +83,7 @@ class FetchLoader implements Loader { load( context: LoaderContext, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ): void { const stats = this.stats; if (stats.loading.start) { @@ -121,17 +121,20 @@ class FetchLoader implements Loader { self.clearTimeout(this.requestTimeout); config.timeout = maxLoadTimeMs; - this.requestTimeout = self.setTimeout(() => { - this.abortInternal(); - callbacks.onTimeout(stats, context, this.response); - }, maxLoadTimeMs - (first - stats.loading.start)); + this.requestTimeout = self.setTimeout( + () => { + this.abortInternal(); + callbacks.onTimeout(stats, context, this.response); + }, + maxLoadTimeMs - (first - stats.loading.start), + ); if (!response.ok) { const { status, statusText } = response; throw new FetchError( statusText || 'fetch, bad network response', status, - response + response, ); } stats.loading.first = first; @@ -144,7 +147,7 @@ class FetchLoader implements Loader { stats, context, config.highWaterMark, - onProgress + onProgress, ); } @@ -164,7 +167,7 @@ class FetchLoader implements Loader { self.clearTimeout(this.requestTimeout); stats.loading.end = Math.max( self.performance.now(), - stats.loading.first + stats.loading.first, ); const total = responseData[LENGTH]; if (total) { @@ -196,7 +199,7 @@ class FetchLoader implements Loader { { code, text }, context, error ? error.details : null, - stats + stats, ); }); } @@ -219,7 +222,7 @@ class FetchLoader implements Loader { stats: LoaderStats, context: LoaderContext, highWaterMark: number = 0, - onProgress: LoaderOnProgress + onProgress: LoaderOnProgress, ): Promise { const chunkCache = new ChunkCache(); const reader = (response.body as ReadableStream).getReader(); @@ -275,7 +278,7 @@ function getRequestParameters(context: LoaderContext, signal): any { if (context.rangeEnd) { initParams.headers.set( 'Range', - 'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1) + 'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1), ); } diff --git a/src/utils/imsc1-ttml-parser.ts b/src/utils/imsc1-ttml-parser.ts index d6a14e503..644eb391d 100644 --- a/src/utils/imsc1-ttml-parser.ts +++ b/src/utils/imsc1-ttml-parser.ts @@ -28,7 +28,7 @@ export function parseIMSC1( payload: ArrayBuffer, initPTS: RationalTimestamp, callBack: (cues: Array) => any, - errorCallBack: (error: Error) => any + errorCallBack: (error: Error) => any, ) { const results = findBox(new Uint8Array(payload), ['mdat']); if (results.length === 0) { @@ -65,16 +65,16 @@ function parseTTML(ttml: string, syncTime: number): Array { result[key] = tt.getAttribute(`ttp:${key}`) || defaultRateInfo[key]; return result; }, - {} + {}, ); const trim = tt.getAttribute('xml:space') !== 'preserve'; const styleElements = collectionToDictionary( - getElementCollection(tt, 'styling', 'style') + getElementCollection(tt, 'styling', 'style'), ); const regionElements = collectionToDictionary( - getElementCollection(tt, 'layout', 'region') + getElementCollection(tt, 'layout', 'region'), ); const cueElements = getElementCollection(tt, 'body', '[begin]'); @@ -87,7 +87,7 @@ function parseTTML(ttml: string, syncTime: number): Array { } const startTime = parseTtmlTime( cueElement.getAttribute('begin'), - rateInfo + rateInfo, ); const duration = parseTtmlTime(cueElement.getAttribute('dur'), rateInfo); let endTime = parseTtmlTime(cueElement.getAttribute('end'), rateInfo); @@ -127,7 +127,7 @@ function parseTTML(ttml: string, syncTime: number): Array { function getElementCollection( fromElement, parentName, - childName + childName, ): Array { const parent = fromElement.getElementsByTagName(parentName)[0]; if (parent) { @@ -165,7 +165,7 @@ function getTextContent(element, trim): string { function getTtmlStyles( region, style, - styleElements + styleElements, ): { [style: string]: string } { const ttsNs = 'http://www.w3.org/ns/ttml#styling'; let regionStyle = null; diff --git a/src/utils/keysystem-util.ts b/src/utils/keysystem-util.ts index fc7f33fc8..4abccdf81 100644 --- a/src/utils/keysystem-util.ts +++ b/src/utils/keysystem-util.ts @@ -43,6 +43,6 @@ export function convertDataUriToArrayBytes(uri: string): Uint8Array | null { export function strToUtf8array(str: string): Uint8Array { return Uint8Array.from(unescape(encodeURIComponent(str)), (c) => - c.charCodeAt(0) + c.charCodeAt(0), ); } diff --git a/src/utils/level-helper.ts b/src/utils/level-helper.ts index faf72e3f0..ef0eed994 100644 --- a/src/utils/level-helper.ts +++ b/src/utils/level-helper.ts @@ -14,7 +14,7 @@ type PartIntersection = (oldPart: Part, newPart: Part) => void; export function updatePTS( fragments: Fragment[], fromIdx: number, - toIdx: number + toIdx: number, ): void { const fragFrom = fragments[fromIdx]; const fragTo = fragments[toIdx]; @@ -59,7 +59,7 @@ export function updateFragPTSDTS( startPTS: number, endPTS: number, startDTS: number, - endDTS: number + endDTS: number, ): number { const parsedMediaDuration = endPTS - startPTS; if (parsedMediaDuration <= 0) { @@ -134,7 +134,7 @@ export function updateFragPTSDTS( export function mergeDetails( oldDetails: LevelDetails, - newDetails: LevelDetails + newDetails: LevelDetails, ): void { // Track the last initSegment processed. Initialize it to the last one on the timeline. let currentInitSegment: Fragment | null = null; @@ -194,7 +194,7 @@ export function mergeDetails( newFrag.initSegment = oldFrag.initSegment; currentInitSegment = oldFrag.initSegment; } - } + }, ); if (currentInitSegment) { @@ -215,7 +215,7 @@ export function mergeDetails( newDetails.deltaUpdateFailed = newDetails.fragments.some((frag) => !frag); if (newDetails.deltaUpdateFailed) { logger.warn( - '[level-helper] Previous playlist missing segments skipped in delta playlist' + '[level-helper] Previous playlist missing segments skipped in delta playlist', ); for (let i = newDetails.skippedSegments; i--; ) { newDetails.fragments.shift(); @@ -226,7 +226,7 @@ export function mergeDetails( newDetails.dateRanges = mergeDateRanges( oldDetails.dateRanges, newDetails.dateRanges, - newDetails.recentlyRemovedDateranges + newDetails.recentlyRemovedDateranges, ); } } @@ -249,7 +249,7 @@ export function mergeDetails( (oldPart: Part, newPart: Part) => { newPart.elementaryStreams = oldPart.elementaryStreams; newPart.stats = oldPart.stats; - } + }, ); // if at least one fragment contains PTS info, recompute PTS information for all fragments @@ -260,7 +260,7 @@ export function mergeDetails( PTSFrag.startPTS, PTSFrag.endPTS, PTSFrag.startDTS, - PTSFrag.endDTS + PTSFrag.endDTS, ); } else { // ensure that delta is within oldFragments range @@ -294,7 +294,7 @@ export function mergeDetails( function mergeDateRanges( oldDateRanges: Record, deltaDateRanges: Record, - recentlyRemovedDateranges: string[] | undefined + recentlyRemovedDateranges: string[] | undefined, ): Record { const dateRanges = Object.assign({}, oldDateRanges); if (recentlyRemovedDateranges) { @@ -309,8 +309,8 @@ function mergeDateRanges( } else { logger.warn( `Ignoring invalid Playlist Delta Update DATERANGE tag: "${JSON.stringify( - deltaDateRanges[id].attr - )}"` + deltaDateRanges[id].attr, + )}"`, ); } }); @@ -320,7 +320,7 @@ function mergeDateRanges( export function mapPartIntersection( oldParts: Part[] | null, newParts: Part[] | null, - intersectionFn: PartIntersection + intersectionFn: PartIntersection, ) { if (oldParts && newParts) { let delta = 0; @@ -344,7 +344,7 @@ export function mapPartIntersection( export function mapFragmentIntersection( oldDetails: LevelDetails, newDetails: LevelDetails, - intersectionFn: FragmentIntersection + intersectionFn: FragmentIntersection, ): void { const skippedSegments = newDetails.skippedSegments; const start = @@ -378,7 +378,7 @@ export function mapFragmentIntersection( export function adjustSliding( oldDetails: LevelDetails, - newDetails: LevelDetails + newDetails: LevelDetails, ): void { const delta = newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN; @@ -403,7 +403,7 @@ export function addSliding(details: LevelDetails, start: number) { export function computeReloadInterval( newDetails: LevelDetails, - distanceToLiveEdgeMs: number = Infinity + distanceToLiveEdgeMs: number = Infinity, ): number { let reloadInterval = 1000 * newDetails.targetduration; @@ -435,7 +435,7 @@ export function computeReloadInterval( export function getFragmentWithSN( level: Level, sn: number, - fragCurrent: Fragment | null + fragCurrent: Fragment | null, ): Fragment | null { if (!level?.details) { return null; @@ -459,7 +459,7 @@ export function getFragmentWithSN( export function getPartWith( level: Level, sn: number, - partIndex: number + partIndex: number, ): Part | null { if (!level?.details) { return null; @@ -470,7 +470,7 @@ export function getPartWith( export function findPart( partList: Part[] | null | undefined, sn: number, - partIndex: number + partIndex: number, ): Part | null { if (partList) { for (let i = partList.length; i--; ) { diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 8033429e7..745d4ef58 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -66,13 +66,13 @@ export function enableLogs(debugConfig: boolean | ILogger, id: string): void { 'log', 'info', 'warn', - 'error' + 'error', ); // Some browsers don't allow to use bind on console object anyway // fallback to default if needed try { exportedLogger.log( - `Debug logs enabled for "${id}" in hls.js version ${__VERSION__}` + `Debug logs enabled for "${id}" in hls.js version ${__VERSION__}`, ); } catch (e) { exportedLogger = fakeLogger; diff --git a/src/utils/media-option-attributes.ts b/src/utils/media-option-attributes.ts index db063a41c..f665609cc 100644 --- a/src/utils/media-option-attributes.ts +++ b/src/utils/media-option-attributes.ts @@ -3,7 +3,7 @@ import type { MediaAttributes, MediaPlaylist } from '../types/media-playlist'; export function subtitleOptionsIdentical( trackList1: MediaPlaylist[] | Level[], - trackList2: MediaPlaylist[] + trackList2: MediaPlaylist[], ): boolean { if (trackList1.length !== trackList2.length) { return false; @@ -12,7 +12,7 @@ export function subtitleOptionsIdentical( if ( !subtitleAttributesIdentical( trackList1[i].attrs as MediaAttributes, - trackList2[i].attrs + trackList2[i].attrs, ) ) { return false; @@ -23,7 +23,7 @@ export function subtitleOptionsIdentical( export function subtitleAttributesIdentical( attrs1: MediaAttributes, - attrs2: MediaAttributes + attrs2: MediaAttributes, ): boolean { // Media options with the same rendition ID must be bit identical const stableRenditionId = attrs1['STABLE-RENDITION-ID']; @@ -40,6 +40,6 @@ export function subtitleAttributesIdentical( 'FORCED', ].some( (subtitleAttribute) => - attrs1[subtitleAttribute] !== attrs2[subtitleAttribute] + attrs1[subtitleAttribute] !== attrs2[subtitleAttribute], ); } diff --git a/src/utils/mediacapabilities-helper.ts b/src/utils/mediacapabilities-helper.ts index 2127061cd..287651a8b 100644 --- a/src/utils/mediacapabilities-helper.ts +++ b/src/utils/mediacapabilities-helper.ts @@ -34,7 +34,7 @@ export function requiresMediaCapabilitiesDecodingInfo( mediaCapabilities: MediaCapabilities | undefined, currentVideoRange: VideoRange | undefined, currentFrameRate: number, - currentBw: number + currentBw: number, ): boolean { // Only test support when configuration is exceeds minimum options const audioGroupId = level.audioCodec ? level.audioGroupId : null; @@ -57,7 +57,7 @@ export function requiresMediaCapabilitiesDecodingInfo( export function getMediaDecodingInfoPromise( level: Level, audioTracksByGroup: AudioTracksByGroup, - mediaCapabilities: MediaCapabilities + mediaCapabilities: MediaCapabilities, ): Promise { const videoCodecs = level.videoCodec; const audioCodecs = level.audioCodec; @@ -106,7 +106,7 @@ export function getMediaDecodingInfoPromise( // spatialRendering: // audioCodec === 'ec-3' && channels.indexOf('JOC'), }, - })) + })), ); } } @@ -122,7 +122,7 @@ export function getMediaDecodingInfoPromise( (SUPPORTED_INFO_CACHE[decodingInfoKey] = mediaCapabilities.decodingInfo(configuration)) ); - }) + }), ) .then((decodingInfoResults) => ({ supported: !decodingInfoResults.some((info) => !info.supported), diff --git a/src/utils/mediakeys-helper.ts b/src/utils/mediakeys-helper.ts index 5f5e91174..7b579be49 100755 --- a/src/utils/mediakeys-helper.ts +++ b/src/utils/mediakeys-helper.ts @@ -19,7 +19,7 @@ export const enum KeySystemFormats { } export function keySystemFormatToKeySystemDomain( - format: KeySystemFormats + format: KeySystemFormats, ): KeySystems | undefined { switch (format) { case KeySystemFormats.FAIRPLAY: @@ -43,7 +43,7 @@ export const enum KeySystemIds { } export function keySystemIdToKeySystemDomain( - systemId: KeySystemIds + systemId: KeySystemIds, ): KeySystems | undefined { if (systemId === KeySystemIds.WIDEVINE) { return KeySystems.WIDEVINE; @@ -55,7 +55,7 @@ export function keySystemIdToKeySystemDomain( } export function keySystemDomainToKeySystemFormat( - keySystem: KeySystems + keySystem: KeySystems, ): KeySystemFormats | undefined { switch (keySystem) { case KeySystems.FAIRPLAY: @@ -70,7 +70,7 @@ export function keySystemDomainToKeySystemFormat( } export function getKeySystemsForConfig( - config: EMEControllerConfig + config: EMEControllerConfig, ): KeySystems[] { const { drmSystems, widevineLicenseUrl } = config; const keySystemsToAttempt: KeySystems[] = drmSystems @@ -89,7 +89,7 @@ export function getKeySystemsForConfig( export type MediaKeyFunc = ( keySystem: KeySystems, - supportedConfigurations: MediaKeySystemConfiguration[] + supportedConfigurations: MediaKeySystemConfiguration[], ) => Promise; export const requestMediaKeySystemAccess = (function (): MediaKeyFunc | null { @@ -111,7 +111,7 @@ export function getSupportedMediaKeySystemConfigurations( keySystem: KeySystems, audioCodecs: string[], videoCodecs: string[], - drmSystemOptions: DRMSystemOptions + drmSystemOptions: DRMSystemOptions, ): MediaKeySystemConfiguration[] { let initDataTypes: string[]; switch (keySystem) { @@ -132,7 +132,7 @@ export function getSupportedMediaKeySystemConfigurations( initDataTypes, audioCodecs, videoCodecs, - drmSystemOptions + drmSystemOptions, ); } @@ -140,7 +140,7 @@ function createMediaKeySystemConfigurations( initDataTypes: string[], audioCodecs: string[], videoCodecs: string[], - drmSystemOptions: DRMSystemOptions + drmSystemOptions: DRMSystemOptions, ): MediaKeySystemConfiguration[] { const baseConfig: MediaKeySystemConfiguration = { initDataTypes: initDataTypes, diff --git a/src/utils/mp4-tools.ts b/src/utils/mp4-tools.ts index a3c458e84..dfd3c621f 100644 --- a/src/utils/mp4-tools.ts +++ b/src/utils/mp4-tools.ts @@ -406,7 +406,7 @@ function addLeadingZero(num: number): string { export function patchEncyptionData( initSegment: Uint8Array | undefined, - decryptdata: DecryptData | null + decryptdata: DecryptData | null, ): Uint8Array | undefined { if (!initSegment || !decryptdata) { return initSegment; @@ -437,8 +437,8 @@ export function patchEncyptionData( `[eme] Patching keyId in 'enc${ isAudio ? 'a' : 'v' }>sinf>>tenc' box: ${Hex.hexDump(tencKeyId)} -> ${Hex.hexDump( - keyId - )}` + keyId, + )}`, ); tenc.set(keyId, 8); } @@ -482,7 +482,7 @@ export function parseSinf(sinf: Uint8Array): Uint8Array | null { */ export function getStartDTS( initData: InitData, - fmp4: Uint8Array + fmp4: Uint8Array, ): number | null { // we need info from two children of each track fragment box return findBox(fmp4, ['moof', 'traf']).reduce( @@ -502,7 +502,7 @@ export function getStartDTS( // https://github.com/video-dev/hls.js/issues/5303 if (baseTime === UINT32_MAX) { logger.warn( - `[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time` + `[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time`, ); return result; } @@ -522,7 +522,7 @@ export function getStartDTS( } return result; }, - null + null, ); if ( start !== null && @@ -533,7 +533,7 @@ export function getStartDTS( } return result; }, - null + null, ); } @@ -607,7 +607,7 @@ export function getDuration(data: Uint8Array, initData: InitData) { if (sidx?.references) { sidxDuration += sidx.references.reduce( (dur, ref) => dur + ref.info.duration || 0, - 0 + 0, ); } } @@ -682,7 +682,7 @@ export function computeRawDurationFromSamples(trun): number { export function offsetStartDTS( initData: InitData, fmp4: Uint8Array, - timeOffset: number + timeOffset: number, ) { findBox(fmp4, ['moof', 'traf']).forEach((traf) => { findBox(traf, ['tfhd']).forEach((tfhd) => { @@ -746,7 +746,7 @@ export interface SegmentedRange { export function appendUint8Array( data1: Uint8Array, - data2: Uint8Array + data2: Uint8Array, ): Uint8Array { const temp = new Uint8Array(data1.length + data2.length); temp.set(data1); @@ -768,7 +768,7 @@ export interface IEmsgParsingData { export function parseSamples( timeOffset: number, - track: PassthroughTrack + track: PassthroughTrack, ): UserdataSample[] { const seiSamples = [] as UserdataSample[]; const videoData = track.samples; @@ -888,13 +888,13 @@ export function parseSamples( if (isSEIMessage(isHEVCFlavor, videoData[sampleOffset])) { const data = videoData.subarray( sampleOffset, - sampleOffset + naluSize + sampleOffset + naluSize, ); parseSEIMessageFromNALu( data, isHEVCFlavor ? 2 : 1, timeOffset + compositionOffset / timescale, - seiSamples + seiSamples, ); } sampleOffset += naluSize; @@ -941,7 +941,7 @@ export function parseSEIMessageFromNALu( unescapedData: Uint8Array, headerSize: number, pts: number, - samples: UserdataSample[] + samples: UserdataSample[], ) { const data = discardEPB(unescapedData); let seiPtr = 0; @@ -1134,7 +1134,7 @@ export function parseEmsg(data: Uint8Array): IEmsgParsingData { if (!Number.isSafeInteger(presentationTime)) { presentationTime = Number.MAX_SAFE_INTEGER; logger.warn( - 'Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box' + 'Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box', ); } @@ -1196,7 +1196,7 @@ export function mp4Box(type: ArrayLike, ...payload: Uint8Array[]) { export function mp4pssh( systemId: Uint8Array, keyids: Array | null, - data: Uint8Array + data: Uint8Array, ) { if (systemId.byteLength !== 16) { throw new RangeError('Invalid system id'); @@ -1242,7 +1242,7 @@ export function mp4pssh( kidCount, kids, dataSize, - data || new Uint8Array() + data || new Uint8Array(), ); } diff --git a/src/utils/output-filter.ts b/src/utils/output-filter.ts index 414c29ae9..88d1a3550 100644 --- a/src/utils/output-filter.ts +++ b/src/utils/output-filter.ts @@ -24,7 +24,7 @@ export default class OutputFilter { this.startTime, this.endTime as number, this.screen as CaptionScreen, - this.cueRanges + this.cueRanges, ); this.startTime = null; } diff --git a/src/utils/rendition-helper.ts b/src/utils/rendition-helper.ts index 451ac2350..a9db50642 100644 --- a/src/utils/rendition-helper.ts +++ b/src/utils/rendition-helper.ts @@ -30,7 +30,7 @@ type StartParameters = { export function getStartCodecTier( codecTiers: Record, videoRange: VideoRange | undefined, - currentBw: number + currentBw: number, ): StartParameters { const codecSets = Object.keys(codecTiers); // Use first level set to determine stereo, and minimum resolution and framerate @@ -70,49 +70,49 @@ export function getStartCodecTier( if (candidateTier.minBitrate > currentBw) { logStartCodecCandidateIgnored( candidate, - `min bitrate of ${candidateTier.minBitrate} > current estimate of ${currentBw}` + `min bitrate of ${candidateTier.minBitrate} > current estimate of ${currentBw}`, ); return selected; } if (!candidateTier.hasDefaultAudio) { logStartCodecCandidateIgnored( candidate, - `no renditions with default or auto-select sound found` + `no renditions with default or auto-select sound found`, ); return selected; } if (hasStereo && candidateTier.channels['2'] === 0) { logStartCodecCandidateIgnored( candidate, - `no renditions with stereo sound found` + `no renditions with stereo sound found`, ); return selected; } if (candidateTier.minHeight > maxHeight) { logStartCodecCandidateIgnored( candidate, - `min resolution of ${candidateTier.minHeight} > maximum of ${maxHeight}` + `min resolution of ${candidateTier.minHeight} > maximum of ${maxHeight}`, ); return selected; } if (candidateTier.minFramerate > maxFramerate) { logStartCodecCandidateIgnored( candidate, - `min framerate of ${candidateTier.minFramerate} > maximum of ${maxFramerate}` + `min framerate of ${candidateTier.minFramerate} > maximum of ${maxFramerate}`, ); return selected; } if (videoRange && candidateTier.videoRanges[videoRange] === 0) { logStartCodecCandidateIgnored( candidate, - `no variants with VIDEO-RANGE of ${videoRange} found` + `no variants with VIDEO-RANGE of ${videoRange} found`, ); return selected; } if (candidateTier.maxScore < selectedScore) { logStartCodecCandidateIgnored( candidate, - `max score of ${candidateTier.maxScore} < selected max of ${selectedScore}` + `max score of ${candidateTier.maxScore} < selected max of ${selectedScore}`, ); return selected; } @@ -128,7 +128,7 @@ export function getStartCodecTier( selectedScore = candidateTier.maxScore; return candidate; }, - undefined + undefined, ); return { codecSet, @@ -140,7 +140,7 @@ export function getStartCodecTier( function logStartCodecCandidateIgnored(codeSet: string, reason: string) { logger.log( - `[abr] start candidates with "${codeSet}" ignored because ${reason}` + `[abr] start candidates with "${codeSet}" ignored because ${reason}`, ); } @@ -180,7 +180,7 @@ export function getAudioTracksByGroup(allAudioTracks: MediaPlaylist[]) { hasDefaultAudio: false, hasAutoSelectAudio: false, groups: {}, - } + }, ); } @@ -188,7 +188,7 @@ export function getCodecTiers( levels: Level[], audioTracksByGroup: AudioTracksByGroup, minAutoLevel: number, - maxAutoLevel: number + maxAutoLevel: number, ): Record { return levels .slice(minAutoLevel, maxAutoLevel + 1) diff --git a/src/utils/texttrack-utils.ts b/src/utils/texttrack-utils.ts index 1f8a944ea..a07e1d151 100644 --- a/src/utils/texttrack-utils.ts +++ b/src/utils/texttrack-utils.ts @@ -33,13 +33,13 @@ export function addCueToTrack(track: TextTrack, cue: VTTCue) { const textTrackCue = new (self.TextTrackCue as any)( cue.startTime, cue.endTime, - cue.text + cue.text, ); textTrackCue.id = cue.id; track.addCue(textTrackCue); } catch (err2) { logger.debug( - `[texttrack-utils]: Legacy TextTrackCue fallback failed: ${err2}` + `[texttrack-utils]: Legacy TextTrackCue fallback failed: ${err2}`, ); } } @@ -71,7 +71,7 @@ export function removeCuesInRange( track: TextTrack, start: number, end: number, - predicate?: (cue: TextTrackCue) => boolean + predicate?: (cue: TextTrackCue) => boolean, ) { const mode = track.mode; if (mode === 'disabled') { @@ -95,7 +95,7 @@ export function removeCuesInRange( // Modified version of binary search O(log(n)). function getFirstCueIndexAfterTime( cues: TextTrackCueList | TextTrackCue[], - time: number + time: number, ): number { // If first cue starts after time, start there if (time < cues[0].startTime) { @@ -132,7 +132,7 @@ function getFirstCueIndexAfterTime( export function getCuesInRange( cues: TextTrackCueList | TextTrackCue[], start: number, - end: number + end: number, ): TextTrackCue[] { const cuesFound: TextTrackCue[] = []; const firstCueInRange = getFirstCueIndexAfterTime(cues, start); diff --git a/src/utils/timescale-conversion.ts b/src/utils/timescale-conversion.ts index c8d0eac8e..f46aa5318 100644 --- a/src/utils/timescale-conversion.ts +++ b/src/utils/timescale-conversion.ts @@ -9,7 +9,7 @@ export function toTimescaleFromBase( baseTime: number, destScale: number, srcBase: number = 1, - round: boolean = false + round: boolean = false, ): number { const result = baseTime * destScale * srcBase; // equivalent to `(value * scale) / (1 / base)` return round ? Math.round(result) : result; @@ -19,21 +19,21 @@ export function toTimescaleFromScale( baseTime: number, destScale: number, srcScale: number = 1, - round: boolean = false + round: boolean = false, ): number { return toTimescaleFromBase(baseTime, destScale, 1 / srcScale, round); } export function toMsFromMpegTsClock( baseTime: number, - round: boolean = false + round: boolean = false, ): number { return toTimescaleFromBase(baseTime, 1000, 1 / MPEG_TS_CLOCK_FREQ_HZ, round); } export function toMpegTsClockFromTimescale( baseTime: number, - srcScale: number = 1 + srcScale: number = 1, ): number { return toTimescaleFromBase(baseTime, MPEG_TS_CLOCK_FREQ_HZ, 1 / srcScale); } diff --git a/src/utils/typed-array.ts b/src/utils/typed-array.ts index 917c7b414..1c1014d40 100644 --- a/src/utils/typed-array.ts +++ b/src/utils/typed-array.ts @@ -1,7 +1,7 @@ export function sliceUint8( array: Uint8Array, start?: number, - end?: number + end?: number, ): Uint8Array { // @ts-expect-error This polyfills IE11 usage of Uint8Array slice. // It always exists in the TypeScript definition so fails, but it fails at runtime on IE11. diff --git a/src/utils/variable-substitution.ts b/src/utils/variable-substitution.ts index 4357b4b2b..7ecbde87d 100644 --- a/src/utils/variable-substitution.ts +++ b/src/utils/variable-substitution.ts @@ -15,7 +15,7 @@ export function substituteVariablesInAttributes( 'variableList' | 'hasVariableRefs' | 'playlistParsingError' >, attr: AttrList, - attributeNames: string[] + attributeNames: string[], ) { if (parsed.variableList !== null || parsed.hasVariableRefs) { for (let i = attributeNames.length; i--; ) { @@ -33,7 +33,7 @@ export function substituteVariables( ParsedMultivariantPlaylist | LevelDetails, 'variableList' | 'hasVariableRefs' | 'playlistParsingError' >, - value: string + value: string, ): string { if (parsed.variableList !== null || parsed.hasVariableRefs) { const variableList = parsed.variableList; @@ -42,17 +42,17 @@ export function substituteVariables( (variableReference: string) => { const variableName = variableReference.substring( 2, - variableReference.length - 1 + variableReference.length - 1, ); const variableValue = variableList?.[variableName]; if (variableValue === undefined) { parsed.playlistParsingError ||= new Error( - `Missing preceding EXT-X-DEFINE tag for Variable Reference: "${variableName}"` + `Missing preceding EXT-X-DEFINE tag for Variable Reference: "${variableName}"`, ); return variableReference; } return variableValue; - } + }, ); } return value; @@ -64,7 +64,7 @@ export function addVariableDefinition( 'variableList' | 'playlistParsingError' >, attr: AttrList, - parentUrl: string + parentUrl: string, ) { let variableList = parsed.variableList; if (!variableList) { @@ -80,12 +80,12 @@ export function addVariableDefinition( VALUE = searchParams.get(NAME); } else { throw new Error( - `"${NAME}" does not match any query parameter in URI: "${parentUrl}"` + `"${NAME}" does not match any query parameter in URI: "${parentUrl}"`, ); } } catch (error) { parsed.playlistParsingError ||= new Error( - `EXT-X-DEFINE QUERYPARAM: ${error.message}` + `EXT-X-DEFINE QUERYPARAM: ${error.message}`, ); } } else { @@ -94,7 +94,7 @@ export function addVariableDefinition( } if (NAME in variableList) { parsed.playlistParsingError ||= new Error( - `EXT-X-DEFINE duplicate Variable Name declarations: "${NAME}"` + `EXT-X-DEFINE duplicate Variable Name declarations: "${NAME}"`, ); } else { variableList[NAME] = VALUE || ''; @@ -107,7 +107,7 @@ export function importVariableDefinition( 'variableList' | 'playlistParsingError' >, attr: AttrList, - sourceVariableList: VariableMap | null + sourceVariableList: VariableMap | null, ) { const IMPORT = attr.IMPORT; if (sourceVariableList && IMPORT in sourceVariableList) { @@ -118,7 +118,7 @@ export function importVariableDefinition( variableList[IMPORT] = sourceVariableList[IMPORT]; } else { parsed.playlistParsingError ||= new Error( - `EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "${IMPORT}"` + `EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "${IMPORT}"`, ); } } diff --git a/src/utils/vttcue.ts b/src/utils/vttcue.ts index 5edd072c2..1737d38db 100644 --- a/src/utils/vttcue.ts +++ b/src/utils/vttcue.ts @@ -58,14 +58,14 @@ export default (function () { function findDirectionSetting(value: string) { return isAllowedValue( AllowedDirections, - value + value, ); } function findAlignSetting(value: string) { return isAllowedValue( AllowedAlignments, - value + value, ); } @@ -124,7 +124,7 @@ export default (function () { set: function (value: string) { _id = '' + value; }, - }) + }), ); Object.defineProperty( @@ -137,7 +137,7 @@ export default (function () { set: function (value: boolean) { _pauseOnExit = !!value; }, - }) + }), ); Object.defineProperty( @@ -155,7 +155,7 @@ export default (function () { _startTime = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -173,7 +173,7 @@ export default (function () { _endTime = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -187,7 +187,7 @@ export default (function () { _text = '' + value; this.hasBeenReset = true; }, - }) + }), ); // todo: implement VTTRegion polyfill? @@ -202,7 +202,7 @@ export default (function () { _region = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -217,14 +217,14 @@ export default (function () { // Have to check for false because the setting an be an empty string. if (setting === false) { throw new SyntaxError( - 'An invalid or illegal string was specified.' + 'An invalid or illegal string was specified.', ); } _vertical = setting; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -238,7 +238,7 @@ export default (function () { _snapToLines = !!value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -251,14 +251,14 @@ export default (function () { set: function (value: number | 'auto') { if (typeof value !== 'number' && value !== 'auto') { throw new SyntaxError( - 'An invalid number or illegal string was specified.' + 'An invalid number or illegal string was specified.', ); } _line = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -272,14 +272,14 @@ export default (function () { const setting = findAlignSetting(value); if (!setting) { throw new SyntaxError( - 'An invalid or illegal string was specified.' + 'An invalid or illegal string was specified.', ); } _lineAlign = setting; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -297,7 +297,7 @@ export default (function () { _position = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -311,14 +311,14 @@ export default (function () { const setting = findAlignSetting(value); if (!setting) { throw new SyntaxError( - 'An invalid or illegal string was specified.' + 'An invalid or illegal string was specified.', ); } _positionAlign = setting; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -336,7 +336,7 @@ export default (function () { _size = value; this.hasBeenReset = true; }, - }) + }), ); Object.defineProperty( @@ -350,14 +350,14 @@ export default (function () { const setting = findAlignSetting(value); if (!setting) { throw new SyntaxError( - 'An invalid or illegal string was specified.' + 'An invalid or illegal string was specified.', ); } _align = setting; this.hasBeenReset = true; }, - }) + }), ); /** diff --git a/src/utils/vttparser.ts b/src/utils/vttparser.ts index 7ccf11c95..3bc0e9ab6 100644 --- a/src/utils/vttparser.ts +++ b/src/utils/vttparser.ts @@ -101,7 +101,7 @@ function parseOptions( input: string, callback: (k: string, v: any) => void, keyValueDelim: RegExp, - groupDelim?: RegExp + groupDelim?: RegExp, ) { const groups = groupDelim ? input.split(groupDelim) : [input]; for (const i in groups) { @@ -198,7 +198,7 @@ function parseCue(input: string, cue: VTTCue, regionList: Region[]) { } }, /:/, - /\s/ + /\s/, ); // Apply default values for any missing fields. @@ -238,7 +238,8 @@ function parseCue(input: string, cue: VTTCue, regionList: Region[]) { if (input.slice(0, 3) !== '-->') { // (3) next characters must match '-->' throw new Error( - "Malformed time stamp (time stamps must be separated by '-->'): " + oInput + "Malformed time stamp (time stamps must be separated by '-->'): " + + oInput, ); } input = input.slice(3); @@ -329,7 +330,7 @@ export class VTTParser { // break; // } }, - /:/ + /:/, ); } diff --git a/src/utils/webvtt-parser.ts b/src/utils/webvtt-parser.ts index 10a382455..46e345e81 100644 --- a/src/utils/webvtt-parser.ts +++ b/src/utils/webvtt-parser.ts @@ -13,7 +13,7 @@ const LINEBREAKS = /\r\n|\n\r|\n|\r/g; const startsWith = function ( inputString: string, searchString: string, - position: number = 0 + position: number = 0, ) { return ( inputString.slice(position, position + searchString.length) === searchString @@ -61,7 +61,7 @@ const hash = function (text: string) { export function generateCueId( startTime: number, endTime: number, - text: string + text: string, ) { return hash(startTime.toString()) + hash(endTime.toString()) + hash(text); } @@ -97,7 +97,7 @@ export function parseWebVTT( cc: number, timeOffset: number, callBack: (cues: VTTCue[]) => void, - errorCallBack: (error: Error) => void + errorCallBack: (error: Error) => void, ) { const parser = new VTTParser(); // Convert byteArray into string, replacing any somewhat exotic linefeeds with "\n", then split on that character. @@ -146,7 +146,7 @@ export function parseWebVTT( const startTime = normalizePts( (cue.startTime + cueOffset - timestampMapLOCAL) * 90000, - timeOffset * 90000 + timeOffset * 90000, ) / 90000; cue.startTime = Math.max(startTime, 0); cue.endTime = Math.max(startTime + duration, 0); diff --git a/src/utils/xhr-loader.ts b/src/utils/xhr-loader.ts index a81985e84..8de248fd1 100644 --- a/src/utils/xhr-loader.ts +++ b/src/utils/xhr-loader.ts @@ -64,7 +64,7 @@ class XhrLoader implements Loader { this.callbacks.onAbort( this.stats, this.context as LoaderContext, - this.loader + this.loader, ); } } @@ -72,7 +72,7 @@ class XhrLoader implements Loader { load( context: LoaderContext, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ) { if (this.stats.loading.start) { throw new Error('Loader can only be used once.'); @@ -117,7 +117,7 @@ class XhrLoader implements Loader { { code: xhr.status, text: error.message }, context, xhr, - stats + stats, ); return; }); @@ -129,7 +129,7 @@ class XhrLoader implements Loader { openAndSendXhr( xhr: XMLHttpRequest, context: LoaderContext, - config: LoaderConfiguration + config: LoaderConfiguration, ) { if (!xhr.readyState) { xhr.open('GET', context.url, true); @@ -146,7 +146,7 @@ class XhrLoader implements Loader { if (context.rangeEnd) { xhr.setRequestHeader( 'Range', - 'bytes=' + context.rangeStart + '-' + (context.rangeEnd - 1) + 'bytes=' + context.rangeStart + '-' + (context.rangeEnd - 1), ); } @@ -161,7 +161,7 @@ class XhrLoader implements Loader { : maxLoadTimeMs; this.requestTimeout = self.setTimeout( this.loadtimeout.bind(this), - config.timeout + config.timeout, ); xhr.send(); } @@ -184,7 +184,7 @@ class XhrLoader implements Loader { if (stats.loading.first === 0) { stats.loading.first = Math.max( self.performance.now(), - stats.loading.start + stats.loading.start, ); // readyState >= 2 AND readyState !==4 (readyState = HEADERS_RECEIVED || LOADING) rearm timeout as xhr not finished yet if (config.timeout !== config.loadPolicy.maxLoadTimeMs) { @@ -193,7 +193,7 @@ class XhrLoader implements Loader { this.requestTimeout = self.setTimeout( this.loadtimeout.bind(this), config.loadPolicy.maxLoadTimeMs - - (stats.loading.first - stats.loading.start) + (stats.loading.first - stats.loading.start), ); } } @@ -212,7 +212,7 @@ class XhrLoader implements Loader { ) { stats.loading.end = Math.max( self.performance.now(), - stats.loading.first + stats.loading.first, ); const data = useResponse ? xhr.response : xhr.responseText; const len = @@ -249,7 +249,7 @@ class XhrLoader implements Loader { { code: status, text: xhr.statusText }, context, xhr, - stats + stats, ); } } @@ -270,7 +270,7 @@ class XhrLoader implements Loader { callbacks.onTimeout( this.stats, this.context as LoaderContext, - this.loader + this.loader, ); } } @@ -281,11 +281,11 @@ class XhrLoader implements Loader { this.retryDelay = getRetryDelay(retryConfig, stats.retry); stats.retry++; logger.warn( - `${status ? 'HTTP Status ' + status : 'Timeout'} while loading ${ - context?.url - }, retrying ${stats.retry}/${retryConfig.maxNumRetry} in ${ - this.retryDelay - }ms` + `${ + status ? 'HTTP Status ' + status : 'Timeout' + } while loading ${context?.url}, retrying ${stats.retry}/${ + retryConfig.maxNumRetry + } in ${this.retryDelay}ms`, ); // abort and reset internal state this.abortInternal(); @@ -294,7 +294,7 @@ class XhrLoader implements Loader { self.clearTimeout(this.retryTimeout); this.retryTimeout = self.setTimeout( this.loadInternal.bind(this), - this.retryDelay + this.retryDelay, ); } @@ -323,7 +323,7 @@ class XhrLoader implements Loader { if ( this.loader && new RegExp(`^${name}:\\s*[\\d.]+\\s*$`, 'im').test( - this.loader.getAllResponseHeaders() + this.loader.getAllResponseHeaders(), ) ) { return this.loader.getResponseHeader(name); diff --git a/tests/functional/multiple/index.html b/tests/functional/multiple/index.html index c5111ea05..8945f9019 100644 --- a/tests/functional/multiple/index.html +++ b/tests/functional/multiple/index.html @@ -1,4 +1,4 @@ - + diff --git a/tests/mocks/hls.mock.ts b/tests/mocks/hls.mock.ts index 232d2477e..cd3b3f810 100644 --- a/tests/mocks/hls.mock.ts +++ b/tests/mocks/hls.mock.ts @@ -33,7 +33,7 @@ export default class HlsMock extends EventEmitter implements HlsEventEmitter { // add spies to event emitters this.trigger = ( event: E, - eventObject: Parameters[1] + eventObject: Parameters[1], ): boolean => this.emit(event as string, event, eventObject); sinon.spy(this, 'on'); sinon.spy(this, 'once'); diff --git a/tests/mocks/loader.mock.ts b/tests/mocks/loader.mock.ts index 44fd19478..994405970 100644 --- a/tests/mocks/loader.mock.ts +++ b/tests/mocks/loader.mock.ts @@ -21,7 +21,7 @@ export class MockXhr implements Loader { load( context: LoaderContext, config: LoaderConfiguration, - callbacks: LoaderCallbacks + callbacks: LoaderCallbacks, ) { this.stats.loading.start = self.performance.now(); this.context = context; diff --git a/tests/mocks/time-ranges.mock.js b/tests/mocks/time-ranges.mock.js index b60184984..b781b772d 100644 --- a/tests/mocks/time-ranges.mock.js +++ b/tests/mocks/time-ranges.mock.js @@ -1,7 +1,7 @@ const assertValidRange = (name, length, index) => { if (index >= length || index < 0) { throw new DOMException( - `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length}).` + `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length}).`, ); } return true; @@ -13,7 +13,7 @@ export class TimeRangesMock { // Accepts an argument list of [start, end] tuples or { start: number, end: number } objects constructor(...ranges) { this._ranges = ranges.map((range) => - Array.isArray(range) ? range : [range.start, range.end] + Array.isArray(range) ? range : [range.start, range.end], ); } diff --git a/tests/test-streams.js b/tests/test-streams.js index 3b4a24db7..ba3bfd54d 100644 --- a/tests/test-streams.js +++ b/tests/test-streams.js @@ -12,7 +12,7 @@ function createTestStream( description, live = false, abr = true, - skip_ua = [] + skip_ua = [], ) { return { url: url, @@ -38,7 +38,7 @@ function createTestStreamWithConfig(target, config) { target.description, target.live, target.abr, - target.skip_ua + target.skip_ua, ); testStream.config = config; @@ -147,7 +147,7 @@ module.exports = { { widevineLicenseUrl: 'https://cwip-shaka-proxy.appspot.com/no_auth', emeEnabled: true, - } + }, ), audioOnlyMultipleLevels: { url: 'https://s3.amazonaws.com/qa.jwplayer.com/~alex/121628/new_master.m3u8', @@ -183,7 +183,7 @@ module.exports = { }, { avBufferOffset: 10.5, - } + }, ), altAudioAndTracks: { // url: 'https://wowzaec2demo.streamlock.net/vod-multitrack/_definst_/smil:ElephantsDream/elephantsdream2.smil/playlist.m3u', @@ -203,7 +203,7 @@ module.exports = { // the timeline shifts roughly 10 seconds seconds back, and as a result buffering skips several segments // to adjust for the currentTime now being places at the very end of the stream. allowedBufferedRangesInSeekTest: 3, - } + }, ), altAudioMultiAudioOnly: { url: 'https://playertest.longtailvideo.com/adaptive/alt-audio-no-video/angel-one.m3u8', diff --git a/tests/unit/controller/abr-controller.ts b/tests/unit/controller/abr-controller.ts index 304ad6679..097895d92 100644 --- a/tests/unit/controller/abr-controller.ts +++ b/tests/unit/controller/abr-controller.ts @@ -47,7 +47,7 @@ describe('AbrController', function () { it('estimate can be reset with new value', function () { const { abrEwmaDefaultEstimate } = hls.config; expect(abrController.bwEstimator.getEstimate()).to.equal( - abrEwmaDefaultEstimate + abrEwmaDefaultEstimate, ); const updatedEstimate = 5e6 + 1; abrController.resetEstimator(updatedEstimate); @@ -86,7 +86,7 @@ describe('AbrController', function () { abrController.resetEstimator(hls.levels[hls.firstLevel].bitrate); expect(abrController.firstAutoLevel).to.equal( 4, - 'firstAutoLevel exact match' + 'firstAutoLevel exact match', ); hls.autoLevelCapping = 3; @@ -95,7 +95,7 @@ describe('AbrController', function () { expect(hls.maxAutoLevel).to.equal(3); expect(abrController.firstAutoLevel).to.equal( 3, - 'firstAutoLevel capped to 3' + 'firstAutoLevel capped to 3', ); hls.autoLevelCapping = 0; @@ -104,7 +104,7 @@ describe('AbrController', function () { expect(hls.maxAutoLevel).to.equal(0); expect(abrController.firstAutoLevel).to.equal( 0, - 'firstAutoLevel capped to 0' + 'firstAutoLevel capped to 0', ); }); @@ -136,7 +136,7 @@ describe('AbrController', function () { abrController, 0, requiredBitrateForLevel2 / 8, - 1000 + 1000, ); expect(abrController.nextAutoLevel).to.equal(2); }); @@ -165,7 +165,7 @@ function loadAndBufferFragment( sizeInBytes: number, timeToLoad: number, timeToFirstByte: number = 0, - timeToParse: number = 0 + timeToParse: number = 0, ) { const frag = new Fragment(PlaylistLevelType.MAIN, ''); frag.level = levelIndex; @@ -187,7 +187,7 @@ function loadAndBufferFragment( part: null, payload: new ArrayBuffer(0), networkDetails: null, - } + }, ); ((abrController as any).onFragBuffered as HlsListeners[Events.FRAG_BUFFERED])( Events.FRAG_BUFFERED, @@ -196,14 +196,14 @@ function loadAndBufferFragment( part: null, stats: frag.stats, id: 'video', - } + }, ); } function setForwardBufferlength( sandbox: sinon.SinonSandbox, hls: Hls, - length: number + length: number, ) { sandbox .stub((hls as any).streamController, 'getMainFwdBufferInfo') diff --git a/tests/unit/controller/audio-stream-controller.js b/tests/unit/controller/audio-stream-controller.js index 26f349b32..7266af68d 100644 --- a/tests/unit/controller/audio-stream-controller.js +++ b/tests/unit/controller/audio-stream-controller.js @@ -54,7 +54,7 @@ describe('AudioStreamController', function () { audioStreamController = new AudioStreamController( hls, fragmentTracker, - keyLoader + keyLoader, ); }); diff --git a/tests/unit/controller/audio-track-controller.ts b/tests/unit/controller/audio-track-controller.ts index 8945b1d68..c0fb8860d 100644 --- a/tests/unit/controller/audio-track-controller.ts +++ b/tests/unit/controller/audio-track-controller.ts @@ -61,7 +61,7 @@ type AudioTrackControllerTestable = Omit< onManifestLoading: () => void; onManifestParsed: ( type: string, - data: { audioTracks: MediaPlaylist[] } + data: { audioTracks: MediaPlaylist[] }, ) => void; onLevelLoading: (type: string, data: { level: number }) => void; onAudioTrackLoaded: (type: string, data: AudioTrackLoadedData) => void; @@ -80,7 +80,7 @@ describe('AudioTrackController', function () { hls.coreComponents.forEach((component) => component.destroy()); hls.coreComponents.length = 0; audioTrackController = new AudioTrackController( - hls as unknown as Hls + hls as unknown as Hls, ) as unknown as AudioTrackControllerTestable; hls.networkControllers.push(audioTrackController); hls.levelController = { @@ -197,7 +197,7 @@ describe('AudioTrackController', function () { Events.AUDIO_TRACKS_UPDATED, { audioTracks: tracks.slice(3, 6), - } + }, ); }); }); @@ -228,7 +228,7 @@ describe('AudioTrackController', function () { expect(audioTrackController.groupId).to.equal(newGroupId); // name is still the same expect(tracks[audioTrackController.audioTrack].name).to.equal( - audioTrackName + audioTrackName, ); }); @@ -248,7 +248,7 @@ describe('AudioTrackController', function () { .calledOnce; expect( audioTrackSwitchingCallback, - 'AUDIO_TRACK_SWITCHING to initial track 0' + 'AUDIO_TRACK_SWITCHING to initial track 0', ).to.have.been.calledOnce; audioTrackController.onAudioTrackLoaded(Events.AUDIO_TRACK_LOADED, { @@ -288,7 +288,7 @@ describe('AudioTrackController', function () { it('should not need loading because the audioTrack is embedded in the main playlist', function () { audioTrackController.canLoad = true; expect( - audioTrackController.shouldLoadPlaylist({ details: { live: true } }) + audioTrackController.shouldLoadPlaylist({ details: { live: true } }), ).to.be.false; expect(audioTrackController.shouldLoadPlaylist({ details: undefined })).to .be.false; @@ -301,7 +301,7 @@ describe('AudioTrackController', function () { details: { live: true }, url: 'http://example.com/manifest.m3u8', }), - 'track 1' + 'track 1', ).to.be.true; expect( @@ -309,7 +309,7 @@ describe('AudioTrackController', function () { details: null, url: 'http://example.com/manifest.m3u8', }), - 'track 2' + 'track 2', ).to.be.true; }); }); @@ -338,21 +338,21 @@ describe('AudioTrackController', function () { audioTrackController.onLevelLoading( Events.LEVEL_LOADING, - levelLoadedEvent + levelLoadedEvent, ); // group has switched expect(audioTrackController.groupId).to.equal(newGroupId); // name is still the same expect(tracks[audioTrackController.audioTrack].name).to.equal( - audioTrackName + audioTrackName, ); }); it('should load audio tracks with a url', function () { const shouldLoadPlaylist = sinon.spy( audioTrackController, - 'shouldLoadPlaylist' + 'shouldLoadPlaylist', ); const audioTrackLoadingCallback = sinon.spy(); const trackWithUrl: MediaPlaylist = { @@ -390,11 +390,11 @@ describe('AudioTrackController', function () { expect(shouldLoadPlaylist).to.have.been.calledWith(trackWithUrl); expect( shouldLoadPlaylist.firstCall.returnValue, - 'expected shouldLoadPlaylist to return false before startLoad() is called' + 'expected shouldLoadPlaylist to return false before startLoad() is called', ).to.be.false; expect( shouldLoadPlaylist.secondCall.returnValue, - 'expected shouldLoadPlaylist to return true after startLoad() is called' + 'expected shouldLoadPlaylist to return true after startLoad() is called', ).to.be.true; expect(audioTrackLoadingCallback).to.have.been.calledOnce; @@ -403,7 +403,7 @@ describe('AudioTrackController', function () { it('should not attempt to load audio tracks without a url', function () { const shouldLoadPlaylist = sinon.spy( audioTrackController, - 'shouldLoadPlaylist' + 'shouldLoadPlaylist', ); const audioTrackLoadingCallback = sinon.spy(); const trackWithOutUrl = tracks[0]; @@ -455,7 +455,7 @@ describe('AudioTrackController', function () { }); expect( audioTrackController.audioTrack, - 'track index/id is not changed as there is no redundant track to choose from' + 'track index/id is not changed as there is no redundant track to choose from', ).to.equal(4); expect(checkRetry).to.have.been.calledOnce; }); diff --git a/tests/unit/controller/base-stream-controller.ts b/tests/unit/controller/base-stream-controller.ts index 6cc1e2593..9f80c1909 100644 --- a/tests/unit/controller/base-stream-controller.ts +++ b/tests/unit/controller/base-stream-controller.ts @@ -42,7 +42,7 @@ describe('BaseStreamController', function () { baseStreamController = new BaseStreamController( hls, fragmentTracker, - new KeyLoader(hlsDefaultConfig) + new KeyLoader(hlsDefaultConfig), ) as unknown as BaseStreamControllerTestable; bufferInfo = { len: 1, diff --git a/tests/unit/controller/buffer-controller-operations.ts b/tests/unit/controller/buffer-controller-operations.ts index 3fbdca8a1..9871035f7 100644 --- a/tests/unit/controller/buffer-controller-operations.ts +++ b/tests/unit/controller/buffer-controller-operations.ts @@ -124,11 +124,11 @@ describe('BufferController', function () { bufferController.sourceBuffer[name].dispatchEvent(new Event('updateend')); expect( currentOnComplete, - 'onComplete should have been called on the current operation' + 'onComplete should have been called on the current operation', ).to.have.callCount(i + 1); expect( shiftAndExecuteNextSpy, - 'The queue should have been cycled' + 'The queue should have been cycled', ).to.have.callCount(i + 1); }); }); @@ -149,15 +149,15 @@ describe('BufferController', function () { expect( onError, - 'onError should have been called on the current operation' + 'onError should have been called on the current operation', ).to.have.callCount(i + 1); expect( onError, - 'onError should be called with the error event' + 'onError should be called with the error event', ).to.have.been.calledWith(errorEvent); expect( triggerSpy, - 'ERROR should have been triggered in response to the SourceBuffer error' + 'ERROR should have been triggered in response to the SourceBuffer error', ).to.have.been.calledWith(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_APPENDING_ERROR, @@ -191,21 +191,21 @@ describe('BufferController', function () { bufferController.onBufferAppending(Events.BUFFER_APPENDING, data); expect( queueAppendSpy, - 'The append operation should have been enqueued' + 'The append operation should have been enqueued', ).to.have.callCount(i + 1); buffer.dispatchEvent(new Event('updateend')); expect( buffer.ended, - `The ${name} buffer should not be marked as true if an append occurred` + `The ${name} buffer should not be marked as true if an append occurred`, ).to.be.false; expect( buffer.appendBuffer, - 'appendBuffer should have been called with the remuxed data' + 'appendBuffer should have been called with the remuxed data', ).to.have.been.calledWith(segmentData); expect( triggerSpy, - 'BUFFER_APPENDED should be triggered upon completion of the operation' + 'BUFFER_APPENDED should be triggered upon completion of the operation', ).to.have.been.calledWith(Events.BUFFER_APPENDED, { parent: 'main', type: name, @@ -219,7 +219,7 @@ describe('BufferController', function () { }); expect( shiftAndExecuteNextSpy, - 'The queue should have been cycled' + 'The queue should have been cycled', ).to.have.callCount(i + 1); }); }); @@ -239,16 +239,16 @@ describe('BufferController', function () { expect( queueAppendSpy, - 'The append operation should have been enqueued' + 'The append operation should have been enqueued', ).to.have.callCount(i + 1); expect( shiftAndExecuteNextSpy, - 'The queue should have been cycled' + 'The queue should have been cycled', ).to.have.callCount(i + 1); }); expect( triggerSpy, - 'Buffer append error event should have been triggered' + 'Buffer append error event should have been triggered', ).to.have.been.calledWith(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_APPEND_ERROR, @@ -277,11 +277,11 @@ describe('BufferController', function () { try { expect( data.frag, - 'The frag emitted in FRAG_BUFFERED should be the frag passed in onFragParsed' + 'The frag emitted in FRAG_BUFFERED should be the frag passed in onFragParsed', ).to.equal(frag); expect( data.id, - 'The id of the event should be equal to the frag type' + 'The id of the event should be equal to the frag type', ).to.equal(frag.type); } catch (e) { reject(e); @@ -313,31 +313,31 @@ describe('BufferController', function () { expect( queueAppendSpy, - 'A remove operation should have been appended to each queue' + 'A remove operation should have been appended to each queue', ).to.have.been.calledTwice; queueNames.forEach((name, i) => { const buffer = bufferController.sourceBuffer[name]; expect( buffer.remove, - `Remove should have been called once on the ${name} SourceBuffer` + `Remove should have been called once on the ${name} SourceBuffer`, ).to.have.been.calledOnce; expect( buffer.remove, - 'Remove should have been called with the expected range' + 'Remove should have been called with the expected range', ).to.have.been.calledWith(0, 10); buffer.dispatchEvent(new Event('updateend')); expect( triggerSpy, - 'The BUFFER_FLUSHED event should be called once per buffer' + 'The BUFFER_FLUSHED event should be called once per buffer', ).to.have.callCount(i + 1); expect( triggerSpy, - 'BUFFER_FLUSHED should be the only event fired' + 'BUFFER_FLUSHED should be the only event fired', ).to.have.been.calledWith(Events.BUFFER_FLUSHED); expect( shiftAndExecuteNextSpy, - 'The queue should have been cycled' + 'The queue should have been cycled', ).to.have.callCount(i + 1); }); }); @@ -351,7 +351,7 @@ describe('BufferController', function () { expect( queueAppendSpy, - 'No remove operations should have been appended' + 'No remove operations should have been appended', ).to.have.callCount(0); }); @@ -365,7 +365,7 @@ describe('BufferController', function () { }); expect( queueAppendSpy, - 'Queue one remove for muxed "audiovideo" SourceBuffer' + 'Queue one remove for muxed "audiovideo" SourceBuffer', ).to.have.been.calledOnce; }); @@ -378,17 +378,17 @@ describe('BufferController', function () { expect( queueAppendSpy, - 'Two remove operations should have been appended' + 'Two remove operations should have been appended', ).to.have.callCount(2); expect( shiftAndExecuteNextSpy, - 'The queues should have been cycled' + 'The queues should have been cycled', ).to.have.callCount(2); queueNames.forEach((name) => { const buffer = bufferController.sourceBuffer[name]; expect( buffer.remove, - `Remove should not have been called on the ${name} buffer` + `Remove should not have been called on the ${name} buffer`, ).to.have.not.been.called; }); expect(triggerSpy, 'No event should have been triggered').to.have.not.been @@ -433,7 +433,7 @@ describe('BufferController', function () { queueNames.forEach((name) => { expect( triggerSpy, - `BUFFER_FLUSHING should have been triggered for the ${name} SourceBuffer` + `BUFFER_FLUSHING should have been triggered for the ${name} SourceBuffer`, ).to.have.been.calledWith(Events.BUFFER_FLUSHING, { startOffset: 0, endOffset: 20, @@ -449,7 +449,7 @@ describe('BufferController', function () { bufferController.flushBackBuffer(); expect( - triggerSpy.withArgs(Events.LIVE_BACK_BUFFER_REACHED) + triggerSpy.withArgs(Events.LIVE_BACK_BUFFER_REACHED), ).to.have.callCount(2); }); @@ -460,7 +460,7 @@ describe('BufferController', function () { queueNames.forEach((name) => { expect( triggerSpy, - `BUFFER_FLUSHING should have been triggered for the ${name} SourceBuffer` + `BUFFER_FLUSHING should have been triggered for the ${name} SourceBuffer`, ).to.have.been.calledWith(Events.BUFFER_FLUSHING, { startOffset: 0, endOffset: 10, @@ -537,11 +537,11 @@ describe('BufferController', function () { // media is null prior to attaching bufferController.media = null; expect(mockMediaSource.duration, 'mediaSource.duration').to.equal( - Infinity + Infinity, ); bufferController.onLevelUpdated(Events.LEVEL_UPDATED, data); expect(mockMediaSource.duration, 'mediaSource.duration').to.equal( - Infinity + Infinity, ); // simulate attach and open source buffers bufferController.media = media; diff --git a/tests/unit/controller/buffer-controller.js b/tests/unit/controller/buffer-controller.js index e015ffa2d..14917be8c 100644 --- a/tests/unit/controller/buffer-controller.js +++ b/tests/unit/controller/buffer-controller.js @@ -157,7 +157,7 @@ describe('BufferController tests', function () { }); checkPendingTracksSpy = sandbox.spy( bufferController, - 'checkPendingTracks' + 'checkPendingTracks', ); }); @@ -298,7 +298,7 @@ describe('BufferController tests', function () { /* eslint-disable-next-line no-unused-vars */ const appendChangeType = sandbox.stub( bufferController, - 'appendChangeType' + 'appendChangeType', ); const buffer = { changeType: sandbox.stub(), @@ -334,7 +334,7 @@ describe('BufferController tests', function () { expect(bufferController.appendChangeType).to.have.been.calledOnce; expect(bufferController.appendChangeType).to.have.been.calledWith( 'audio', - 'audio/mp4;codecs=mp4a.40.5' + 'audio/mp4;codecs=mp4a.40.5', ); expect(bufferController.tracks.audio).to.deep.equal({ buffer, @@ -348,7 +348,7 @@ describe('BufferController tests', function () { expect(bufferController.appendChangeType).to.have.been.calledTwice; expect(bufferController.appendChangeType).to.have.been.calledWith( 'audio', - 'audio/mp4;codecs=mp4a.40.2' + 'audio/mp4;codecs=mp4a.40.2', ); expect(bufferController.tracks.audio).to.deep.equal({ buffer, diff --git a/tests/unit/controller/buffer-operation-queue.ts b/tests/unit/controller/buffer-operation-queue.ts index dbf0f6748..cbc6fb75c 100644 --- a/tests/unit/controller/buffer-operation-queue.ts +++ b/tests/unit/controller/buffer-operation-queue.ts @@ -48,11 +48,11 @@ describe('BufferOperationQueue tests', function () { operationQueue.append(operation, name); expect( execute, - `The ${name} queue operation should have been executed` + `The ${name} queue operation should have been executed`, ).to.have.callCount(i + 1); expect( operationQueue.queues[name], - `The ${name} queue should have a length of 1` + `The ${name} queue should have a length of 1`, ).to.have.length(1); }); }); @@ -75,11 +75,11 @@ describe('BufferOperationQueue tests', function () { operationQueue.append(operation, name); expect( execute, - `The ${name} queue operation should not have been executed` + `The ${name} queue operation should not have been executed`, ).to.have.not.been.called; expect( operationQueue.queues[name], - `The ${name} queue should have a length of 2` + `The ${name} queue should have a length of 2`, ).to.have.length(2); }); }); @@ -94,7 +94,7 @@ describe('BufferOperationQueue tests', function () { queueNames.forEach((name) => { expect( operationQueue.queues[name], - `The ${name} queue should have a length of 1` + `The ${name} queue should have a length of 1`, ).to.have.length(1); }); }); @@ -122,15 +122,15 @@ describe('BufferOperationQueue tests', function () { queueNames.forEach((name, i) => { operationQueue.append(operation, name); expect(onError, 'onError should have been called').to.have.callCount( - i + 1 + i + 1, ); expect( onError, - 'onError should have been called with the thrown exception' + 'onError should have been called with the thrown exception', ).to.have.been.calledWith(error); expect( operationQueue.queues[name], - `The ${name} queue should have a length of 0` + `The ${name} queue should have a length of 0`, ).to.have.length(0); }); }); @@ -153,11 +153,11 @@ describe('BufferOperationQueue tests', function () { operationQueue.shiftAndExecuteNext(name); expect( execute, - `The ${name} queue operation should have been executed` + `The ${name} queue operation should have been executed`, ).to.have.callCount(i + 1); expect( operationQueue.queues[name], - `The ${name} queue should have a length of 1` + `The ${name} queue should have a length of 1`, ).to.have.length(1); }); }); diff --git a/tests/unit/controller/cap-level-controller.js b/tests/unit/controller/cap-level-controller.js index fca908a85..b478d41ee 100644 --- a/tests/unit/controller/cap-level-controller.js +++ b/tests/unit/controller/cap-level-controller.js @@ -33,7 +33,7 @@ describe('CapLevelController', function () { const actual = CapLevelController.getMaxLevelByMediaSize( levels, 300, - 300 + 300, ); expect(expected).to.equal(actual); }); @@ -43,7 +43,7 @@ describe('CapLevelController', function () { const actual = CapLevelController.getMaxLevelByMediaSize( levels, 500, - 500 + 500, ); expect(expected).to.equal(actual); }); @@ -53,7 +53,7 @@ describe('CapLevelController', function () { const actual = CapLevelController.getMaxLevelByMediaSize( levels, 5000, - 5000 + 5000, ); expect(expected).to.equal(actual); }); @@ -69,7 +69,7 @@ describe('CapLevelController', function () { const actual = CapLevelController.getMaxLevelByMediaSize( undefined, 5000, - 5000 + 5000, ); expect(expected).to.equal(actual); }); @@ -184,7 +184,7 @@ describe('CapLevelController', function () { it('immediately caps and sets a timer for monitoring size size', function () { const detectPlayerSizeSpy = sinon.spy( capLevelController, - 'detectPlayerSize' + 'detectPlayerSize', ); capLevelController.startCapping(); @@ -198,7 +198,7 @@ describe('CapLevelController', function () { capLevelController.stopCapping(); expect(capLevelController.autoLevelCapping).to.equal( - Number.POSITIVE_INFINITY + Number.POSITIVE_INFINITY, ); expect(capLevelController.restrictedLevels).to.be.empty; expect(capLevelController.firstLevel).to.equal(-1); @@ -210,7 +210,7 @@ describe('CapLevelController', function () { expect(capLevelController.restrictedLevels).to.be.empty; expect(capLevelController.timer).to.not.exist; expect(capLevelController.autoLevelCapping).to.equal( - Number.POSITIVE_INFINITY + Number.POSITIVE_INFINITY, ); }); diff --git a/tests/unit/controller/cmcd-controller.ts b/tests/unit/controller/cmcd-controller.ts index e55372e41..fa4d29c53 100644 --- a/tests/unit/controller/cmcd-controller.ts +++ b/tests/unit/controller/cmcd-controller.ts @@ -51,7 +51,7 @@ describe('CMCDController', function () { it('appends with ?', function () { const result = CMCDController.appendQueryToUri( 'http://test.com', - 'CMCD=d%3D6067' + 'CMCD=d%3D6067', ); expect(result).to.equal('http://test.com?CMCD=d%3D6067'); }); @@ -59,7 +59,7 @@ describe('CMCDController', function () { it('appends with &', function () { const result = CMCDController.appendQueryToUri( 'http://test.com?testing=123', - 'CMCD=d%3D6067' + 'CMCD=d%3D6067', ); expect(result).to.equal('http://test.com?testing=123&CMCD=d%3D6067'); }); diff --git a/tests/unit/controller/content-steering-controller.ts b/tests/unit/controller/content-steering-controller.ts index f901db81f..23d44946f 100644 --- a/tests/unit/controller/content-steering-controller.ts +++ b/tests/unit/controller/content-steering-controller.ts @@ -71,7 +71,7 @@ describe('ContentSteeringController', function () { loader: MockXhr, }); contentSteeringController = new ContentSteeringController( - hls as any + hls as any, ) as unknown as ConentSteeringControllerTestable; // @ts-ignore sandbox.stub(MediaSource, 'isTypeSupported').returns(true); @@ -105,7 +105,7 @@ describe('ContentSteeringController', function () { }, }); expect(contentSteeringController.uri).to.equal( - 'http://example.com/manifest.json' + 'http://example.com/manifest.json', ); expect(contentSteeringController.pathwayId).to.equal('pathway-2'); }); @@ -159,7 +159,7 @@ describe('ContentSteeringController', function () { { url: 'http://example.com/manifest.json?_HLS_pathway=pathway-2&_HLS_throughput=500000', }, - JSON.stringify(contentSteeringController.loader.context) + JSON.stringify(contentSteeringController.loader.context), ); }); @@ -171,7 +171,7 @@ describe('ContentSteeringController', function () { }, }); expect(contentSteeringController.uri).to.equal( - 'http://example.com/manifest.json' + 'http://example.com/manifest.json', ); expect(contentSteeringController.updated).to.equal(0); expect(contentSteeringController.timeToLoad).to.equal(300); @@ -181,15 +181,15 @@ describe('ContentSteeringController', function () { TTL: 100, 'RELOAD-URI': 'http://beta.example2.com/manifest.json', }, - contentSteeringController + contentSteeringController, ); expect(contentSteeringController.uri, 'updates the uri').to.equal( - 'http://beta.example2.com/manifest.json' + 'http://beta.example2.com/manifest.json', ); expect(contentSteeringController.updated).to.be.gt(0); expect( contentSteeringController.timeToLoad, - 'updates the timeToLoad' + 'updates the timeToLoad', ).to.equal(100); expect(contentSteeringController.reloadTimer).to.be.gt(-1); }); @@ -205,12 +205,12 @@ describe('ContentSteeringController', function () { beforeEach(function () { parsedMultivariant = M3U8Parser.parseMasterPlaylist( multivariantPlaylistWithPathways, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); const parsedMediaOptions = M3U8Parser.parseMasterPlaylistMedia( multivariantPlaylistWithPathways, 'http://example.com/main.m3u8', - parsedMultivariant + parsedMultivariant, ); const manifestLoadedData = { contentSteering: parsedMultivariant.contentSteering, @@ -220,7 +220,7 @@ describe('ContentSteeringController', function () { }; levelController = hls.levelController = new LevelController( hls as any, - contentSteeringController as any + contentSteeringController as any, ); audioTrackController = hls.audioTrackController = new AudioTrackController(hls as any); @@ -229,11 +229,11 @@ describe('ContentSteeringController', function () { hls.nextAutoLevel = 0; contentSteeringController.onManifestLoaded( Events.MANIFEST_LOADED, - manifestLoadedData + manifestLoadedData, ); levelController.onManifestLoaded( Events.MANIFEST_LOADED, - manifestLoadedData + manifestLoadedData, ); const { payload } = hls.getEventData(0) as { name: string; @@ -255,7 +255,7 @@ describe('ContentSteeringController', function () { expect(manifestParsedData.firstLevel).to.equal(0); expect(manifestParsedData.levels[0].pathwayId).to.equal('Bar'); expect(levelController.levels, 'LevelController levels').to.have.lengthOf( - 10 + 10, ); }); @@ -265,7 +265,7 @@ describe('ContentSteeringController', function () { { 'PATHWAY-PRIORITY': ['Baz', 'Foo', 'Bar'], }, - contentSteeringController + contentSteeringController, ); expect(hls.trigger.callCount, 'events triggered').to.equal(7); expect(hls.getEventData(0).name).to.equal(Events.MANIFEST_PARSED); @@ -275,12 +275,12 @@ describe('ContentSteeringController', function () { .that.has.lengthOf(6, 'MANIFEST_PARSED audioTracks'); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -306,22 +306,22 @@ describe('ContentSteeringController', function () { expect(hls.getEventData(5).name).to.equal(Events.AUDIO_TRACK_SWITCHING); expect(hls.getEventData(6).name).to.equal(Events.SUBTITLE_TRACKS_UPDATED); expect(levelController.levels, 'LevelController levels').to.have.lengthOf( - 10 + 10, ); expect(levelController.levels[0].uri).to.equal( - 'http://www.baz.com/tier6.m3u8' + 'http://www.baz.com/tier6.m3u8', ); expect( contentSteeringController.levels, - 'Content Steering variants' + 'Content Steering variants', ).to.have.lengthOf(30); expect( contentSteeringController.audioTracks, - 'Content Steering audio tracks' + 'Content Steering audio tracks', ).to.have.lengthOf(6); expect( contentSteeringController.subtitleTracks, - 'Content Steering subtitle tracks' + 'Content Steering subtitle tracks', ).to.have.lengthOf(6); }); @@ -329,7 +329,7 @@ describe('ContentSteeringController', function () { it('clones the Base Pathway', function () { expect( contentSteeringController.levels, - 'Content Steering variants' + 'Content Steering variants', ).to.have.lengthOf(30); loadSteeringManifest( { @@ -344,28 +344,28 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect( contentSteeringController.levels, - 'Content Steering variants' + 'Content Steering variants', ).to.have.lengthOf(40); expect( contentSteeringController.audioTracks, - 'Content Steering audio tracks' + 'Content Steering audio tracks', ).to.have.lengthOf(8); expect( contentSteeringController.subtitleTracks, - 'Content Steering subtitle tracks' + 'Content Steering subtitle tracks', ).to.have.lengthOf(8); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -390,15 +390,15 @@ describe('ContentSteeringController', function () { expect(hls.getEventData(4).name).to.equal(Events.AUDIO_TRACKS_UPDATED); expect(hls.getEventData(5).name).to.equal(Events.AUDIO_TRACK_SWITCHING); expect(hls.getEventData(6).name).to.equal( - Events.SUBTITLE_TRACKS_UPDATED + Events.SUBTITLE_TRACKS_UPDATED, ); expect( levelController.levels, - 'LevelController levels' + 'LevelController levels', ).to.have.lengthOf(10); expect(levelController.levels[0].uri).to.equal( - 'http://www.buzz.com/tier6.m3u8' + 'http://www.buzz.com/tier6.m3u8', ); }); @@ -407,7 +407,7 @@ describe('ContentSteeringController', function () { level.url[0] += '?foo=bar'; }); expect(contentSteeringController.levels?.[0].uri).to.equal( - 'http://www.foo.com/tier6.m3u8?foo=bar' + 'http://www.foo.com/tier6.m3u8?foo=bar', ); loadSteeringManifest( { @@ -426,16 +426,16 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -446,7 +446,7 @@ describe('ContentSteeringController', function () { .that.has.lengthOf(10, 'LEVELS_UPDATED levels'); expect(eventData.levels[0].pathwayId).to.equal('Buzz'); expect(eventData.levels[0].uri).to.equal( - 'http://www.foo.com/tier6.m3u8?foo=baz&app=player&beta=test' + 'http://www.foo.com/tier6.m3u8?foo=baz&app=player&beta=test', ); }); @@ -468,16 +468,16 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -489,19 +489,19 @@ describe('ContentSteeringController', function () { expect(eventData.levels[0].pathwayId).to.equal('Buzz'); expect(eventData.levels[0].attrs['STABLE-VARIANT-ID']).to.equal('foo1'); expect(eventData.levels[0].uri).to.equal( - 'http://www.buzz.com/1.m3u8?fallback=true' + 'http://www.buzz.com/1.m3u8?fallback=true', ); expect(eventData.levels[1].attrs['STABLE-VARIANT-ID']).to.equal('foo2'); expect(eventData.levels[1].uri).to.equal( - 'http://www.buzz.com/2.m3u8?fallback=true' + 'http://www.buzz.com/2.m3u8?fallback=true', ); expect(eventData.levels[2].attrs['STABLE-VARIANT-ID']).to.equal('foo3'); expect(eventData.levels[2].uri).to.equal( - 'http://www.buzz.com/3.m3u8?fallback=true' + 'http://www.buzz.com/3.m3u8?fallback=true', ); expect(eventData.levels[3].attrs['STABLE-VARIANT-ID']).to.equal('foo4'); expect(eventData.levels[3].uri).to.equal( - 'http://www.foo.com/tier10.m3u8' + 'http://www.foo.com/tier10.m3u8', ); }); @@ -526,35 +526,35 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect( audioTrackController.tracks, - 'AudioTrackController tracks' + 'AudioTrackController tracks', ).to.have.lengthOf(8); expect(audioTrackController.tracks[6].attrs['PATHWAY-ID']).to.equal( - 'Buzz' + 'Buzz', ); expect( - audioTrackController.tracks[6].attrs['STABLE-RENDITION-ID'] + audioTrackController.tracks[6].attrs['STABLE-RENDITION-ID'], ).to.equal('audio-foo1'); expect(audioTrackController.tracks[6].groupId).to.equal( - 'AAC-foo_clone_Buzz' + 'AAC-foo_clone_Buzz', ); expect(audioTrackController.tracks[6].url).to.equal( - 'http://z.buzz.com/audio_aac.m3u8?fallback=true' + 'http://z.buzz.com/audio_aac.m3u8?fallback=true', ); expect(audioTrackController.tracks[7].attrs['PATHWAY-ID']).to.equal( - 'Buzz' + 'Buzz', ); expect( - audioTrackController.tracks[7].attrs['STABLE-RENDITION-ID'] + audioTrackController.tracks[7].attrs['STABLE-RENDITION-ID'], ).to.equal('audio-foo2'); expect(audioTrackController.tracks[7].groupId).to.equal( - 'EC3-foo_clone_Buzz' + 'EC3-foo_clone_Buzz', ); expect(audioTrackController.tracks[7].url).to.equal( - 'http://z.buzz.com/audio_ec3.m3u8?fallback=true' + 'http://z.buzz.com/audio_ec3.m3u8?fallback=true', ); expect(hls.getEventData(4).name).to.equal(Events.AUDIO_TRACKS_UPDATED); @@ -565,18 +565,18 @@ describe('ContentSteeringController', function () { .that.has.lengthOf(1, 'AUDIO_TRACKS_UPDATED audioTracks'); expect(eventData.audioTracks[0].attrs['PATHWAY-ID']).to.equal('Buzz'); expect(eventData.audioTracks[0].attrs['STABLE-RENDITION-ID']).to.equal( - 'audio-foo1' + 'audio-foo1', ); expect(eventData.audioTracks[0].url).to.equal( - 'http://z.buzz.com/audio_aac.m3u8?fallback=true' + 'http://z.buzz.com/audio_aac.m3u8?fallback=true', ); expect( subtitleTrackController.tracks, - 'SubtitleTrackController tracks' + 'SubtitleTrackController tracks', ).to.have.lengthOf(8); expect(hls.getEventData(6).name).to.equal( - Events.SUBTITLE_TRACKS_UPDATED + Events.SUBTITLE_TRACKS_UPDATED, ); const subtitleTracksEvent = hls.getEventData(6); const subsEventData = @@ -585,22 +585,22 @@ describe('ContentSteeringController', function () { .to.have.property('subtitleTracks') .that.has.lengthOf(2, 'SUBTITLE_TRACKS_UPDATED subtitleTracks'); expect(subsEventData.subtitleTracks[0].attrs['PATHWAY-ID']).to.equal( - 'Buzz' + 'Buzz', ); expect( - subsEventData.subtitleTracks[0].attrs['STABLE-RENDITION-ID'] + subsEventData.subtitleTracks[0].attrs['STABLE-RENDITION-ID'], ).to.equal('subs-foo1'); expect(subsEventData.subtitleTracks[0].url).to.equal( - 'http://z.buzz.com/subs-en.m3u8?fallback=true' + 'http://z.buzz.com/subs-en.m3u8?fallback=true', ); expect(subsEventData.subtitleTracks[1].attrs['PATHWAY-ID']).to.equal( - 'Buzz' + 'Buzz', ); expect( - subsEventData.subtitleTracks[1].attrs['STABLE-RENDITION-ID'] + subsEventData.subtitleTracks[1].attrs['STABLE-RENDITION-ID'], ).to.equal('subs-foo2'); expect(subsEventData.subtitleTracks[1].url).to.equal( - 'http://z.buzz.com/subs-it.m3u8?fallback=true' + 'http://z.buzz.com/subs-it.m3u8?fallback=true', ); }); @@ -631,16 +631,16 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -651,11 +651,11 @@ describe('ContentSteeringController', function () { const eventData = updatedEvent.payload as LevelsUpdatedData; expect(eventData.levels[0].pathwayId).to.equal('Bear'); expect(eventData.levels[0].uri).to.equal( - 'http://www.bear.com/tier6.m3u8?cloned=buzz' + 'http://www.bear.com/tier6.m3u8?cloned=buzz', ); expect(eventData.levels[1].attrs['STABLE-VARIANT-ID']).to.equal('foo2'); expect(eventData.levels[1].uri).to.equal( - 'http://www.bear.com/2.m3u8?fallback=true&cloned=buzz' + 'http://www.bear.com/2.m3u8?fallback=true&cloned=buzz', ); expect(hls.getEventData(4).name).to.equal(Events.AUDIO_TRACKS_UPDATED); @@ -663,23 +663,23 @@ describe('ContentSteeringController', function () { const audioEventData = audioTracksEvent.payload as AudioTracksUpdatedData; expect(audioEventData.audioTracks[0].attrs['PATHWAY-ID']).to.equal( - 'Bear' + 'Bear', ); expect(audioEventData.audioTracks[0].url).to.equal( - 'http://www.bear.com/audio_aac.m3u8?cloned=buzz' + 'http://www.bear.com/audio_aac.m3u8?cloned=buzz', ); expect(hls.getEventData(6).name).to.equal( - Events.SUBTITLE_TRACKS_UPDATED + Events.SUBTITLE_TRACKS_UPDATED, ); const subtitleTracksEvent = hls.getEventData(6); const subsEventData = subtitleTracksEvent.payload as SubtitleTracksUpdatedData; expect(subsEventData.subtitleTracks[0].attrs['PATHWAY-ID']).to.equal( - 'Bear' + 'Bear', ); expect(subsEventData.subtitleTracks[0].url).to.equal( - 'http://www.bear.com/subs-en.m3u8?cloned=buzz' + 'http://www.bear.com/subs-en.m3u8?cloned=buzz', ); }); @@ -697,16 +697,16 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -714,7 +714,7 @@ describe('ContentSteeringController', function () { const eventData = updatedEvent.payload as LevelsUpdatedData; expect(eventData.levels[0].pathwayId).to.equal('Buzz'); expect(eventData.levels[0].uri).to.equal( - 'http://www.foo.com/tier6.m3u8' + 'http://www.foo.com/tier6.m3u8', ); }); @@ -735,16 +735,16 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -752,7 +752,7 @@ describe('ContentSteeringController', function () { const eventData = updatedEvent.payload as LevelsUpdatedData; expect(eventData.levels[0].pathwayId).to.equal('Buzz'); expect(eventData.levels[0].uri).to.equal( - 'http://www.foo.com/tier6.m3u8?not-empty=ok' + 'http://www.foo.com/tier6.m3u8?not-empty=ok', ); }); @@ -770,20 +770,20 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect( contentSteeringController.levels, - 'Content Steering variants' + 'Content Steering variants', ).to.have.lengthOf(30); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -791,7 +791,7 @@ describe('ContentSteeringController', function () { const eventData = updatedEvent.payload as LevelsUpdatedData; expect(eventData.levels[0].pathwayId).to.equal('Foo'); expect(eventData.levels[0].uri).to.equal( - 'http://www.foo.com/tier6.m3u8' + 'http://www.foo.com/tier6.m3u8', ); }); @@ -823,7 +823,7 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); loadSteeringManifest( { @@ -838,20 +838,20 @@ describe('ContentSteeringController', function () { }, ], }, - contentSteeringController + contentSteeringController, ); expect( contentSteeringController.levels, - 'Content Steering variants' + 'Content Steering variants', ).to.have.lengthOf(40); expect(hls.getEventData(1).name).to.equal( - Events.STEERING_MANIFEST_LOADED + Events.STEERING_MANIFEST_LOADED, ); const steeringManifestLoadedEvent = hls.getEventData(1); expect(steeringManifestLoadedEvent.payload).to.have.property('url'); expect(steeringManifestLoadedEvent.payload).to.have.property( - 'steeringManifest' + 'steeringManifest', ); expect(hls.getEventData(2).name).to.equal(Events.LEVELS_UPDATED); @@ -859,7 +859,7 @@ describe('ContentSteeringController', function () { const eventData = updatedEvent.payload as LevelsUpdatedData; expect(eventData.levels[0].pathwayId).to.equal('Buzz'); expect(eventData.levels[0].uri).to.equal( - 'http://www.buzz-1.com/tier6.m3u8' + 'http://www.buzz-1.com/tier6.m3u8', ); }); }); @@ -868,7 +868,7 @@ describe('ContentSteeringController', function () { function loadSteeringManifest( partialManifest: Partial, - steering: ConentSteeringControllerTestable + steering: ConentSteeringControllerTestable, ) { steering.startLoad(); const response: LoaderResponse = { @@ -883,6 +883,6 @@ function loadSteeringManifest( response, new LoadStats(), steering.loader.context as any, - null + null, ); } diff --git a/tests/unit/controller/eme-controller.ts b/tests/unit/controller/eme-controller.ts index 327a08afa..eb78ebf9a 100644 --- a/tests/unit/controller/eme-controller.ts +++ b/tests/unit/controller/eme-controller.ts @@ -25,7 +25,7 @@ type EMEControllerTestable = Omit< mediaKeySessions: MediaKeySessionContext[]; onMediaAttached: ( event: Events.MEDIA_ATTACHED, - data: MediaAttachedData + data: MediaAttachedData, ) => void; onMediaDetached: () => void; }; @@ -37,7 +37,7 @@ class MediaMock extends EventEmitter { constructor() { super(); this.setMediaKeys = sinon.spy((mediaKeys: MediaKeys | null) => - Promise.resolve() + Promise.resolve(), ); this.addEventListener = this.addListener.bind(this); this.removeEventListener = this.removeListener.bind(this); @@ -100,7 +100,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -116,7 +116,7 @@ describe('EMEController', function () { }); sinonFakeXMLHttpRequestStatic.onCreate = ( - xhr: sinon.SinonFakeXMLHttpRequest + xhr: sinon.SinonFakeXMLHttpRequest, ) => { self.setTimeout(() => { (xhr as any).response = new Uint8Array(); @@ -181,7 +181,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -201,7 +201,7 @@ describe('EMEController', function () { }); sinonFakeXMLHttpRequestStatic.onCreate = ( - xhr: sinon.SinonFakeXMLHttpRequest + xhr: sinon.SinonFakeXMLHttpRequest, ) => { self.setTimeout(() => { (xhr as any).response = new Uint8Array(); @@ -265,7 +265,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -309,7 +309,7 @@ describe('EMEController', function () { .finally(() => { expect(emeController.hls.trigger).callCount(1); expect(emeController.hls.trigger.args[0][1].details).to.equal( - ErrorDetails.KEY_SYSTEM_NO_SESSION + ErrorDetails.KEY_SYSTEM_NO_SESSION, ); }); }); @@ -342,7 +342,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -359,7 +359,7 @@ describe('EMEController', function () { let xhrInstance; sinonFakeXMLHttpRequestStatic.onCreate = ( - xhr: sinon.SinonFakeXMLHttpRequest + xhr: sinon.SinonFakeXMLHttpRequest, ) => { xhrInstance = xhr; Promise.resolve().then(() => { @@ -386,7 +386,9 @@ describe('EMEController', function () { } as any); expect( - emeController.keyIdToKeySessionPromise['00000000000000000000000000000000'] + emeController.keyIdToKeySessionPromise[ + '00000000000000000000000000000000' + ], ).to.be.a('Promise'); if ( !emeController.keyIdToKeySessionPromise[ @@ -400,14 +402,14 @@ describe('EMEController', function () { ].finally(() => { expect(mediaKeysSetServerCertificateSpy).to.have.been.calledOnce; expect(mediaKeysSetServerCertificateSpy).to.have.been.calledWith( - xhrInstance.response + xhrInstance.response, ); }); }); it('should fetch the server certificate and trigger update failed error', function () { const mediaKeysSetServerCertificateSpy = sinon.spy(() => - Promise.reject(new Error('Failed')) + Promise.reject(new Error('Failed')), ); const reqMediaKsAccessSpy = sinon.spy(function () { @@ -424,7 +426,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -441,7 +443,7 @@ describe('EMEController', function () { let xhrInstance; sinonFakeXMLHttpRequestStatic.onCreate = ( - xhr: sinon.SinonFakeXMLHttpRequest + xhr: sinon.SinonFakeXMLHttpRequest, ) => { xhrInstance = xhr; self.setTimeout(() => { @@ -466,7 +468,9 @@ describe('EMEController', function () { } as any); expect( - emeController.keyIdToKeySessionPromise['00000000000000000000000000000000'] + emeController.keyIdToKeySessionPromise[ + '00000000000000000000000000000000' + ], ).to.be.a('Promise'); if ( !emeController.keyIdToKeySessionPromise[ @@ -482,12 +486,12 @@ describe('EMEController', function () { .finally(() => { expect(mediaKeysSetServerCertificateSpy).to.have.been.calledOnce; expect((mediaKeysSetServerCertificateSpy.args[0] as any)[0]).to.equal( - xhrInstance.response + xhrInstance.response, ); expect(emeController.hls.trigger).to.have.been.calledOnce; expect(emeController.hls.trigger.args[0][1].details).to.equal( - ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED + ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED, ); }); }); @@ -506,7 +510,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); @@ -522,7 +526,7 @@ describe('EMEController', function () { }); sinonFakeXMLHttpRequestStatic.onCreate = ( - xhr: sinon.SinonFakeXMLHttpRequest + xhr: sinon.SinonFakeXMLHttpRequest, ) => { self.setTimeout(() => { xhr.status = 400; @@ -546,7 +550,9 @@ describe('EMEController', function () { } as any); expect( - emeController.keyIdToKeySessionPromise['00000000000000000000000000000000'] + emeController.keyIdToKeySessionPromise[ + '00000000000000000000000000000000' + ], ).to.be.a('Promise'); if ( !emeController.keyIdToKeySessionPromise[ @@ -562,7 +568,7 @@ describe('EMEController', function () { .finally(() => { expect(emeController.hls.trigger).to.have.been.calledOnce; expect(emeController.hls.trigger.args[0][1].details).to.equal( - ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED + ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED, ); }); }); @@ -582,7 +588,7 @@ describe('EMEController', function () { update: () => Promise.resolve(), keyStatuses: new Map(), }), - }) + }), ), }); }); diff --git a/tests/unit/controller/error-controller.ts b/tests/unit/controller/error-controller.ts index b327ad319..1bd5a7988 100644 --- a/tests/unit/controller/error-controller.ts +++ b/tests/unit/controller/error-controller.ts @@ -51,17 +51,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_LOADED, (event, data) => reject( new Error( - 'Manifest Loaded should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Loaded should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_PARSING_ERROR, - 'no EXTM3U delimiter' - ) + 'no EXTM3U delimiter', + ), ); }); @@ -73,17 +73,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_LOADED, (event, data) => reject( new Error( - 'Manifest Loaded should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Loaded should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_PARSING_ERROR, - 'no levels found in manifest' - ) + 'no levels found in manifest', + ), ); }); @@ -95,17 +95,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_LOADED, (event, data) => reject( new Error( - 'Manifest Loaded should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Loaded should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_PARSING_ERROR, - 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "foobar"' - ) + 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "foobar"', + ), ); }); @@ -117,17 +117,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_PARSED, (event, data) => reject( new Error( - 'Manifest Parsed should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Parsed should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR, - 'no level with compatible codecs found in manifest' - ) + 'no level with compatible codecs found in manifest', + ), ); }); @@ -140,17 +140,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_PARSED, (event, data) => reject( new Error( - 'Manifest Parsed should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Parsed should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_LOAD_ERROR, - 'A network error (status 400) occurred while loading manifest' - ) + 'A network error (status 400) occurred while loading manifest', + ), ); }); @@ -163,9 +163,9 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_PARSED, (event, data) => reject( new Error( - 'Manifest Parsed should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Parsed should not be triggered when manifest parsing fails', + ), + ), ); server.respond(); timers.tick(1000); @@ -187,8 +187,8 @@ describe('ErrorController Integration Tests', function () { expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_LOAD_ERROR, - 'A network error (status 501) occurred while loading manifest' - ) + 'A network error (status 501) occurred while loading manifest', + ), ); }); @@ -200,9 +200,9 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.MANIFEST_PARSED, (event, data) => reject( new Error( - 'Manifest Parsed should not be triggered when manifest parsing fails' - ) - ) + 'Manifest Parsed should not be triggered when manifest parsing fails', + ), + ), ); // tick 3 times to trigger 2 retries and then an error timers.tick(hls.config.manifestLoadPolicy.default.maxLoadTimeMs + 1); @@ -212,8 +212,8 @@ describe('ErrorController Integration Tests', function () { expectFatalErrorEventToStopPlayer( hls, ErrorDetails.MANIFEST_LOAD_TIMEOUT, - 'A network timeout occurred while loading manifest' - ) + 'A network timeout occurred while loading manifest', + ), ); }); }); @@ -227,17 +227,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.LEVEL_LOADED, () => reject( new Error( - 'Level Loaded should not be triggered when playlist parsing fails' - ) - ) + 'Level Loaded should not be triggered when playlist parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.LEVEL_PARSING_ERROR, - 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "foobar"' - ) + 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "foobar"', + ), ); }); @@ -249,17 +249,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.LEVEL_LOADED, () => reject( new Error( - 'Level Loaded should not be triggered when playlist parsing fails' - ) - ) + 'Level Loaded should not be triggered when playlist parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.LEVEL_PARSING_ERROR, - 'Missing Target Duration' - ) + 'Missing Target Duration', + ), ); }); @@ -271,17 +271,17 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.LEVEL_LOADED, () => reject( new Error( - 'Level Loaded should not be triggered when playlist parsing fails' - ) - ) + 'Level Loaded should not be triggered when playlist parsing fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.LEVEL_EMPTY_ERROR, - 'No Segments found in Playlist' - ) + 'No Segments found in Playlist', + ), ); }); @@ -292,9 +292,9 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.LEVEL_LOADED, () => reject( new Error( - 'Level Loaded should not be triggered when playlist parsing fails' - ) - ) + 'Level Loaded should not be triggered when playlist parsing fails', + ), + ), ); server.respond(); }).then((data: ErrorData) => { @@ -302,13 +302,13 @@ describe('ErrorController Integration Tests', function () { expect(data.fatal).to.equal(false, 'Error should not be fatal'); expect(data.error.message).to.equal( 'No Segments found in Playlist', - data.error.message + data.error.message, ); hls.stopLoad.should.have.been.calledOnce; hls.trigger.should.not.have.been.calledWith(Events.LEVEL_LOADED); server.respondWith( 'noSegmentsLive.m3u8', - testResponses['oneSegmentLive.m3u8'] + testResponses['oneSegmentLive.m3u8'], ); timers.tick(6000); server.respond(); @@ -335,7 +335,7 @@ describe('ErrorController Integration Tests', function () { expect(data.fatal).to.equal(false, 'Error should not be fatal'); expect(data.error.message).to.equal( 'Missing Target Duration', - data.error.message + data.error.message, ); hls.stopLoad.should.have.been.calledOnce; timers.tick(100); @@ -345,7 +345,7 @@ describe('ErrorController Integration Tests', function () { hls.trigger.should.have.been.calledWith(Events.LEVEL_LOADED); expect(hls.currentLevel).to.not.equal( errorIndex, - 'Should not be on errored level' + 'Should not be on errored level', ); }); }); @@ -366,13 +366,13 @@ describe('ErrorController Integration Tests', function () { expect(data.fatal).to.equal(false, 'Error should not be fatal'); expect(data.error.message).to.equal( 'A network error (status 400) occurred while loading level: 2 id: 0', - data.error.message + data.error.message, ); hls.stopLoad.should.have.been.calledOnce; hls.trigger.should.have.been.calledWith(Events.LEVEL_LOADED); expect(hls.currentLevel).to.not.equal( errorIndex, - 'Should not be on errored level' + 'Should not be on errored level', ); }); }); @@ -392,14 +392,14 @@ describe('ErrorController Integration Tests', function () { expect(data.fatal).to.equal(false, 'Error should not be fatal'); expect(data.error.message).to.equal( 'A network timeout occurred while loading level: 2 id: 0', - data.error.message + data.error.message, ); server.respond(); hls.stopLoad.should.have.been.calledOnce; hls.trigger.should.have.been.calledWith(Events.LEVEL_LOADED); expect(hls.currentLevel).to.not.equal( errorIndex, - 'Should not be on errored level' + 'Should not be on errored level', ); }); }); @@ -421,16 +421,16 @@ describe('ErrorController Integration Tests', function () { resolve(data); } else { timers.tick( - hls.config.fragLoadPolicy.default.errorRetry!.maxRetryDelayMs + hls.config.fragLoadPolicy.default.errorRetry!.maxRetryDelayMs, ); } }); hls.on(Events.FRAG_LOADED, (event, data) => reject( new Error( - 'Frag Loaded should not be triggered when frag loading fails' - ) - ) + 'Frag Loaded should not be triggered when frag loading fails', + ), + ), ); server.respond(); }).then((errorData: ErrorData) => { @@ -438,7 +438,7 @@ describe('ErrorController Integration Tests', function () { const finalAssertion = expectFatalErrorEventToStopPlayer( hls, ErrorDetails.FRAG_LOAD_ERROR, - 'HTTP Error 500 Internal Server Error' + 'HTTP Error 500 Internal Server Error', ); finalAssertion(errorData); }); @@ -468,9 +468,9 @@ describe('ErrorController Integration Tests', function () { hls.on(Events.FRAG_LOADED, (event, data) => reject( new Error( - 'Frag Loaded should not be triggered when frag loading fails' - ) - ) + 'Frag Loaded should not be triggered when frag loading fails', + ), + ), ); server.respond(); }).then((errorData: ErrorData) => { @@ -478,7 +478,7 @@ describe('ErrorController Integration Tests', function () { const finalAssertion = expectFatalErrorEventToStopPlayer( hls, ErrorDetails.FRAG_LOAD_TIMEOUT, - 'Timeout after 10000ms' + 'Timeout after 10000ms', ); finalAssertion(errorData); }); @@ -494,7 +494,7 @@ describe('ErrorController Integration Tests', function () { #EXT-X-MAP:URI="init.mp4" #EXTINF:6 segment.mp4 -#EXT-X-ENDLIST` +#EXT-X-ENDLIST`, ); server.respondWith('aes-128-init-segment.m3u8/bad.key', [ 200, @@ -527,17 +527,17 @@ segment.mp4 hls.on(Events.FRAG_DECRYPTED, (event, data) => reject( new Error( - 'Frag Decrypted should not be triggered when frag decryption fails' - ) - ) + 'Frag Decrypted should not be triggered when frag decryption fails', + ), + ), ); server.respond(); }).then( expectFatalErrorEventToStopPlayer( hls, ErrorDetails.FRAG_DECRYPT_ERROR, - 'Offset is outside the bounds of the DataView' - ) + 'Offset is outside the bounds of the DataView', + ), ); }); }); @@ -562,8 +562,8 @@ segment.mp4 } else if (data.fatal) { reject( new Error( - `Error fatal before retries exhausted: "${data.error.message}"` - ) + `Error fatal before retries exhausted: "${data.error.message}"`, + ), ); } else { timers.tick(8000); @@ -574,8 +574,8 @@ segment.mp4 expectFatalErrorEventToStopPlayer( hls, ErrorDetails.FRAG_PARSING_ERROR, - 'Failed to find demuxer by probing fragment data' - ) + 'Failed to find demuxer by probing fragment data', + ), ); }); @@ -609,7 +609,7 @@ segment.mp4 hls.trigger.should.have.been.calledWith(Events.LEVEL_LOADED); expect(hls.currentLevel).to.not.equal( errorIndex, - 'Should not be on errored level' + 'Should not be on errored level', ); }); }); @@ -639,7 +639,7 @@ segment.mp4 timers.tick(5000); }).then((data: ErrorData) => { expect(data.details).to.equal( - ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED + ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED, ); expect(data.fatal).to.equal(false, 'Error should not be fatal'); expect(data.error.message).to.equal('HDCP level output restricted'); @@ -648,7 +648,7 @@ segment.mp4 expect(hls.maxHdcpLevel).to.equal('TYPE-0'); expect(hls.currentLevel).to.not.equal( errorIndex, - 'Should not be on errored level' + 'Should not be on errored level', ); }); }); @@ -665,26 +665,26 @@ segment.mp4 /http:\/\/www\.(foo|bar|baz)\.com\/tier.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'video-segment.mp4' - ) + 'video-segment.mp4', + ), ); server.respondWith( /http:\/\/www\.(foo|bar|baz)\.com\/audio.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'audio-segment.mp4' - ) + 'audio-segment.mp4', + ), ); server.respondWith( /http:\/\/www\.(foo|bar|baz)\.com\/subs.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'subs-segment.mp4' - ) + 'subs-segment.mp4', + ), ); server.respondWith( /http:\/\/www\.(foo|bar)\.com\/(video|audio)-segment.mp4/, - [500, {}, new ArrayBuffer(0)] + [500, {}, new ArrayBuffer(0)], ); server.respondWith(/http:\/\/www\.baz\.com\/audio-segment.mp4/, [ 200, @@ -707,7 +707,7 @@ segment.mp4 hls.on(Events.AUDIO_TRACK_LOADING, loadingEventCallback(server, timers)); hls.on( Events.SUBTITLE_TRACK_LOADING, - loadingEventCallback(server, timers) + loadingEventCallback(server, timers), ); hls.on(Events.FRAG_LOADING, loadingEventCallback(server, timers)); hls.on(Events.ERROR, (event, data) => { @@ -725,7 +725,7 @@ segment.mp4 .then((data: LevelSwitchingData) => { expect( errors, - 'fragment errors after yeilding to first error event' + 'fragment errors after yeilding to first error event', ).to.have.lengthOf(2); expect(hls.levels[0].uri).to.equal('http://www.bar.com/tier6.m3u8'); return new Promise((resolve, reject) => { @@ -739,7 +739,7 @@ segment.mp4 .then((data: LevelSwitchingData) => { expect( errors, - 'fragment errors after yeilding to second error event' + 'fragment errors after yeilding to second error event', ).to.have.lengthOf(12); expect(hls.levels[0].uri).to.equal('http://www.baz.com/tier6.m3u8'); return new Promise((resolve, reject) => { @@ -748,7 +748,7 @@ segment.mp4 }); hls.on(Events.ERROR, (event, data) => { reject( - new Error(`Unexpected error after fallback: ${data.error}`) + new Error(`Unexpected error after fallback: ${data.error}`), ); }); }); @@ -756,10 +756,10 @@ segment.mp4 .then((data: FragLoadedData) => { expect(errors[errors.length - 1].fatal).to.equal( false, - 'Error should not be fatal' + 'Error should not be fatal', ); expect(data.frag.url).to.equal( - 'http://www.baz.com/audio-segment.mp4' + 'http://www.baz.com/audio-segment.mp4', ); }); }); @@ -774,22 +774,22 @@ segment.mp4 /http:\/\/www\.(foo|bar|baz)\.com\/tier.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'video-segment.mp4' - ) + 'video-segment.mp4', + ), ); server.respondWith( /http:\/\/www\.(foo|bar|baz)\.com\/audio.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'audio-segment.mp4' - ) + 'audio-segment.mp4', + ), ); server.respondWith( /http:\/\/www\.(foo|bar|baz)\.com\/subs.+\.m3u8/, testResponses['oneSegmentVod.m3u8'].replace( 'segment.mp4', - 'subs-segment.mp4' - ) + 'subs-segment.mp4', + ), ); server.respondWith(/http:\/\/www\.(foo|bar)\.com\/audio-segment.mp4/, [ 500, @@ -817,7 +817,7 @@ segment.mp4 hls.on(Events.AUDIO_TRACK_LOADING, loadingEventCallback(server, timers)); hls.on( Events.SUBTITLE_TRACK_LOADING, - loadingEventCallback(server, timers) + loadingEventCallback(server, timers), ); hls.on(Events.FRAG_LOADING, loadingEventCallback(server, timers)); hls.on(Events.ERROR, (event, data) => { @@ -835,7 +835,7 @@ segment.mp4 .then((data: LevelSwitchingData) => { expect( errors, - 'fragment errors after yeilding to first error event' + 'fragment errors after yeilding to first error event', ).to.have.lengthOf(2); expect(hls.levels[0].uri).to.equal('http://www.bar.com/tier6.m3u8'); return new Promise((resolve, reject) => { @@ -849,7 +849,7 @@ segment.mp4 .then((data: LevelSwitchingData) => { expect( errors, - 'fragment errors after yeilding to second error event' + 'fragment errors after yeilding to second error event', ).to.have.lengthOf(12); expect(hls.levels[0].uri).to.equal('http://www.baz.com/tier6.m3u8'); return new Promise((resolve, reject) => { @@ -864,10 +864,10 @@ segment.mp4 .then((data: FragLoadedData) => { expect(errors[errors.length - 1].fatal).to.equal( false, - 'Error should not be fatal' + 'Error should not be fatal', ); expect(data.frag.url).to.equal( - 'http://www.baz.com/audio-segment.mp4' + 'http://www.baz.com/audio-segment.mp4', ); }); }); @@ -953,15 +953,15 @@ function setupMockServerResponses(server: sinon.SinonFakeServer) { }); server.respondWith( /multivariantPlaylist.*\/low.m3u8/, - testResponses['oneSegmentVod.m3u8'] + testResponses['oneSegmentVod.m3u8'], ); server.respondWith( /multivariantPlaylist.*\/mid.m3u8/, - testResponses['oneSegmentVod.m3u8'] + testResponses['oneSegmentVod.m3u8'], ); server.respondWith( /multivariantPlaylist.*\/high.m3u8/, - testResponses['oneSegmentVod.m3u8'] + testResponses['oneSegmentVod.m3u8'], ); } @@ -976,7 +976,7 @@ function loadingEventCallback(server, timers) { function expectFatalErrorEventToStopPlayer( hls: Hls, withErrorDetails: ErrorDetails, - withErrorMessage: string + withErrorMessage: string, ) { return (data: ErrorData) => { expect(data.details).to.equal(withErrorDetails); @@ -992,7 +992,7 @@ function expectPlayerStopped(hlsPrivate: any) { // All stream-controllers are stopped if ('state' in controller) { expect(controller.state, `${controller.constructor.name}.state`).to.equal( - 'STOPPED' + 'STOPPED', ); } // All loaders controllers have destroyed their loaders diff --git a/tests/unit/controller/ewma-bandwidth-estimator.ts b/tests/unit/controller/ewma-bandwidth-estimator.ts index 1a8a014b5..038e0546b 100644 --- a/tests/unit/controller/ewma-bandwidth-estimator.ts +++ b/tests/unit/controller/ewma-bandwidth-estimator.ts @@ -31,12 +31,12 @@ describe('EwmaBandWidthEstimator', function () { bwEstimator.sample(4000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 1396480.1544736226, - 0.000000001 + 0.000000001, ); bwEstimator.sample(1000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 2056826.9489827948, - 0.000000001 + 0.000000001, ); }); @@ -48,12 +48,12 @@ describe('EwmaBandWidthEstimator', function () { bwEstimator.sample(4000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 1439580.319105247, - 0.000000001 + 0.000000001, ); bwEstimator.sample(1000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 2208342.324322311, - 0.000000001 + 0.000000001, ); }); @@ -66,17 +66,17 @@ describe('EwmaBandWidthEstimator', function () { bwEstimator.sample(4000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 1439580.319105247, - 0.000000001 + 0.000000001, ); bwEstimator.update(15, 4); expect(bwEstimator.getEstimate()).to.closeTo( 1878125.393685882, - 0.000000001 + 0.000000001, ); bwEstimator.sample(1000, 1000000); expect(bwEstimator.getEstimate()).to.closeTo( 2966543.443461984, - 0.000000001 + 0.000000001, ); }); diff --git a/tests/unit/controller/fragment-finders.js b/tests/unit/controller/fragment-finders.js index efc10774b..3d3b7960c 100644 --- a/tests/unit/controller/fragment-finders.js +++ b/tests/unit/controller/fragment-finders.js @@ -36,12 +36,12 @@ describe('Fragment finders', function () { fragPrevious, mockFragments, bufferEnd, - tolerance + tolerance, ); const resultSN = actual ? actual.sn : -1; expect(actual).to.equal( mockFragments[3], - 'Expected sn 3, found sn segment ' + resultSN + 'Expected sn 3, found sn segment ' + resultSN, ); expect(binarySearchSpy).to.have.not.been.called; }); @@ -51,13 +51,13 @@ describe('Fragment finders', function () { mockFragments[0], mockFragments, mockFragments[0].duration, - tolerance + tolerance, ); expect(actual).to.equal( mockFragments[1], `expected sn ${mockFragments[1].sn}, but got sn ${ actual ? actual.sn : null - }` + }`, ); expect(binarySearchSpy).to.have.not.been.called; }); @@ -88,13 +88,13 @@ describe('Fragment finders', function () { fragPrevious, fragments, bufferEnd, - tolerance + tolerance, ); expect(actual).to.equal( fragments[1], `expected sn ${fragments[1].sn}, but got sn ${ actual ? actual.sn : null - }` + }`, ); }); @@ -148,7 +148,7 @@ describe('Fragment finders', function () { fragPrevious, fragments, bufferEnd, - tolerance + tolerance, ); expect(actual).to.equal(null); }); @@ -232,7 +232,7 @@ describe('Fragment finders', function () { it('finds a fragment with endProgramDateTime greater than the reference PDT', function () { const foundFragment = findFragmentByPDT( mockFragments, - fragPrevious.endProgramDateTime + 1 + fragPrevious.endProgramDateTime + 1, ); expect(foundFragment).to.equal(mockFragments[2]); }); @@ -240,13 +240,13 @@ describe('Fragment finders', function () { it('returns null when the reference pdt is outside of the pdt range of the fragment array', function () { let foundFragment = findFragmentByPDT( mockFragments, - mockFragments[0].programDateTime - 1 + mockFragments[0].programDateTime - 1, ); expect(foundFragment).to.not.exist; foundFragment = findFragmentByPDT( mockFragments, - mockFragments[mockFragments.length - 1].endProgramDateTime + 1 + mockFragments[mockFragments.length - 1].endProgramDateTime + 1, ); expect(foundFragment).to.not.exist; }); @@ -254,24 +254,24 @@ describe('Fragment finders', function () { it('is able to find the first fragment', function () { const foundFragment = findFragmentByPDT( mockFragments, - mockFragments[0].programDateTime + mockFragments[0].programDateTime, ); const resultSN = foundFragment ? foundFragment.sn : -1; expect(foundFragment).to.equal( mockFragments[0], - 'Expected sn 0, found sn segment ' + resultSN + 'Expected sn 0, found sn segment ' + resultSN, ); }); it('is able to find the last fragment', function () { const foundFragment = findFragmentByPDT( mockFragments, - mockFragments[mockFragments.length - 1].programDateTime + mockFragments[mockFragments.length - 1].programDateTime, ); const resultSN = foundFragment ? foundFragment.sn : -1; expect(foundFragment).to.equal( mockFragments[4], - 'Expected sn 4, found sn segment ' + resultSN + 'Expected sn 4, found sn segment ' + resultSN, ); }); diff --git a/tests/unit/controller/fragment-tracker.ts b/tests/unit/controller/fragment-tracker.ts index 9d9516c27..ef56611aa 100644 --- a/tests/unit/controller/fragment-tracker.ts +++ b/tests/unit/controller/fragment-tracker.ts @@ -33,7 +33,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ); triggerFragLoaded(hls, fragment); @@ -45,7 +45,7 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 0.5, }, - ]) + ]), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); @@ -79,7 +79,7 @@ describe('FragmentTracker', function () { level: 0, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ); triggerFragLoaded(hls, fragment); return fragment; @@ -88,7 +88,7 @@ describe('FragmentTracker', function () { it('detects fragments that never loaded', function () { const fragment = addFragment(); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.APPENDING + FragmentState.APPENDING, ); }); @@ -101,7 +101,7 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 1, }, - ]) + ]), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); @@ -118,13 +118,13 @@ describe('FragmentTracker', function () { startPTS: 0.5, endPTS: 2, }, - ]) + ]), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.PARTIAL + FragmentState.PARTIAL, ); }); @@ -137,13 +137,13 @@ describe('FragmentTracker', function () { startPTS: 0.5, endPTS: 2, }, - ]) + ]), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.PARTIAL + FragmentState.PARTIAL, ); // Trim the buffer @@ -154,11 +154,11 @@ describe('FragmentTracker', function () { startPTS: 0.75, endPTS: 2, }, - ]) + ]), ); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.NOT_LOADED + FragmentState.NOT_LOADED, ); }); }); @@ -181,7 +181,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 1-2 createMockFragment( @@ -192,7 +192,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 2-3 createMockFragment( @@ -203,7 +203,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), ]; // load fragments to buffered @@ -214,34 +214,34 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 3, }, - ]) + ]), ); fragments.forEach((fragment) => { triggerFragLoadedAndFragBuffered(hls, fragment); }); expect( - fragmentTracker.getBufferedFrag(0.0, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(0.0, PlaylistLevelType.MAIN), ).to.equal(fragments[0]); expect( - fragmentTracker.getBufferedFrag(0.1, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(0.1, PlaylistLevelType.MAIN), ).to.equal(fragments[0]); expect( - fragmentTracker.getBufferedFrag(1.0, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(1.0, PlaylistLevelType.MAIN), ).to.equal(fragments[1]); expect( - fragmentTracker.getBufferedFrag(1.1, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(1.1, PlaylistLevelType.MAIN), ).to.equal(fragments[1]); expect( - fragmentTracker.getBufferedFrag(2.0, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(2.0, PlaylistLevelType.MAIN), ).to.equal(fragments[2]); expect( - fragmentTracker.getBufferedFrag(2.1, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(2.1, PlaylistLevelType.MAIN), ).to.equal(fragments[2]); expect( - fragmentTracker.getBufferedFrag(2.9, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(2.9, PlaylistLevelType.MAIN), ).to.equal(fragments[2]); expect( - fragmentTracker.getBufferedFrag(3.0, PlaylistLevelType.MAIN) + fragmentTracker.getBufferedFrag(3.0, PlaylistLevelType.MAIN), ).to.equal(fragments[2]); }); it('should return null if found it, but it is not buffered', function () { @@ -255,7 +255,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 1-2 createMockFragment( @@ -266,7 +266,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 2-3 createMockFragment( @@ -277,7 +277,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), ]; // load fragments, but it is not buffered @@ -304,8 +304,8 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] - ) + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], + ), ); // not found expect(fragmentTracker.getBufferedFrag(1.1, PlaylistLevelType.MAIN)).to @@ -326,8 +326,8 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.AUDIO, // <= level type is not "main" }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] - ) + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], + ), ); expect(fragmentTracker.getBufferedFrag(0, PlaylistLevelType.MAIN)).to.not @@ -350,7 +350,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ); triggerFragLoaded(hls, fragment); @@ -369,14 +369,14 @@ describe('FragmentTracker', function () { startPTS: 0.5, endPTS: 2, }, - ] - ) + ], + ), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.PARTIAL + FragmentState.PARTIAL, ); }); @@ -389,7 +389,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ); triggerFragLoaded(hls, fragment); @@ -408,14 +408,14 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 2, }, - ] - ) + ], + ), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); expect(fragmentTracker.getState(fragment)).to.equal( - FragmentState.PARTIAL + FragmentState.PARTIAL, ); }); @@ -428,7 +428,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.AUDIO, }, - [ElementaryStreamTypes.AUDIO] + [ElementaryStreamTypes.AUDIO], ); triggerFragLoaded(hls, fragment); @@ -447,8 +447,8 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 2, }, - ] - ) + ], + ), ); hls.trigger(Events.FRAG_BUFFERED, createFragBufferedData(fragment, true)); @@ -471,7 +471,7 @@ describe('FragmentTracker', function () { beforeEach(function () { hls = new Hls({}); fragmentTracker = new FragmentTracker( - hls + hls, ) as unknown as FragmentTrackerTestable; }); it('should remove fragment', function () { @@ -483,7 +483,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ); // load fragments to buffered hls.trigger( @@ -493,7 +493,7 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 1, }, - ]) + ]), ); triggerFragLoadedAndFragBuffered(hls, fragment); expect(fragmentTracker.hasFragment(fragment)).to.be.true; @@ -509,7 +509,7 @@ describe('FragmentTracker', function () { beforeEach(function () { hls = new Hls({}); fragmentTracker = new FragmentTracker( - hls + hls, ) as unknown as FragmentTrackerTestable; }); it('should remove all fragments', function () { @@ -523,7 +523,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 1-2 createMockFragment( @@ -534,7 +534,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), // 2-3 createMockFragment( @@ -545,7 +545,7 @@ describe('FragmentTracker', function () { level: 1, type: PlaylistLevelType.MAIN, }, - [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO] + [ElementaryStreamTypes.AUDIO, ElementaryStreamTypes.VIDEO], ), ]; // load fragments to buffered @@ -556,7 +556,7 @@ describe('FragmentTracker', function () { startPTS: 0, endPTS: 3, }, - ]) + ]), ); fragments.forEach((fragment) => { triggerFragLoadedAndFragBuffered(hls, fragment); @@ -565,7 +565,7 @@ describe('FragmentTracker', function () { fragments.forEach((fragment) => { expect( fragmentTracker.hasFragment(fragment), - 'has fragments before removing' + 'has fragments before removing', ).to.be.true; }); // Remove all fragments @@ -574,7 +574,7 @@ describe('FragmentTracker', function () { fragments.forEach((fragment) => { expect( fragmentTracker.hasFragment(fragment), - 'has not fragments after removing' + 'has not fragments after removing', ).to.be.false; }); }); @@ -602,7 +602,7 @@ function createMockBuffer(buffered: PtsTimeRanges): TimeRanges { function createBufferAppendedData( video: PtsTimeRanges, - audio?: PtsTimeRanges + audio?: PtsTimeRanges, ): BufferAppendedData { return { chunkMeta: new ChunkMetadata(0, 0, 0, 0), @@ -619,7 +619,7 @@ function createBufferAppendedData( function createFragBufferedData( frag: Fragment, - aborted?: boolean + aborted?: boolean, ): FragBufferedData { const stats = new LoadStats(); if (aborted) { @@ -652,7 +652,7 @@ type MockFragmentParams = { function createMockFragment( data: MockFragmentParams, - types: ElementaryStreamTypes[] + types: ElementaryStreamTypes[], ): Fragment { const frag = new Fragment(data.type, ''); Object.assign(frag, data); @@ -664,7 +664,7 @@ function createMockFragment( data.startPTS, data.endPTS, data.startPTS, - data.endPTS + data.endPTS, ); }); frag.relurl = 'not-frag-hint'; diff --git a/tests/unit/controller/gap-controller.js b/tests/unit/controller/gap-controller.js index 27b707dad..1b8e99cda 100644 --- a/tests/unit/controller/gap-controller.js +++ b/tests/unit/controller/gap-controller.js @@ -28,7 +28,7 @@ describe('GapController', function () { config, media, new FragmentTracker(hls), - hls + hls, ); triggerSpy = sinon.spy(hls, 'trigger'); }); @@ -298,7 +298,7 @@ describe('GapController', function () { }); expect(gapController.stalled).to.equal( null, - 'seeking while loading fragment' + 'seeking while loading fragment', ); }); diff --git a/tests/unit/controller/latency-controller.ts b/tests/unit/controller/latency-controller.ts index 62eb196b6..26ea06bec 100644 --- a/tests/unit/controller/latency-controller.ts +++ b/tests/unit/controller/latency-controller.ts @@ -46,7 +46,7 @@ describe('LatencyController', function () { edgeStub.get(() => value); latencyController['onLevelUpdated']( Events.LEVEL_UPDATED, - levelUpdatedData + levelUpdatedData, ); }); const ageStub = sinon.stub(levelDetails, 'age'); @@ -55,7 +55,7 @@ describe('LatencyController', function () { ageStub.get(() => value); latencyController['onLevelUpdated']( Events.LEVEL_UPDATED, - levelUpdatedData + levelUpdatedData, ); }); let currentTime = 0; diff --git a/tests/unit/controller/level-controller.ts b/tests/unit/controller/level-controller.ts index adf75cf20..369c3cb01 100755 --- a/tests/unit/controller/level-controller.ts +++ b/tests/unit/controller/level-controller.ts @@ -45,17 +45,17 @@ type LevelControllerTestable = Omit & { context?: PlaylistLoaderContext; frag?: Fragment; level?: number; - } + }, ) => void; switchParams: ( playlistUri: string, - previous: LevelDetails | undefined + previous: LevelDetails | undefined, ) => void; redundantFailover: (levelIndex: number) => void; }; function parsedLevel( - options: Partial & { bitrate: number } + options: Partial & { bitrate: number }, ): LevelParsed { const level: LevelParsed = { attrs: new AttrList(''), @@ -89,7 +89,7 @@ describe('LevelController', function () { hls = new HlsMock({}); levelController = new LevelController( hls as any, - null + null, ) as unknown as LevelControllerTestable; levelController.onParsedComplete = () => {}; hls.levelController = levelController; @@ -276,7 +276,7 @@ http://foo.example.com/hlg/prog_index.m3u8 http://bar.example.com/foo/prog_index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=80000,CODECS="mp4a.40.2",RESOLUTION=0x0 http://bar.example.com/audio-only/prog_index.m3u8`, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); expect(parsedLevels).to.have.lengthOf(6, 'MANIFEST_LOADED levels'); levelController.onManifestLoaded(Events.MANIFEST_LOADED, { @@ -289,16 +289,16 @@ http://bar.example.com/audio-only/prog_index.m3u8`, expect(name).to.equal(Events.MANIFEST_PARSED); expect(levels).to.have.lengthOf(4, 'MANIFEST_PARSED levels'); expect(levels[0].uri).to.equal( - 'http://foo.example.com/sdr-default/prog_index.m3u8' + 'http://foo.example.com/sdr-default/prog_index.m3u8', ); expect(levels[1].uri).to.equal( - 'http://foo.example.com/sdr/prog_index.m3u8' + 'http://foo.example.com/sdr/prog_index.m3u8', ); expect(levels[2].uri).to.equal( - 'http://foo.example.com/pq/prog_index.m3u8' + 'http://foo.example.com/pq/prog_index.m3u8', ); expect(levels[3].uri).to.equal( - 'http://foo.example.com/hlg/prog_index.m3u8' + 'http://foo.example.com/hlg/prog_index.m3u8', ); }); }); @@ -345,7 +345,7 @@ http://bar.example.com/audio-only/prog_index.m3u8`, levelController.onManifestLoaded(Events.MANIFEST_LOADED, data); expect(hls.trigger).to.have.been.calledWith( Events.MANIFEST_PARSED, - parsedData + parsedData, ); }); @@ -574,12 +574,12 @@ vfrag3.m4v 0, PlaylistLevelType.MAIN, 0, - {} + {}, ); const selectedUri = 'http://example.com/chunklist_vfrag1500.m3u8'; const hlsUrlParameters = levelController.switchParams( selectedUri, - levelDetails + levelDetails, ); expect(hlsUrlParameters).to.have.property('msn').which.equals(4); expect(hlsUrlParameters).to.have.property('part').which.equals(1); @@ -593,13 +593,13 @@ vfrag3.m4v 0, PlaylistLevelType.MAIN, 0, - {} + {}, ); const selectedUriWithQuery = 'http://example.com/chunklist_vfrag1500.m3u8?abc=123'; const hlsUrlParameters = levelController.switchParams( selectedUriWithQuery, - levelDetails + levelDetails, ); expect(hlsUrlParameters).to.not.be.undefined; expect(hlsUrlParameters).to.have.property('msn').which.equals(4); @@ -628,13 +628,13 @@ vfrag3.m4v 0, PlaylistLevelType.MAIN, 0, - {} + {}, ); const selectedUriWithQuery = 'http://example.com/chunklist.m3u8?token=123'; const hlsUrlParameters = levelController.switchParams( selectedUriWithQuery, - levelDetails + levelDetails, ); expect(hlsUrlParameters).to.not.be.undefined; expect(hlsUrlParameters).to.have.property('msn').which.equals(6); @@ -653,7 +653,7 @@ http://bar.example.com/lo/prog_index.m3u8 http://foo.example.com/md/prog_index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=500000,RESOLUTION=1920x1080 http://bar.example.com/md/prog_index.m3u8`, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); expect(parsedLevels).to.have.lengthOf(4, 'MANIFEST_LOADED levels'); levelController.onManifestLoaded(Events.MANIFEST_LOADED, { @@ -668,12 +668,12 @@ http://bar.example.com/md/prog_index.m3u8`, expect(levels[0].url).to.have.lengthOf(2); expect(levels[0].urlId).to.equal(0); expect(levels[0].uri).to.equal( - 'http://foo.example.com/lo/prog_index.m3u8' + 'http://foo.example.com/lo/prog_index.m3u8', ); expect(levels[1].url).to.have.lengthOf(2); expect(levels[1].urlId).to.equal(0); expect(levels[1].uri).to.equal( - 'http://foo.example.com/md/prog_index.m3u8' + 'http://foo.example.com/md/prog_index.m3u8', ); expect(levelController.level).to.equal(-1); levels[0].details = {} as any; @@ -682,10 +682,10 @@ http://bar.example.com/md/prog_index.m3u8`, levels[0].urlId++; levels[1].urlId++; expect(levels[0].uri).to.equal( - 'http://bar.example.com/lo/prog_index.m3u8' + 'http://bar.example.com/lo/prog_index.m3u8', ); expect(levels[1].uri).to.equal( - 'http://bar.example.com/md/prog_index.m3u8' + 'http://bar.example.com/md/prog_index.m3u8', ); expect(levelController.level).to.equal(0); expect(levels[0].details, 'Resets LevelDetails').to.be.undefined; @@ -703,12 +703,12 @@ http://foo.example.com/md/prog_index.m3u8 http://bar.example.com/md/prog_index.m3u8`; const parsedMultivariant = M3U8Parser.parseMasterPlaylist( multivariantPlaylist, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); const parsedMediaOptions = M3U8Parser.parseMasterPlaylistMedia( multivariantPlaylist, 'http://example.com/main.m3u8', - parsedMultivariant + parsedMultivariant, ); const { levels: parsedLevels } = parsedMultivariant; const { AUDIO: parsedAudio, SUBTITLES: parsedSubs } = parsedMediaOptions; @@ -727,7 +727,7 @@ http://bar.example.com/md/prog_index.m3u8`; expect(levels[0].url).to.have.lengthOf(1); expect(levels[0].urlId).to.equal(0); expect(levels[0].uri).to.equal( - 'http://foo.example.com/lo/prog_index.m3u8' + 'http://foo.example.com/lo/prog_index.m3u8', ); expect(levels[0]).to.have.property('audioGroupIds').which.has.lengthOf(1); @@ -742,16 +742,16 @@ http://bar.example.com/md/prog_index.m3u8`; expect(levels[1].url).to.have.lengthOf(2); expect(levels[1].urlId).to.equal(0); expect(levels[1].uri).to.equal( - 'http://foo.example.com/md/prog_index.m3u8' + 'http://foo.example.com/md/prog_index.m3u8', ); expect(levelController.level).to.equal(-1); levels[0].urlId++; levels[1].urlId++; expect(levels[0].uri).to.equal( - 'http://foo.example.com/lo/prog_index.m3u8' + 'http://foo.example.com/lo/prog_index.m3u8', ); expect(levels[1].uri).to.equal( - 'http://bar.example.com/md/prog_index.m3u8' + 'http://bar.example.com/md/prog_index.m3u8', ); }); @@ -761,12 +761,12 @@ http://bar.example.com/md/prog_index.m3u8`; beforeEach(function () { parsedMultivariant = M3U8Parser.parseMasterPlaylist( multivariantPlaylistWithRedundantFallbacks, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); parsedMediaOptions = M3U8Parser.parseMasterPlaylistMedia( multivariantPlaylistWithRedundantFallbacks, 'http://example.com/main.m3u8', - parsedMultivariant + parsedMultivariant, ); }); @@ -826,7 +826,7 @@ http://bar.example.com/md/prog_index.m3u8`; }); expect(subtitleTracks).to.have.lengthOf( 9, - 'MANIFEST_PARSED subtitleTracks' + 'MANIFEST_PARSED subtitleTracks', ); // 3 subtitle groups * 3 subtitle tracks per group expect(subtitleTracks[0]).to.deep.include({ id: 0, @@ -954,12 +954,12 @@ http://bar.example.com/md/prog_index.m3u8`; beforeEach(function () { parsedMultivariant = M3U8Parser.parseMasterPlaylist( multivariantPlaylistWithPathways, - 'http://example.com/main.m3u8' + 'http://example.com/main.m3u8', ); parsedMediaOptions = M3U8Parser.parseMasterPlaylistMedia( multivariantPlaylistWithPathways, 'http://example.com/main.m3u8', - parsedMultivariant + parsedMultivariant, ); }); @@ -988,7 +988,7 @@ http://bar.example.com/md/prog_index.m3u8`; expect(audioTracks).to.have.lengthOf(6, 'MANIFEST_PARSED audioTracks'); // 3 audio groups * 2 audio tracks per group expect(subtitleTracks).to.have.lengthOf( 6, - 'MANIFEST_PARSED subtitleTracks' + 'MANIFEST_PARSED subtitleTracks', ); // 3 subtitle groups * 2 subtitle tracks per group expect(levelController.level).to.equal(-1); diff --git a/tests/unit/controller/level-helper.ts b/tests/unit/controller/level-helper.ts index 627d39c68..352ec286b 100644 --- a/tests/unit/controller/level-helper.ts +++ b/tests/unit/controller/level-helper.ts @@ -114,15 +114,15 @@ describe('LevelHelper Tests', function () { expect(intersectionFn).to.have.been.calledThrice; expect(intersectionFn.firstCall).to.have.been.calledWith( oldParts[3], - newParts[0] + newParts[0], ); expect(intersectionFn.secondCall).to.have.been.calledWith( oldParts[4], - newParts[1] + newParts[1], ); expect(intersectionFn.thirdCall).to.have.been.calledWith( oldParts[5], - newParts[2] + newParts[2], ); }); }); @@ -198,7 +198,7 @@ describe('LevelHelper Tests', function () { frag, `Fragment sn: ${frag.sn} does not match expected: actual: ${JSON.stringify(frag)} -expect: ${JSON.stringify(merged.fragments[i])}` +expect: ${JSON.stringify(merged.fragments[i])}`, ).to.deep.equal(merged.fragments[i]); }); }); @@ -220,7 +220,7 @@ expect: ${JSON.stringify(merged.fragments[i])}` frag, `Fragment sn: ${frag.sn} does not match expected: actual: ${JSON.stringify(frag)} -expect: ${JSON.stringify(merged.fragments[i])}` +expect: ${JSON.stringify(merged.fragments[i])}`, ).to.deep.equal(merged.fragments[i]); }); }); @@ -253,12 +253,12 @@ expect: ${JSON.stringify(merged.fragments[i])}` newPlaylist.fragments.forEach((frag, i) => { expect( frag.initSegment, - `Fragment sn: ${frag.sn} does not have correct initSegment` + `Fragment sn: ${frag.sn} does not have correct initSegment`, ).to.equal(oldInitSegment); }); expect( newPlaylist.fragmentHint.initSegment, - 'fragmentHint does not have correct initSegment' + 'fragmentHint does not have correct initSegment', ).to.equal(oldInitSegment); }); }); diff --git a/tests/unit/controller/stream-controller.ts b/tests/unit/controller/stream-controller.ts index 54477ab30..815773d90 100644 --- a/tests/unit/controller/stream-controller.ts +++ b/tests/unit/controller/stream-controller.ts @@ -53,7 +53,7 @@ describe('StreamController', function () { expect(streamController.hasInterval()).to.be.true; expect(streamController.state).to.equal( State.IDLE, - "StreamController's state should not be STOPPED" + "StreamController's state should not be STOPPED", ); }; @@ -61,14 +61,14 @@ describe('StreamController', function () { expect(streamController.hasInterval()).to.be.false; expect(streamController.state).to.equal( State.STOPPED, - "StreamController's state should be STOPPED" + "StreamController's state should be STOPPED", ); }; const loadManifest = (manifest: string): ParsedMultivariantPlaylist => { const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.example.com' + 'http://www.example.com', ); const { contentSteering, @@ -207,19 +207,19 @@ describe('StreamController', function () { levelDetails.targetduration = mockFragments[0].duration; levelDetails.totalduration = mockFragments.reduce( (sum, frag) => sum + frag.duration, - 0 + 0, ); }); it('PTS search choosing wrong fragment (3 instead of 2) after level loaded', function () { const foundFragment = streamController['getNextFragment']( bufferEnd, - levelDetails + levelDetails, ); const resultSN = foundFragment ? foundFragment.sn : -1; expect(foundFragment).to.equal( mockFragments[3], - 'Expected sn 3, found sn segment ' + resultSN + 'Expected sn 3, found sn segment ' + resultSN, ); }); @@ -227,12 +227,12 @@ describe('StreamController', function () { streamController['fragPrevious'] = null; const foundFragment = streamController['getNextFragment']( bufferEnd, - levelDetails + levelDetails, ); const resultSN = foundFragment ? foundFragment.sn : -1; expect(foundFragment).to.equal( mockFragments[3], - 'Expected sn 3, found sn segment ' + resultSN + 'Expected sn 3, found sn segment ' + resultSN, ); }); @@ -267,13 +267,13 @@ describe('StreamController', function () { it('does PDT search, choosing fragment after level loaded', function () { const foundFragment = streamController['getInitialLiveFragment']( levelDetails, - mockFragments + mockFragments, ); expect(foundFragment).to.equal( mockFragments[4], `Expected sn 4, found sn segment ${ foundFragment ? foundFragment.sn : -1 - }` + }`, ); }); }); @@ -303,25 +303,25 @@ describe('StreamController', function () { fragPrevious.sn = 0; let foundFragment = streamController['getInitialLiveFragment']( levelDetails, - fragmentsWithoutPdt + fragmentsWithoutPdt, ); expect(foundFragment).to.equal( fragmentsWithoutPdt[1], `Expected sn 1, found sn segment ${ foundFragment ? foundFragment.sn : -1 - }` + }`, ); fragPrevious.sn = 3; foundFragment = streamController['getInitialLiveFragment']( levelDetails, - fragmentsWithoutPdt + fragmentsWithoutPdt, ); expect(foundFragment).to.equal( fragmentsWithoutPdt[4], `Expected sn 4, found sn segment ${ foundFragment ? foundFragment.sn : -1 - }` + }`, ); }); @@ -330,13 +330,13 @@ describe('StreamController', function () { const foundFragment = streamController['getInitialLiveFragment']( levelDetails, - fragmentsWithoutPdt + fragmentsWithoutPdt, ); expect(foundFragment).to.equal( fragmentsWithoutPdt[2], `Expected sn 2, found sn segment ${ foundFragment ? foundFragment.sn : -1 - }` + }`, ); }); @@ -344,13 +344,13 @@ describe('StreamController', function () { fragPrevious.cc = 0; const foundFragment = streamController['getInitialLiveFragment']( levelDetails, - fragmentsWithoutPdt + fragmentsWithoutPdt, ); expect(foundFragment).to.equal( fragmentsWithoutPdt[0], `Expected sn 0, found sn segment ${ foundFragment ? foundFragment.sn : -1 - }` + }`, ); }); @@ -358,7 +358,7 @@ describe('StreamController', function () { fragPrevious.cc = 2; const foundFragment = streamController['getInitialLiveFragment']( levelDetails, - fragmentsWithoutPdt + fragmentsWithoutPdt, ); expect(foundFragment).to.equal(null); }); diff --git a/tests/unit/controller/subtitle-stream-controller.js b/tests/unit/controller/subtitle-stream-controller.js index 1ca9c29af..2cbf03c07 100644 --- a/tests/unit/controller/subtitle-stream-controller.js +++ b/tests/unit/controller/subtitle-stream-controller.js @@ -42,7 +42,7 @@ describe('SubtitleStreamController', function () { subtitleStreamController = new SubtitleStreamController( hls, fragmentTracker, - keyLoader + keyLoader, ); subtitleStreamController.onMediaAttached(Events.MEDIA_ATTACHED, { @@ -147,13 +147,13 @@ describe('SubtitleStreamController', function () { it('nulls fragPrevious when seeking away from fragCurrent', function () { subtitleStreamController.fragCurrent = new Fragment( PlaylistLevelType.MAIN, - '' + '', ); subtitleStreamController.fragCurrent.start = 1000; subtitleStreamController.fragCurrent.duration = 10; subtitleStreamController.fragPrevious = new Fragment( PlaylistLevelType.MAIN, - '' + '', ); subtitleStreamController.onMediaSeeking(); expect(subtitleStreamController.fragPrevious).to.not.exist; diff --git a/tests/unit/controller/subtitle-track-controller.js b/tests/unit/controller/subtitle-track-controller.js index edd5beef5..adae1b9d3 100644 --- a/tests/unit/controller/subtitle-track-controller.js +++ b/tests/unit/controller/subtitle-track-controller.js @@ -52,7 +52,7 @@ describe('SubtitleTrackController', function () { const textTrack3 = videoElement.addTextTrack( 'captions', 'Untitled CC', - 'en' + 'en', ); textTrack1.groupId = 'default-text-group'; @@ -151,7 +151,7 @@ describe('SubtitleTrackController', function () { name: 'English', type: 'SUBTITLES', url: 'bar', - } + }, ); }); @@ -169,7 +169,7 @@ describe('SubtitleTrackController', function () { id: 1, groupId: 'default-text-group', deliveryDirectives: null, - } + }, ); }); @@ -187,7 +187,7 @@ describe('SubtitleTrackController', function () { name: 'English', type: 'SUBTITLES', url: 'baz', - } + }, ); }); @@ -198,7 +198,7 @@ describe('SubtitleTrackController', function () { expect(triggerSpy.firstCall).to.have.been.calledWith( 'hlsSubtitleTrackSwitch', - { id: -1 } + { id: -1 }, ); }); @@ -216,7 +216,7 @@ describe('SubtitleTrackController', function () { id: 2, groupId: 'default-text-group', deliveryDirectives: null, - } + }, ); }); @@ -260,7 +260,7 @@ describe('SubtitleTrackController', function () { it('exits early if the loaded track does not match the requested track', function () { const playlistLoadedSpy = sandbox.spy( subtitleTrackController, - 'playlistLoaded' + 'playlistLoaded', ); subtitleTrackController.canLoad = true; subtitleTrackController.trackId = 1; @@ -272,7 +272,7 @@ describe('SubtitleTrackController', function () { }; subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - mockLoadedEvent + mockLoadedEvent, ); expect(subtitleTrackController.timer).to.equal(-1); expect(playlistLoadedSpy).to.have.not.been.called; @@ -280,7 +280,7 @@ describe('SubtitleTrackController', function () { mockLoadedEvent.id = 0; subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - mockLoadedEvent + mockLoadedEvent, ); expect(subtitleTrackController.timer).to.equal(-1); expect(playlistLoadedSpy).to.have.not.been.called; @@ -288,7 +288,7 @@ describe('SubtitleTrackController', function () { mockLoadedEvent.id = 1; subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - mockLoadedEvent + mockLoadedEvent, ); expect(subtitleTrackController.timer).to.equal(-1); expect(playlistLoadedSpy).to.have.been.calledOnce; @@ -300,7 +300,7 @@ describe('SubtitleTrackController', function () { subtitleTrackController.trackId = 1; subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - { id: 1, details, stats: new LoadStats() } + { id: 1, details, stats: new LoadStats() }, ); expect(subtitleTrackController.timer).to.equal(-1); }); @@ -311,7 +311,7 @@ describe('SubtitleTrackController', function () { subtitleTrackController.trackId = 1; subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - { id: 1, details, stats: new LoadStats() } + { id: 1, details, stats: new LoadStats() }, ); expect(subtitleTrackController.timer).to.exist; }); @@ -323,7 +323,7 @@ describe('SubtitleTrackController', function () { subtitleTrackController.timer = self.setTimeout(() => {}, 0); subtitleTrackController.onSubtitleTrackLoaded( Events.SUBTITLE_TRACK_LOADED, - { id: 1, details, stats: new LoadStats() } + { id: 1, details, stats: new LoadStats() }, ); expect(subtitleTrackController.timer).to.equal(-1); }); @@ -333,7 +333,7 @@ describe('SubtitleTrackController', function () { it('stops loading', function () { const clearReloadSpy = sandbox.spy( subtitleTrackController, - 'clearTimer' + 'clearTimer', ); subtitleTrackController.stopLoad(); expect(subtitleTrackController.canLoad).to.be.false; @@ -345,7 +345,7 @@ describe('SubtitleTrackController', function () { it('starts loading', function () { const loadCurrentTrackSpy = sandbox.spy( subtitleTrackController, - 'loadPlaylist' + 'loadPlaylist', ); subtitleTrackController.startLoad(); expect(subtitleTrackController.canLoad).to.be.true; diff --git a/tests/unit/controller/timeline-controller-nonnative.js b/tests/unit/controller/timeline-controller-nonnative.js index ccbb9bbc4..f87f5176d 100644 --- a/tests/unit/controller/timeline-controller-nonnative.js +++ b/tests/unit/controller/timeline-controller-nonnative.js @@ -36,10 +36,10 @@ describe('Non-Native TimelineController functions', function () { expect(track.kind).to.equal('captions'); expect(track.default).to.equal(false); expect(track.label).to.equal( - timelineController.captionsProperties.textTrack1.label + timelineController.captionsProperties.textTrack1.label, ); expect(timelineController.nonNativeCaptionsTracks.textTrack1).to.equal( - track + track, ); done(); }); diff --git a/tests/unit/controller/timeline-controller.js b/tests/unit/controller/timeline-controller.js index a4e1da8b6..df5975100 100644 --- a/tests/unit/controller/timeline-controller.js +++ b/tests/unit/controller/timeline-controller.js @@ -25,7 +25,7 @@ describe('TimelineController', function () { { id: 0, name: 'en', attrs: { LANGUAGE: 'en', NAME: 'en' } }, { id: 1, name: 'ru', attrs: { LANGUAGE: 'ru', NAME: 'ru' } }, ], - } + }, ); // text tracks model contain only newly added manifest tracks, in same order as in manifest @@ -44,7 +44,7 @@ describe('TimelineController', function () { { id: 0, name: 'en', attrs: { LANGUAGE: 'en', NAME: 'en' } }, { id: 1, name: 'ru', attrs: { LANGUAGE: 'ru', NAME: 'ru' } }, ], - } + }, ); // text tracks model contain only newly added manifest tracks, in same order diff --git a/tests/unit/demuxer/base-audio-demuxer.ts b/tests/unit/demuxer/base-audio-demuxer.ts index ff337de41..5ef53b5a5 100644 --- a/tests/unit/demuxer/base-audio-demuxer.ts +++ b/tests/unit/demuxer/base-audio-demuxer.ts @@ -10,19 +10,19 @@ describe('BaseAudioDemuxer', function () { }); it('should use the timeOffset if timestamp is undefined or not finite', function () { expect(initPTSFn(undefined, 1, { baseTime: 0, timescale: 1 })).to.be.eq( - 90000 + 90000, ); expect(initPTSFn(NaN, 1, { baseTime: 0, timescale: 1 })).to.be.eq(90000); expect(initPTSFn(Infinity, 1, { baseTime: 0, timescale: 1 })).to.be.eq( - 90000 + 90000, ); }); it('should add initPTS to timeOffset when timestamp is undefined or not finite', function () { expect( - initPTSFn(undefined, 1, { baseTime: 42, timescale: 90000 }) + initPTSFn(undefined, 1, { baseTime: 42, timescale: 90000 }), ).to.be.eq(90042); expect(initPTSFn(NaN, 1, { baseTime: 42, timescale: 90000 })).to.be.eq( - 90042 + 90042, ); }); }); diff --git a/tests/unit/demuxer/id3.ts b/tests/unit/demuxer/id3.ts index 8e281464a..f86819fa2 100644 --- a/tests/unit/demuxer/id3.ts +++ b/tests/unit/demuxer/id3.ts @@ -12,11 +12,11 @@ describe('ID3 tests', function () { ]); const mockID3HeaderMissingLeadingByte = mockID3Header.slice( 8, - mockID3Header.length + mockID3Header.length, ); const mockID3HeaderMissingTrailingByte = mockID3Header.slice( 0, - mockID3Header.length - 8 + mockID3Header.length - 8, ); it('utf8ArrayToStr', function (done) { diff --git a/tests/unit/demuxer/transmuxer.ts b/tests/unit/demuxer/transmuxer.ts index 45a406d1b..f13518ae0 100644 --- a/tests/unit/demuxer/transmuxer.ts +++ b/tests/unit/demuxer/transmuxer.ts @@ -34,7 +34,7 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ) as any; expect(transmuxerInterface.hls).to.equal(hls, 'Hls object created'); expect(transmuxerInterface.id).to.equal(id, 'Id has been set up'); @@ -53,7 +53,7 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ) as any; expect(transmuxerInterface.hls).to.equal(hls, 'Hls object created'); expect(transmuxerInterface.id).to.equal(id, 'Id has been set up'); @@ -71,7 +71,7 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; transmuxerInterface.destroy(); @@ -90,7 +90,7 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; transmuxerInterface.destroy(); @@ -109,12 +109,12 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; const stub = sinon.stub( transmuxerInterfacePrivates.workerContext.worker, - 'postMessage' + 'postMessage', ); const currentFrag = new Fragment(PlaylistLevelType.MAIN, ''); currentFrag.cc = 100; @@ -141,14 +141,14 @@ describe('TransmuxerInterface tests', function () { part, duration, accurateTimeOffset, - chunkMeta + chunkMeta, ); expect(stub).to.have.been.calledOnce; const firstCall = stub.args[0][0]; expect( firstCall, - 'Demux call 1: ' + JSON.stringify(firstCall, null, 2) + 'Demux call 1: ' + JSON.stringify(firstCall, null, 2), ).to.deep.equal({ cmd: 'demux', data, @@ -174,14 +174,14 @@ describe('TransmuxerInterface tests', function () { part, duration, accurateTimeOffset, - chunkMeta + chunkMeta, ); expect(stub).to.have.been.calledTwice; const secondCall = stub.args[1][0]; expect( secondCall, - 'Demux call 2: ' + JSON.stringify(secondCall, null, 2) + 'Demux call 2: ' + JSON.stringify(secondCall, null, 2), ).to.deep.equal({ cmd: 'demux', data, @@ -200,7 +200,7 @@ describe('TransmuxerInterface tests', function () { hls, id, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; @@ -228,7 +228,7 @@ describe('TransmuxerInterface tests', function () { const configureStub = sinon.stub( transmuxerInterfacePrivates.transmuxer, - 'configure' + 'configure', ); const pushStub = sinon.stub(transmuxerInterfacePrivates.transmuxer, 'push'); pushStub.returns(Promise.reject(new Error('Stubbed transmux result'))); @@ -241,7 +241,7 @@ describe('TransmuxerInterface tests', function () { part, duration, accurateTimeOffset, - chunkMeta + chunkMeta, ); const tConfig = new TransmuxConfig('', '', initSegmentData, 0); @@ -254,7 +254,7 @@ describe('TransmuxerInterface tests', function () { data, newFrag.decryptdata, chunkMeta, - state + state, ); }); @@ -273,7 +273,7 @@ describe('TransmuxerInterface tests', function () { hls, PlaylistLevelType.MAIN, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; transmuxerInterfacePrivates.frag = {}; @@ -297,7 +297,7 @@ describe('TransmuxerInterface tests', function () { hls, PlaylistLevelType.MAIN, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; const evt = { @@ -320,7 +320,7 @@ describe('TransmuxerInterface tests', function () { hls, PlaylistLevelType.MAIN, onTransmuxComplete, - onFlush + onFlush, ); const transmuxerInterfacePrivates = transmuxerInterface as any; const evt = { diff --git a/tests/unit/events.js b/tests/unit/events.js index d4e833b24..ccdddca79 100644 --- a/tests/unit/events.js +++ b/tests/unit/events.js @@ -30,7 +30,7 @@ describe('Events tests', function () { const value = Events[event]; const expected = 'hls' + getAllCapsSnakeCaseToCamelCase(event); expect(value).to.equal(expected); - } + }, ); }); }); diff --git a/tests/unit/hls.js b/tests/unit/hls.js index 235750bad..600dab1ad 100644 --- a/tests/unit/hls.js +++ b/tests/unit/hls.js @@ -18,7 +18,7 @@ describe('Hls', function () { it('should return a default bandwidth estimate', function () { const hls = new Hls(); expect(hls.bandwidthEstimate).to.equal( - hlsDefaultConfig.abrEwmaDefaultEstimate + hlsDefaultConfig.abrEwmaDefaultEstimate, ); }); }); diff --git a/tests/unit/loader/date-range.ts b/tests/unit/loader/date-range.ts index 79d178def..4acc58154 100644 --- a/tests/unit/loader/date-range.ts +++ b/tests/unit/loader/date-range.ts @@ -7,42 +7,42 @@ const expect = chai.expect; describe('DateRange class', function () { const startDateAndDuration = new AttrList( - 'ID="ad1",CLASS="com.apple.hls.interstitial",START-DATE="2020-01-02T21:55:44.000Z",DURATION=15.0' + 'ID="ad1",CLASS="com.apple.hls.interstitial",START-DATE="2020-01-02T21:55:44.000Z",DURATION=15.0', ); const startDateAndEndDate = new AttrList( - 'ID="ad2",CLASS="com.apple.hls.interstitial",START-DATE="2020-01-02T21:55:44.000Z",END-DATE="2020-01-02T21:56:44.001Z"' + 'ID="ad2",CLASS="com.apple.hls.interstitial",START-DATE="2020-01-02T21:55:44.000Z",END-DATE="2020-01-02T21:56:44.001Z"', ); const startDateAndEndOnNext = new AttrList( - 'ID="ad3",CLASS="com.apple.hls.interstitial",START-DATE="2022-01-01T00:00:00.100Z",END-ON-NEXT=YES' + 'ID="ad3",CLASS="com.apple.hls.interstitial",START-DATE="2022-01-01T00:00:00.100Z",END-ON-NEXT=YES', ); const sctePlanned = new AttrList( - 'ID="s1",START-DATE="2014-03-05T11:15:00Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC' + 'ID="s1",START-DATE="2014-03-05T11:15:00Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC', ); const scteDurationUpdate = new AttrList( - 'ID="s1",DURATION=59.994,SCTE35-IN=0xFC01' + 'ID="s1",DURATION=59.994,SCTE35-IN=0xFC01', ); const scteInvalidChange = new AttrList( - 'ID="s1",PLANNED-DURATION=60.0,SCTE35-OUT=0xFCCC,DURATION=59.993,SCTE35-IN=0xFC' + 'ID="s1",PLANNED-DURATION=60.0,SCTE35-OUT=0xFCCC,DURATION=59.993,SCTE35-IN=0xFC', ); const missingId = new AttrList( - 'START-DATE="2020-01-02T21:55:44.000Z",DURATION=15.0' + 'START-DATE="2020-01-02T21:55:44.000Z",DURATION=15.0', ); const missingStartDate = new AttrList('ID="ad1",DURATION=15.0'); const invalidStartDate = new AttrList( - 'ID="ad1",START-DATE="20-01-02-21:55",DURATION=15.0' + 'ID="ad1",START-DATE="20-01-02-21:55",DURATION=15.0', ); const negativeDuration = new AttrList( - 'ID="ad1",START-DATE="2020-01-02T21:55:44.000Z",DURATION=-1.0' + 'ID="ad1",START-DATE="2020-01-02T21:55:44.000Z",DURATION=-1.0', ); const endDateEarlierThanStartDate = new AttrList( - 'ID="ad2",START-DATE="2020-01-02T21:55:44.000Z",END-DATE="2019-01-02T21:56:44.001Z"' + 'ID="ad2",START-DATE="2020-01-02T21:55:44.000Z",END-DATE="2019-01-02T21:56:44.001Z"', ); const endOnNextWithNoClass = new AttrList( - 'ID="ad3",START-DATE="2022-01-01T00:00:00.100Z",END-ON-NEXT=YES' + 'ID="ad3",START-DATE="2022-01-01T00:00:00.100Z",END-ON-NEXT=YES', ); it('parses id, class, date, duration, and end-on-next attributes', function () { @@ -50,7 +50,7 @@ describe('DateRange class', function () { expect(dateRangeDuration.id).to.equal('ad1'); expect(dateRangeDuration.class).to.equal('com.apple.hls.interstitial'); expect(dateRangeDuration.startDate.toISOString()).to.equal( - '2020-01-02T21:55:44.000Z' + '2020-01-02T21:55:44.000Z', ); expect(dateRangeDuration.duration).to.equal(15); @@ -58,24 +58,24 @@ describe('DateRange class', function () { expect(dateRangeEndDate.id).to.equal('ad2'); expect(dateRangeEndDate.class).to.equal('com.apple.hls.interstitial'); expect(dateRangeEndDate.startDate.toISOString()).to.equal( - '2020-01-02T21:55:44.000Z' + '2020-01-02T21:55:44.000Z', ); expect(dateRangeEndDate.endDate?.toISOString()).to.equal( - '2020-01-02T21:56:44.001Z' + '2020-01-02T21:56:44.001Z', ); const dateRangeEndOnNext = new DateRange(startDateAndEndOnNext); expect(dateRangeEndOnNext.id).to.equal('ad3'); expect(dateRangeEndOnNext.class).to.equal('com.apple.hls.interstitial'); expect(dateRangeEndOnNext.startDate.toISOString()).to.equal( - '2022-01-01T00:00:00.100Z' + '2022-01-01T00:00:00.100Z', ); expect(dateRangeEndOnNext.endOnNext).to.equal(true); const dateRangePlannedDuration = new DateRange(sctePlanned); expect(dateRangePlannedDuration.id).to.equal('s1'); expect(dateRangePlannedDuration.startDate.toISOString()).to.equal( - '2014-03-05T11:15:00.000Z' + '2014-03-05T11:15:00.000Z', ); expect(dateRangePlannedDuration.plannedDuration).to.equal(59.993); }); @@ -83,7 +83,7 @@ describe('DateRange class', function () { it('calculates end-date based on duration', function () { const dateRangeDuration = new DateRange(startDateAndDuration); expect(dateRangeDuration.endDate?.toISOString()).to.equal( - '2020-01-02T21:55:59.000Z' + '2020-01-02T21:55:59.000Z', ); }); @@ -109,7 +109,7 @@ describe('DateRange class', function () { expected, `Expected attributes to be ${ expected ? 'valid' : 'invalid' - } ${JSON.stringify(attributeList)}` + } ${JSON.stringify(attributeList)}`, ); } @@ -146,8 +146,8 @@ describe('DateRange class', function () { expect(scteIn.isValid).to.equal( false, `Expected DateRange with same ID to be invalid because of conflicting attribute values\n${JSON.stringify( - scteOut - )}\n${JSON.stringify(scteIn)}` + scteOut, + )}\n${JSON.stringify(scteIn)}`, ); }); }); diff --git a/tests/unit/loader/fragment-loader.ts b/tests/unit/loader/fragment-loader.ts index e5f0ed4e1..4a137fe9f 100644 --- a/tests/unit/loader/fragment-loader.ts +++ b/tests/unit/loader/fragment-loader.ts @@ -25,7 +25,7 @@ describe('FragmentLoader tests', function () { beforeEach(function () { fragmentLoader = new FragmentLoader( - mergeConfig(hlsDefaultConfig, { loader: MockXhr }) + mergeConfig(hlsDefaultConfig, { loader: MockXhr }), ); frag = new Fragment(PlaylistLevelType.MAIN, ''); frag.url = 'foo'; @@ -76,13 +76,13 @@ describe('FragmentLoader tests', function () { stats, context, response.data, - networkDetails + networkDetails, ); fragmentLoaderPrivates.loader.callbacks.onSuccess( response, stats, context, - networkDetails + networkDetails, ); }); }); @@ -118,7 +118,7 @@ describe('FragmentLoader tests', function () { response, context, networkDetails, - stats + stats, ); }).then((error: LoadError) => { expect(error).to.be.instanceOf(LoadError); @@ -133,7 +133,7 @@ describe('FragmentLoader tests', function () { networkDetails, stats, }, - JSON.stringify(error.data, null, 2) + JSON.stringify(error.data, null, 2), ); expect(fragmentLoaderPrivates.loader).to.not.exist; expect(frag.loader).to.not.exist; diff --git a/tests/unit/loader/fragment.ts b/tests/unit/loader/fragment.ts index 73aa70bfa..a92287d94 100644 --- a/tests/unit/loader/fragment.ts +++ b/tests/unit/loader/fragment.ts @@ -21,7 +21,7 @@ describe('Fragment class tests', function () { const key = new LevelKey( 'AES-128', 'https://wamsbayclus001kd-hs.cloudapp.net/HlsHandler.ashx?kid=da3813af-55e6-48e7-aa9f-a4d6031f7b4d', - 'identity' + 'identity', ); frag.levelkeys = { identity: key }; expect(frag.encrypted).to.equal(true); @@ -32,7 +32,7 @@ describe('Fragment class tests', function () { 'SAMPLE-AES', 'skd://one', 'com.apple.streamingkeydelivery', - [1] + [1], ); frag.levelkeys = { 'com.apple.streamingkeydelivery': key }; expect(frag.encrypted).to.equal(true); @@ -46,7 +46,7 @@ describe('Fragment class tests', function () { 'SAMPLE-AES', 'data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==', 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', - [1] + [1], ); frag.levelkeys = { 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed': key }; expect(frag.encrypted).to.equal(true); @@ -60,7 +60,7 @@ describe('Fragment class tests', function () { 'SAMPLE-AES', 'data:text/plain;charset=UTF-16;base64,xAEAAAEAAQC6ATwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AdgBHAFYAagBOAEsAZwBZAE0ARQBxAHAATwBMAGgAMQBWAGQAUgBUADAAQQA9AD0APAAvAEsASQBEAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=', 'com.microsoft.playready', - [1] + [1], ); frag.levelkeys = { 'com.microsoft.playready': key }; expect(frag.encrypted).to.equal(true); diff --git a/tests/unit/loader/playlist-loader.ts b/tests/unit/loader/playlist-loader.ts index 7dbc9e61a..8df9a15fa 100644 --- a/tests/unit/loader/playlist-loader.ts +++ b/tests/unit/loader/playlist-loader.ts @@ -14,7 +14,7 @@ describe('PlaylistLoader', function () { it('parses empty manifest returns empty array', function () { const result = M3U8Parser.parseMasterPlaylist( '', - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels).to.deep.equal([]); expect(result.sessionData).to.equal(null); @@ -25,7 +25,7 @@ describe('PlaylistLoader', function () { http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core`; const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels).to.deep.equal([]); expect(result.sessionData).to.equal(null); @@ -38,7 +38,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels).to.have.lengthOf(1); expect(result.levels[0].bitrate).to.equal(836280); @@ -48,7 +48,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.levels[0].height).to.equal(360); expect(result.levels[0].name).to.equal('480'); expect(result.levels[0].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); expect(result.sessionData).to.equal(null); }); @@ -61,11 +61,11 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels).to.have.lengthOf(1); expect(result.levels[0].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); }); @@ -76,7 +76,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels.length).to.equal(1); expect(result.levels[0].bitrate).to.equal(836280); @@ -86,7 +86,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.levels[0].height).to.equal(360); expect(result.levels[0].name).to.equal('480'); expect(result.levels[0].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); expect(result.sessionData).to.equal(null); }); @@ -98,7 +98,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ let result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels.length).to.equal(1); expect(result.levels[0].bitrate).to.equal(836280); @@ -109,7 +109,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.levels[0].name).to.equal('480'); expect( result.levels[0].url, - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); expect(result.sessionData).to.equal(null); @@ -119,7 +119,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels.length).to.equal(1); expect(result.levels[0].bitrate).to.equal(836280); @@ -129,7 +129,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.levels[0].height).to.equal(360); expect(result.levels[0].name).to.equal('480'); expect(result.levels[0].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); expect(result.sessionData).to.equal(null); @@ -139,7 +139,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels).to.have.lengthOf(1); expect(result.levels[0].bitrate).to.equal(836280); @@ -149,7 +149,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.levels[0].height).to.equal(360); expect(result.levels[0].name).to.equal('480'); expect(result.levels[0].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/158282701_mp4_h264_aac_hq.m3u8#cell=core', ); expect(result.sessionData).to.equal(null); }); @@ -179,7 +179,7 @@ http://proxy-21.dailymotion.com/sec(2a991e17f08fcd94f95637a6dd718ddd)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); expect(result.levels.length).to.equal(10); expect(result.levels[0].bitrate).to.equal(836280); @@ -203,7 +203,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); const expected = { 'com.dailymotion.sessiondata.test': new AttrList({ @@ -241,7 +241,7 @@ http://proxy-21.dailymotion.com/sec(2a991e17f08fcd94f95637a6dd718ddd)/video/107/ const result = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); const expected = { 'com.dailymotion.sessiondata.test': new AttrList({ @@ -263,7 +263,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ const { sessionData } = M3U8Parser.parseMasterPlaylist( manifest, - 'http://www.dailymotion.com' + 'http://www.dailymotion.com', ); const expected = { 'com.dailymotion.sessiondata.test': new AttrList({ @@ -291,7 +291,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(0); expect(result.totalduration).to.equal(0); @@ -309,7 +309,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(0); expect(result.totalduration).to.equal(0); @@ -326,7 +326,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.targetduration).to.equal(2); }); @@ -342,7 +342,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.targetduration).to.equal(1); }); @@ -370,7 +370,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.variableList).to.equal(null); expect(result.totalduration).to.equal(51.24); @@ -391,7 +391,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ expect(result.fragments[4].start).to.equal(47.36); expect(result.fragments[4].duration).to.equal(3.88); expect(result.fragments[4].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/frag(5)/video/107/282/158282701_mp4_h264_aac_hq.ts' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/frag(5)/video/107/282/158282701_mp4_h264_aac_hq.ts', ); }); @@ -410,7 +410,7 @@ http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/ 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.totalduration).to.equal(4); expect(result.startSN).to.equal(0); @@ -451,7 +451,7 @@ chop/segment-5.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.totalduration).to.equal(30); expect(result.startSN).to.equal(0); @@ -468,7 +468,7 @@ chop/segment-5.ts expect(result.fragments[4].start).to.equal(24); expect(result.fragments[4].duration).to.equal(6); expect(result.fragments[4].url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/frag(5)/video/107/282/chop/segment-5.ts' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/frag(5)/video/107/282/chop/segment-5.ts', ); }); @@ -495,7 +495,7 @@ chop/segment-5.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.totalduration).to.equal(51.24); expect(result.startSN).to.equal(0); @@ -525,7 +525,7 @@ oceans_aes-audio=65000-video=236000-3.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.totalduration).to.equal(25); expect(result.startSN).to.equal(1); @@ -537,11 +537,11 @@ oceans_aes-audio=65000-video=236000-3.ts expect(result.fragments[0].title).to.equal('no desc'); expect(result.fragments[0].level).to.equal(0); expect(result.fragments[0].url).to.equal( - 'http://foo.com/adaptive/oceans_aes/oceans_aes-audio=65000-video=236000-1.ts' + 'http://foo.com/adaptive/oceans_aes/oceans_aes-audio=65000-video=236000-1.ts', ); expectWithJSONMessage( result.fragments[0].levelkeys?.['com.apple.streamingkeydelivery'], - 'levelkeys' + 'levelkeys', ).to.deep.include({ uri: 'skd://assetid?keyId=1234', method: 'AES-128', @@ -574,7 +574,7 @@ oceans_aes-audio=65000-video=236000-3.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.totalduration).to.equal(25); expect(result.startSN).to.equal(1); @@ -586,10 +586,10 @@ oceans_aes-audio=65000-video=236000-3.ts expect(result.fragments[0].title).to.equal('no desc'); expect(result.fragments[0].level).to.equal(0); expect(result.fragments[0].url).to.equal( - 'http://foo.com/adaptive/oceans_aes/oceans_aes-audio=65000-video=236000-1.ts' + 'http://foo.com/adaptive/oceans_aes/oceans_aes-audio=65000-video=236000-1.ts', ); expect(result.fragments[0].decryptdata?.uri).to.equal( - 'http://foo.com/adaptive/oceans_aes/oceans.key' + 'http://foo.com/adaptive/oceans_aes/oceans.key', ); expect(result.fragments[0].decryptdata?.method).to.equal('AES-128'); let sn = 1; @@ -599,7 +599,7 @@ oceans_aes-audio=65000-video=236000-3.ts } expect(result.fragments[0].decryptdata?.iv?.buffer).to.deep.equal( - uint8View.buffer + uint8View.buffer, ); sn = 3; @@ -609,7 +609,7 @@ oceans_aes-audio=65000-video=236000-3.ts } expect(result.fragments[2].decryptdata?.iv?.buffer).to.deep.equal( - uint8View.buffer + uint8View.buffer, ); }); @@ -656,7 +656,7 @@ lo008ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(10); expect(result.fragments[0].url).to.equal('http://dummy.com/lo007ts'); @@ -712,7 +712,7 @@ lo008ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(10); expect(result.fragments[0].url).to.equal('http://dummy.com/lo007ts'); @@ -747,7 +747,7 @@ lo007ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(3); expect(result.fragments[0].url).to.equal('http://dummy.com/lo007ts'); @@ -784,7 +784,7 @@ lo007ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(5); expect(result.totalduration).to.equal(45); @@ -818,7 +818,7 @@ lo007ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(5); expect(result.totalduration).to.equal(45); @@ -842,7 +842,7 @@ lo007ts`; startTimeOffset: null, variableList: null, hasVariableRefs: false, - } + }, ); expect(result.length).to.equal(1); expect(result[0].autoselect).to.be.true; @@ -852,7 +852,7 @@ lo007ts`; expect(result[0].lang).to.equal('eng'); expect(result[0].name).to.equal('Audio'); expect(result[0].url).to.equal( - 'https://hls.ted.com/videos/ZakEbrahim_2014/audio/600k.m3u8?qr=true&preroll=Blank' + 'https://hls.ted.com/videos/ZakEbrahim_2014/audio/600k.m3u8?qr=true&preroll=Blank', ); }); // issue #425 - first fragment has null url and no decryptdata if EXT-X-KEY follows EXTINF @@ -885,7 +885,7 @@ lo007ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(8); expect(result.totalduration).to.equal(80); @@ -950,25 +950,25 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719935.ts`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(10); expect(result.totalduration).to.equal(84.94); expect(result.targetduration).to.equal(10); expect(result.fragments[0].url).to.equal( - 'http://dummy.url.com/hls/live/segment/segment_022916_164500865_719926.ts' + 'http://dummy.url.com/hls/live/segment/segment_022916_164500865_719926.ts', ); expect(result.fragments[0].tagList).to.have.lengthOf(1); expect(result.fragments[2].tagList[0][0]).to.equal('EXT-X-CUE-OUT'); expect(result.fragments[2].tagList[0][1]).to.equal( - 'DURATION=150,BREAKID=0x0' + 'DURATION=150,BREAKID=0x0', ); expect(result.fragments[3].tagList[0][1]).to.equal('0.50'); expect(result.fragments[4].tagList).to.have.lengthOf(2); expect(result.fragments[4].tagList[0][0]).to.equal('EXT-X-CUE-IN'); expect(result.fragments[7].tagList[0][0]).to.equal('INF'); expect(result.fragments[8].url).to.equal( - 'http://dummy.url.com/hls/live/segment/segment_022916_164500865_719934.ts' + 'http://dummy.url.com/hls/live/segment/segment_022916_164500865_719934.ts', ); }); @@ -993,21 +993,21 @@ Rollover38803/20160525T064049-01-69844069.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(3); expect(result.hasProgramDateTime).to.be.true; expect(result.totalduration).to.equal(30); expect(result.fragments[0].url).to.equal( - 'http://video.example.com/Rollover38803/20160525T064049-01-69844067.ts' + 'http://video.example.com/Rollover38803/20160525T064049-01-69844067.ts', ); expect(result.fragments[0].programDateTime).to.equal(1464366884000); expect(result.fragments[1].url).to.equal( - 'http://video.example.com/Rollover38803/20160525T064049-01-69844068.ts' + 'http://video.example.com/Rollover38803/20160525T064049-01-69844068.ts', ); expect(result.fragments[1].programDateTime).to.equal(1464366894000); expect(result.fragments[2].url).to.equal( - 'http://video.example.com/Rollover38803/20160525T064049-01-69844069.ts' + 'http://video.example.com/Rollover38803/20160525T064049-01-69844069.ts', ); expect(result.fragments[2].programDateTime).to.equal(1464366904000); }); @@ -1026,7 +1026,7 @@ Rollover38803/20160525T064049-01-69844069.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments).to.have.lengthOf(1); expect(result.fragments[0].duration).to.equal(0.36); @@ -1049,11 +1049,11 @@ main.mp4`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); const initSegment = result.fragments[0].initSegment; expect(initSegment?.url).to.equal( - 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/main.mp4' + 'http://proxy-62.dailymotion.com/sec(3ae40f708f79ca9471f52b86da76a3a8)/video/107/282/main.mp4', ); expect(initSegment?.byteRangeStartOffset).to.equal(0); expect(initSegment?.byteRangeEndOffset).to.equal(718); @@ -1081,14 +1081,14 @@ frag2.mp4 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments[0].initSegment?.url).to.equal( - 'http://video.example.com/main.mp4' + 'http://video.example.com/main.mp4', ); expect(result.fragments[0].initSegment?.sn).to.equal('initSegment'); expect(result.fragments[1].initSegment?.url).to.equal( - 'http://video.example.com/alt.mp4' + 'http://video.example.com/alt.mp4', ); expect(result.fragments[1].initSegment?.sn).to.equal('initSegment'); }); @@ -1115,19 +1115,19 @@ Rollover38803/20160525T064049-01-69844069.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.true; expect(result.fragments[0].rawProgramDateTime).to.equal( - '2016-05-27T16:34:44Z' + '2016-05-27T16:34:44Z', ); expect(result.fragments[0].programDateTime).to.equal(1464366884000); expect(result.fragments[1].rawProgramDateTime).to.equal( - '2016-05-27T16:34:54Z' + '2016-05-27T16:34:54Z', ); expect(result.fragments[1].programDateTime).to.equal(1464366894000); expect(result.fragments[2].rawProgramDateTime).to.equal( - '2016-05-27T16:35:04Z' + '2016-05-27T16:35:04Z', ); expect(result.fragments[2].programDateTime).to.equal(1464366904000); }); @@ -1149,11 +1149,11 @@ frag2.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.true; expect(result.fragments[2].rawProgramDateTime).to.equal( - '2016-05-27T16:35:04Z' + '2016-05-27T16:35:04Z', ); expect(result.fragments[1].programDateTime).to.equal(1464366894000); expect(result.fragments[0].programDateTime).to.equal(1464366884000); @@ -1176,11 +1176,11 @@ frag2.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.true; expect(result.fragments[0].rawProgramDateTime).to.equal( - '2016-05-27T16:35:04Z' + '2016-05-27T16:35:04Z', ); expect(result.fragments[1].programDateTime).to.equal(1464366914000); expect(result.fragments[2].programDateTime).to.equal(1464366924000); @@ -1215,22 +1215,22 @@ frag5.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.true; expect(result.fragments[0].programDateTime).to.equal(1464366904000); expect(result.fragments[0].rawProgramDateTime).to.equal( - '2016-05-27T16:35:04Z' + '2016-05-27T16:35:04Z', ); expect(result.fragments[1].programDateTime).to.equal(1464366914000); expect(result.fragments[2].programDateTime).to.equal(1495902904000); expect(result.fragments[2].rawProgramDateTime).to.equal( - '2017-05-27T16:35:04Z' + '2017-05-27T16:35:04Z', ); expect(result.fragments[3].programDateTime).to.equal(1495902914000); expect(result.fragments[4].programDateTime).to.equal(1432726923000); expect(result.fragments[4].rawProgramDateTime).to.equal( - '2015-05-27T11:42:03Z' + '2015-05-27T11:42:03Z', ); expect(result.fragments[5].programDateTime).to.equal(1432726933000); }); @@ -1250,11 +1250,11 @@ frag1.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.true; expect(result.fragments[0].rawProgramDateTime).to.equal( - '2016-05-27T16:35:04Z' + '2016-05-27T16:35:04Z', ); expect(result.fragments[0].programDateTime).to.equal(1464366904000); }); @@ -1273,7 +1273,7 @@ frag1.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.hasProgramDateTime).to.be.false; expect(result.fragments[0].rawProgramDateTime).to.not.exist; @@ -1325,7 +1325,7 @@ fileSequence1151233.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.canBlockReload).to.be.true; expect(details.canSkipUntil).to.equal(24); @@ -1347,7 +1347,7 @@ fileSequence1151226.ts`, 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.canSkipUntil).to.equal(20); expect(details.holdBack).to.equal(15.1); @@ -1365,7 +1365,7 @@ fileSequence1151226.ts`, 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.partTarget).to.equal(1.004); }); @@ -1377,7 +1377,7 @@ fileSequence1151226.ts`, 0, PlaylistLevelType.MAIN, 0, - null + null, ); // TODO: Partial Segments for a yet to be appended EXT-INF entry will be added to the fragments list // once PartLoader is implemented to abstract away part loading complexity using progressive loader events @@ -1457,7 +1457,7 @@ fileSequence1151226.ts`, 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.preloadHint).to.be.an('object'); expect(details.preloadHint).to.deep.include({ @@ -1473,7 +1473,7 @@ fileSequence1151226.ts`, 0, PlaylistLevelType.MAIN, 0, - null + null, ); const renditionReports = details.renditionReports as AttrList[]; expect(renditionReports).to.be.an('array').which.has.lengthOf(2); @@ -1525,7 +1525,7 @@ fileSequence81641.m4s 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.skippedSegments).to.equal(9); expect(details.recentlyRemovedDateranges).to.deep.equal(['DrTag', 'tdl']); @@ -1565,7 +1565,7 @@ fileSequence2.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); const fragments = details.fragments as Fragment[]; expectWithJSONMessage(fragments[0].tagList).to.deep.equal([ @@ -1602,7 +1602,7 @@ fileSequence2.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); const fragments = details.fragments as Fragment[]; expectWithJSONMessage(fragments[0].tagList).to.deep.equal([ @@ -1644,7 +1644,7 @@ main4.aac 0, PlaylistLevelType.MAIN, 0, - null + null, ); expectWithJSONMessage(details.fragments[0].tagList).to.deep.equal([ ['PROGRAM-DATE-TIME', '2018-09-28T16:50:26Z'], @@ -1692,7 +1692,7 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments[2].tagList[0][0]).to.equal('EXT-X-CUSTOM-DATE'); expect(result.fragments[2].tagList[0][1]).to.equal('2016-05-27T16:34:44Z'); @@ -1700,7 +1700,7 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts expect(result.fragments[2].tagList[1][1]).to.equal('{"key":"value"}'); expect(result.fragments[2].tagList[2][0]).to.equal('EXT-X-CUSTOM-URI'); expect(result.fragments[2].tagList[2][1]).to.equal( - 'http://dummy.url.com/hls/moreinfo.json' + 'http://dummy.url.com/hls/moreinfo.json', ); }); @@ -1722,16 +1722,16 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(2); expect(result.totalduration).to.equal(12.012); expect(result.targetduration).to.equal(7); expect(result.fragments[0].url).to.equal( - 'http://dummy.url.com/180724_Allison VLOG-v3_00001.ts' + 'http://dummy.url.com/180724_Allison VLOG-v3_00001.ts', ); expect(result.fragments[1].url).to.equal( - 'http://dummy.url.com/180724_Allison VLOG-v3_00002.ts' + 'http://dummy.url.com/180724_Allison VLOG-v3_00002.ts', ); }); @@ -1754,16 +1754,16 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(2); expect(result.totalduration).to.equal(12.012); expect(result.targetduration).to.equal(7); expect(result.fragments[0].url).to.equal( - 'http://dummy.url.com/180724_Allison VLOG v3_00001.ts' + 'http://dummy.url.com/180724_Allison VLOG v3_00001.ts', ); expect(result.fragments[1].url).to.equal( - 'http://dummy.url.com/180724_Allison VLOG v3_00002.ts' + 'http://dummy.url.com/180724_Allison VLOG v3_00002.ts', ); }); @@ -1834,7 +1834,7 @@ media_1638278.m4s`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(22); let pdt = 1636514824000; @@ -1888,15 +1888,15 @@ media_1638278.m4s`; 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(result.fragments.length).to.equal(8); expect(result.fragments[0].levelkeys, 'first segment has no keys').to.equal( - undefined + undefined, ); expect( result.fragments[1].levelkeys, - 'second segment has no keys' + 'second segment has no keys', ).to.equal(undefined); expect(result.fragments[2].levelkeys, 'third segment has two keys') .to.be.an('object') @@ -1911,10 +1911,10 @@ media_1638278.m4s`; 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', ]); expect(result.fragments[4].levelkeys, 'fifth segment has no keys').to.equal( - undefined + undefined, ); expect(result.fragments[5].levelkeys, 'sixth segment has no keys').to.equal( - undefined + undefined, ); expect(result.fragments[6].levelkeys, 'seventh segment has two keys') .to.be.an('object') @@ -2062,7 +2062,7 @@ describe('#EXT-X-DEFINE', function () { .with.property('message') .which.equals( 'EXT-X-DEFINE duplicate Variable Name declarations: "foo"', - result.playlistParsingError?.message + result.playlistParsingError?.message, ); }); @@ -2094,7 +2094,7 @@ describe('#EXT-X-DEFINE', function () { const result = M3U8Parser.parseMasterPlaylist( manifest, - 'https://www.x.com' + 'https://www.x.com', ); if (result.variableList === null) { @@ -2114,11 +2114,11 @@ describe('#EXT-X-DEFINE', function () { return; } expect(result.sessionKeys[0].keyFormat).to.equal( - 'com.apple.streamingkeydelivery' + 'com.apple.streamingkeydelivery', ); expect(result.sessionKeys[0].keyFormatVersions).to.deep.equal([1, 2]); expect(result.sessionKeys[0].iv).to.deep.equal( - new Uint8Array([0, 0, 0, 2]) + new Uint8Array([0, 0, 0, 2]), ); expect(result.contentSteering).to.deep.include({ @@ -2132,7 +2132,7 @@ describe('#EXT-X-DEFINE', function () { url: 'https://example.com/sec/video/1.m3u8', videoCodec: 'avc1.64001f', }, - JSON.stringify(result.levels[0], null, 2) + JSON.stringify(result.levels[0], null, 2), ); expect(result.levels[1]).to.deep.include( @@ -2141,13 +2141,13 @@ describe('#EXT-X-DEFINE', function () { url: 'https://example.com/sec/avc1.64001f/2.m3u8', videoCodec: 'avc1.64001f', }, - JSON.stringify(result.levels[0], null, 2) + JSON.stringify(result.levels[0], null, 2), ); const { AUDIO: audioTracks = [] } = M3U8Parser.parseMasterPlaylistMedia( manifest, 'https://www.x.com', - result + result, ); expect(audioTracks[0]).to.deep.include( @@ -2156,7 +2156,7 @@ describe('#EXT-X-DEFINE', function () { lang: 'eng', url: 'https://example.com/200k.m3u8', }, - JSON.stringify(audioTracks[0], null, 2) + JSON.stringify(audioTracks[0], null, 2), ); }); @@ -2202,7 +2202,7 @@ a{$mvpVariable}.mp4 0, PlaylistLevelType.MAIN, 0, - { mvpVariable: 'ok' } + { mvpVariable: 'ok' }, ); if (details.variableList === null) { expect(details.variableList, 'variableList').to.not.equal(null); @@ -2224,7 +2224,7 @@ a{$mvpVariable}.mp4 expect(details.fragments).to.have.lengthOf(7); expect(details.fragments[3].title).to.equal( 'no desc {$mvpVariable}', - 'does not substitute vars in segment "title"' + 'does not substitute vars in segment "title"', ); expect(details.fragments[3]).to.deep.include({ relurl: 'aok.mp4', @@ -2256,7 +2256,7 @@ a{$mvpVariable}.mp4 }); expectWithJSONMessage( details.fragments[3].levelkeys?.['com.apple.streamingkeydelivery'], - 'levelkeys' + 'levelkeys', ).to.deep.include({ uri: 'skd://key-data', method: 'SAMPLE-AES', @@ -2300,7 +2300,7 @@ https://www.x.com/sec/video/2.m3u8?parent-token={$token}`; const result = M3U8Parser.parseMasterPlaylist( manifest, - 'https://www.x.com?foo=bar&a=ok&token=1234' + 'https://www.x.com?foo=bar&a=ok&token=1234', ); if (result.variableList === null) { @@ -2320,13 +2320,13 @@ https://www.x.com/sec/video/2.m3u8?parent-token={$token}`; { url: 'https://www.x.com/sec/video/1.m3u8?parent-token=1234', }, - JSON.stringify(result.levels[0], null, 2) + JSON.stringify(result.levels[0], null, 2), ); expect(result.levels[1]).to.deep.include( { url: 'https://www.x.com/sec/video/2.m3u8?parent-token=1234', }, - JSON.stringify(result.levels[0], null, 2) + JSON.stringify(result.levels[0], null, 2), ); const level = `#EXTM3U #EXT-X-VERSION:1 @@ -2347,7 +2347,7 @@ segment-3.mp4?t={$token}`; 0, PlaylistLevelType.MAIN, 0, - result.variableList + result.variableList, ); if (details.variableList === null) { expect(details.variableList, 'variableList').to.not.equal(null); @@ -2389,7 +2389,7 @@ a{$mvpVar}.mp4 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.variableList).to.equal(null); expect(details) @@ -2398,7 +2398,7 @@ a{$mvpVar}.mp4 .which.has.property('message') .which.equals( 'EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "mvpVar"', - details.playlistParsingError?.message + details.playlistParsingError?.message, ); expect(details.fragments[0].relurl).to.equal('a{$mvpVar}.mp4'); }); @@ -2420,7 +2420,7 @@ a{$bar}.mp4 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.variableList, 'variableList').to.equal(null); expect(details) @@ -2429,7 +2429,7 @@ a{$bar}.mp4 .which.has.property('message') .which.equals( 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "bar"', - details.playlistParsingError?.message + details.playlistParsingError?.message, ); expect(details.fragments?.[0].relurl).to.equal('a{$bar}.mp4'); }); @@ -2452,7 +2452,7 @@ a{$bar}.mp4 0, PlaylistLevelType.MAIN, 0, - null + null, ); expect(details.variableList, 'variableList').to.deep.equal({ bar: '1' }); expect(details) @@ -2461,7 +2461,7 @@ a{$bar}.mp4 .which.has.property('message') .which.equals( 'Missing preceding EXT-X-DEFINE tag for Variable Reference: "bar"', - details.playlistParsingError?.message + details.playlistParsingError?.message, ); expect(details.fragments[0].relurl).to.equal('a{$bar}.mp4'); }); diff --git a/tests/unit/utils/attr-list.js b/tests/unit/utils/attr-list.js index bd22a7f8c..d6707357b 100644 --- a/tests/unit/utils/attr-list.js +++ b/tests/unit/utils/attr-list.js @@ -33,28 +33,28 @@ describe('AttrList', function () { it('parses valid hexadecimalInteger attribute', function () { expect(new AttrList('HEX=0x42').hexadecimalIntegerAsNumber('HEX')).to.equal( - 0x42 + 0x42, ); expect(new AttrList('HEX=0X42').hexadecimalIntegerAsNumber('HEX')).to.equal( - 0x42 + 0x42, ); expect(new AttrList('HEX=0x0').hexadecimalIntegerAsNumber('HEX')).to.equal( - 0 + 0, ); expect( - new AttrList('HEX="0x42"').hexadecimalIntegerAsNumber('HEX') + new AttrList('HEX="0x42"').hexadecimalIntegerAsNumber('HEX'), ).to.equal(0x42); }); it('parses valid decimalFloatingPoint attribute', function () { expect(new AttrList('FLOAT=0.42').decimalFloatingPoint('FLOAT')).to.equal( - 0.42 + 0.42, ); expect(new AttrList('FLOAT=-0.42').decimalFloatingPoint('FLOAT')).to.equal( - -0.42 + -0.42, ); expect(new AttrList('FLOAT=0').decimalFloatingPoint('FLOAT')).to.equal(0); expect(new AttrList('FLOAT="0.42"').decimalFloatingPoint('FLOAT')).to.equal( - 0.42 + 0.42, ); }); it('parses valid quotedString attribute', function () { @@ -74,7 +74,7 @@ describe('AttrList', function () { expect(new AttrList('ENUM=1').enumeratedString('ENUM')).to.equal('1'); expect(new AttrList('ENUM=A=B').enumeratedString('ENUM')).to.equal('A=B'); expect(new AttrList('ENUM=A=B=C').enumeratedString('ENUM')).to.equal( - 'A=B=C' + 'A=B=C', ); const list = new AttrList('ENUM1=A=B=C,ENUM2=42'); expect(list.enumeratedString('ENUM1')).to.equal('A=B=C'); @@ -90,7 +90,7 @@ describe('AttrList', function () { height: 0, }); expect( - new AttrList('RES="400x200"').decimalResolution('RES') + new AttrList('RES="400x200"').decimalResolution('RES'), ).to.deep.equal({ width: 400, height: 200 }); }); it('handles invalid decimalResolution attribute', function () { @@ -105,7 +105,7 @@ describe('AttrList', function () { it('parses multiple attributes', function () { const list = new AttrList( - 'INT=42,HEX=0x42,FLOAT=0.42,STRING="hi",ENUM=OK,RES=4x2' + 'INT=42,HEX=0x42,FLOAT=0.42,STRING="hi",ENUM=OK,RES=4x2', ); expect(list.decimalInteger('INT')).to.equal(42); expect(list.hexadecimalIntegerAsNumber('HEX')).to.equal(0x42); @@ -132,7 +132,7 @@ describe('AttrList', function () { it('parses dashed attribute names', function () { const list = new AttrList( - 'INT-VALUE=42,H-E-X=0x42,-FLOAT=0.42,STRING-="hi",ENUM=OK' + 'INT-VALUE=42,H-E-X=0x42,-FLOAT=0.42,STRING-="hi",ENUM=OK', ); expect(list.decimalInteger('INT-VALUE')).to.equal(42); expect(list.hexadecimalIntegerAsNumber('H-E-X')).to.equal(0x42); @@ -144,25 +144,25 @@ describe('AttrList', function () { it('handles hexadecimalInteger conversions', function () { const list = new AttrList( - 'HEX1=0x0123456789abcdef0123456789abcdef,HEX2=0x123,HEX3=0x0' + 'HEX1=0x0123456789abcdef0123456789abcdef,HEX2=0x123,HEX3=0x0', ); expect(list.hexadecimalInteger('HEX1').buffer).to.deep.equal( new Uint8Array([ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, - ]).buffer + ]).buffer, ); expect(list.hexadecimalInteger('HEX2').buffer).to.deep.equal( - new Uint8Array([0x01, 0x23]).buffer + new Uint8Array([0x01, 0x23]).buffer, ); expect(list.hexadecimalInteger('HEX3').buffer).to.deep.equal( - new Uint8Array([0x0]).buffer + new Uint8Array([0x0]).buffer, ); }); it('returns infinity on large number conversions', function () { const list = new AttrList( - 'VAL=12345678901234567890,HEX=0x0123456789abcdef0123456789abcdef' + 'VAL=12345678901234567890,HEX=0x0123456789abcdef0123456789abcdef', ); expect(list.decimalInteger('VAL')).to.equal(Infinity); expect(list.hexadecimalIntegerAsNumber('HEX')).to.equal(Infinity); diff --git a/tests/unit/utils/binary-search.js b/tests/unit/utils/binary-search.js index 30c20b513..c440851b3 100644 --- a/tests/unit/utils/binary-search.js +++ b/tests/unit/utils/binary-search.js @@ -23,7 +23,7 @@ describe('binary search util', function () { const item = list[i]; const foundItem = BinarySearch.search( list, - buildComparisonFunction(item) + buildComparisonFunction(item), ); expect(foundItem).to.equal(item); } @@ -32,7 +32,7 @@ describe('binary search util', function () { const item = 1000; const foundItem = BinarySearch.search( list, - buildComparisonFunction(item) + buildComparisonFunction(item), ); expect(foundItem).to.not.exist; }); diff --git a/tests/unit/utils/buffer-helper.js b/tests/unit/utils/buffer-helper.js index 22793b47d..3448ad46a 100644 --- a/tests/unit/utils/buffer-helper.js +++ b/tests/unit/utils/buffer-helper.js @@ -89,7 +89,7 @@ describe('BufferHelper', function () { }; const maxHoleDuration = 0; expect( - BufferHelper.bufferInfo(invalidMedia, 0, maxHoleDuration) + BufferHelper.bufferInfo(invalidMedia, 0, maxHoleDuration), ).to.deep.equal({ len: 0, start: 0, @@ -124,7 +124,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 0; expect( - BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration), ).to.deep.equal({ len: 0.5, start: 0, @@ -132,7 +132,7 @@ describe('BufferHelper', function () { nextStart: 1, }); expect( - BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration), ).to.deep.equal({ len: 0, start: 0.5, @@ -140,7 +140,7 @@ describe('BufferHelper', function () { nextStart: 1, }); expect( - BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration), ).to.deep.equal({ len: 1, start: 1, @@ -148,7 +148,7 @@ describe('BufferHelper', function () { nextStart: undefined, }); expect( - BufferHelper.bufferedInfo(buffered, 1.5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 1.5, maxHoleDuration), ).to.deep.equal({ len: 0.5, start: 1, @@ -171,7 +171,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 0.5; expect( - BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration), ).to.deep.equal({ len: 0.5, start: 0, @@ -182,7 +182,7 @@ describe('BufferHelper', function () { // |////////|________|////////////////| // 0 0.5 - M - 1 2 expect( - BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration), ).to.deep.equal({ len: 1.5, start: 1, @@ -190,7 +190,7 @@ describe('BufferHelper', function () { nextStart: undefined, }); expect( - BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration), ).to.deep.equal({ len: 1, start: 1, @@ -198,7 +198,7 @@ describe('BufferHelper', function () { nextStart: undefined, }); expect( - BufferHelper.bufferedInfo(buffered, 2, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 2, maxHoleDuration), ).to.deep.equal({ len: 0, start: 2, @@ -221,7 +221,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 0.5; expect( - BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration), ).to.deep.equal({ len: 0.5, start: 0, @@ -244,7 +244,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 1; expect( - BufferHelper.bufferedInfo(buffered, 0.8, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0.8, maxHoleDuration), ).to.deep.equal({ len: 1.2, start: 0, @@ -268,7 +268,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 0.5; expect( - BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration), ).to.deep.equal({ len: 0.5, start: 0, @@ -289,7 +289,7 @@ describe('BufferHelper', function () { ]; const maxHoleDuration = 0; expect( - BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration), ).to.deep.equal({ len: 0, start: 5, @@ -301,7 +301,7 @@ describe('BufferHelper', function () { const buffered = []; const maxHoleDuration = 0; expect( - BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration) + BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration), ).to.deep.equal({ len: 0, start: 5, diff --git a/tests/unit/utils/discontinuities.ts b/tests/unit/utils/discontinuities.ts index 1dbe87068..f7c8fc131 100644 --- a/tests/unit/utils/discontinuities.ts +++ b/tests/unit/utils/discontinuities.ts @@ -182,8 +182,8 @@ describe('discontinuities', function () { `actual:\n\n${JSON.stringify( lastLevel.details, null, - 2 - )}\n\nexpected\n\n${JSON.stringify(detailsExpected, null, 2)}` + 2, + )}\n\nexpected\n\n${JSON.stringify(detailsExpected, null, 2)}`, ).to.deep.equal(detailsExpected); }); @@ -437,7 +437,7 @@ describe('discontinuities', function () { const expected = undefined; const actual = findDiscontinuousReferenceFrag( objToLevelDetails({ fragments: [] }), - objToLevelDetails({ fragments: mockFrags }) + objToLevelDetails({ fragments: mockFrags }), ); expect(actual).to.equal(expected); }); @@ -446,7 +446,7 @@ describe('discontinuities', function () { const expected = undefined; const actual = findDiscontinuousReferenceFrag( objToLevelDetails({ fragments: [{ cc: 10 }].map(objToFragment) }), - objToLevelDetails({ fragments: mockFrags }) + objToLevelDetails({ fragments: mockFrags }), ); expect(actual).to.equal(expected); }); @@ -455,7 +455,7 @@ describe('discontinuities', function () { const expected = undefined; const actual = findDiscontinuousReferenceFrag( objToLevelDetails({ fragments: [{ cc: 0 }].map(objToFragment) }), - objToLevelDetails({ fragments: [] }) + objToLevelDetails({ fragments: [] }), ); expect(actual).to.equal(expected); }); @@ -488,7 +488,7 @@ describe('discontinuities', function () { const actual = shouldAlignOnDiscontinuities( lastFrag, lastLevel, - curDetails + curDetails, ); expect(actual).to.be.true; }); @@ -508,7 +508,7 @@ describe('discontinuities', function () { const actual = shouldAlignOnDiscontinuities( lastFrag, lastLevel, - curDetails + curDetails, ); expect(actual).to.be.false; }); @@ -526,7 +526,7 @@ describe('discontinuities', function () { const actual = shouldAlignOnDiscontinuities( lastFrag, lastLevel, - curDetails + curDetails, ); expect(actual).to.be.false; }); diff --git a/tests/unit/utils/output-filter.js b/tests/unit/utils/output-filter.js index 87250a05d..9ade0879b 100644 --- a/tests/unit/utils/output-filter.js +++ b/tests/unit/utils/output-filter.js @@ -32,7 +32,7 @@ describe('OutputFilter', function () { 1, 0, 1, - lastScreen + lastScreen, ); }); @@ -47,7 +47,7 @@ describe('OutputFilter', function () { 1, 0, 4, - lastScreen + lastScreen, ); }); diff --git a/tests/unit/utils/vttparser.ts b/tests/unit/utils/vttparser.ts index 72b3c2ebe..9d2e08b1a 100644 --- a/tests/unit/utils/vttparser.ts +++ b/tests/unit/utils/vttparser.ts @@ -10,7 +10,7 @@ describe('VTTParser', function () { function assertTimeStampValue(timestamp, value) { expect(parseTimeStamp(timestamp)).to.eq( value, - `"${timestamp}" should equal ${value}` + `"${timestamp}" should equal ${value}`, ); } it('should parse fractional seconds correctly regardless of length', function () { diff --git a/tools/mp4-inspect.js b/tools/mp4-inspect.js index cf803c9b9..4dad9167e 100644 --- a/tools/mp4-inspect.js +++ b/tools/mp4-inspect.js @@ -49,7 +49,7 @@ var // this is the start of a huge multi-line var decl var avcView = new DataView( avcStream.buffer, avcStream.byteOffset, - avcStream.byteLength + avcStream.byteLength, ), result = [], i, @@ -124,7 +124,7 @@ var // this is the start of a huge multi-line var decl nalSize = view.getUint16(offset); offset += 2; result.sps.push( - new Uint8Array(data.subarray(offset, offset + nalSize)) + new Uint8Array(data.subarray(offset, offset + nalSize)), ); offset += nalSize; } @@ -135,7 +135,7 @@ var // this is the start of a huge multi-line var decl nalSize = view.getUint16(offset); offset += 2; result.pps.push( - new Uint8Array(data.subarray(offset, offset + nalSize)) + new Uint8Array(data.subarray(offset, offset + nalSize)), ); offset += nalSize; }