eyevinn-channel-engine 4.3.12 → 5.0.0-rc.2

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.
@@ -148,7 +148,7 @@ var PlayheadStateStore = /** @class */ (function (_super) {
148
148
  function PlayheadStateStore(opts) {
149
149
  return _super.call(this, "playhead", opts, {
150
150
  state: PlayheadState.IDLE,
151
- tickInterval: 3,
151
+ tickInterval: opts ? (opts.averageSegmentDuration / 1000) : 3,
152
152
  mediaSeq: 0,
153
153
  vodMediaSeqVideo: 0,
154
154
  vodMediaSeqAudio: 0,
@@ -171,11 +171,11 @@ export declare class ChannelEngine {
171
171
  getSubtitleManifests(channelId: any): Promise<{}>;
172
172
  _handleHeartbeat(req: any, res: any, next: any): void;
173
173
  _handleMasterManifest(req: any, res: any, next: any): Promise<void>;
174
+ _handleMediaManifest(req: any, res: any, next: any): Promise<void>;
174
175
  _handleAudioManifest(req: any, res: any, next: any): Promise<void>;
175
176
  _handleSubtitleManifest(req: any, res: any, next: any): Promise<void>;
176
177
  _handleDummySubtitleEndpoint(req: any, res: any, next: any): Promise<void>;
177
178
  _handleSubtitleSliceEndpoint(req: any, res: any, next: any): Promise<void>;
178
- _handleMediaManifest(req: any, res: any, next: any): Promise<void>;
179
179
  _handleEventStream(req: any, res: any, next: any): void;
180
180
  _handleStatus(req: any, res: any, next: any): Promise<void>;
181
181
  _handleAggregatedSessionHealth(req: any, res: any, next: any): Promise<void>;
@@ -139,6 +139,7 @@ var ChannelEngine = /** @class */ (function () {
139
139
  volatileKeyTTL: options.volatileKeyTTL,
140
140
  }),
141
141
  playheadStateStore: new PlayheadStateStore({
142
+ averageSegmentDuration: options.averageSegmentDuration,
142
143
  redisUrl: options.redisUrl,
143
144
  memcachedUrl: options.memcachedUrl,
144
145
  cacheTTL: options.sharedStoreCacheTTL,
@@ -408,7 +409,7 @@ var ChannelEngine = /** @class */ (function () {
408
409
  return [3 /*break*/, 4];
409
410
  case 3:
410
411
  err_2 = _a.sent();
411
- debug('Problem occured when updating streamSwitchers');
412
+ debug('Problem occurred when updating streamSwitchers');
412
413
  throw new Error(err_2);
413
414
  case 4: return [2 /*return*/];
414
415
  }
@@ -463,12 +464,14 @@ var ChannelEngine = /** @class */ (function () {
463
464
  useDemuxedAudio: options.useDemuxedAudio,
464
465
  dummySubtitleEndpoint: this.dummySubtitleEndpoint,
465
466
  subtitleSliceEndpoint: this.subtitleSliceEndpoint,
466
- useVTTSubtitles: this.useVTTSubtitles,
467
+ useVTTSubtitles: false,
467
468
  cloudWatchMetrics: this.logCloudWatchMetrics,
468
469
  profile: channel.profile,
470
+ audioTracks: channel.audioTracks
469
471
  }, this.sessionLiveStore);
470
472
  sessionSwitchers[channel.id] = new StreamSwitcher({
471
473
  sessionId: channel.id,
474
+ useDemuxedAudio: options.useDemuxedAudio,
472
475
  streamSwitchManager: this.streamSwitchManager ? this.streamSwitchManager : null
473
476
  });
474
477
  return [4 /*yield*/, sessions[channel.id].initAsync()];
@@ -929,21 +932,55 @@ var ChannelEngine = /** @class */ (function () {
929
932
  });
930
933
  });
931
934
  };
932
- ChannelEngine.prototype._handleAudioManifest = function (req, res, next) {
935
+ ChannelEngine.prototype._handleMediaManifest = function (req, res, next) {
933
936
  return __awaiter(this, void 0, void 0, function () {
934
- var session, body, err_5, err;
937
+ var session, sessionLive, ts1, body, err_5, err;
935
938
  return __generator(this, function (_a) {
936
939
  switch (_a.label) {
937
940
  case 0:
938
- debug("req.url=".concat(req.url));
939
- session = sessions[req.params[2]];
940
- if (!session) return [3 /*break*/, 5];
941
+ debug("x-playback-session-id=".concat(req.headers["x-playback-session-id"], " req.url=").concat(req.url));
942
+ debug(req.params);
943
+ session = sessions[req.params[1]];
944
+ sessionLive = sessionsLive[req.params[1]];
945
+ if (!(session && sessionLive)) return [3 /*break*/, 13];
941
946
  _a.label = 1;
942
947
  case 1:
943
- _a.trys.push([1, 3, , 4]);
944
- return [4 /*yield*/, session.getCurrentAudioManifestAsync(req.params[0], req.params[1], req.headers["x-playback-session-id"])];
948
+ _a.trys.push([1, 11, , 12]);
949
+ ts1 = Date.now();
950
+ body = null;
951
+ if (!!this.streamSwitchManager) return [3 /*break*/, 3];
952
+ debug("[".concat(req.params[1], "]: Responding with VOD2Live manifest"));
953
+ return [4 /*yield*/, session.getCurrentMediaManifestAsync(req.params[0], req.headers["x-playback-session-id"])];
945
954
  case 2:
946
955
  body = _a.sent();
956
+ return [3 /*break*/, 10];
957
+ case 3:
958
+ if (!(switcherStatus[req.params[1]] === null || switcherStatus[req.params[1]] === undefined)) return [3 /*break*/, 5];
959
+ debug("[".concat(req.params[1], "]: (").concat(switcherStatus[req.params[1]], ") Waiting for streamSwitcher to respond"));
960
+ return [4 /*yield*/, timer(500)];
961
+ case 4:
962
+ _a.sent();
963
+ return [3 /*break*/, 3];
964
+ case 5:
965
+ debug("switcherStatus[".concat(req.params[1], "]=[").concat(switcherStatus[req.params[1]], "]"));
966
+ if (!switcherStatus[req.params[1]]) return [3 /*break*/, 7];
967
+ debug("[".concat(req.params[1], "]: Responding with Live-stream manifest"));
968
+ return [4 /*yield*/, sessionLive.getCurrentMediaManifestAsync(req.params[0])];
969
+ case 6:
970
+ body = _a.sent();
971
+ return [3 /*break*/, 9];
972
+ case 7:
973
+ debug("[".concat(req.params[1], "]: Responding with VOD2Live manifest"));
974
+ return [4 /*yield*/, session.getCurrentMediaManifestAsync(req.params[0], req.headers["x-playback-session-id"])];
975
+ case 8:
976
+ body = _a.sent();
977
+ _a.label = 9;
978
+ case 9:
979
+ debug("[".concat(req.params[1], "]: Media Manifest Request Took (").concat(Date.now() - ts1, ")ms"));
980
+ _a.label = 10;
981
+ case 10:
982
+ //verbose(`[${session.sessionId}] body=`);
983
+ //verbose(body);
947
984
  res.sendRaw(200, Buffer.from(body, 'utf8'), {
948
985
  "Content-Type": "application/vnd.apple.mpegurl",
949
986
  "Access-Control-Allow-Origin": "*",
@@ -951,24 +988,93 @@ var ChannelEngine = /** @class */ (function () {
951
988
  "X-Instance-Id": this.instanceId + "<".concat(version, ">"),
952
989
  });
953
990
  next();
954
- return [3 /*break*/, 4];
955
- case 3:
991
+ return [3 /*break*/, 12];
992
+ case 11:
956
993
  err_5 = _a.sent();
957
994
  next(this._gracefulErrorHandler(err_5));
958
- return [3 /*break*/, 4];
959
- case 4: return [3 /*break*/, 6];
995
+ return [3 /*break*/, 12];
996
+ case 12: return [3 /*break*/, 14];
997
+ case 13:
998
+ err = new errs.NotFoundError('Invalid session(s)');
999
+ next(err);
1000
+ _a.label = 14;
1001
+ case 14: return [2 /*return*/];
1002
+ }
1003
+ });
1004
+ });
1005
+ };
1006
+ ChannelEngine.prototype._handleAudioManifest = function (req, res, next) {
1007
+ return __awaiter(this, void 0, void 0, function () {
1008
+ var session, sessionLive, body, ts1, err_6, err;
1009
+ return __generator(this, function (_a) {
1010
+ switch (_a.label) {
1011
+ case 0:
1012
+ debug("x-playback-session-id=".concat(req.headers["x-playback-session-id"], " req.url=").concat(req.url));
1013
+ debug(req.params);
1014
+ session = sessions[req.params[2]];
1015
+ sessionLive = sessionsLive[req.params[2]];
1016
+ if (!(session && sessionLive)) return [3 /*break*/, 13];
1017
+ _a.label = 1;
1018
+ case 1:
1019
+ _a.trys.push([1, 11, , 12]);
1020
+ body = null;
1021
+ ts1 = Date.now();
1022
+ if (!!this.streamSwitchManager) return [3 /*break*/, 3];
1023
+ debug("[".concat(req.params[2], "]: Responding with VOD2Live manifest"));
1024
+ return [4 /*yield*/, session.getCurrentAudioManifestAsync(req.params[0], req.params[1], req.headers["x-playback-session-id"])];
1025
+ case 2:
1026
+ body = _a.sent();
1027
+ return [3 /*break*/, 10];
1028
+ case 3:
1029
+ if (!(switcherStatus[req.params[2]] === null || switcherStatus[req.params[2]] === undefined)) return [3 /*break*/, 5];
1030
+ debug("[".concat(req.params[2], "]: (").concat(switcherStatus[req.params[1]], ") Waiting for streamSwitcher to respond"));
1031
+ return [4 /*yield*/, timer(500)];
1032
+ case 4:
1033
+ _a.sent();
1034
+ return [3 /*break*/, 3];
960
1035
  case 5:
961
- err = new errs.NotFoundError('Invalid session');
1036
+ debug("switcherStatus[".concat(req.params[1], "]=[").concat(switcherStatus[req.params[2]], "]"));
1037
+ if (!switcherStatus[req.params[2]]) return [3 /*break*/, 7];
1038
+ debug("[".concat(req.params[2], "]: Responding with Live-stream manifest"));
1039
+ return [4 /*yield*/, sessionLive.getCurrentAudioManifestAsync(req.params[0], req.params[1])];
1040
+ case 6:
1041
+ body = _a.sent();
1042
+ return [3 /*break*/, 9];
1043
+ case 7:
1044
+ debug("[".concat(req.params[2], "]: Responding with VOD2Live manifest"));
1045
+ return [4 /*yield*/, session.getCurrentAudioManifestAsync(req.params[0], req.params[1], req.headers["x-playback-session-id"])];
1046
+ case 8:
1047
+ body = _a.sent();
1048
+ _a.label = 9;
1049
+ case 9:
1050
+ debug("[".concat(req.params[2], "]: Audio Manifest Request Took (").concat(Date.now() - ts1, ")ms"));
1051
+ _a.label = 10;
1052
+ case 10:
1053
+ res.sendRaw(200, Buffer.from(body, 'utf8'), {
1054
+ "Content-Type": "application/vnd.apple.mpegurl",
1055
+ "Access-Control-Allow-Origin": "*",
1056
+ "Cache-Control": "max-age=".concat(this.streamerOpts.cacheTTL || '4'),
1057
+ "X-Instance-Id": this.instanceId + "<".concat(version, ">"),
1058
+ });
1059
+ next();
1060
+ return [3 /*break*/, 12];
1061
+ case 11:
1062
+ err_6 = _a.sent();
1063
+ next(this._gracefulErrorHandler(err_6));
1064
+ return [3 /*break*/, 12];
1065
+ case 12: return [3 /*break*/, 14];
1066
+ case 13:
1067
+ err = new errs.NotFoundError('Invalid session(s)');
962
1068
  next(err);
963
- _a.label = 6;
964
- case 6: return [2 /*return*/];
1069
+ _a.label = 14;
1070
+ case 14: return [2 /*return*/];
965
1071
  }
966
1072
  });
967
1073
  });
968
1074
  };
969
1075
  ChannelEngine.prototype._handleSubtitleManifest = function (req, res, next) {
970
1076
  return __awaiter(this, void 0, void 0, function () {
971
- var session, body, err_6, err;
1077
+ var session, body, err_7, err;
972
1078
  return __generator(this, function (_a) {
973
1079
  switch (_a.label) {
974
1080
  case 0:
@@ -990,8 +1096,8 @@ var ChannelEngine = /** @class */ (function () {
990
1096
  next();
991
1097
  return [3 /*break*/, 4];
992
1098
  case 3:
993
- err_6 = _a.sent();
994
- next(this._gracefulErrorHandler(err_6));
1099
+ err_7 = _a.sent();
1100
+ next(this._gracefulErrorHandler(err_7));
995
1101
  return [3 /*break*/, 4];
996
1102
  case 4: return [3 /*break*/, 6];
997
1103
  case 5:
@@ -1027,7 +1133,7 @@ var ChannelEngine = /** @class */ (function () {
1027
1133
  };
1028
1134
  ChannelEngine.prototype._handleSubtitleSliceEndpoint = function (req, res, next) {
1029
1135
  return __awaiter(this, void 0, void 0, function () {
1030
- var slicer, body, err_7;
1136
+ var slicer, body, err_8;
1031
1137
  return __generator(this, function (_a) {
1032
1138
  switch (_a.label) {
1033
1139
  case 0:
@@ -1048,77 +1154,10 @@ var ChannelEngine = /** @class */ (function () {
1048
1154
  next();
1049
1155
  return [3 /*break*/, 4];
1050
1156
  case 3:
1051
- err_7 = _a.sent();
1052
- next(this._gracefulErrorHandler(err_7));
1053
- return [3 /*break*/, 4];
1054
- case 4: return [2 /*return*/];
1055
- }
1056
- });
1057
- });
1058
- };
1059
- ChannelEngine.prototype._handleMediaManifest = function (req, res, next) {
1060
- return __awaiter(this, void 0, void 0, function () {
1061
- var session, sessionLive, body, err_8, err;
1062
- return __generator(this, function (_a) {
1063
- switch (_a.label) {
1064
- case 0:
1065
- debug("x-playback-session-id=".concat(req.headers["x-playback-session-id"], " req.url=").concat(req.url));
1066
- debug(req.params);
1067
- session = sessions[req.params[1]];
1068
- sessionLive = sessionsLive[req.params[1]];
1069
- if (!(session && sessionLive)) return [3 /*break*/, 12];
1070
- _a.label = 1;
1071
- case 1:
1072
- _a.trys.push([1, 10, , 11]);
1073
- body = null;
1074
- if (!!this.streamSwitchManager) return [3 /*break*/, 3];
1075
- debug("[".concat(req.params[1], "]: Responding with VOD2Live manifest"));
1076
- return [4 /*yield*/, session.getCurrentMediaManifestAsync(req.params[0], req.headers["x-playback-session-id"])];
1077
- case 2:
1078
- body = _a.sent();
1079
- return [3 /*break*/, 9];
1080
- case 3:
1081
- if (!(switcherStatus[req.params[1]] === null || switcherStatus[req.params[1]] === undefined)) return [3 /*break*/, 5];
1082
- debug("[".concat(req.params[1], "]: (").concat(switcherStatus[req.params[1]], ") Waiting for streamSwitcher to respond"));
1083
- return [4 /*yield*/, timer(500)];
1084
- case 4:
1085
- _a.sent();
1086
- return [3 /*break*/, 3];
1087
- case 5:
1088
- debug("switcherStatus[".concat(req.params[1], "]=[").concat(switcherStatus[req.params[1]], "]"));
1089
- if (!switcherStatus[req.params[1]]) return [3 /*break*/, 7];
1090
- debug("[".concat(req.params[1], "]: Responding with Live-stream manifest"));
1091
- return [4 /*yield*/, sessionLive.getCurrentMediaManifestAsync(req.params[0])];
1092
- case 6:
1093
- body = _a.sent();
1094
- return [3 /*break*/, 9];
1095
- case 7:
1096
- debug("[".concat(req.params[1], "]: Responding with VOD2Live manifest"));
1097
- return [4 /*yield*/, session.getCurrentMediaManifestAsync(req.params[0], req.headers["x-playback-session-id"])];
1098
- case 8:
1099
- body = _a.sent();
1100
- _a.label = 9;
1101
- case 9:
1102
- //verbose(`[${session.sessionId}] body=`);
1103
- //verbose(body);
1104
- res.sendRaw(200, Buffer.from(body, 'utf8'), {
1105
- "Content-Type": "application/vnd.apple.mpegurl",
1106
- "Access-Control-Allow-Origin": "*",
1107
- "Cache-Control": "max-age=".concat(this.streamerOpts.cacheTTL || '4'),
1108
- "X-Instance-Id": this.instanceId + "<".concat(version, ">"),
1109
- });
1110
- next();
1111
- return [3 /*break*/, 11];
1112
- case 10:
1113
1157
  err_8 = _a.sent();
1114
1158
  next(this._gracefulErrorHandler(err_8));
1115
- return [3 /*break*/, 11];
1116
- case 11: return [3 /*break*/, 13];
1117
- case 12:
1118
- err = new errs.NotFoundError('Invalid session(s)');
1119
- next(err);
1120
- _a.label = 13;
1121
- case 13: return [2 /*return*/];
1159
+ return [3 /*break*/, 4];
1160
+ case 4: return [2 /*return*/];
1122
1161
  }
1123
1162
  });
1124
1163
  });
@@ -45,6 +45,10 @@ declare class Session {
45
45
  discSeq: any;
46
46
  mediaSeqOffset: any;
47
47
  transitionSegments: any;
48
+ audioSeq: any;
49
+ discAudioSeq: any;
50
+ audioSeqOffset: any;
51
+ transitionAudioSegments: any;
48
52
  reloadBehind: any;
49
53
  };
50
54
  isAllowedToClearVodCache: boolean;
@@ -87,9 +91,11 @@ declare class Session {
87
91
  resetAsync(id: any): Promise<void>;
88
92
  getSessionState(): Promise<any>;
89
93
  getTruncatedVodSegments(vodUri: any, duration: any): Promise<any>;
90
- setCurrentMediaSequenceSegments(segments: any, mSeqOffset: any, reloadBehind: any): Promise<void>;
94
+ getTruncatedVodAudioSegments(vodUri: any, duration: any): Promise<any>;
95
+ setCurrentMediaSequenceSegments(segments: any, mSeqOffset: any, reloadBehind: any, audioSegments: any, aSeqOffset: any): Promise<void>;
91
96
  getCurrentMediaSequenceSegments(opts: any): Promise<any>;
92
- setCurrentMediaAndDiscSequenceCount(_mediaSeq: any, _discSeq: any): Promise<void>;
97
+ getCurrentAudioSequenceSegments(opts: any): Promise<any>;
98
+ setCurrentMediaAndDiscSequenceCount(_mediaSeq: any, _discSeq: any, _audioSeq: any, _discAudioSeq: any): Promise<void>;
93
99
  getCurrentMediaAndDiscSequenceCount(): Promise<{
94
100
  mediaSeq: any;
95
101
  discSeq: any;