eyevinn-channel-engine 4.2.1 → 4.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +6 -5
  2. package/dist/engine/server.d.ts +11 -1
  3. package/dist/engine/server.js +56 -51
  4. package/dist/engine/session.d.ts +2 -0
  5. package/dist/engine/session.js +352 -293
  6. package/dist/engine/stream_switcher.d.ts +1 -0
  7. package/dist/engine/stream_switcher.js +16 -0
  8. package/dist/examples/autocreate.js +99 -0
  9. package/dist/{server.js → examples/default.js} +1 -1
  10. package/dist/{server-demux.js → examples/demux.js} +1 -1
  11. package/dist/{server-drm.js → examples/drm.js} +1 -1
  12. package/dist/{server-livemix.js → examples/livemix.js} +1 -1
  13. package/dist/examples/multicodec.d.ts +1 -0
  14. package/dist/{server-multicodec.js → examples/multicodec.js} +1 -1
  15. package/dist/package.json +4 -4
  16. package/engine/server.ts +36 -34
  17. package/engine/session.js +60 -7
  18. package/engine/stream_switcher.js +18 -0
  19. package/examples/autocreate.ts +112 -0
  20. package/{server.ts → examples/default.ts} +1 -1
  21. package/{server-demux.ts → examples/demux.ts} +1 -1
  22. package/{server-drm.ts → examples/drm.ts} +1 -1
  23. package/{server-livemix.ts → examples/livemix.ts} +1 -1
  24. package/{server-multicodec.ts → examples/multicodec.ts} +1 -1
  25. package/package.json +4 -4
  26. package/tsconfig.json +1 -5
  27. /package/dist/{server-demux.d.ts → examples/autocreate.d.ts} +0 -0
  28. /package/dist/{server-drm.d.ts → examples/default.d.ts} +0 -0
  29. /package/dist/{server-livemix.d.ts → examples/demux.d.ts} +0 -0
  30. /package/dist/{server-multicodec.d.ts → examples/drm.d.ts} +0 -0
  31. /package/dist/{server.d.ts → examples/livemix.d.ts} +0 -0
@@ -1062,7 +1062,7 @@ var Session = /** @class */ (function () {
1062
1062
  };
1063
1063
  Session.prototype.incrementAsync = function () {
1064
1064
  return __awaiter(this, void 0, void 0, function () {
1065
- var isLeader, sessionState, playheadState, currentVod, _a, leaderAction, _b, m3u8_4, _c, audioIncrement, positionV, positionA, position, currentVod_1, sessionState_1, posDiff, incrementValue, index, audioSeqLastIdx, thresh, audioPosition, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, mediaSequenceValue, audioInfo, mediaSequenceValueAudio, diffMs, m3u8;
1065
+ var isLeader, sessionState, playheadState, currentVod, _a, isOldVod, nextState, leaderAction, leaderState, _b, m3u8_4, _c, audioIncrement, positionV, positionA, position, currentVod_1, sessionState_1, posDiff, incrementValue, index, audioSeqLastIdx, thresh, audioPosition, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, mediaSequenceValue, audioInfo, mediaSequenceValueAudio, diffMs, m3u8;
1066
1066
  return __generator(this, function (_s) {
1067
1067
  switch (_s.label) {
1068
1068
  case 0: return [4 /*yield*/, this._tickAsync()];
@@ -1074,7 +1074,7 @@ var Session = /** @class */ (function () {
1074
1074
  return [4 /*yield*/, this._sessionState.getValues(["state", "mediaSeq", "mediaSeqAudio", "mediaSeqSubtitle", "discSeq", "discSeqAudio", "discSeqSubtitle", "vodMediaSeqVideo", "vodMediaSeqAudio", "vodMediaSeqSubtitle"])];
1075
1075
  case 3:
1076
1076
  sessionState = _s.sent();
1077
- return [4 /*yield*/, this._playheadState.getValues(["mediaSeq", "mediaSeqAudio", "mediaSeqSubtitle", "vodMediaSeqVideo", "vodMediaSeqAudio", "vodMediaSubtitle"])];
1077
+ return [4 /*yield*/, this._playheadState.getValues(["mediaSeq", "mediaSeqAudio", "mediaSeqSubtitle", "vodMediaSeqVideo", "vodMediaSeqAudio", "vodMediaSubtitle", "playheadRef"])];
1078
1078
  case 4:
1079
1079
  playheadState = _s.sent();
1080
1080
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
@@ -1103,10 +1103,16 @@ var Session = /** @class */ (function () {
1103
1103
  case 9:
1104
1104
  if (!(sessionState.state === SessionState.VOD_NEXT_INITIATING || sessionState.state === SessionState.VOD_RELOAD_INITIATING)) return [3 /*break*/, 14];
1105
1105
  if (!isLeader) return [3 /*break*/, 11];
1106
+ isOldVod = this._isOldVod(playheadState.playheadRef, currentVod.getDuration());
1107
+ nextState = SessionState.VOD_PLAYING;
1108
+ if (isOldVod) {
1109
+ nextState = SessionState.VOD_NEXT_INIT;
1110
+ }
1106
1111
  leaderAction = sessionState.state === SessionState.VOD_NEXT_INITIATING ? "initiated" : "reloaded";
1107
- debug("[".concat(this._sessionId, "]: I am the leader and have just ").concat(leaderAction, " next VOD, let's move to VOD_PLAYING"));
1112
+ leaderState = nextState === SessionState.VOD_NEXT_INIT ? "VOD_NEXT_INIT" : "VOD_PLAYING";
1113
+ debug("[".concat(this._sessionId, "]: I am the leader and have just ").concat(leaderAction, " next VOD, let's move to ").concat(leaderState));
1108
1114
  _b = sessionState;
1109
- return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_PLAYING)];
1115
+ return [4 /*yield*/, this._sessionState.set("state", nextState)];
1110
1116
  case 10:
1111
1117
  _b.state = _s.sent();
1112
1118
  return [3 /*break*/, 13];
@@ -1762,19 +1768,19 @@ var Session = /** @class */ (function () {
1762
1768
  };
1763
1769
  Session.prototype._tickAsync = function () {
1764
1770
  return __awaiter(this, void 0, void 0, function () {
1765
- var newVod, sessionState, isLeader, currentVod, vodResponse, _a, nextVodPromise, nextVodStart, _b, loadPromise, hlsOpts, loadStart, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, err_7, _r, length_1, endMseqValue, endMseqValueAudio, endMseqValueSubtitle, lastDiscontinuity, lastDiscontinuityAudio, lastDiscontinuitySubtitle, _s, vodPromise, gracePeriod, nextVodStart, _t, loadPromise, hlsOpts, loadStart, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, diffMs, err_8, startTS, _6, mSeq, currentVod_2, dSeq, mSeqOffset, reloadBehind, segments, playheadState, nextMseq, _7, err_9;
1771
+ var newVod, sessionState, isLeader, currentVod, vodResponse, _a, nextVodPromise, nextVodStart, _b, loadPromise, hlsOpts, _c, mediaManifestLoader, audioManifestLoader, loadStart, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, err_7, _s, length_1, endMseqValue, endMseqValueAudio, endMseqValueSubtitle, lastDiscontinuity, lastDiscontinuityAudio, lastDiscontinuitySubtitle, _t, vodPromise, gracePeriod, nextVodStart, _u, loadPromise, hlsOpts, _v, mediaManifestLoader, audioManifestLoader, loadStart, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, diffMs, err_8, startTS, _8, mSeq, currentVod_2, dSeq, mSeqOffset, reloadBehind, segments, playheadState, nextMseq, _9, err_9;
1766
1772
  var _this = this;
1767
- return __generator(this, function (_8) {
1768
- switch (_8.label) {
1773
+ return __generator(this, function (_10) {
1774
+ switch (_10.label) {
1769
1775
  case 0: return [4 /*yield*/, this._sessionState.getValues(["state", "assetId", "vodMediaSeqVideo", "vodMediaSeqAudio", "vodMediaSeqSubtitle", "mediaSeq", "mediaSeqAudio", "mediaSeqSubtitle", "discSeq", "discSeqAudio", "discSeqSubtitle", "nextVod"])];
1770
1776
  case 1:
1771
- sessionState = _8.sent();
1777
+ sessionState = _10.sent();
1772
1778
  return [4 /*yield*/, this._sessionStateStore.isLeader(this._instanceId)];
1773
1779
  case 2:
1774
- isLeader = _8.sent();
1780
+ isLeader = _10.sent();
1775
1781
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
1776
1782
  case 3:
1777
- currentVod = _8.sent();
1783
+ currentVod = _10.sent();
1778
1784
  if (!sessionState.state) {
1779
1785
  sessionState.state = SessionState.VOD_INIT;
1780
1786
  }
@@ -1782,23 +1788,23 @@ var Session = /** @class */ (function () {
1782
1788
  switch (_a) {
1783
1789
  case SessionState.VOD_INIT: return [3 /*break*/, 4];
1784
1790
  case SessionState.VOD_INIT_BY_ID: return [3 /*break*/, 4];
1785
- case SessionState.VOD_PLAYING: return [3 /*break*/, 30];
1786
- case SessionState.VOD_NEXT_INITIATING: return [3 /*break*/, 36];
1787
- case SessionState.VOD_NEXT_INIT: return [3 /*break*/, 37];
1788
- case SessionState.VOD_RELOAD_INIT: return [3 /*break*/, 68];
1789
- case SessionState.VOD_RELOAD_INITIATING: return [3 /*break*/, 90];
1791
+ case SessionState.VOD_PLAYING: return [3 /*break*/, 35];
1792
+ case SessionState.VOD_NEXT_INITIATING: return [3 /*break*/, 41];
1793
+ case SessionState.VOD_NEXT_INIT: return [3 /*break*/, 42];
1794
+ case SessionState.VOD_RELOAD_INIT: return [3 /*break*/, 78];
1795
+ case SessionState.VOD_RELOAD_INITIATING: return [3 /*break*/, 100];
1790
1796
  }
1791
- return [3 /*break*/, 94];
1797
+ return [3 /*break*/, 104];
1792
1798
  case 4:
1793
- _8.trys.push([4, 27, , 30]);
1799
+ _10.trys.push([4, 32, , 35]);
1794
1800
  // Needed if store was reset
1795
1801
  return [4 /*yield*/, this._sessionStateStore.clearLeaderCache()];
1796
1802
  case 5:
1797
1803
  // Needed if store was reset
1798
- _8.sent();
1804
+ _10.sent();
1799
1805
  return [4 /*yield*/, this._sessionStateStore.isLeader(this._instanceId)];
1800
1806
  case 6:
1801
- isLeader = _8.sent();
1807
+ isLeader = _10.sent();
1802
1808
  nextVodPromise = void 0;
1803
1809
  if (sessionState.state === SessionState.VOD_INIT) {
1804
1810
  debug("[".concat(this._sessionId, "]: state=VOD_INIT"));
@@ -1808,96 +1814,105 @@ var Session = /** @class */ (function () {
1808
1814
  debug("[".concat(this._sessionId, "]: state=VOD_INIT_BY_ID ").concat(sessionState.assetId));
1809
1815
  nextVodPromise = this._getNextVodById(sessionState.assetId);
1810
1816
  }
1811
- if (!isLeader) return [3 /*break*/, 23];
1817
+ if (!isLeader) return [3 /*break*/, 28];
1812
1818
  nextVodStart = Date.now();
1813
1819
  return [4 /*yield*/, nextVodPromise];
1814
1820
  case 7:
1815
- vodResponse = _8.sent();
1821
+ vodResponse = _10.sent();
1816
1822
  _b = sessionState;
1817
1823
  return [4 /*yield*/, this._sessionState.set("nextVod", vodResponse)];
1818
1824
  case 8:
1819
- _b.nextVod = _8.sent();
1825
+ _b.nextVod = _10.sent();
1820
1826
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'nextVod', channel: this._sessionId, reqTimeMs: Date.now() - nextVodStart });
1821
1827
  loadPromise = void 0;
1822
- if (!vodResponse.type) {
1823
- debug("[".concat(this._sessionId, "]: got first VOD uri=").concat(vodResponse.uri, ":").concat(vodResponse.offset || 0));
1824
- hlsOpts = { sequenceAlwaysContainNewSegments: this.alwaysNewSegments,
1825
- forcedDemuxMode: this.use_demuxed_audio,
1826
- dummySubtitleEndpoint: this.dummySubtitleEndpoint,
1827
- subtitleSliceEndpoint: this.subtitleSliceEndpoint,
1828
- shouldContainSubtitles: this.use_vtt_subtitles,
1829
- expectedSubtitleTracks: this._subtitleTracks
1830
- };
1831
- newVod = new HLSVod(vodResponse.uri, [], vodResponse.unixTs, vodResponse.offset * 1000, m3u8Header(this._instanceId), hlsOpts);
1832
- if (vodResponse.timedMetadata) {
1833
- Object.keys(vodResponse.timedMetadata).map(function (k) {
1834
- newVod.addMetadata(k, vodResponse.timedMetadata[k]);
1835
- });
1836
- }
1837
- currentVod = newVod;
1838
- loadPromise = currentVod.load();
1828
+ if (!!vodResponse.type) return [3 /*break*/, 12];
1829
+ debug("[".concat(this._sessionId, "]: got first VOD uri=").concat(vodResponse.uri, ":").concat(vodResponse.offset || 0));
1830
+ hlsOpts = { sequenceAlwaysContainNewSegments: this.alwaysNewSegments,
1831
+ forcedDemuxMode: this.use_demuxed_audio,
1832
+ dummySubtitleEndpoint: this.dummySubtitleEndpoint,
1833
+ subtitleSliceEndpoint: this.subtitleSliceEndpoint,
1834
+ shouldContainSubtitles: this.use_vtt_subtitles,
1835
+ expectedSubtitleTracks: this._subtitleTracks
1836
+ };
1837
+ newVod = new HLSVod(vodResponse.uri, [], vodResponse.unixTs, vodResponse.offset * 1000, m3u8Header(this._instanceId), hlsOpts);
1838
+ if (vodResponse.timedMetadata) {
1839
+ Object.keys(vodResponse.timedMetadata).map(function (k) {
1840
+ newVod.addMetadata(k, vodResponse.timedMetadata[k]);
1841
+ });
1839
1842
  }
1840
- else {
1841
- if (vodResponse.type === 'gap') {
1842
- loadPromise = new Promise(function (resolve, reject) {
1843
- _this._fillGap(null, vodResponse.desiredDuration)
1844
- .then(function (gapVod) {
1845
- currentVod = gapVod;
1846
- resolve(gapVod);
1847
- }).catch(reject);
1848
- });
1849
- }
1843
+ currentVod = newVod;
1844
+ if (!vodResponse.desiredDuration) return [3 /*break*/, 10];
1845
+ return [4 /*yield*/, this._truncateVod(vodResponse)];
1846
+ case 9:
1847
+ _c = _10.sent(), mediaManifestLoader = _c.mediaManifestLoader, audioManifestLoader = _c.audioManifestLoader;
1848
+ loadPromise = currentVod.load(null, mediaManifestLoader, audioManifestLoader);
1849
+ return [3 /*break*/, 11];
1850
+ case 10:
1851
+ loadPromise = currentVod.load();
1852
+ _10.label = 11;
1853
+ case 11: return [3 /*break*/, 13];
1854
+ case 12:
1855
+ if (vodResponse.type === 'gap') {
1856
+ loadPromise = new Promise(function (resolve, reject) {
1857
+ _this._fillGap(null, vodResponse.desiredDuration)
1858
+ .then(function (gapVod) {
1859
+ currentVod = gapVod;
1860
+ resolve(gapVod);
1861
+ }).catch(reject);
1862
+ });
1850
1863
  }
1864
+ _10.label = 13;
1865
+ case 13:
1851
1866
  loadStart = Date.now();
1852
1867
  return [4 /*yield*/, loadPromise];
1853
- case 9:
1854
- _8.sent();
1868
+ case 14:
1869
+ _10.sent();
1855
1870
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'loadVod', channel: this._sessionId, loadTimeMs: Date.now() - loadStart });
1856
1871
  debug("[".concat(this._sessionId, "]: first VOD loaded"));
1857
1872
  debug("[".concat(this._sessionId, "]: ").concat(currentVod.getDeltaTimes()));
1858
1873
  debug("[".concat(this._sessionId, "]: playhead positions [V]=").concat(currentVod.getPlayheadPositions("video")));
1859
1874
  debug("[".concat(this._sessionId, "]: playhead positions [A]=").concat(currentVod.getPlayheadPositions("audio")));
1860
1875
  //debug(newVod);
1861
- _c = sessionState;
1876
+ _d = sessionState;
1862
1877
  return [4 /*yield*/, this._sessionState.set("mediaSeq", 0)];
1863
- case 10:
1878
+ case 15:
1864
1879
  //debug(newVod);
1865
- _c.mediaSeq = _8.sent();
1866
- _d = sessionState;
1867
- return [4 /*yield*/, this._sessionState.set("mediaSeqAudio", 0)];
1868
- case 11:
1869
- _d.mediaSeqAudio = _8.sent();
1880
+ _d.mediaSeq = _10.sent();
1870
1881
  _e = sessionState;
1871
- return [4 /*yield*/, this._sessionState.set("mediaSeqSubtitle", 0)];
1872
- case 12:
1873
- _e.mediaSeqSubtitle = _8.sent();
1882
+ return [4 /*yield*/, this._sessionState.set("mediaSeqAudio", 0)];
1883
+ case 16:
1884
+ _e.mediaSeqAudio = _10.sent();
1874
1885
  _f = sessionState;
1875
- return [4 /*yield*/, this._sessionState.set("discSeq", 0)];
1876
- case 13:
1877
- _f.discSeq = _8.sent();
1886
+ return [4 /*yield*/, this._sessionState.set("mediaSeqSubtitle", 0)];
1887
+ case 17:
1888
+ _f.mediaSeqSubtitle = _10.sent();
1878
1889
  _g = sessionState;
1879
- return [4 /*yield*/, this._sessionState.set("discSeqAudio", 0)];
1880
- case 14:
1881
- _g.discSeqAudio = _8.sent();
1890
+ return [4 /*yield*/, this._sessionState.set("discSeq", 0)];
1891
+ case 18:
1892
+ _g.discSeq = _10.sent();
1882
1893
  _h = sessionState;
1883
- return [4 /*yield*/, this._sessionState.set("discSeqSubtitle", 0)];
1884
- case 15:
1885
- _h.discSeqSubtitle = _8.sent();
1894
+ return [4 /*yield*/, this._sessionState.set("discSeqAudio", 0)];
1895
+ case 19:
1896
+ _h.discSeqAudio = _10.sent();
1886
1897
  _j = sessionState;
1887
- return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
1888
- case 16:
1889
- _j.vodMediaSeqVideo = _8.sent();
1898
+ return [4 /*yield*/, this._sessionState.set("discSeqSubtitle", 0)];
1899
+ case 20:
1900
+ _j.discSeqSubtitle = _10.sent();
1890
1901
  _k = sessionState;
1891
- return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
1892
- case 17:
1893
- _k.vodMediaSeqAudio = _8.sent();
1902
+ return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
1903
+ case 21:
1904
+ _k.vodMediaSeqVideo = _10.sent();
1894
1905
  _l = sessionState;
1906
+ return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
1907
+ case 22:
1908
+ _l.vodMediaSeqAudio = _10.sent();
1909
+ _m = sessionState;
1895
1910
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqSubtitle", 0)];
1896
- case 18:
1897
- _l.vodMediaSeqSubtitle = _8.sent();
1911
+ case 23:
1912
+ _m.vodMediaSeqSubtitle = _10.sent();
1898
1913
  return [4 /*yield*/, this._playheadState.set("playheadRef", Date.now(), isLeader)];
1899
- case 19:
1900
- _8.sent();
1914
+ case 24:
1915
+ _10.sent();
1901
1916
  this.produceEvent({
1902
1917
  type: 'NOW_PLAYING',
1903
1918
  data: {
@@ -1905,32 +1920,32 @@ var Session = /** @class */ (function () {
1905
1920
  title: this.currentMetadata.title,
1906
1921
  }
1907
1922
  });
1908
- _m = sessionState;
1909
- return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_PLAYING)];
1910
- case 20:
1911
- _m.state = _8.sent();
1912
1923
  _o = sessionState;
1924
+ return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_PLAYING)];
1925
+ case 25:
1926
+ _o.state = _10.sent();
1927
+ _p = sessionState;
1913
1928
  return [4 /*yield*/, this._sessionState.setCurrentVod(currentVod, { ttl: currentVod.getDuration() * 1000 })];
1914
- case 21:
1915
- _o.currentVod = _8.sent();
1929
+ case 26:
1930
+ _p.currentVod = _10.sent();
1916
1931
  return [4 /*yield*/, this._sessionState.remove("nextVod")];
1917
- case 22:
1918
- _8.sent();
1932
+ case 27:
1933
+ _10.sent();
1919
1934
  return [2 /*return*/];
1920
- case 23:
1935
+ case 28:
1921
1936
  debug("[".concat(this._sessionId, "]: not a leader so will go directly to state VOD_PLAYING"));
1922
- _p = sessionState;
1923
- return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_PLAYING)];
1924
- case 24:
1925
- _p.state = _8.sent();
1926
1937
  _q = sessionState;
1938
+ return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_PLAYING)];
1939
+ case 29:
1940
+ _q.state = _10.sent();
1941
+ _r = sessionState;
1927
1942
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
1928
- case 25:
1929
- _q.currentVod = _8.sent();
1943
+ case 30:
1944
+ _r.currentVod = _10.sent();
1930
1945
  return [2 /*return*/];
1931
- case 26: return [3 /*break*/, 30];
1932
- case 27:
1933
- err_7 = _8.sent();
1946
+ case 31: return [3 /*break*/, 35];
1947
+ case 32:
1948
+ err_7 = _10.sent();
1934
1949
  console.error("[".concat(this._sessionId, "]: Failed to init first VOD"));
1935
1950
  if (this._assetManager.handleError) {
1936
1951
  this._assetManager.handleError(new Error("Failed to init first VOD"), vodResponse);
@@ -1938,18 +1953,18 @@ var Session = /** @class */ (function () {
1938
1953
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'error', on: 'firstvod', channel: this._sessionId, err: err_7, vod: vodResponse });
1939
1954
  debug(err_7);
1940
1955
  return [4 /*yield*/, this._sessionState.remove("nextVod")];
1941
- case 28:
1942
- _8.sent();
1956
+ case 33:
1957
+ _10.sent();
1943
1958
  return [4 /*yield*/, this._insertSlate(currentVod)];
1944
- case 29:
1945
- currentVod = _8.sent();
1959
+ case 34:
1960
+ currentVod = _10.sent();
1946
1961
  if (!currentVod) {
1947
1962
  debug("No slate to load");
1948
1963
  throw err_7;
1949
1964
  }
1950
- return [3 /*break*/, 30];
1951
- case 30:
1952
- if (!isLeader) return [3 /*break*/, 34];
1965
+ return [3 /*break*/, 35];
1966
+ case 35:
1967
+ if (!isLeader) return [3 /*break*/, 39];
1953
1968
  // Handle edge case where store has been reset, but leader has not cleared cache.
1954
1969
  if (this.prevVodMediaSeq.video === null) {
1955
1970
  this.prevVodMediaSeq.video = sessionState.vodMediaSeqVideo;
@@ -1973,20 +1988,20 @@ var Session = /** @class */ (function () {
1973
1988
  this.prevMediaSeqOffset.subtitle = sessionState.mediaSeqSubtitle;
1974
1989
  }
1975
1990
  }
1976
- if (!(sessionState.vodMediaSeqVideo < this.prevVodMediaSeq.video)) return [3 /*break*/, 33];
1991
+ if (!(sessionState.vodMediaSeqVideo < this.prevVodMediaSeq.video)) return [3 /*break*/, 38];
1977
1992
  debug("[".concat(this._sessionId, "]: state=VOD_PLAYING, current[").concat(sessionState.vodMediaSeqVideo, "], prev[").concat(this.prevVodMediaSeq.video, "], total[").concat(currentVod.getLiveMediaSequencesCount(), "]"));
1978
1993
  return [4 /*yield*/, this._sessionState.clearCurrentVodCache()];
1979
- case 31:
1980
- _8.sent();
1994
+ case 36:
1995
+ _10.sent();
1981
1996
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
1982
- case 32:
1983
- currentVod = _8.sent();
1997
+ case 37:
1998
+ currentVod = _10.sent();
1984
1999
  this.prevVodMediaSeq.video = sessionState.vodMediaSeqVideo;
1985
2000
  this.prevVodMediaSeq.audio = sessionState.vodMediaSeqAudio;
1986
2001
  this.prevVodMediaSeq.subtitle = sessionState.vodMediaSeqSubtitle;
1987
- _8.label = 33;
1988
- case 33: return [3 /*break*/, 35];
1989
- case 34:
2002
+ _10.label = 38;
2003
+ case 38: return [3 /*break*/, 40];
2004
+ case 39:
1990
2005
  // Handle edge case where Leader loaded next vod but Follower remained in state=VOD_PLAYING
1991
2006
  if ((this.prevMediaSeqOffset.video !== null) & (sessionState.mediaSeq !== this.prevMediaSeqOffset.video)) {
1992
2007
  debug("[".concat(this._sessionId, "]: state=VOD_PLAYING, current[").concat(sessionState.vodMediaSeqVideo, "], prev[").concat(this.prevVodMediaSeq.video, "], total[").concat(currentVod.getLiveMediaSequencesCount(), "]"));
@@ -1994,30 +2009,30 @@ var Session = /** @class */ (function () {
1994
2009
  // Allow Follower to clear VodCache...
1995
2010
  this.isAllowedToClearVodCache = true;
1996
2011
  }
1997
- _8.label = 35;
1998
- case 35:
2012
+ _10.label = 40;
2013
+ case 40:
1999
2014
  debug("[".concat(this._sessionId, "]: state=VOD_PLAYING (").concat(sessionState.vodMediaSeqVideo, "_").concat(sessionState.vodMediaSeqAudio, "_").concat(sessionState.vodMediaSeqSubtitle, ", ").concat(currentVod.getLiveMediaSequencesCount(), "_").concat(currentVod.getLiveMediaSequencesCount("audio"), "_").concat(currentVod.getLiveMediaSequencesCount("subtitle"), ")"));
2000
2015
  return [2 /*return*/];
2001
- case 36:
2002
- debug("[".concat(this._sessionId, "]: state=VOD_NEXT_INITIATING (").concat(sessionState.vodMediaSeqVideo, "_").concat(sessionState.vodMediaSeqAudio, "_").concat(sessionState.vodMediaSeqSubtitle, ", ").concat(currentVod.getLiveMediaSequencesCount(), "_").concat(currentVod.getLiveMediaSequencesCount("audio"), "_").concat(currentVod.getLiveMediaSequencesCount("audio"), "_").concat(currentVod.getLiveMediaSequencesCount("subtitle"), ")"));
2016
+ case 41:
2017
+ debug("[".concat(this._sessionId, "]: state=VOD_NEXT_INITIATING (").concat(sessionState.vodMediaSeqVideo, "_").concat(sessionState.vodMediaSeqAudio, "_").concat(sessionState.vodMediaSeqSubtitle, ", ").concat(currentVod.getLiveMediaSequencesCount(), "_").concat(currentVod.getLiveMediaSequencesCount("audio"), "_").concat(currentVod.getLiveMediaSequencesCount("subtitle"), ")"));
2003
2018
  if (!isLeader) {
2004
2019
  debug("[".concat(this._sessionId, "]: not the leader so just waiting for the VOD to be initiated"));
2005
2020
  }
2006
2021
  // Allow Leader|Follower to clear vodCache...
2007
2022
  this.isAllowedToClearVodCache = true;
2008
2023
  return [2 /*return*/];
2009
- case 37:
2010
- _8.trys.push([37, 64, , 67]);
2024
+ case 42:
2025
+ _10.trys.push([42, 74, , 77]);
2011
2026
  debug("[".concat(this._sessionId, "]: state=VOD_NEXT_INIT"));
2012
- if (!isLeader) return [3 /*break*/, 59];
2013
- if (!!currentVod) return [3 /*break*/, 39];
2027
+ if (!isLeader) return [3 /*break*/, 69];
2028
+ if (!!currentVod) return [3 /*break*/, 44];
2014
2029
  debug("[".concat(this._sessionId, "]: no VOD to append to, assume first VOD to init"));
2015
- _r = sessionState;
2030
+ _s = sessionState;
2016
2031
  return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_INIT)];
2017
- case 38:
2018
- _r.state = _8.sent();
2032
+ case 43:
2033
+ _s.state = _10.sent();
2019
2034
  return [2 /*return*/];
2020
- case 39:
2035
+ case 44:
2021
2036
  length_1 = currentVod.getLiveMediaSequencesCount();
2022
2037
  endMseqValue = void 0;
2023
2038
  endMseqValueAudio = void 0;
@@ -2035,77 +2050,87 @@ var Session = /** @class */ (function () {
2035
2050
  lastDiscontinuity = currentVod.getLastDiscontinuity();
2036
2051
  lastDiscontinuityAudio = currentVod.getLastDiscontinuityAudio();
2037
2052
  lastDiscontinuitySubtitle = currentVod.getLastDiscontinuitySubtitle();
2038
- _s = sessionState;
2053
+ _t = sessionState;
2039
2054
  return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_NEXT_INITIATING)];
2040
- case 40:
2041
- _s.state = _8.sent();
2055
+ case 45:
2056
+ _t.state = _10.sent();
2042
2057
  vodPromise = this._getNextVod();
2043
- if (!(length_1 === 1)) return [3 /*break*/, 42];
2058
+ if (!(length_1 === 1)) return [3 /*break*/, 47];
2044
2059
  gracePeriod = (this.averageSegmentDuration / 2);
2045
2060
  debug("[".concat(this._sessionId, "]: adding a grace period before calling nextVod: ").concat(gracePeriod, "ms"));
2046
2061
  return [4 /*yield*/, timer(gracePeriod)];
2047
- case 41:
2048
- _8.sent();
2049
- _8.label = 42;
2050
- case 42:
2062
+ case 46:
2063
+ _10.sent();
2064
+ _10.label = 47;
2065
+ case 47:
2051
2066
  nextVodStart = Date.now();
2052
2067
  return [4 /*yield*/, vodPromise];
2053
- case 43:
2054
- vodResponse = _8.sent();
2055
- _t = sessionState;
2068
+ case 48:
2069
+ vodResponse = _10.sent();
2070
+ _u = sessionState;
2056
2071
  return [4 /*yield*/, this._sessionState.set("nextVod", vodResponse)];
2057
- case 44:
2058
- _t.nextVod = _8.sent();
2072
+ case 49:
2073
+ _u.nextVod = _10.sent();
2059
2074
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'nextVod', channel: this._sessionId, reqTimeMs: Date.now() - nextVodStart });
2060
2075
  loadPromise = void 0;
2061
- if (!vodResponse.type) {
2062
- debug("[".concat(this._sessionId, "]: got next VOD uri=").concat(vodResponse.uri, ":").concat(vodResponse.offset));
2063
- hlsOpts = { sequenceAlwaysContainNewSegments: this.alwaysNewSegments,
2064
- forcedDemuxMode: this.use_demuxed_audio,
2065
- dummySubtitleEndpoint: this.dummySubtitleEndpoint,
2066
- subtitleSliceEndpoint: this.subtitleSliceEndpoint,
2067
- shouldContainSubtitles: this.use_vtt_subtitles,
2068
- expectedSubtitleTracks: this._subtitleTracks
2069
- };
2070
- newVod = new HLSVod(vodResponse.uri, null, vodResponse.unixTs, vodResponse.offset * 1000, m3u8Header(this._instanceId), hlsOpts);
2071
- if (vodResponse.timedMetadata) {
2072
- Object.keys(vodResponse.timedMetadata).map(function (k) {
2073
- newVod.addMetadata(k, vodResponse.timedMetadata[k]);
2074
- });
2075
- }
2076
- this.produceEvent({
2077
- type: 'NEXT_VOD_SELECTED',
2078
- data: {
2079
- id: this.currentMetadata.id,
2080
- uri: vodResponse.uri,
2081
- title: this.currentMetadata.title || '',
2082
- }
2076
+ if (!!vodResponse.type) return [3 /*break*/, 53];
2077
+ debug("[".concat(this._sessionId, "]: got next VOD uri=").concat(vodResponse.uri, ":").concat(vodResponse.offset));
2078
+ hlsOpts = { sequenceAlwaysContainNewSegments: this.alwaysNewSegments,
2079
+ forcedDemuxMode: this.use_demuxed_audio,
2080
+ dummySubtitleEndpoint: this.dummySubtitleEndpoint,
2081
+ subtitleSliceEndpoint: this.subtitleSliceEndpoint,
2082
+ shouldContainSubtitles: this.use_vtt_subtitles,
2083
+ expectedSubtitleTracks: this._subtitleTracks
2084
+ };
2085
+ newVod = new HLSVod(vodResponse.uri, null, vodResponse.unixTs, vodResponse.offset * 1000, m3u8Header(this._instanceId), hlsOpts);
2086
+ if (vodResponse.timedMetadata) {
2087
+ Object.keys(vodResponse.timedMetadata).map(function (k) {
2088
+ newVod.addMetadata(k, vodResponse.timedMetadata[k]);
2083
2089
  });
2084
- loadPromise = newVod.loadAfter(currentVod);
2085
- if (vodResponse.diffMs) {
2086
- this.diffCompensation = vodResponse.diffMs;
2087
- if (this.diffCompensation) {
2088
- this.timePositionOffset = this.diffCompensation;
2089
- cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'timePositionOffsetUpdated', channel: this._sessionId, offsetMs: this.timePositionOffset });
2090
- }
2091
- else {
2092
- this.timePositionOffset = 0;
2093
- }
2094
- }
2095
2090
  }
2096
- else {
2097
- loadPromise = new Promise(function (resolve, reject) {
2098
- _this._fillGap(currentVod, vodResponse.desiredDuration)
2099
- .then(function (gapVod) {
2100
- newVod = gapVod;
2101
- resolve(newVod);
2102
- }).catch(reject);
2103
- });
2091
+ this.produceEvent({
2092
+ type: 'NEXT_VOD_SELECTED',
2093
+ data: {
2094
+ id: this.currentMetadata.id,
2095
+ uri: vodResponse.uri,
2096
+ title: this.currentMetadata.title || '',
2097
+ }
2098
+ });
2099
+ if (!vodResponse.desiredDuration) return [3 /*break*/, 51];
2100
+ return [4 /*yield*/, this._truncateVod(vodResponse)];
2101
+ case 50:
2102
+ _v = _10.sent(), mediaManifestLoader = _v.mediaManifestLoader, audioManifestLoader = _v.audioManifestLoader;
2103
+ loadPromise = newVod.loadAfter(currentVod, null, mediaManifestLoader, audioManifestLoader);
2104
+ return [3 /*break*/, 52];
2105
+ case 51:
2106
+ loadPromise = newVod.loadAfter(currentVod);
2107
+ _10.label = 52;
2108
+ case 52:
2109
+ if (vodResponse.diffMs) {
2110
+ this.diffCompensation = vodResponse.diffMs;
2111
+ if (this.diffCompensation) {
2112
+ this.timePositionOffset = this.diffCompensation;
2113
+ cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'timePositionOffsetUpdated', channel: this._sessionId, offsetMs: this.timePositionOffset });
2114
+ }
2115
+ else {
2116
+ this.timePositionOffset = 0;
2117
+ }
2104
2118
  }
2119
+ return [3 /*break*/, 54];
2120
+ case 53:
2121
+ loadPromise = new Promise(function (resolve, reject) {
2122
+ _this._fillGap(currentVod, vodResponse.desiredDuration)
2123
+ .then(function (gapVod) {
2124
+ newVod = gapVod;
2125
+ resolve(newVod);
2126
+ }).catch(reject);
2127
+ });
2128
+ _10.label = 54;
2129
+ case 54:
2105
2130
  loadStart = Date.now();
2106
2131
  return [4 /*yield*/, ChaosMonkey.loadVod(loadPromise)];
2107
- case 45:
2108
- _8.sent();
2132
+ case 55:
2133
+ _10.sent();
2109
2134
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'loadVod', channel: this._sessionId, loadTimeMs: Date.now() - loadStart });
2110
2135
  this.leaderIsSettingNextVod = true;
2111
2136
  debug("[".concat(this._sessionId, "]: next VOD loaded (").concat(newVod.getDeltaTimes(), ")"));
@@ -2113,57 +2138,57 @@ var Session = /** @class */ (function () {
2113
2138
  debug("[".concat(this._sessionId, "]: playhead positions [A]=").concat(newVod.getPlayheadPositions("audio")));
2114
2139
  currentVod = newVod;
2115
2140
  debug("[".concat(this._sessionId, "]: msequences=").concat(currentVod.getLiveMediaSequencesCount(), "; audio msequences=").concat(currentVod.getLiveMediaSequencesCount("audio"), "; subtitle msequences=").concat(currentVod.getLiveMediaSequencesCount("subtitle")));
2116
- _u = sessionState;
2141
+ _w = sessionState;
2117
2142
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
2118
- case 46:
2119
- _u.vodMediaSeqVideo = _8.sent();
2120
- _v = sessionState;
2143
+ case 56:
2144
+ _w.vodMediaSeqVideo = _10.sent();
2145
+ _x = sessionState;
2121
2146
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
2122
- case 47:
2123
- _v.vodMediaSeqAudio = _8.sent();
2124
- _w = sessionState;
2147
+ case 57:
2148
+ _x.vodMediaSeqAudio = _10.sent();
2149
+ _y = sessionState;
2125
2150
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqSubtitle", 0)];
2126
- case 48:
2127
- _w.vodMediaSeqSubtitle = _8.sent();
2128
- _x = sessionState;
2151
+ case 58:
2152
+ _y.vodMediaSeqSubtitle = _10.sent();
2153
+ _z = sessionState;
2129
2154
  return [4 /*yield*/, this._sessionState.set("mediaSeq", sessionState.mediaSeq + endMseqValue)];
2130
- case 49:
2131
- _x.mediaSeq = _8.sent();
2132
- _y = sessionState;
2155
+ case 59:
2156
+ _z.mediaSeq = _10.sent();
2157
+ _0 = sessionState;
2133
2158
  return [4 /*yield*/, this._sessionState.set("mediaSeqAudio", sessionState.mediaSeqAudio + endMseqValueAudio)];
2134
- case 50:
2135
- _y.mediaSeqAudio = _8.sent();
2136
- _z = sessionState;
2159
+ case 60:
2160
+ _0.mediaSeqAudio = _10.sent();
2161
+ _1 = sessionState;
2137
2162
  return [4 /*yield*/, this._sessionState.set("mediaSeqSubtitle", sessionState.mediaSeqSubtitle + endMseqValueSubtitle)];
2138
- case 51:
2139
- _z.mediaSeqSubtitle = _8.sent();
2140
- _0 = sessionState;
2163
+ case 61:
2164
+ _1.mediaSeqSubtitle = _10.sent();
2165
+ _2 = sessionState;
2141
2166
  return [4 /*yield*/, this._sessionState.set("discSeq", sessionState.discSeq + lastDiscontinuity)];
2142
- case 52:
2143
- _0.discSeq = _8.sent();
2144
- _1 = sessionState;
2167
+ case 62:
2168
+ _2.discSeq = _10.sent();
2169
+ _3 = sessionState;
2145
2170
  return [4 /*yield*/, this._sessionState.set("discSeqAudio", sessionState.discSeqAudio + lastDiscontinuityAudio)];
2146
- case 53:
2147
- _1.discSeqAudio = _8.sent();
2148
- _2 = sessionState;
2171
+ case 63:
2172
+ _3.discSeqAudio = _10.sent();
2173
+ _4 = sessionState;
2149
2174
  return [4 /*yield*/, this._sessionState.set("discSeqSubtitle", sessionState.discSeqSubtitle + lastDiscontinuitySubtitle)];
2150
- case 54:
2151
- _2.discSeqSubtitle = _8.sent();
2152
- debug("[".concat(this._sessionId, "]: new sequence data set in store [").concat(sessionState.mediaSeq, "][").concat(sessionState.discSeq, "]_[").concat(sessionState.mediaSeqSubtitle, "][").concat(sessionState.discSeqSubtitle, "]_[").concat(sessionState.mediaSeqSubtitle, "][").concat(sessionState.discSeqSubtitle, "]"));
2175
+ case 64:
2176
+ _4.discSeqSubtitle = _10.sent();
2177
+ debug("[".concat(this._sessionId, "]: new sequence data set in store V[").concat(sessionState.mediaSeq, "][").concat(sessionState.discSeq, "]_A[").concat(sessionState.mediaSeqAudio, "][").concat(sessionState.discSeqAudio, "]_S[").concat(sessionState.mediaSeqSubtitle, "][").concat(sessionState.discSeqSubtitle, "]"));
2153
2178
  return [4 /*yield*/, this._sessionState.remove("nextVod")];
2154
- case 55:
2155
- _8.sent();
2156
- _3 = sessionState;
2179
+ case 65:
2180
+ _10.sent();
2181
+ _5 = sessionState;
2157
2182
  return [4 /*yield*/, this._sessionState.setCurrentVod(currentVod, { ttl: currentVod.getDuration() * 1000 })];
2158
- case 56:
2159
- _3.currentVod = _8.sent();
2183
+ case 66:
2184
+ _5.currentVod = _10.sent();
2160
2185
  this.leaderIsSettingNextVod = false;
2161
2186
  return [4 /*yield*/, this._playheadState.set("playheadRef", Date.now(), isLeader)];
2162
- case 57:
2163
- _8.sent();
2187
+ case 67:
2188
+ _10.sent();
2164
2189
  return [4 /*yield*/, this._playheadState.set("diffCompensation", this.diffCompensation, isLeader)];
2165
- case 58:
2166
- _8.sent();
2190
+ case 68:
2191
+ _10.sent();
2167
2192
  debug("[".concat(this._sessionId, "]: sharing durrent vods diffCompensation=").concat(this.diffCompensation));
2168
2193
  this.produceEvent({
2169
2194
  type: 'NOW_PLAYING',
@@ -2173,22 +2198,22 @@ var Session = /** @class */ (function () {
2173
2198
  }
2174
2199
  });
2175
2200
  return [2 /*return*/];
2176
- case 59:
2201
+ case 69:
2177
2202
  debug("[".concat(this._sessionId, "]: not a leader so will go directly to state VOD_NEXT_INITIATING"));
2178
2203
  this.waitingForNextVod = true;
2179
- _4 = sessionState;
2204
+ _6 = sessionState;
2180
2205
  return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_NEXT_INITIATING)];
2181
- case 60:
2182
- _4.state = _8.sent();
2206
+ case 70:
2207
+ _6.state = _10.sent();
2183
2208
  // Allow Leader|Follower to clear vodCache...
2184
2209
  this.isAllowedToClearVodCache = true;
2185
- _5 = sessionState;
2210
+ _7 = sessionState;
2186
2211
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
2187
- case 61:
2188
- _5.currentVod = _8.sent();
2212
+ case 71:
2213
+ _7.currentVod = _10.sent();
2189
2214
  return [4 /*yield*/, this._playheadState.get("diffCompensation")];
2190
- case 62:
2191
- diffMs = _8.sent();
2215
+ case 72:
2216
+ diffMs = _10.sent();
2192
2217
  if (diffMs) {
2193
2218
  this.diffCompensation = diffMs;
2194
2219
  debug("[".concat(this._sessionId, "]: Setting diffCompensation=").concat(this.diffCompensation));
@@ -2200,10 +2225,10 @@ var Session = /** @class */ (function () {
2200
2225
  this.timePositionOffset = 0;
2201
2226
  }
2202
2227
  }
2203
- _8.label = 63;
2204
- case 63: return [3 /*break*/, 67];
2205
- case 64:
2206
- err_8 = _8.sent();
2228
+ _10.label = 73;
2229
+ case 73: return [3 /*break*/, 77];
2230
+ case 74:
2231
+ err_8 = _10.sent();
2207
2232
  console.error("[".concat(this._sessionId, "]: Failed to init next VOD"));
2208
2233
  debug("[".concat(this._sessionId, "]: ").concat(err_8));
2209
2234
  if (this._assetManager.handleError) {
@@ -2211,34 +2236,34 @@ var Session = /** @class */ (function () {
2211
2236
  }
2212
2237
  cloudWatchLog(!this.cloudWatchLogging, 'engine-session', { event: 'error', on: 'nextvod', channel: this._sessionId, err: err_8, vod: vodResponse });
2213
2238
  return [4 /*yield*/, this._sessionState.remove("nextVod")];
2214
- case 65:
2215
- _8.sent();
2239
+ case 75:
2240
+ _10.sent();
2216
2241
  return [4 /*yield*/, this._insertSlate(currentVod)];
2217
- case 66:
2218
- currentVod = _8.sent();
2242
+ case 76:
2243
+ currentVod = _10.sent();
2219
2244
  if (!currentVod) {
2220
2245
  debug("No slate to load");
2221
2246
  throw err_8;
2222
2247
  }
2223
2248
  // Allow Leader|Follower to clear vodCache...
2224
2249
  this.isAllowedToClearVodCache = true;
2225
- return [3 /*break*/, 67];
2226
- case 67: return [3 /*break*/, 95];
2227
- case 68:
2228
- _8.trys.push([68, 88, , 89]);
2250
+ return [3 /*break*/, 77];
2251
+ case 77: return [3 /*break*/, 105];
2252
+ case 78:
2253
+ _10.trys.push([78, 98, , 99]);
2229
2254
  debug("[".concat(this._sessionId, "]: state=VOD_RELOAD_INIT"));
2230
- if (!isLeader) return [3 /*break*/, 85];
2255
+ if (!isLeader) return [3 /*break*/, 95];
2231
2256
  startTS = Date.now();
2232
2257
  // 1) To tell Follower that, Leader is working on it!
2233
- _6 = sessionState;
2258
+ _8 = sessionState;
2234
2259
  return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_RELOAD_INITIATING)];
2235
- case 69:
2260
+ case 79:
2236
2261
  // 1) To tell Follower that, Leader is working on it!
2237
- _6.state = _8.sent();
2262
+ _8.state = _10.sent();
2238
2263
  mSeq = this.switchDataForSession.mediaSeq;
2239
2264
  return [4 /*yield*/, this._sessionState.getCurrentVod()];
2240
- case 70:
2241
- currentVod_2 = _8.sent();
2265
+ case 80:
2266
+ currentVod_2 = _10.sent();
2242
2267
  if (currentVod_2.sequenceAlwaysContainNewSegments) {
2243
2268
  // (!) will need to compensate if using this setting on HLSVod Object.
2244
2269
  Object.keys(this.switchDataForSession.transitionSegments).forEach(function (bw) {
@@ -2257,21 +2282,21 @@ var Session = /** @class */ (function () {
2257
2282
  return [2 /*return*/];
2258
2283
  }
2259
2284
  return [4 /*yield*/, this._sessionState.set("mediaSeq", mSeq)];
2260
- case 71:
2261
- _8.sent();
2285
+ case 81:
2286
+ _10.sent();
2262
2287
  return [4 /*yield*/, this._playheadState.set("mediaSeq", mSeq, isLeader)];
2263
- case 72:
2264
- _8.sent();
2288
+ case 82:
2289
+ _10.sent();
2265
2290
  return [4 /*yield*/, this._sessionState.set("discSeq", dSeq)];
2266
- case 73:
2267
- _8.sent();
2291
+ case 83:
2292
+ _10.sent();
2268
2293
  // TODO: support demux^
2269
2294
  debug("[".concat(this._sessionId, "]: Setting current media and discontinuity count -> [").concat(mSeq, "]:[").concat(dSeq, "]"));
2270
2295
  // 3) Set new media segments/currentVod, to carry on the continuity from session-live
2271
2296
  debug("[".concat(this._sessionId, "]: LEADER: making changes to current VOD. I will also update currentVod in store."));
2272
2297
  return [4 /*yield*/, this._playheadState.getValues(["vodMediaSeqVideo"])];
2273
- case 74:
2274
- playheadState = _8.sent();
2298
+ case 84:
2299
+ playheadState = _10.sent();
2275
2300
  nextMseq = playheadState.vodMediaSeqVideo + 1;
2276
2301
  if (nextMseq > currentVod_2.getLiveMediaSequencesCount() - 1) {
2277
2302
  nextMseq = currentVod_2.getLiveMediaSequencesCount() - 1;
@@ -2280,38 +2305,38 @@ var Session = /** @class */ (function () {
2280
2305
  // TODO: Support reloading with audioSegments and SubtitleSegments as well |
2281
2306
  // ---------------------------------------------------'
2282
2307
  return [4 /*yield*/, currentVod_2.reload(nextMseq, segments, null, reloadBehind)];
2283
- case 75:
2308
+ case 85:
2284
2309
  // ---------------------------------------------------.
2285
2310
  // TODO: Support reloading with audioSegments and SubtitleSegments as well |
2286
2311
  // ---------------------------------------------------'
2287
- _8.sent();
2312
+ _10.sent();
2288
2313
  return [4 /*yield*/, this._sessionState.setCurrentVod(currentVod_2, { ttl: currentVod_2.getDuration() * 1000 })];
2289
- case 76:
2290
- _8.sent();
2314
+ case 86:
2315
+ _10.sent();
2291
2316
  return [4 /*yield*/, this._sessionState.set("vodReloaded", 1)];
2292
- case 77:
2293
- _8.sent();
2317
+ case 87:
2318
+ _10.sent();
2294
2319
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
2295
- case 78:
2296
- _8.sent();
2320
+ case 88:
2321
+ _10.sent();
2297
2322
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
2298
- case 79:
2299
- _8.sent();
2323
+ case 89:
2324
+ _10.sent();
2300
2325
  return [4 /*yield*/, this._sessionState.set("vodMediaSeqSubtitle", 0)];
2301
- case 80:
2302
- _8.sent();
2326
+ case 90:
2327
+ _10.sent();
2303
2328
  return [4 /*yield*/, this._playheadState.set("vodMediaSeqVideo", 0, isLeader)];
2304
- case 81:
2305
- _8.sent();
2329
+ case 91:
2330
+ _10.sent();
2306
2331
  return [4 /*yield*/, this._playheadState.set("vodMediaSeqAudio", 0, isLeader)];
2307
- case 82:
2308
- _8.sent();
2332
+ case 92:
2333
+ _10.sent();
2309
2334
  return [4 /*yield*/, this._playheadState.set("vodMediaSeqSubtitle", 0, isLeader)];
2310
- case 83:
2311
- _8.sent();
2335
+ case 93:
2336
+ _10.sent();
2312
2337
  return [4 /*yield*/, this._playheadState.set("playheadRef", Date.now(), isLeader)];
2313
- case 84:
2314
- _8.sent();
2338
+ case 94:
2339
+ _10.sent();
2315
2340
  // 4) Log to debug and cloudwatch
2316
2341
  debug("[".concat(this._sessionId, "]: LEADER: Set new Reloaded VOD and vodMediaSeq counts in store."));
2317
2342
  debug("[".concat(this._sessionId, "]: next VOD Reloaded (").concat(currentVod_2.getDeltaTimes(), ")"));
@@ -2319,38 +2344,38 @@ var Session = /** @class */ (function () {
2319
2344
  debug("[".concat(this._sessionId, "]: msequences=").concat(currentVod_2.getLiveMediaSequencesCount()));
2320
2345
  cloudWatchLog(!this.cloudWatchLogging, "engine-session", { event: "switchback", channel: this._sessionId, reqTimeMs: Date.now() - startTS });
2321
2346
  return [2 /*return*/];
2322
- case 85:
2347
+ case 95:
2323
2348
  debug("[".concat(this._sessionId, "]: not a leader so will go directly to state VOD_RELOAD_INITIATING"));
2324
- _7 = sessionState;
2349
+ _9 = sessionState;
2325
2350
  return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_RELOAD_INITIATING)];
2326
- case 86:
2327
- _7.state = _8.sent();
2328
- _8.label = 87;
2329
- case 87: return [3 /*break*/, 89];
2330
- case 88:
2331
- err_9 = _8.sent();
2351
+ case 96:
2352
+ _9.state = _10.sent();
2353
+ _10.label = 97;
2354
+ case 97: return [3 /*break*/, 99];
2355
+ case 98:
2356
+ err_9 = _10.sent();
2332
2357
  debug("Failed to init reload vod");
2333
2358
  throw err_9;
2334
- case 89: return [3 /*break*/, 95];
2335
- case 90:
2359
+ case 99: return [3 /*break*/, 105];
2360
+ case 100:
2336
2361
  debug("[".concat(this._sessionId, "]: state=VOD_RELOAD_INITIATING (").concat(sessionState.vodMediaSeqVideo, "_").concat(sessionState.vodMediaSeqAudio, "_").concat(sessionState.vodMediaSeqSubtitle, ", ").concat(currentVod.getLiveMediaSequencesCount(), "_").concat(currentVod.getLiveMediaSequencesCount("audio"), "_").concat(currentVod.getLiveMediaSequencesCount("subtitle"), ")"));
2337
- if (!!isLeader) return [3 /*break*/, 93];
2362
+ if (!!isLeader) return [3 /*break*/, 103];
2338
2363
  debug("[".concat(this._sessionId, "]: not the leader so just waiting for the VOD to be reloaded"));
2339
- if (!(sessionState.vodMediaSeqVideo === 0 || this.waitingForNextVod)) return [3 /*break*/, 92];
2364
+ if (!(sessionState.vodMediaSeqVideo === 0 || this.waitingForNextVod)) return [3 /*break*/, 102];
2340
2365
  debug("[".concat(this._sessionId, "]: First mediasequence in VOD and I am not the leader so invalidate current VOD cache and fetch the new one from the leader"));
2341
2366
  return [4 /*yield*/, this._sessionState.clearCurrentVodCache()];
2342
- case 91:
2343
- _8.sent();
2344
- _8.label = 92;
2345
- case 92:
2367
+ case 101:
2368
+ _10.sent();
2369
+ _10.label = 102;
2370
+ case 102:
2346
2371
  this.waitingForNextVod = true;
2347
- _8.label = 93;
2348
- case 93:
2372
+ _10.label = 103;
2373
+ case 103:
2349
2374
  // Allow Leader|Follower to clear vodCache...
2350
2375
  this.isAllowedToClearVodCache = true;
2351
2376
  return [2 /*return*/];
2352
- case 94: throw new Error("Invalid state: " + sessionState.state);
2353
- case 95: return [2 /*return*/];
2377
+ case 104: throw new Error("Invalid state: " + sessionState.state);
2378
+ case 105: return [2 /*return*/];
2354
2379
  }
2355
2380
  });
2356
2381
  });
@@ -2449,6 +2474,31 @@ var Session = /** @class */ (function () {
2449
2474
  }
2450
2475
  });
2451
2476
  };
2477
+ Session.prototype._truncateVod = function (vodResponse) {
2478
+ var _this = this;
2479
+ return new Promise(function (resolve, reject) {
2480
+ var truncatedVod = new HLSTruncateVod(vodResponse.uri, vodResponse.desiredDuration / 1000);
2481
+ truncatedVod.load()
2482
+ .then(function () {
2483
+ var audioManifestLoader;
2484
+ var mediaManifestLoader = function (bw) {
2485
+ var mediaManifestStream = new Readable();
2486
+ mediaManifestStream.push(truncatedVod.getMediaManifest(bw));
2487
+ mediaManifestStream.push(null);
2488
+ return mediaManifestStream;
2489
+ };
2490
+ if (_this.use_demuxed_audio) {
2491
+ audioManifestLoader = function (audioGroupId, audioLanguage) {
2492
+ var mediaManifestStream = new Readable();
2493
+ mediaManifestStream.push(truncatedVod.getAudioManifest(audioGroupId, audioLanguage));
2494
+ mediaManifestStream.push(null);
2495
+ return mediaManifestStream;
2496
+ };
2497
+ }
2498
+ resolve({ mediaManifestLoader: mediaManifestLoader, audioManifestLoader: audioManifestLoader });
2499
+ });
2500
+ });
2501
+ };
2452
2502
  Session.prototype._truncateSlate = function (afterVod, requestedDuration, vodUri) {
2453
2503
  var _this = this;
2454
2504
  return new Promise(function (resolve, reject) {
@@ -2698,6 +2748,15 @@ var Session = /** @class */ (function () {
2698
2748
  return compensationSec;
2699
2749
  }
2700
2750
  };
2751
+ Session.prototype._isOldVod = function (refTs, vodDur) {
2752
+ var TIME_PADDING_MS = 20 * 1000; // 20secs
2753
+ var VOD_DURATION_MS = vodDur * 1000;
2754
+ var TIME_SINCE_VOD_STARTED_MS = (Date.now() - refTs) + TIME_PADDING_MS;
2755
+ if (TIME_SINCE_VOD_STARTED_MS > VOD_DURATION_MS) {
2756
+ return true;
2757
+ }
2758
+ return false;
2759
+ };
2701
2760
  return Session;
2702
2761
  }());
2703
2762
  module.exports = Session;