From b022db8f10d61aeea02a43168b0d00378051b879 Mon Sep 17 00:00:00 2001 From: Nfrederiksen Date: Fri, 27 Oct 2023 15:11:15 +0200 Subject: [PATCH 1/7] chore: first version of seperate fn for audio increment + unit tests --- engine/session.js | 83 ++++++++++++++++++---------------- spec/engine/session_spec.js | 88 +++++++++++++++++++++++++++++++++---- 2 files changed, 126 insertions(+), 45 deletions(-) diff --git a/engine/session.js b/engine/session.js index c16e9640..eb0023c8 100644 --- a/engine/session.js +++ b/engine/session.js @@ -836,45 +836,19 @@ class Session { sessionState.vodMediaSeqVideo = await this._sessionState.increment("vodMediaSeqVideo", 1); let audioIncrement; if (this.use_demuxed_audio) { - let positionV = 0; - let positionA = 0; - const position = (await this._getCurrentPlayheadPosition()) * 1000; - positionV = position ? position / 1000 : 0; - let currentVod = await this._sessionState.getCurrentVod(); - const sessionState = await this._sessionState.getValues(["vodMediaSeqAudio"]); - let posDiff; - let incrementValue = 1; - let index = 0; + const playheadPosVideo = (await this._getCurrentPlayheadPosition()) * 1000; const audioSeqLastIdx = currentVod.getLiveMediaSequencesCount("audio") - 1; - const thresh = 0.5; - const maxAcceptableDiff = 0.001; - debug(`[${this._sessionId}]: About to determine audio increment`); - do { - const audioPosition = (await this._getAudioPlayheadPosition(sessionState.vodMediaSeqAudio + index)) * 1000; - positionA = audioPosition ? audioPosition / 1000 : 0; - posDiff = (positionV - positionA).toFixed(3); - debug(`[${this._sessionId}]: positionV=${positionV};positionA=${positionA};posDiff=${posDiff}`); - if (posDiff <= maxAcceptableDiff) { - break; - } - if (posDiff > thresh) { - index++; - incrementValue++; - } else if (posDiff > maxAcceptableDiff) { - index = incrementValue; - debug(`[${this._sessionId}]: Audio Stepping index set to = ${index}`); - break; - } - if (sessionState.vodMediaSeqAudio + index > audioSeqLastIdx) { - break; - } - } while (!(-thresh < posDiff && posDiff < thresh) && !isNaN(posDiff)); - audioIncrement = index; - debug(`[${this._sessionId}]: Current VOD Playhead Positions are to be: [${positionV.toFixed(3)}][${positionA.toFixed(3)}] (${posDiff})`); + const _sessionState = await this._sessionState.getValues(["vodMediaSeqAudio"]); + audioIncrement = await this._determineAudioIncrement( + playheadPosVideo, + audioSeqLastIdx, + sessionState.vodMediaSeqAudio, + this._getAudioPlayheadPosition.bind(this) + ); + // Perform the Increment + debug(`[${this._sessionId}]: Will increment audio with ${audioIncrement}`); + sessionState.vodMediaSeqAudio = await this._sessionState.increment("vodMediaSeqAudio", audioIncrement); } - debug(`[${this._sessionId}]: Will increment audio with ${audioIncrement}`); - sessionState.vodMediaSeqAudio = await this._sessionState.increment("vodMediaSeqAudio", audioIncrement); - if (this.use_vtt_subtitles) { debug(`[${this._sessionId}]: Will increment subtitle with 1`); sessionState.vodMediaSeqSubtitle = await this._sessionState.increment("vodMediaSeqSubtitle", 1); @@ -2089,6 +2063,41 @@ class Session { } return false; } + + async _determineAudioIncrement(_currentPosVideo, _audioSeqFinalIndex, _vodMediaSeqAudio, _getAudioPlayheadPositionAsyncFn) { + debug(`[${this._sessionId}]: About to determine audio increment. Video increment has already been executed.`); + let audioIncrement = 0; + let positionV = _currentPosVideo ? _currentPosVideo / 1000 : 0; + let positionA; + let posDiff; + const threshold = 0.250; + let currentIndex = 0; + + while (currentIndex < _audioSeqFinalIndex) { + const currentPosAudio = (await _getAudioPlayheadPositionAsyncFn(_vodMediaSeqAudio + currentIndex)) * 1000; + positionA = currentPosAudio ? currentPosAudio / 1000 : 0; + posDiff = (positionV - positionA).toFixed(3); + debug(`[${this._sessionId}]: positionV=${positionV};positionA=${positionA};posDiff=${posDiff}`); + if (isNaN(posDiff)) { + break; + } + if (positionA >= positionV) { + debug(`[${this._sessionId}]: positionA=${positionA} >= positionV=${positionV};IncrementValue=${currentIndex}`); + break; + } + const difference = Math.abs(posDiff); + if (difference > threshold && difference > Number.EPSILON) { + debug(`[${this._sessionId}]: Audio is too behind video. Incrementing...`); + currentIndex++; + } else { + debug(`[${this._sessionId}]: Difference(${difference}) is acceptable; IncrementValue=${currentIndex}`); + break; + } + } + audioIncrement = currentIndex; + debug(`[${this._sessionId}]: Current VOD Playhead Positions are to be: [${positionV.toFixed(3)}][${positionA.toFixed(3)}] (${posDiff})`); + return audioIncrement; + } } module.exports = Session; diff --git a/spec/engine/session_spec.js b/spec/engine/session_spec.js index 6ebeabdf..2f7eee0b 100644 --- a/spec/engine/session_spec.js +++ b/spec/engine/session_spec.js @@ -1,20 +1,92 @@ -const Session = require('../../engine/session.js'); +const Session = require("../../engine/session.js"); -const { SessionStateStore } = require('../../engine/session_state.js'); -const { PlayheadStateStore } = require('../../engine/playhead_state.js'); +const { SessionStateStore } = require("../../engine/session_state.js"); +const { PlayheadStateStore } = require("../../engine/playhead_state.js"); describe("Session", () => { let sessionLiveStore = undefined; beforeEach(() => { sessionLiveStore = { sessionStateStore: new SessionStateStore(), - playheadStateStore: new PlayheadStateStore() - }; + playheadStateStore: new PlayheadStateStore(), + }; }); it("creates a unique session ID", () => { - const id1 = new Session('dummy', null, sessionLiveStore).sessionId; - const id2 = new Session('dummy', null, sessionLiveStore).sessionId; + const id1 = new Session("dummy", null, sessionLiveStore).sessionId; + const id2 = new Session("dummy", null, sessionLiveStore).sessionId; expect(id1).not.toEqual(id2); }); -}); \ No newline at end of file + + fit("for demuxed, returns the appropriate audio increment value", async () => { + const session = new Session("dummy", null, sessionLiveStore); + const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. + const mockCurrentVideoPosition = 200.0 * 1000; // Video is 200s deep into its content. + const mockMseqAudio = 25; // current mseq for audio on vod, 25 out of 50. + const mock_getAudioPlayheadPosition = async (pos_n_current) => { + const mockPositions = [196.0, 199.84, 203.68, 207.52]; + return mockPositions[pos_n_current - mockMseqAudio]; + }; + const output = await session._determineAudioIncrement( + mockCurrentVideoPosition, + mockFinalAudioIdx, + mockMseqAudio, + mock_getAudioPlayheadPosition, + 24 + ); + expect(output).toBe(1); + }); + + fit("for demuxed, returns the appropriate audio increment value", async () => { + const session = new Session("dummy", null, sessionLiveStore); + const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. + const mockCurrentVideoPosition = 441.7599999999981697 * 1000; // Video is 200s deep into its content. + const mockMseqAudio = 25; // current mseq for audio on vod, 25 out of 50. + const mock_getAudioPlayheadPosition = async (pos_n_current) => { + const mockPositions = [437.919999999999, 441.75999999999897]; + return mockPositions[pos_n_current - mockMseqAudio]; + }; + const output = await session._determineAudioIncrement( + mockCurrentVideoPosition, + mockFinalAudioIdx, + mockMseqAudio, + mock_getAudioPlayheadPosition, + 24 + ); + expect(output).toBe(1); + }); + fit("for demuxed, returns the appropriate audio increment value", async () => { + const session = new Session("dummy", null, sessionLiveStore); + const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. + const mockCurrentVideoPosition = 3.840 * 8 * 1000; // Video is 200s deep into its content. + const mockMseqAudio = 5; // current mseq for audio on vod, 25 out of 50. + const mock_getAudioPlayheadPosition = async (pos_n_current) => { + const mockPositions = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52]; + return mockPositions[pos_n_current]; + }; + const output = await session._determineAudioIncrement( + mockCurrentVideoPosition, + mockFinalAudioIdx, + mockMseqAudio, + mock_getAudioPlayheadPosition + ); + expect(output).toBe(3); + }); + fit("for demuxed, returns the appropriate audio increment value", async () => { + const session = new Session("dummy", null, sessionLiveStore); + const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. + const mockCurrentVideoPosition = 14 * 1000; // Video is 200s deep into its content. + const mockMseqAudio = 0; // current mseq for audio on vod, 25 out of 50. + const mock_getAudioPlayheadPosition = async (pos_n_current) => { + const mockPositions = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52]; + return mockPositions[pos_n_current]; + }; + const output = await session._determineAudioIncrement( + mockCurrentVideoPosition, + mockFinalAudioIdx, + mockMseqAudio, + mock_getAudioPlayheadPosition + ); + expect(output).toBe(4); + }); +}); From c21f00690dc0dad22568bf94b71689de1120502d Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Wed, 1 Nov 2023 09:31:40 +0100 Subject: [PATCH 2/7] fix: HA demux audio incr not in sync --- engine/session.js | 85 +++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/engine/session.js b/engine/session.js index eb0023c8..faf30480 100644 --- a/engine/session.js +++ b/engine/session.js @@ -834,25 +834,51 @@ class Session { } } else { sessionState.vodMediaSeqVideo = await this._sessionState.increment("vodMediaSeqVideo", 1); - let audioIncrement; + let playheadPosVideoMs; + let playheadAudio; + let playheadSubtitle; + if (this.use_demuxed_audio || this.use_vtt_subtitles) { + playheadPosVideoMs = (await this._getCurrentPlayheadPosition()) * 1000; + } + if (this.use_demuxed_audio) { - const playheadPosVideo = (await this._getCurrentPlayheadPosition()) * 1000; const audioSeqLastIdx = currentVod.getLiveMediaSequencesCount("audio") - 1; - const _sessionState = await this._sessionState.getValues(["vodMediaSeqAudio"]); - audioIncrement = await this._determineAudioIncrement( - playheadPosVideo, + const sessionStateObj = await this._sessionState.getValues(["vodMediaSeqAudio"]); + playheadAudio = await this._determineExtraMediaIncrement( + "audio", + playheadPosVideoMs, audioSeqLastIdx, - sessionState.vodMediaSeqAudio, + sessionStateObj.vodMediaSeqAudio, this._getAudioPlayheadPosition.bind(this) ); // Perform the Increment - debug(`[${this._sessionId}]: Will increment audio with ${audioIncrement}`); - sessionState.vodMediaSeqAudio = await this._sessionState.increment("vodMediaSeqAudio", audioIncrement); + debug(`[${this._sessionId}]: Will increment audio with ${playheadAudio.increment}`); + sessionState.vodMediaSeqAudio = await this._sessionState.increment("vodMediaSeqAudio", playheadAudio.increment); } if (this.use_vtt_subtitles) { - debug(`[${this._sessionId}]: Will increment subtitle with 1`); - sessionState.vodMediaSeqSubtitle = await this._sessionState.increment("vodMediaSeqSubtitle", 1); + const playheadPosVideo = playheadPosVideo || (await this._getCurrentPlayheadPosition()) * 1000; + const subtitleSeqLastIdx = currentVod.getLiveMediaSequencesCount("subtitle") - 1; + const sessionStateObj = await this._sessionState.getValues(["vodMediaSeqSubtitle"]); + playheadSubtitle = await this._determineExtraMediaIncrement( + "subtitle", + playheadPosVideoMs, + subtitleSeqLastIdx, + sessionStateObj.vodMediaSeqSubtitle, + this._getSubtitlePlayheadPosition.bind(this) + ); + // Perform the Increment + debug(`[${this._sessionId}]: Will increment subtitle with ${playheadSubtitle.increment}`); + sessionState.vodMediaSeqSubtitle = await this._sessionState.increment("vodMediaSeqSubtitle", playheadSubtitle.increment); } + debug(`[${this._sessionId}]: Current VOD Playhead Positions are to be V[${(playheadPosVideoMs/1000).toFixed(3)}]${ + playheadAudio ? `A[${(playheadAudio.position).toFixed(3)}]` : "" + }${ + playheadSubtitle ? `S[${(playheadSubtitle.position).toFixed(3)})]` : "" + }${ + playheadAudio ? ` (${playheadAudio.diff})` : "" + }${ + playheadSubtitle ? ` (${playheadSubtitle.diff})` : "" + }`); } let newSessionState = {}; @@ -1362,6 +1388,7 @@ class Session { debug(`[${this._sessionId}]: ${currentVod.getDeltaTimes()}`); debug(`[${this._sessionId}]: playhead positions [V]=${currentVod.getPlayheadPositions("video")}`); debug(`[${this._sessionId}]: playhead positions [A]=${currentVod.getPlayheadPositions("audio")}`); + debug(`[${this._sessionId}]: playhead positions [S]=${currentVod.getPlayheadPositions("subtitle")}`); //debug(newVod); const updatedSessionState = await this._sessionState.setValues({ "mediaSeq": 0, @@ -1558,6 +1585,7 @@ class Session { debug(`[${this._sessionId}]: next VOD loaded (${newVod.getDeltaTimes()})`); debug(`[${this._sessionId}]: playhead positions [V]=${newVod.getPlayheadPositions("video")}`); debug(`[${this._sessionId}]: playhead positions [A]=${newVod.getPlayheadPositions("audio")}`); + debug(`[${this._sessionId}]: playhead positions [S]=${newVod.getPlayheadPositions("subtitle")}`); currentVod = newVod; debug(`[${this._sessionId}]: msequences=${currentVod.getLiveMediaSequencesCount()}; audio msequences=${currentVod.getLiveMediaSequencesCount("audio")}; subtitle msequences=${currentVod.getLiveMediaSequencesCount("subtitle")}`); sessionState.currentVod = await this._sessionState.setCurrentVod(currentVod, { ttl: currentVod.getDuration() * 1000 }); @@ -2064,39 +2092,38 @@ class Session { return false; } - async _determineAudioIncrement(_currentPosVideo, _audioSeqFinalIndex, _vodMediaSeqAudio, _getAudioPlayheadPositionAsyncFn) { - debug(`[${this._sessionId}]: About to determine audio increment. Video increment has already been executed.`); - let audioIncrement = 0; + async _determineExtraMediaIncrement(_extraType, _currentPosVideo, _extraSeqFinalIndex, _vodMediaSeqExtra, _getExtraPlayheadPositionAsyncFn) { + debug(`[${this._sessionId}]: About to determine ${_extraType} increment. Video increment has already been executed.`); + let extraMediaIncrement = 0; let positionV = _currentPosVideo ? _currentPosVideo / 1000 : 0; - let positionA; + let positionX; let posDiff; const threshold = 0.250; - let currentIndex = 0; - - while (currentIndex < _audioSeqFinalIndex) { - const currentPosAudio = (await _getAudioPlayheadPositionAsyncFn(_vodMediaSeqAudio + currentIndex)) * 1000; - positionA = currentPosAudio ? currentPosAudio / 1000 : 0; - posDiff = (positionV - positionA).toFixed(3); - debug(`[${this._sessionId}]: positionV=${positionV};positionA=${positionA};posDiff=${posDiff}`); + while (extraMediaIncrement < _extraSeqFinalIndex) { + const currentPosExtraMedia = (await _getExtraPlayheadPositionAsyncFn(_vodMediaSeqExtra + extraMediaIncrement)) * 1000; + positionX = currentPosExtraMedia ? currentPosExtraMedia / 1000 : 0; + posDiff = (positionV - positionX).toFixed(3); + debug(`[${this._sessionId}]: positionV=${positionV};position${_extraType === "audio" ? "A" : "S"}=${positionX};posDiff=${posDiff}`); if (isNaN(posDiff)) { break; } - if (positionA >= positionV) { - debug(`[${this._sessionId}]: positionA=${positionA} >= positionV=${positionV};IncrementValue=${currentIndex}`); + if (positionX >= positionV) { break; } const difference = Math.abs(posDiff); if (difference > threshold && difference > Number.EPSILON) { - debug(`[${this._sessionId}]: Audio is too behind video. Incrementing...`); - currentIndex++; + // Video position ahead of audio|sub position, further increment needed... + extraMediaIncrement++; } else { - debug(`[${this._sessionId}]: Difference(${difference}) is acceptable; IncrementValue=${currentIndex}`); + debug(`[${this._sessionId}]: Difference(${difference}) is acceptable; IncrementValue=${extraMediaIncrement}`); break; } } - audioIncrement = currentIndex; - debug(`[${this._sessionId}]: Current VOD Playhead Positions are to be: [${positionV.toFixed(3)}][${positionA.toFixed(3)}] (${posDiff})`); - return audioIncrement; + return { + increment: extraMediaIncrement, + position: positionX, + diff: posDiff + }; } } From 5089dde9d2b125cf59e42d5e6541f2e4017e5374 Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Wed, 1 Nov 2023 09:32:17 +0100 Subject: [PATCH 3/7] test: for new increment function --- spec/engine/session_spec.js | 46 ++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/spec/engine/session_spec.js b/spec/engine/session_spec.js index 2f7eee0b..8c9e888a 100644 --- a/spec/engine/session_spec.js +++ b/spec/engine/session_spec.js @@ -18,7 +18,7 @@ describe("Session", () => { expect(id1).not.toEqual(id2); }); - fit("for demuxed, returns the appropriate audio increment value", async () => { + it("for demuxed, returns the appropriate audio increment value when desync is within acceptable limit", async () => { const session = new Session("dummy", null, sessionLiveStore); const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. const mockCurrentVideoPosition = 200.0 * 1000; // Video is 200s deep into its content. @@ -27,66 +27,70 @@ describe("Session", () => { const mockPositions = [196.0, 199.84, 203.68, 207.52]; return mockPositions[pos_n_current - mockMseqAudio]; }; - const output = await session._determineAudioIncrement( + const output = await session._determineExtraMediaIncrement( + "audio", mockCurrentVideoPosition, mockFinalAudioIdx, mockMseqAudio, mock_getAudioPlayheadPosition, 24 ); - expect(output).toBe(1); + expect(output.increment).toBe(1); }); - fit("for demuxed, returns the appropriate audio increment value", async () => { + it("for demuxed, returns the appropriate audio increment value when they are in sync but there is a floating point error", async () => { const session = new Session("dummy", null, sessionLiveStore); - const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. - const mockCurrentVideoPosition = 441.7599999999981697 * 1000; // Video is 200s deep into its content. - const mockMseqAudio = 25; // current mseq for audio on vod, 25 out of 50. + const mockFinalAudioIdx = 50; + const mockCurrentVideoPosition = 441.7599999999981697 * 1000; + const mockMseqAudio = 25; const mock_getAudioPlayheadPosition = async (pos_n_current) => { const mockPositions = [437.919999999999, 441.75999999999897]; return mockPositions[pos_n_current - mockMseqAudio]; }; - const output = await session._determineAudioIncrement( + const output = await session._determineExtraMediaIncrement( + "audio", mockCurrentVideoPosition, mockFinalAudioIdx, mockMseqAudio, mock_getAudioPlayheadPosition, 24 ); - expect(output).toBe(1); + expect(output.increment).toBe(1); }); - fit("for demuxed, returns the appropriate audio increment value", async () => { + it("for demuxed, returns the appropriate audio increment value, normal case I", async () => { const session = new Session("dummy", null, sessionLiveStore); - const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. - const mockCurrentVideoPosition = 3.840 * 8 * 1000; // Video is 200s deep into its content. - const mockMseqAudio = 5; // current mseq for audio on vod, 25 out of 50. + const mockFinalAudioIdx = 50; + const mockCurrentVideoPosition = 3.840 * 8 * 1000; + const mockMseqAudio = 5; const mock_getAudioPlayheadPosition = async (pos_n_current) => { const mockPositions = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52]; return mockPositions[pos_n_current]; }; - const output = await session._determineAudioIncrement( + const output = await session._determineExtraMediaIncrement( + "audio", mockCurrentVideoPosition, mockFinalAudioIdx, mockMseqAudio, mock_getAudioPlayheadPosition ); - expect(output).toBe(3); + expect(output.increment).toBe(3); }); - fit("for demuxed, returns the appropriate audio increment value", async () => { + it("for demuxed, returns the appropriate audio increment value, normal case II", async () => { const session = new Session("dummy", null, sessionLiveStore); - const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. - const mockCurrentVideoPosition = 14 * 1000; // Video is 200s deep into its content. - const mockMseqAudio = 0; // current mseq for audio on vod, 25 out of 50. + const mockFinalAudioIdx = 50; + const mockCurrentVideoPosition = 14 * 1000; + const mockMseqAudio = 0; const mock_getAudioPlayheadPosition = async (pos_n_current) => { const mockPositions = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52]; return mockPositions[pos_n_current]; }; - const output = await session._determineAudioIncrement( + const output = await session._determineExtraMediaIncrement( + "subtitle", mockCurrentVideoPosition, mockFinalAudioIdx, mockMseqAudio, mock_getAudioPlayheadPosition ); - expect(output).toBe(4); + expect(output.increment).toBe(4); }); }); From 22c9df2b78bba0ee7182bf5683bba9c93125837d Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Wed, 1 Nov 2023 12:53:06 +0100 Subject: [PATCH 4/7] test: add more cases --- spec/engine/session_spec.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/spec/engine/session_spec.js b/spec/engine/session_spec.js index 8c9e888a..4d1187e7 100644 --- a/spec/engine/session_spec.js +++ b/spec/engine/session_spec.js @@ -18,7 +18,7 @@ describe("Session", () => { expect(id1).not.toEqual(id2); }); - it("for demuxed, returns the appropriate audio increment value when desync is within acceptable limit", async () => { + it("for demuxed, returns the appropriate audio increment value when desync is within acceptable limit, case I", async () => { const session = new Session("dummy", null, sessionLiveStore); const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. const mockCurrentVideoPosition = 200.0 * 1000; // Video is 200s deep into its content. @@ -38,6 +38,26 @@ describe("Session", () => { expect(output.increment).toBe(1); }); + it("for demuxed, returns the appropriate audio increment value when desync is within acceptable limit, case II", async () => { + const session = new Session("dummy", null, sessionLiveStore); + const mockFinalAudioIdx = 50; // current Vod has 50 media sequences to serve. + const mockCurrentVideoPosition = 200.0 * 1000; // Video is 200s deep into its content. + const mockMseqAudio = 25; // current mseq for audio on vod, 25 out of 50. + const mock_getAudioPlayheadPosition = async (pos_n_current) => { + const mockPositions = [192.16, 196.0, 199.84, 203.68, 207.52]; + return mockPositions[pos_n_current - mockMseqAudio]; + }; + const output = await session._determineExtraMediaIncrement( + "audio", + mockCurrentVideoPosition, + mockFinalAudioIdx, + mockMseqAudio, + mock_getAudioPlayheadPosition, + 24 + ); + expect(output.increment).toBe(2); + }); + it("for demuxed, returns the appropriate audio increment value when they are in sync but there is a floating point error", async () => { const session = new Session("dummy", null, sessionLiveStore); const mockFinalAudioIdx = 50; From 8f293b02d0da1c5e10db0b3575cbc53a936bb2d4 Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Tue, 21 Nov 2023 10:53:09 +0100 Subject: [PATCH 5/7] chore: cleaner Increment logs --- engine/session.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/engine/session.js b/engine/session.js index faf30480..10f75218 100644 --- a/engine/session.js +++ b/engine/session.js @@ -923,10 +923,19 @@ class Session { const mediaSequenceValueAudio = currentVod.mediaSequenceValuesAudio[playheadState.vodMediaSeqAudio]; audioInfo = ` mseq[A]={${playheadState.mediaSeqAudio + mediaSequenceValueAudio}}` } - debug(`[${this._sessionId}]: Session can now serve mseq[V]={${playheadState.mediaSeq + mediaSequenceValue}}` + audioInfo); + let subsInfo = ""; + if (this.use_vtt_subtitles) { + const mediaSequenceValueSubtitle = currentVod.mediaSequenceValuesSubtitle[playheadState.vodMediaSeqSubtitle]; + subsInfo = ` mseq[S]={${playheadState.mediaSeqSubtitle + mediaSequenceValueSubtitle}}` + } + debug(`[${this._sessionId}]: Session can now serve mseq[V]={${playheadState.mediaSeq + mediaSequenceValue}}` + audioInfo + subsInfo); } - debug(`[${this._sessionId}]: INCREMENT (mseq=${playheadState.mediaSeq + playheadState.vodMediaSeqVideo}) vodMediaSeq=(${playheadState.vodMediaSeqVideo}_${playheadState.vodMediaSeqAudio} of ${currentVod.getLiveMediaSequencesCount()}_${currentVod.getLiveMediaSequencesCount("audio")})`); + debug(`[${this._sessionId}]: INCREMENT (mseq=${playheadState.mediaSeq + playheadState.vodMediaSeqVideo}) vodMediaSeq=(${playheadState.vodMediaSeqVideo}_${playheadState.vodMediaSeqAudio}${ + this.use_vtt_subtitles ? `_${playheadState.vodMediaSeqSubtitle}` : "" + } of ${currentVod.getLiveMediaSequencesCount()}_${currentVod.getLiveMediaSequencesCount("audio")}${ + this.use_vtt_subtitles ? `_${currentVod.getLiveMediaSequencesCount("subtitle")})` : ")" + }`); // As a FOLLOWER, we might need to read up from shared store... if (playheadState.vodMediaSeqVideo < 2 || playheadState.mediaSeq !== this.prevMediaSeqOffset.video) { @@ -2098,7 +2107,7 @@ class Session { let positionV = _currentPosVideo ? _currentPosVideo / 1000 : 0; let positionX; let posDiff; - const threshold = 0.250; + const threshold = 0.500; while (extraMediaIncrement < _extraSeqFinalIndex) { const currentPosExtraMedia = (await _getExtraPlayheadPositionAsyncFn(_vodMediaSeqExtra + extraMediaIncrement)) * 1000; positionX = currentPosExtraMedia ? currentPosExtraMedia / 1000 : 0; From 14be00f5671b097e32baad9421a385436919866c Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Tue, 21 Nov 2023 13:00:18 +0100 Subject: [PATCH 6/7] bump hls-vodtolive v4.1.1 --- package-lock.json | 543 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 298 insertions(+), 247 deletions(-) diff --git a/package-lock.json b/package-lock.json index f933423d..260d4cd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@eyevinn/hls-repeat": "^0.2.0", "@eyevinn/hls-truncate": "^0.3.0", - "@eyevinn/hls-vodtolive": "^4.1.0", + "@eyevinn/hls-vodtolive": "^4.1.1", "@eyevinn/m3u8": "^0.5.3", "abort-controller": "^3.0.0", "debug": "^3.2.7", @@ -97,9 +97,9 @@ } }, "node_modules/@eyevinn/hls-vodtolive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@eyevinn/hls-vodtolive/-/hls-vodtolive-4.1.0.tgz", - "integrity": "sha512-1f05IxohO3fUmaJUTAGDBs0zViYoMImlE9/bstHRqiJVAQ7V2U7QCe3nvVuRv/7aPyqy6efsymwnfODax0abvg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@eyevinn/hls-vodtolive/-/hls-vodtolive-4.1.1.tgz", + "integrity": "sha512-TgAwYSwNYh6nPHxBKMPsS3DFAfVUO2vbbCB9r7sRvxOTEn6qIaNMOgL2fYl+OQjXG9gJAMrcFOTRMUDvQZ/HpQ==", "dependencies": { "@eyevinn/m3u8": "^0.5.6", "abort-controller": "^3.0.0", @@ -179,10 +179,13 @@ ] }, "node_modules/@types/node": { - "version": "18.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", - "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==", - "dev": true + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/abort-controller": { "version": "3.0.0", @@ -380,12 +383,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -435,33 +439,33 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/csv": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.3.tgz", - "integrity": "sha512-TuOM1iZgdDiB6IuwJA8oqeu7g61d9CU9EQJGzCJ1AE03amPSh/UK5BMjAVx+qZUBb/1XEo133WHzWSwifa6Yqw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.5.tgz", + "integrity": "sha512-Y+KTCAUljtq2JaGP42ZL1bymqlU5BkfnFpZhxRczGFDZox2VXhlRHnG5DRshyUrwQzmCdEiLjSqNldCfm1OVCA==", "dependencies": { - "csv-generate": "^4.2.8", - "csv-parse": "^5.5.0", - "csv-stringify": "^6.4.2", - "stream-transform": "^3.2.8" + "csv-generate": "^4.3.0", + "csv-parse": "^5.5.2", + "csv-stringify": "^6.4.4", + "stream-transform": "^3.2.10" }, "engines": { "node": ">= 0.1.90" } }, "node_modules/csv-generate": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.2.8.tgz", - "integrity": "sha512-qQ5CUs4I58kfo90EDBKjdp0SpJ3xWnN1Xk1lZ1ITvfvMtNRf+jrEP8tNPeEPiI9xJJ6Bd/km/1hMjyYlTpY42g==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.3.0.tgz", + "integrity": "sha512-7KdVId/2RgwPIKfWHaHtjBq7I9mgdi8ICzsUyIhP8is6UwpwVGGSC/aPnrZ8/SkgBcCP20lXrdPuP64Irs1VBg==" }, "node_modules/csv-parse": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.0.tgz", - "integrity": "sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw==" + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.2.tgz", + "integrity": "sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA==" }, "node_modules/csv-stringify": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.2.tgz", - "integrity": "sha512-DXIdnnCUQYjDKTu6TgCSzRDiAuLxDjhl4ErFP9FGMF3wzBGOVMg9bZTLaUcYtuvhXgNbeXPKeaRfpgyqE4xySw==" + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", + "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" }, "node_modules/dashdash": { "version": "1.14.1", @@ -483,9 +487,9 @@ } }, "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -585,25 +589,25 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -611,23 +615,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -661,13 +665,13 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -776,9 +780,9 @@ } }, "node_modules/find-my-way": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", - "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -841,9 +845,12 @@ "dev": true }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -871,14 +878,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -978,17 +985,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -998,11 +994,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1044,6 +1040,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -1156,12 +1163,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -1607,13 +1614,12 @@ } }, "node_modules/nock": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.3.tgz", - "integrity": "sha512-z+KUlILy9SK/RjpeXDiDUEAq4T94ADPHE3qaRkf66mpEhzc/ytOMm3Bwdrbq6k1tMWkbdujiKim3G2tfQARuJw==", + "version": "13.3.7", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.7.tgz", + "integrity": "sha512-z3voRxo6G0JxqCsjuzERh1ReFC4Vp2b7JpSgcMJB6jnJbUszf88awAeQLIID2UNMwbMh9/Zm5sFscagj0QYHEg==", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", "propagate": "^2.0.0" }, "engines": { @@ -1669,9 +1675,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1707,9 +1713,12 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/on-finished": { "version": "2.4.1", @@ -1767,9 +1776,9 @@ } }, "node_modules/pino": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.1.tgz", - "integrity": "sha512-Cp4QzUQrvWCRJaQ8Lzv0mJzXVk4z2jlq8JNKMGaixC2Pz5L4l2p95TkuRvYbrEbe85NQsDKrAd4zalf7Ml6WiA==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.1.tgz", + "integrity": "sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -1780,7 +1789,7 @@ "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", + "sonic-boom": "^3.7.0", "thread-stream": "^2.0.0" }, "bin": { @@ -1815,9 +1824,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz", + "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==" }, "node_modules/promise.allsettled": { "version": "1.0.7", @@ -1852,9 +1861,9 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -2281,12 +2290,27 @@ "node": ">=4" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dependencies": { "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.0" }, "engines": { @@ -2312,9 +2336,9 @@ } }, "node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -2411,9 +2435,9 @@ } }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -2459,9 +2483,9 @@ } }, "node_modules/stream-transform": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.8.tgz", - "integrity": "sha512-NUx0mBuI63KbNEEh9Yj0OzKB7iMOSTpkuODM2G7By+TTVihEIJ0cYp5X+pq/TdJRlsznt6CYR8HqxexyC6/bTw==" + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.10.tgz", + "integrity": "sha512-Yu+x7zcWbWdyB0Td8dFzHt2JEyD6694CNq2lqh1rbuEBVxPtjb/GZ7xDnZcdYiU5E/RtufM54ClSEOzZDeWguA==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -2514,9 +2538,9 @@ } }, "node_modules/thread-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.0.tgz", - "integrity": "sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", "dependencies": { "real-require": "^0.2.0" } @@ -2650,6 +2674,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2733,12 +2763,12 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -2814,9 +2844,9 @@ } }, "@eyevinn/hls-vodtolive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@eyevinn/hls-vodtolive/-/hls-vodtolive-4.1.0.tgz", - "integrity": "sha512-1f05IxohO3fUmaJUTAGDBs0zViYoMImlE9/bstHRqiJVAQ7V2U7QCe3nvVuRv/7aPyqy6efsymwnfODax0abvg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@eyevinn/hls-vodtolive/-/hls-vodtolive-4.1.1.tgz", + "integrity": "sha512-TgAwYSwNYh6nPHxBKMPsS3DFAfVUO2vbbCB9r7sRvxOTEn6qIaNMOgL2fYl+OQjXG9gJAMrcFOTRMUDvQZ/HpQ==", "requires": { "@eyevinn/m3u8": "^0.5.6", "abort-controller": "^3.0.0", @@ -2878,10 +2908,13 @@ } }, "@types/node": { - "version": "18.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", - "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==", - "dev": true + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "abort-controller": { "version": "3.0.0", @@ -3014,12 +3047,13 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "caseless": { @@ -3057,30 +3091,30 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "csv": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.3.tgz", - "integrity": "sha512-TuOM1iZgdDiB6IuwJA8oqeu7g61d9CU9EQJGzCJ1AE03amPSh/UK5BMjAVx+qZUBb/1XEo133WHzWSwifa6Yqw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.5.tgz", + "integrity": "sha512-Y+KTCAUljtq2JaGP42ZL1bymqlU5BkfnFpZhxRczGFDZox2VXhlRHnG5DRshyUrwQzmCdEiLjSqNldCfm1OVCA==", "requires": { - "csv-generate": "^4.2.8", - "csv-parse": "^5.5.0", - "csv-stringify": "^6.4.2", - "stream-transform": "^3.2.8" + "csv-generate": "^4.3.0", + "csv-parse": "^5.5.2", + "csv-stringify": "^6.4.4", + "stream-transform": "^3.2.10" } }, "csv-generate": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.2.8.tgz", - "integrity": "sha512-qQ5CUs4I58kfo90EDBKjdp0SpJ3xWnN1Xk1lZ1ITvfvMtNRf+jrEP8tNPeEPiI9xJJ6Bd/km/1hMjyYlTpY42g==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.3.0.tgz", + "integrity": "sha512-7KdVId/2RgwPIKfWHaHtjBq7I9mgdi8ICzsUyIhP8is6UwpwVGGSC/aPnrZ8/SkgBcCP20lXrdPuP64Irs1VBg==" }, "csv-parse": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.0.tgz", - "integrity": "sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw==" + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.2.tgz", + "integrity": "sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA==" }, "csv-stringify": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.2.tgz", - "integrity": "sha512-DXIdnnCUQYjDKTu6TgCSzRDiAuLxDjhl4ErFP9FGMF3wzBGOVMg9bZTLaUcYtuvhXgNbeXPKeaRfpgyqE4xySw==" + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", + "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" }, "dashdash": { "version": "1.14.1", @@ -3099,9 +3133,9 @@ } }, "define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "requires": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -3172,25 +3206,25 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "requires": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -3198,23 +3232,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.13" } }, "es-array-method-boxes-properly": { @@ -3239,13 +3273,13 @@ } }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -3330,9 +3364,9 @@ "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==" }, "find-my-way": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", - "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -3379,9 +3413,9 @@ "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.6", @@ -3400,14 +3434,14 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-symbol-description": { @@ -3476,25 +3510,17 @@ "har-schema": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "requires": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" } }, "has-proto": { @@ -3515,6 +3541,14 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -3608,12 +3642,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -3929,13 +3963,12 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nock": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.3.tgz", - "integrity": "sha512-z+KUlILy9SK/RjpeXDiDUEAq4T94ADPHE3qaRkf66mpEhzc/ytOMm3Bwdrbq6k1tMWkbdujiKim3G2tfQARuJw==", + "version": "13.3.7", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.7.tgz", + "integrity": "sha512-z3voRxo6G0JxqCsjuzERh1ReFC4Vp2b7JpSgcMJB6jnJbUszf88awAeQLIID2UNMwbMh9/Zm5sFscagj0QYHEg==", "requires": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", "propagate": "^2.0.0" }, "dependencies": { @@ -3968,9 +4001,9 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-keys": { "version": "1.1.1", @@ -3994,9 +4027,9 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" }, "on-finished": { "version": "2.4.1", @@ -4042,9 +4075,9 @@ } }, "pino": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.1.tgz", - "integrity": "sha512-Cp4QzUQrvWCRJaQ8Lzv0mJzXVk4z2jlq8JNKMGaixC2Pz5L4l2p95TkuRvYbrEbe85NQsDKrAd4zalf7Ml6WiA==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.1.tgz", + "integrity": "sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -4055,7 +4088,7 @@ "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", + "sonic-boom": "^3.7.0", "thread-stream": "^2.0.0" } }, @@ -4084,9 +4117,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz", + "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==" }, "promise.allsettled": { "version": "1.0.7", @@ -4112,9 +4145,9 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, "qs": { "version": "6.5.3", @@ -4429,12 +4462,24 @@ } } }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "requires": { "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.0" } }, @@ -4454,9 +4499,9 @@ } }, "sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", "requires": { "atomic-sleep": "^1.0.0" } @@ -4532,9 +4577,9 @@ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -4566,9 +4611,9 @@ } }, "stream-transform": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.8.tgz", - "integrity": "sha512-NUx0mBuI63KbNEEh9Yj0OzKB7iMOSTpkuODM2G7By+TTVihEIJ0cYp5X+pq/TdJRlsznt6CYR8HqxexyC6/bTw==" + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.10.tgz", + "integrity": "sha512-Yu+x7zcWbWdyB0Td8dFzHt2JEyD6694CNq2lqh1rbuEBVxPtjb/GZ7xDnZcdYiU5E/RtufM54ClSEOzZDeWguA==" }, "string_decoder": { "version": "1.3.0", @@ -4609,9 +4654,9 @@ } }, "thread-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.0.tgz", - "integrity": "sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", "requires": { "real-require": "^0.2.0" } @@ -4708,6 +4753,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4779,12 +4830,12 @@ } }, "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" diff --git a/package.json b/package.json index 3b017013..8b67d569 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dependencies": { "@eyevinn/hls-repeat": "^0.2.0", "@eyevinn/hls-truncate": "^0.3.0", - "@eyevinn/hls-vodtolive": "^4.1.0", + "@eyevinn/hls-vodtolive": "^4.1.1", "@eyevinn/m3u8": "^0.5.3", "abort-controller": "^3.0.0", "debug": "^3.2.7", From a4f9f7b4c667da1d325d605295766b27635ce490 Mon Sep 17 00:00:00 2001 From: Nicholas Frederiksen Date: Tue, 21 Nov 2023 13:10:36 +0100 Subject: [PATCH 7/7] Merge branch 'master' into fix/independent-subtitle-playhead Merge branch 'fix/independent-subtitle-playhead' of https://github.com/Eyevinn/channel-engine into fix/independent-subtitle-playhead --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 260d4cd3..d6f53253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "eyevinn-channel-engine", - "version": "4.3.7", + "version": "4.3.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "eyevinn-channel-engine", - "version": "4.3.7", + "version": "4.3.8", "license": "Apache-2.0", "dependencies": { "@eyevinn/hls-repeat": "^0.2.0", diff --git a/package.json b/package.json index 8b67d569..15214a6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eyevinn-channel-engine", - "version": "4.3.7", + "version": "4.3.8", "description": "OTT TV Channel Engine", "main": "dist/index.js", "types": "dist/index.d.ts",