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.
- package/README.md +6 -5
- package/dist/engine/server.d.ts +11 -1
- package/dist/engine/server.js +56 -51
- package/dist/engine/session.d.ts +2 -0
- package/dist/engine/session.js +352 -293
- package/dist/engine/stream_switcher.d.ts +1 -0
- package/dist/engine/stream_switcher.js +16 -0
- package/dist/examples/autocreate.js +99 -0
- package/dist/{server.js → examples/default.js} +1 -1
- package/dist/{server-demux.js → examples/demux.js} +1 -1
- package/dist/{server-drm.js → examples/drm.js} +1 -1
- package/dist/{server-livemix.js → examples/livemix.js} +1 -1
- package/dist/examples/multicodec.d.ts +1 -0
- package/dist/{server-multicodec.js → examples/multicodec.js} +1 -1
- package/dist/package.json +4 -4
- package/engine/server.ts +36 -34
- package/engine/session.js +60 -7
- package/engine/stream_switcher.js +18 -0
- package/examples/autocreate.ts +112 -0
- package/{server.ts → examples/default.ts} +1 -1
- package/{server-demux.ts → examples/demux.ts} +1 -1
- package/{server-drm.ts → examples/drm.ts} +1 -1
- package/{server-livemix.ts → examples/livemix.ts} +1 -1
- package/{server-multicodec.ts → examples/multicodec.ts} +1 -1
- package/package.json +4 -4
- package/tsconfig.json +1 -5
- /package/dist/{server-demux.d.ts → examples/autocreate.d.ts} +0 -0
- /package/dist/{server-drm.d.ts → examples/default.d.ts} +0 -0
- /package/dist/{server-livemix.d.ts → examples/demux.d.ts} +0 -0
- /package/dist/{server-multicodec.d.ts → examples/drm.d.ts} +0 -0
- /package/dist/{server.d.ts → examples/livemix.d.ts} +0 -0
package/dist/engine/session.js
CHANGED
|
@@ -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
|
-
|
|
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",
|
|
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,
|
|
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 (
|
|
1768
|
-
switch (
|
|
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 =
|
|
1777
|
+
sessionState = _10.sent();
|
|
1772
1778
|
return [4 /*yield*/, this._sessionStateStore.isLeader(this._instanceId)];
|
|
1773
1779
|
case 2:
|
|
1774
|
-
isLeader =
|
|
1780
|
+
isLeader = _10.sent();
|
|
1775
1781
|
return [4 /*yield*/, this._sessionState.getCurrentVod()];
|
|
1776
1782
|
case 3:
|
|
1777
|
-
currentVod =
|
|
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*/,
|
|
1786
|
-
case SessionState.VOD_NEXT_INITIATING: return [3 /*break*/,
|
|
1787
|
-
case SessionState.VOD_NEXT_INIT: return [3 /*break*/,
|
|
1788
|
-
case SessionState.VOD_RELOAD_INIT: return [3 /*break*/,
|
|
1789
|
-
case SessionState.VOD_RELOAD_INITIATING: return [3 /*break*/,
|
|
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*/,
|
|
1797
|
+
return [3 /*break*/, 104];
|
|
1792
1798
|
case 4:
|
|
1793
|
-
|
|
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
|
-
|
|
1804
|
+
_10.sent();
|
|
1799
1805
|
return [4 /*yield*/, this._sessionStateStore.isLeader(this._instanceId)];
|
|
1800
1806
|
case 6:
|
|
1801
|
-
isLeader =
|
|
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*/,
|
|
1817
|
+
if (!isLeader) return [3 /*break*/, 28];
|
|
1812
1818
|
nextVodStart = Date.now();
|
|
1813
1819
|
return [4 /*yield*/, nextVodPromise];
|
|
1814
1820
|
case 7:
|
|
1815
|
-
vodResponse =
|
|
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 =
|
|
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 (
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
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
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
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
|
|
1854
|
-
|
|
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
|
-
|
|
1876
|
+
_d = sessionState;
|
|
1862
1877
|
return [4 /*yield*/, this._sessionState.set("mediaSeq", 0)];
|
|
1863
|
-
case
|
|
1878
|
+
case 15:
|
|
1864
1879
|
//debug(newVod);
|
|
1865
|
-
|
|
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("
|
|
1872
|
-
case
|
|
1873
|
-
_e.
|
|
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("
|
|
1876
|
-
case
|
|
1877
|
-
_f.
|
|
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("
|
|
1880
|
-
case
|
|
1881
|
-
_g.
|
|
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("
|
|
1884
|
-
case
|
|
1885
|
-
_h.
|
|
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("
|
|
1888
|
-
case
|
|
1889
|
-
_j.
|
|
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("
|
|
1892
|
-
case
|
|
1893
|
-
_k.
|
|
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
|
|
1897
|
-
|
|
1911
|
+
case 23:
|
|
1912
|
+
_m.vodMediaSeqSubtitle = _10.sent();
|
|
1898
1913
|
return [4 /*yield*/, this._playheadState.set("playheadRef", Date.now(), isLeader)];
|
|
1899
|
-
case
|
|
1900
|
-
|
|
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
|
|
1915
|
-
|
|
1929
|
+
case 26:
|
|
1930
|
+
_p.currentVod = _10.sent();
|
|
1916
1931
|
return [4 /*yield*/, this._sessionState.remove("nextVod")];
|
|
1917
|
-
case
|
|
1918
|
-
|
|
1932
|
+
case 27:
|
|
1933
|
+
_10.sent();
|
|
1919
1934
|
return [2 /*return*/];
|
|
1920
|
-
case
|
|
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
|
|
1929
|
-
|
|
1943
|
+
case 30:
|
|
1944
|
+
_r.currentVod = _10.sent();
|
|
1930
1945
|
return [2 /*return*/];
|
|
1931
|
-
case
|
|
1932
|
-
case
|
|
1933
|
-
err_7 =
|
|
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
|
|
1942
|
-
|
|
1956
|
+
case 33:
|
|
1957
|
+
_10.sent();
|
|
1943
1958
|
return [4 /*yield*/, this._insertSlate(currentVod)];
|
|
1944
|
-
case
|
|
1945
|
-
currentVod =
|
|
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*/,
|
|
1951
|
-
case
|
|
1952
|
-
if (!isLeader) return [3 /*break*/,
|
|
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*/,
|
|
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
|
|
1980
|
-
|
|
1994
|
+
case 36:
|
|
1995
|
+
_10.sent();
|
|
1981
1996
|
return [4 /*yield*/, this._sessionState.getCurrentVod()];
|
|
1982
|
-
case
|
|
1983
|
-
currentVod =
|
|
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
|
-
|
|
1988
|
-
case
|
|
1989
|
-
case
|
|
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
|
-
|
|
1998
|
-
case
|
|
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
|
|
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("
|
|
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
|
|
2010
|
-
|
|
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*/,
|
|
2013
|
-
if (!!currentVod) return [3 /*break*/,
|
|
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
|
-
|
|
2030
|
+
_s = sessionState;
|
|
2016
2031
|
return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_INIT)];
|
|
2017
|
-
case
|
|
2018
|
-
|
|
2032
|
+
case 43:
|
|
2033
|
+
_s.state = _10.sent();
|
|
2019
2034
|
return [2 /*return*/];
|
|
2020
|
-
case
|
|
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
|
-
|
|
2053
|
+
_t = sessionState;
|
|
2039
2054
|
return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_NEXT_INITIATING)];
|
|
2040
|
-
case
|
|
2041
|
-
|
|
2055
|
+
case 45:
|
|
2056
|
+
_t.state = _10.sent();
|
|
2042
2057
|
vodPromise = this._getNextVod();
|
|
2043
|
-
if (!(length_1 === 1)) return [3 /*break*/,
|
|
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
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
case
|
|
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
|
|
2054
|
-
vodResponse =
|
|
2055
|
-
|
|
2068
|
+
case 48:
|
|
2069
|
+
vodResponse = _10.sent();
|
|
2070
|
+
_u = sessionState;
|
|
2056
2071
|
return [4 /*yield*/, this._sessionState.set("nextVod", vodResponse)];
|
|
2057
|
-
case
|
|
2058
|
-
|
|
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 (
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
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
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
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
|
|
2108
|
-
|
|
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
|
-
|
|
2141
|
+
_w = sessionState;
|
|
2117
2142
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
|
|
2118
|
-
case
|
|
2119
|
-
|
|
2120
|
-
|
|
2143
|
+
case 56:
|
|
2144
|
+
_w.vodMediaSeqVideo = _10.sent();
|
|
2145
|
+
_x = sessionState;
|
|
2121
2146
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
|
|
2122
|
-
case
|
|
2123
|
-
|
|
2124
|
-
|
|
2147
|
+
case 57:
|
|
2148
|
+
_x.vodMediaSeqAudio = _10.sent();
|
|
2149
|
+
_y = sessionState;
|
|
2125
2150
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqSubtitle", 0)];
|
|
2126
|
-
case
|
|
2127
|
-
|
|
2128
|
-
|
|
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
|
|
2131
|
-
|
|
2132
|
-
|
|
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
|
|
2135
|
-
|
|
2136
|
-
|
|
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
|
|
2139
|
-
|
|
2140
|
-
|
|
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
|
|
2143
|
-
|
|
2144
|
-
|
|
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
|
|
2147
|
-
|
|
2148
|
-
|
|
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
|
|
2151
|
-
|
|
2152
|
-
debug("[".concat(this._sessionId, "]: new sequence data set in store [").concat(sessionState.mediaSeq, "][").concat(sessionState.discSeq, "]
|
|
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
|
|
2155
|
-
|
|
2156
|
-
|
|
2179
|
+
case 65:
|
|
2180
|
+
_10.sent();
|
|
2181
|
+
_5 = sessionState;
|
|
2157
2182
|
return [4 /*yield*/, this._sessionState.setCurrentVod(currentVod, { ttl: currentVod.getDuration() * 1000 })];
|
|
2158
|
-
case
|
|
2159
|
-
|
|
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
|
|
2163
|
-
|
|
2187
|
+
case 67:
|
|
2188
|
+
_10.sent();
|
|
2164
2189
|
return [4 /*yield*/, this._playheadState.set("diffCompensation", this.diffCompensation, isLeader)];
|
|
2165
|
-
case
|
|
2166
|
-
|
|
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
|
|
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
|
-
|
|
2204
|
+
_6 = sessionState;
|
|
2180
2205
|
return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_NEXT_INITIATING)];
|
|
2181
|
-
case
|
|
2182
|
-
|
|
2206
|
+
case 70:
|
|
2207
|
+
_6.state = _10.sent();
|
|
2183
2208
|
// Allow Leader|Follower to clear vodCache...
|
|
2184
2209
|
this.isAllowedToClearVodCache = true;
|
|
2185
|
-
|
|
2210
|
+
_7 = sessionState;
|
|
2186
2211
|
return [4 /*yield*/, this._sessionState.getCurrentVod()];
|
|
2187
|
-
case
|
|
2188
|
-
|
|
2212
|
+
case 71:
|
|
2213
|
+
_7.currentVod = _10.sent();
|
|
2189
2214
|
return [4 /*yield*/, this._playheadState.get("diffCompensation")];
|
|
2190
|
-
case
|
|
2191
|
-
diffMs =
|
|
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
|
-
|
|
2204
|
-
case
|
|
2205
|
-
case
|
|
2206
|
-
err_8 =
|
|
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
|
|
2215
|
-
|
|
2239
|
+
case 75:
|
|
2240
|
+
_10.sent();
|
|
2216
2241
|
return [4 /*yield*/, this._insertSlate(currentVod)];
|
|
2217
|
-
case
|
|
2218
|
-
currentVod =
|
|
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*/,
|
|
2226
|
-
case
|
|
2227
|
-
case
|
|
2228
|
-
|
|
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*/,
|
|
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
|
-
|
|
2258
|
+
_8 = sessionState;
|
|
2234
2259
|
return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_RELOAD_INITIATING)];
|
|
2235
|
-
case
|
|
2260
|
+
case 79:
|
|
2236
2261
|
// 1) To tell Follower that, Leader is working on it!
|
|
2237
|
-
|
|
2262
|
+
_8.state = _10.sent();
|
|
2238
2263
|
mSeq = this.switchDataForSession.mediaSeq;
|
|
2239
2264
|
return [4 /*yield*/, this._sessionState.getCurrentVod()];
|
|
2240
|
-
case
|
|
2241
|
-
currentVod_2 =
|
|
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
|
|
2261
|
-
|
|
2285
|
+
case 81:
|
|
2286
|
+
_10.sent();
|
|
2262
2287
|
return [4 /*yield*/, this._playheadState.set("mediaSeq", mSeq, isLeader)];
|
|
2263
|
-
case
|
|
2264
|
-
|
|
2288
|
+
case 82:
|
|
2289
|
+
_10.sent();
|
|
2265
2290
|
return [4 /*yield*/, this._sessionState.set("discSeq", dSeq)];
|
|
2266
|
-
case
|
|
2267
|
-
|
|
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
|
|
2274
|
-
playheadState =
|
|
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
|
|
2308
|
+
case 85:
|
|
2284
2309
|
// ---------------------------------------------------.
|
|
2285
2310
|
// TODO: Support reloading with audioSegments and SubtitleSegments as well |
|
|
2286
2311
|
// ---------------------------------------------------'
|
|
2287
|
-
|
|
2312
|
+
_10.sent();
|
|
2288
2313
|
return [4 /*yield*/, this._sessionState.setCurrentVod(currentVod_2, { ttl: currentVod_2.getDuration() * 1000 })];
|
|
2289
|
-
case
|
|
2290
|
-
|
|
2314
|
+
case 86:
|
|
2315
|
+
_10.sent();
|
|
2291
2316
|
return [4 /*yield*/, this._sessionState.set("vodReloaded", 1)];
|
|
2292
|
-
case
|
|
2293
|
-
|
|
2317
|
+
case 87:
|
|
2318
|
+
_10.sent();
|
|
2294
2319
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqVideo", 0)];
|
|
2295
|
-
case
|
|
2296
|
-
|
|
2320
|
+
case 88:
|
|
2321
|
+
_10.sent();
|
|
2297
2322
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqAudio", 0)];
|
|
2298
|
-
case
|
|
2299
|
-
|
|
2323
|
+
case 89:
|
|
2324
|
+
_10.sent();
|
|
2300
2325
|
return [4 /*yield*/, this._sessionState.set("vodMediaSeqSubtitle", 0)];
|
|
2301
|
-
case
|
|
2302
|
-
|
|
2326
|
+
case 90:
|
|
2327
|
+
_10.sent();
|
|
2303
2328
|
return [4 /*yield*/, this._playheadState.set("vodMediaSeqVideo", 0, isLeader)];
|
|
2304
|
-
case
|
|
2305
|
-
|
|
2329
|
+
case 91:
|
|
2330
|
+
_10.sent();
|
|
2306
2331
|
return [4 /*yield*/, this._playheadState.set("vodMediaSeqAudio", 0, isLeader)];
|
|
2307
|
-
case
|
|
2308
|
-
|
|
2332
|
+
case 92:
|
|
2333
|
+
_10.sent();
|
|
2309
2334
|
return [4 /*yield*/, this._playheadState.set("vodMediaSeqSubtitle", 0, isLeader)];
|
|
2310
|
-
case
|
|
2311
|
-
|
|
2335
|
+
case 93:
|
|
2336
|
+
_10.sent();
|
|
2312
2337
|
return [4 /*yield*/, this._playheadState.set("playheadRef", Date.now(), isLeader)];
|
|
2313
|
-
case
|
|
2314
|
-
|
|
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
|
|
2347
|
+
case 95:
|
|
2323
2348
|
debug("[".concat(this._sessionId, "]: not a leader so will go directly to state VOD_RELOAD_INITIATING"));
|
|
2324
|
-
|
|
2349
|
+
_9 = sessionState;
|
|
2325
2350
|
return [4 /*yield*/, this._sessionState.set("state", SessionState.VOD_RELOAD_INITIATING)];
|
|
2326
|
-
case
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
case
|
|
2330
|
-
case
|
|
2331
|
-
err_9 =
|
|
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
|
|
2335
|
-
case
|
|
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*/,
|
|
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*/,
|
|
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
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
case
|
|
2367
|
+
case 101:
|
|
2368
|
+
_10.sent();
|
|
2369
|
+
_10.label = 102;
|
|
2370
|
+
case 102:
|
|
2346
2371
|
this.waitingForNextVod = true;
|
|
2347
|
-
|
|
2348
|
-
case
|
|
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
|
|
2353
|
-
case
|
|
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;
|