prismcast 1.2.0 → 1.3.0

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 (129) hide show
  1. package/README.md +26 -1
  2. package/dist/app.js +29 -2
  3. package/dist/app.js.map +1 -1
  4. package/dist/browser/cdp.js +1 -1
  5. package/dist/browser/cdp.js.map +1 -1
  6. package/dist/browser/channelSelection.d.ts +14 -4
  7. package/dist/browser/channelSelection.js +48 -704
  8. package/dist/browser/channelSelection.js.map +1 -1
  9. package/dist/browser/index.d.ts +18 -4
  10. package/dist/browser/index.js +205 -39
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/tuning/fox.d.ts +19 -0
  13. package/dist/browser/tuning/fox.js +61 -0
  14. package/dist/browser/tuning/fox.js.map +1 -0
  15. package/dist/browser/tuning/hbo.d.ts +22 -0
  16. package/dist/browser/tuning/hbo.js +182 -0
  17. package/dist/browser/tuning/hbo.js.map +1 -0
  18. package/dist/browser/tuning/hulu.d.ts +30 -0
  19. package/dist/browser/tuning/hulu.js +514 -0
  20. package/dist/browser/tuning/hulu.js.map +1 -0
  21. package/dist/browser/tuning/sling.d.ts +22 -0
  22. package/dist/browser/tuning/sling.js +287 -0
  23. package/dist/browser/tuning/sling.js.map +1 -0
  24. package/dist/browser/tuning/thumbnailRow.d.ts +18 -0
  25. package/dist/browser/tuning/thumbnailRow.js +107 -0
  26. package/dist/browser/tuning/thumbnailRow.js.map +1 -0
  27. package/dist/browser/tuning/tileClick.d.ts +18 -0
  28. package/dist/browser/tuning/tileClick.js +102 -0
  29. package/dist/browser/tuning/tileClick.js.map +1 -0
  30. package/dist/browser/tuning/youtubeTv.d.ts +17 -0
  31. package/dist/browser/tuning/youtubeTv.js +99 -0
  32. package/dist/browser/tuning/youtubeTv.js.map +1 -0
  33. package/dist/browser/video.d.ts +2 -2
  34. package/dist/browser/video.js +18 -8
  35. package/dist/browser/video.js.map +1 -1
  36. package/dist/channels/index.js +131 -12
  37. package/dist/channels/index.js.map +1 -1
  38. package/dist/config/profiles.d.ts +5 -5
  39. package/dist/config/profiles.js +35 -11
  40. package/dist/config/profiles.js.map +1 -1
  41. package/dist/config/providers.d.ts +48 -4
  42. package/dist/config/providers.js +182 -22
  43. package/dist/config/providers.js.map +1 -1
  44. package/dist/config/sites.d.ts +10 -0
  45. package/dist/config/sites.js +96 -17
  46. package/dist/config/sites.js.map +1 -1
  47. package/dist/config/userChannels.js +21 -3
  48. package/dist/config/userChannels.js.map +1 -1
  49. package/dist/config/userConfig.d.ts +2 -1
  50. package/dist/config/userConfig.js +12 -4
  51. package/dist/config/userConfig.js.map +1 -1
  52. package/dist/index.js +10 -4
  53. package/dist/index.js.map +1 -1
  54. package/dist/routes/auth.js +6 -0
  55. package/dist/routes/auth.js.map +1 -1
  56. package/dist/routes/config.d.ts +5 -0
  57. package/dist/routes/config.js +273 -35
  58. package/dist/routes/config.js.map +1 -1
  59. package/dist/routes/debug.d.ts +6 -0
  60. package/dist/routes/debug.js +274 -0
  61. package/dist/routes/debug.js.map +1 -0
  62. package/dist/routes/index.d.ts +1 -0
  63. package/dist/routes/index.js +3 -0
  64. package/dist/routes/index.js.map +1 -1
  65. package/dist/routes/logs.js +17 -5
  66. package/dist/routes/logs.js.map +1 -1
  67. package/dist/routes/root.js +507 -128
  68. package/dist/routes/root.js.map +1 -1
  69. package/dist/routes/theme.js +7 -0
  70. package/dist/routes/theme.js.map +1 -1
  71. package/dist/service/commands.js +8 -8
  72. package/dist/service/commands.js.map +1 -1
  73. package/dist/service/generators.js +22 -16
  74. package/dist/service/generators.js.map +1 -1
  75. package/dist/streaming/fmp4Segmenter.d.ts +7 -0
  76. package/dist/streaming/fmp4Segmenter.js +124 -15
  77. package/dist/streaming/fmp4Segmenter.js.map +1 -1
  78. package/dist/streaming/hls.d.ts +74 -6
  79. package/dist/streaming/hls.js +212 -130
  80. package/dist/streaming/hls.js.map +1 -1
  81. package/dist/streaming/hlsSegments.js +11 -4
  82. package/dist/streaming/hlsSegments.js.map +1 -1
  83. package/dist/streaming/lifecycle.js +1 -1
  84. package/dist/streaming/lifecycle.js.map +1 -1
  85. package/dist/streaming/monitor.d.ts +1 -1
  86. package/dist/streaming/monitor.js +202 -53
  87. package/dist/streaming/monitor.js.map +1 -1
  88. package/dist/streaming/mp4Parser.d.ts +29 -1
  89. package/dist/streaming/mp4Parser.js +243 -18
  90. package/dist/streaming/mp4Parser.js.map +1 -1
  91. package/dist/streaming/mpegts.d.ts +5 -2
  92. package/dist/streaming/mpegts.js +122 -29
  93. package/dist/streaming/mpegts.js.map +1 -1
  94. package/dist/streaming/registry.d.ts +1 -1
  95. package/dist/streaming/registry.js.map +1 -1
  96. package/dist/streaming/setup.d.ts +13 -1
  97. package/dist/streaming/setup.js +136 -36
  98. package/dist/streaming/setup.js.map +1 -1
  99. package/dist/streaming/showInfo.js +9 -9
  100. package/dist/streaming/showInfo.js.map +1 -1
  101. package/dist/streaming/statusEmitter.js +5 -6
  102. package/dist/streaming/statusEmitter.js.map +1 -1
  103. package/dist/types/index.d.ts +16 -3
  104. package/dist/types/index.js +5 -1
  105. package/dist/types/index.js.map +1 -1
  106. package/dist/utils/debugFilter.d.ts +38 -0
  107. package/dist/utils/debugFilter.js +157 -0
  108. package/dist/utils/debugFilter.js.map +1 -0
  109. package/dist/utils/evaluate.js.map +1 -1
  110. package/dist/utils/ffmpeg.d.ts +5 -0
  111. package/dist/utils/ffmpeg.js +13 -2
  112. package/dist/utils/ffmpeg.js.map +1 -1
  113. package/dist/utils/fileLogger.d.ts +2 -1
  114. package/dist/utils/fileLogger.js +4 -2
  115. package/dist/utils/fileLogger.js.map +1 -1
  116. package/dist/utils/index.d.ts +1 -0
  117. package/dist/utils/index.js +1 -0
  118. package/dist/utils/index.js.map +1 -1
  119. package/dist/utils/logEmitter.d.ts +1 -0
  120. package/dist/utils/logEmitter.js.map +1 -1
  121. package/dist/utils/logger.d.ts +9 -8
  122. package/dist/utils/logger.js +52 -28
  123. package/dist/utils/logger.js.map +1 -1
  124. package/dist/utils/retry.d.ts +1 -1
  125. package/dist/utils/retry.js +3 -3
  126. package/dist/utils/retry.js.map +1 -1
  127. package/dist/utils/version.js +4 -9
  128. package/dist/utils/version.js.map +1 -1
  129. package/package.json +6 -6
@@ -2,7 +2,7 @@
2
2
  *
3
3
  * fmp4Segmenter.ts: fMP4 HLS segmentation for PrismCast.
4
4
  */
5
- import { createMP4BoxParser, detectMoofKeyframe } from "./mp4Parser.js";
5
+ import { createMP4BoxParser, detectMoofKeyframe, parseMoovTimescales, rewriteMoofTimestamps } from "./mp4Parser.js";
6
6
  import { storeInitSegment, storeSegment, updatePlaylist } from "./hlsSegments.js";
7
7
  import { CONFIG } from "../config/index.js";
8
8
  import { LOG } from "../utils/index.js";
@@ -17,6 +17,11 @@ import { LOG } from "../utils/index.js";
17
17
  // Set to true to enable keyframe detection and statistics. This parses traf/trun sample flags in each moof to track keyframe frequency and log per-segment warnings.
18
18
  // Useful for diagnosing frozen screen issues in downstream HLS consumers.
19
19
  const KEYFRAME_DEBUG = false;
20
+ // Ratio threshold for the duration sanity check. If a trun's computed total duration exceeds this multiple of the established per-track baseline (or falls below 1/Nth),
21
+ // the duration is considered corrupt and the timestamp counter is corrected to use the baseline value instead. A factor of 20 is deliberately generous — Chrome's
22
+ // MediaRecorder legitimately produces bursty moofs (5-8x normal) when the source player buffers and then delivers accumulated frames in a burst. Those are real data,
23
+ // not corruption. This ratio catches only truly pathological values while letting burst moofs pass through with their correct durations.
24
+ const DURATION_SANITY_RATIO = 20n;
20
25
  // Keyframe Stats Formatting.
21
26
  /**
22
27
  * Formats keyframe statistics into a human-readable summary for the termination log. Returns an empty string if no moof boxes were processed. The format mirrors the
@@ -63,7 +68,7 @@ export function formatKeyframeStatsSummary(stats) {
63
68
  * @returns The segmenter interface with pipe, stop, and keyframe stats methods.
64
69
  */
65
70
  export function createFMP4Segmenter(options) {
66
- const { onError, onStop, pendingDiscontinuity, startingSegmentIndex, streamId } = options;
71
+ const { initialTrackTimestamps, onError, onStop, pendingDiscontinuity, previousInitSegment, startingInitVersion, startingSegmentIndex, streamId } = options;
67
72
  // Initialize state.
68
73
  const state = {
69
74
  discontinuityIndices: new Set(),
@@ -72,6 +77,8 @@ export function createFMP4Segmenter(options) {
72
77
  hasInit: false,
73
78
  indeterminateCount: 0,
74
79
  initBoxes: [],
80
+ initSegment: null,
81
+ initVersion: startingInitVersion ?? 0,
75
82
  keyframeCount: 0,
76
83
  lastKeyframeTime: null,
77
84
  lastSegmentSize: 0,
@@ -83,9 +90,14 @@ export function createFMP4Segmenter(options) {
83
90
  segmentFirstMoofChecked: false,
84
91
  segmentIndex: startingSegmentIndex ?? 0,
85
92
  segmentStartTime: Date.now(),
93
+ segmentTrackDurations: new Map(),
86
94
  segmentsWithoutLeadingKeyframe: 0,
87
95
  stopped: false,
88
- totalKeyframeIntervalMs: 0
96
+ totalKeyframeIntervalMs: 0,
97
+ trackExpectedDurations: new Map(),
98
+ trackTimescales: new Map(),
99
+ trackTimestamps: initialTrackTimestamps ? new Map(initialTrackTimestamps) : new Map(),
100
+ zeroDurationWarned: new Set()
89
101
  };
90
102
  // Reference to the input stream for cleanup.
91
103
  let inputStream = null;
@@ -108,7 +120,7 @@ export function createFMP4Segmenter(options) {
108
120
  "#EXT-X-VERSION:7",
109
121
  ["#EXT-X-TARGETDURATION:", String(Math.ceil(maxDuration))].join(""),
110
122
  ["#EXT-X-MEDIA-SEQUENCE:", String(startIndex)].join(""),
111
- "#EXT-X-MAP:URI=\"init.mp4\""
123
+ ["#EXT-X-MAP:URI=\"init.mp4?v=", String(state.initVersion), "\""].join("")
112
124
  ];
113
125
  // Add segment entries for each segment in the current playlist window.
114
126
  for (let i = startIndex; i < state.segmentIndex; i++) {
@@ -116,17 +128,26 @@ export function createFMP4Segmenter(options) {
116
128
  // with the current codec parameters.
117
129
  if (state.discontinuityIndices.has(i)) {
118
130
  lines.push("#EXT-X-DISCONTINUITY");
119
- lines.push("#EXT-X-MAP:URI=\"init.mp4\"");
131
+ lines.push(["#EXT-X-MAP:URI=\"init.mp4?v=", String(state.initVersion), "\""].join(""));
120
132
  }
121
133
  // Use the actual recorded duration for this segment. Fall back to the configured target duration for segments that predate duration tracking (e.g. after
122
134
  // a hot restart with continuation).
123
135
  const duration = state.segmentDurations.get(i) ?? CONFIG.hls.segmentDuration;
124
- lines.push(["#EXTINF:", String(duration.toFixed(3)), ","].join(""));
136
+ lines.push(["#EXTINF:", duration.toFixed(3), ","].join(""));
125
137
  lines.push(["segment", String(i), ".m4s"].join(""));
126
138
  }
127
139
  lines.push("");
128
140
  return lines.join("\n");
129
141
  }
142
+ /**
143
+ * Resets per-segment tracking state. Called after outputting a segment. Extracted to avoid duplication of the same four assignments.
144
+ */
145
+ function resetSegmentTracking() {
146
+ state.fragmentBuffer = [];
147
+ state.segmentFirstMoofChecked = false;
148
+ state.segmentStartTime = Date.now();
149
+ state.segmentTrackDurations = new Map();
150
+ }
130
151
  /**
131
152
  * Outputs the current fragment buffer as a segment.
132
153
  */
@@ -139,8 +160,21 @@ export function createFMP4Segmenter(options) {
139
160
  state.discontinuityIndices.add(state.segmentIndex);
140
161
  state.pendingDiscontinuity = false;
141
162
  }
142
- // Record the actual wall-clock duration of this segment. We floor at 0.1 seconds to prevent zero-duration entries that would violate HLS expectations.
143
- const actualDuration = Math.max(0.1, (Date.now() - state.segmentStartTime) / 1000);
163
+ // Compute the segment duration from accumulated trun durations (media timeline). Both audio and video tracks should produce nearly identical real-time values. We
164
+ // take the maximum across tracks to handle edge cases where one track has slightly more data at a segment boundary. Falls back to wall-clock time if no media
165
+ // durations were accumulated (e.g., rewriteMoofTimestamps threw for every moof in this segment, or moov timescale parsing failed). Floored at 0.1 seconds to
166
+ // prevent zero-duration entries that would violate HLS expectations.
167
+ let mediaDuration = 0;
168
+ for (const [trackId, accumulated] of state.segmentTrackDurations) {
169
+ const timescale = state.trackTimescales.get(trackId);
170
+ if (timescale && (accumulated > 0n)) {
171
+ const seconds = Number(accumulated) / timescale;
172
+ if (seconds > mediaDuration) {
173
+ mediaDuration = seconds;
174
+ }
175
+ }
176
+ }
177
+ const actualDuration = Math.max(0.1, (mediaDuration > 0) ? mediaDuration : ((Date.now() - state.segmentStartTime) / 1000));
144
178
  state.segmentDurations.set(state.segmentIndex, actualDuration);
145
179
  // Combine all fragment data into a single segment.
146
180
  const segmentData = Buffer.concat(state.fragmentBuffer);
@@ -158,10 +192,8 @@ export function createFMP4Segmenter(options) {
158
192
  state.segmentDurations.delete(idx);
159
193
  }
160
194
  }
161
- // Clear the fragment buffer and reset the first-moof keyframe check for the next segment.
162
- state.fragmentBuffer = [];
163
- state.segmentFirstMoofChecked = false;
164
- state.segmentStartTime = Date.now();
195
+ // Clear the fragment buffer and reset segment-level tracking for the next segment.
196
+ resetSegmentTracking();
165
197
  // Update the playlist.
166
198
  updatePlaylist(streamId, generatePlaylist());
167
199
  }
@@ -182,7 +214,7 @@ export function createFMP4Segmenter(options) {
182
214
  if (intervalMs > state.maxKeyframeIntervalMs) {
183
215
  state.maxKeyframeIntervalMs = intervalMs;
184
216
  }
185
- LOG.debug("Keyframe detected, interval: %dms.", intervalMs);
217
+ LOG.debug("streaming:segmenter", "Keyframe detected, interval: %dms.", intervalMs);
186
218
  }
187
219
  state.lastKeyframeTime = now;
188
220
  }
@@ -218,6 +250,36 @@ export function createFMP4Segmenter(options) {
218
250
  const initData = Buffer.concat(state.initBoxes);
219
251
  storeInitSegment(streamId, initData);
220
252
  state.hasInit = true;
253
+ state.initSegment = initData;
254
+ // Check whether the init content changed. Always true for fresh streams (no previousInitSegment). For tab replacement, false when the new capture
255
+ // happens to use the same codec parameters as the old one.
256
+ const initChanged = !previousInitSegment || !initData.equals(previousInitSegment);
257
+ // Version the init URI for HLS cache busting. Incrementing the version makes the #EXT-X-MAP URI different from the previous playlist, forcing clients
258
+ // to re-fetch the init segment. This prevents timescale mismatches when Chrome's MediaRecorder picks a different timescale between capture sessions.
259
+ if (initChanged) {
260
+ state.initVersion++;
261
+ }
262
+ // Extract per-track timescale values from the moov box. These convert trun sample durations (timescale units) to seconds for media-time EXTINF values.
263
+ // Wrapped in try/catch so a malformed moov never prevents stream startup — EXTINF falls back to wall-clock time if parsing fails.
264
+ try {
265
+ state.trackTimescales = parseMoovTimescales(box.data);
266
+ if (state.trackTimescales.size === 0) {
267
+ LOG.debug("streaming:segmenter", "No track timescales found in moov. EXTINF will use wall-clock fallback.");
268
+ }
269
+ }
270
+ catch {
271
+ LOG.debug("streaming:segmenter", "Failed to parse moov timescales. EXTINF will use wall-clock fallback.");
272
+ }
273
+ // Log init segment details for debugging timescale or codec issues.
274
+ const timescaleEntries = [];
275
+ for (const [trackId, timescale] of state.trackTimescales) {
276
+ timescaleEntries.push("track " + String(trackId) + "=" + String(timescale));
277
+ }
278
+ LOG.debug("streaming:segmenter", "Init segment received: %d bytes, version=%d, timescales=[%s].", initData.length, state.initVersion, timescaleEntries.join(", "));
279
+ // Suppress the discontinuity marker when codec parameters are unchanged (byte-identical init). This avoids an unnecessary decoder flush on the client.
280
+ if (!initChanged && state.pendingDiscontinuity) {
281
+ state.pendingDiscontinuity = false;
282
+ }
221
283
  }
222
284
  return;
223
285
  }
@@ -227,8 +289,7 @@ export function createFMP4Segmenter(options) {
227
289
  // Start of a new fragment. Check whether we should cut a segment before adding this moof to the buffer.
228
290
  if (state.fragmentBuffer.length > 0) {
229
291
  if (!state.firstSegmentEmitted) {
230
- // Fast path: emit the first segment as soon as we have one complete moof+mdat pair. This minimizes time-to-first-frame by making the first segment
231
- // available after just one fragment rather than waiting for the full target duration.
292
+ // Fast path: emit the first segment as soon as we have one complete moof+mdat pair.
232
293
  outputSegment();
233
294
  }
234
295
  else {
@@ -239,6 +300,51 @@ export function createFMP4Segmenter(options) {
239
300
  }
240
301
  }
241
302
  }
303
+ // Rewrite tfdt.baseMediaDecodeTime in each traf with self-generated monotonic timestamps. This eliminates discontinuities from capture restarts (tab
304
+ // replacement, source reload). Wrapped in try/catch so a malformed moof never crashes the segmenter — the segment passes through with Chrome's original
305
+ // timestamps, which is better than dropping it entirely.
306
+ try {
307
+ const trafDurations = rewriteMoofTimestamps(box.data, state.trackTimestamps);
308
+ // Process per-track durations for diagnostics and sanity checking.
309
+ for (const [trackId, duration] of trafDurations) {
310
+ // Zero duration: rate-limited warning. Indicates a trun parsing issue but doesn't corrupt the counter (advancing by zero is harmless).
311
+ if (duration === 0n) {
312
+ if (!state.zeroDurationWarned.has(trackId)) {
313
+ state.zeroDurationWarned.add(trackId);
314
+ LOG.debug("streaming:segmenter", "Zero duration in moof traf for track %d.", trackId);
315
+ }
316
+ continue;
317
+ }
318
+ // The effective duration is what trackTimestamps actually advances by for this moof. Normally this equals the trun-computed duration, but the sanity
319
+ // check below may clamp it to the expected baseline when the computed value is unreasonable.
320
+ let effectiveDuration = duration;
321
+ // Sanity check: compare against the anchored baseline for this track. A wildly off duration (e.g., from a corrupt trun with inflated per-sample durations)
322
+ // would permanently shift all subsequent timestamps if not caught. The rewrite function already advanced the counter by `duration` — we correct it here
323
+ // by substituting the baseline value when the computed value is unreasonable. The baseline is anchored to the first valid moof and never updated — this
324
+ // prevents baseline poisoning from burst moofs that Chrome's MediaRecorder produces after source buffering stalls.
325
+ const expected = state.trackExpectedDurations.get(trackId);
326
+ if (expected && (expected > 0n) && ((duration > (expected * DURATION_SANITY_RATIO)) || (duration < (expected / DURATION_SANITY_RATIO)))) {
327
+ const current = state.trackTimestamps.get(trackId);
328
+ if (current !== undefined) {
329
+ state.trackTimestamps.set(trackId, current - duration + expected);
330
+ }
331
+ effectiveDuration = expected;
332
+ LOG.debug("streaming:segmenter", "Clamped abnormal trun duration for track %d: %s units (expected ~%s, baselines=%d).", trackId, String(duration), String(expected), state.trackExpectedDurations.size);
333
+ }
334
+ else if (!state.trackExpectedDurations.has(trackId)) {
335
+ // Establish baseline from the first valid moof per track. The baseline is never updated afterward — see trackExpectedDurations comment in SegmenterState.
336
+ state.trackExpectedDurations.set(trackId, duration);
337
+ LOG.debug("streaming:segmenter", "Anchored baseline for track %d: %s units (segment %d).", trackId, String(duration), state.segmentIndex);
338
+ }
339
+ // Accumulate the effective duration for media-time EXTINF computation. This stays synchronized with the trackTimestamps counter that drives
340
+ // baseMediaDecodeTime — clamped moofs contribute the clamped value, normal moofs contribute the trun-computed value.
341
+ const prev = state.segmentTrackDurations.get(trackId) ?? 0n;
342
+ state.segmentTrackDurations.set(trackId, prev + effectiveDuration);
343
+ }
344
+ }
345
+ catch {
346
+ LOG.debug("streaming:segmenter", "Failed to rewrite moof timestamps.");
347
+ }
242
348
  // When keyframe debugging is enabled, parse traf/trun sample flags to detect whether this moof starts with a keyframe. Wrapped in try/catch for failure
243
349
  // isolation — a malformed moof should never crash the segmenter.
244
350
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -308,6 +414,8 @@ export function createFMP4Segmenter(options) {
308
414
  onError(error);
309
415
  }
310
416
  return {
417
+ getInitSegment: () => state.initSegment,
418
+ getInitVersion: () => state.initVersion,
311
419
  getKeyframeStats: () => ({
312
420
  averageKeyframeIntervalMs: (state.keyframeCount >= 2) ? (state.totalKeyframeIntervalMs / (state.keyframeCount - 1)) : 0,
313
421
  indeterminateCount: state.indeterminateCount,
@@ -319,6 +427,7 @@ export function createFMP4Segmenter(options) {
319
427
  }),
320
428
  getLastSegmentSize: () => state.lastSegmentSize,
321
429
  getSegmentIndex: () => state.segmentIndex,
430
+ getTrackTimestamps: () => new Map(state.trackTimestamps),
322
431
  markDiscontinuity: () => {
323
432
  if (state.stopped) {
324
433
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"fmp4Segmenter.js","sourceRoot":"","sources":["../../src/streaming/fmp4Segmenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fmp4Segmenter.js","sourceRoot":"","sources":["../../src/streaming/fmp4Segmenter.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,43 @@
1
+ import type { Channel, Nullable } from "../types/index.js";
1
2
  import type { Request, Response } from "express";
2
3
  /**
3
- * Ensures a stream is running for a channel. If no stream exists, starts one. If a stream startup is in progress (placeholder), waits for it to complete. Returns the
4
- * stream ID if successful, or null if an error occurred (with the error response already sent to the client).
4
+ * Result of channel validation. On success, contains the resolved channel and provider key. On failure, contains the HTTP error details. The body field carries
5
+ * either a plain string (for text error responses) or an object (for JSON error responses), so callers can use typeof to pick res.send() vs res.json().
6
+ */
7
+ export type ValidateChannelResult = {
8
+ channel: Channel;
9
+ resolvedKey: string;
10
+ valid: true;
11
+ } | {
12
+ body: Record<string, string> | string;
13
+ statusCode: number;
14
+ valid: false;
15
+ };
16
+ /**
17
+ * Validates a channel name for streaming. Performs all fast, synchronous checks: disabled status, provider resolution, channel lookup, and login mode. Returns a
18
+ * discriminated union so callers can handle success and failure without coupling to Express response objects.
19
+ *
20
+ * This is extracted from ensureChannelStream() so it can be called by both HLS and MPEG-TS code paths without duplicating the validation logic.
21
+ *
22
+ * @param channelName - The channel key to validate.
23
+ * @returns Validation result with channel data on success, or error details on failure.
24
+ */
25
+ export declare function validateChannel(channelName: string): ValidateChannelResult;
26
+ /**
27
+ * Sends a validation error response to the client. Handles both plain text bodies (via res.send) and object bodies (via res.json).
28
+ * @param validation - The failed validation result.
29
+ * @param res - Express response object.
30
+ */
31
+ export declare function sendValidationError(validation: {
32
+ body: Record<string, string> | string;
33
+ statusCode: number;
34
+ }, res: Response): void;
35
+ /**
36
+ * Ensures a stream is running for a channel. If no stream exists, starts one. If a stream startup is in progress (-1 sentinel), waits for it to complete. Returns
37
+ * the stream ID if successful, or null if an error occurred (with the error response already sent to the client).
5
38
  *
6
- * This is the shared entry point for both HLS and MPEG-TS handlers. It handles channel validation, login mode blocking, and concurrent startup deduplication. The
7
- * existing-stream check runs first so that ad-hoc streams (started via /play with synthetic keys) can be served without requiring a predefined channel definition.
39
+ * The existing-stream check runs first so that ad-hoc streams (registered under synthetic keys like "play-a1b2c3d4") can be served without failing the
40
+ * "Channel not found" check.
8
41
  *
9
42
  * For channels with multiple providers (e.g., ESPN via ESPN.com or Disney+), the user's provider selection is resolved before looking up the channel definition.
10
43
  * The stream is registered under the canonical key (channelName) for deduplication, but uses the resolved provider's URL and settings.
@@ -14,9 +47,9 @@ import type { Request, Response } from "express";
14
47
  * @param res - Express response object (for error responses).
15
48
  * @returns The stream ID if a stream is running, or null if an error occurred.
16
49
  */
17
- export declare function ensureChannelStream(channelName: string, req: Request, res: Response): Promise<number | null>;
50
+ export declare function ensureChannelStream(channelName: string, req: Request, res: Response): Promise<Nullable<number>>;
18
51
  /**
19
- * Handles HLS playlist requests. Ensures a stream is running for the requested channel, waits for the first playlist to be produced, then returns it.
52
+ * Handles HLS playlist requests. Ensures a stream is running for the channel (blocking until ready if a new stream must start), then returns the playlist.
20
53
  *
21
54
  * Route: GET /hls/:name/stream.m3u8
22
55
  *
@@ -46,7 +79,42 @@ export declare function handleHLSSegment(req: Request, res: Response): void;
46
79
  * @param res - Express response object.
47
80
  */
48
81
  export declare function handlePlayStream(req: Request, res: Response): Promise<void>;
82
+ /**
83
+ * Waits for a stream startup to complete without sending any HTTP responses. Used by MPEG-TS when headers have already been flushed and error responses cannot be
84
+ * sent.
85
+ *
86
+ * @param channelName - The channel name (or synthetic ad-hoc key) to poll.
87
+ * @returns The resolved stream ID on success, or null if startup failed or timed out.
88
+ */
89
+ export declare function awaitStreamReadySilent(channelName: string): Promise<Nullable<number>>;
90
+ /**
91
+ * Options for initializing a stream.
92
+ */
93
+ interface InitializeStreamOptions {
94
+ channel?: Channel;
95
+ channelSelector?: string;
96
+ channelName: string;
97
+ clientAddress: Nullable<string>;
98
+ clickSelector?: string;
99
+ clickToPlay?: boolean;
100
+ profileOverride?: string;
101
+ url: string;
102
+ }
103
+ /**
104
+ * Initializes a new HLS stream. This is the shared stream startup logic used by both channel-based and ad-hoc streams. It handles browser capture setup, segmenter
105
+ * creation, stream registration, and event emission.
106
+ *
107
+ * A -1 sentinel is set in channelToStreamId during setup to prevent duplicate stream starts. On success, the sentinel is replaced with the real stream ID. On
108
+ * failure, the sentinel is removed and the error is re-thrown for the caller to handle HTTP error responses appropriately (channel-based streams need HDHomeRun
109
+ * headers, ad-hoc streams do not).
110
+ *
111
+ * @param options - Stream initialization options.
112
+ * @returns The stream ID on success, or null if the stream was terminated during the narrow setup window (orphaned setup race condition).
113
+ * @throws StreamSetupError if setup fails, or Error for unexpected failures.
114
+ */
115
+ export declare function initializeStream(options: InitializeStreamOptions): Promise<Nullable<number>>;
49
116
  /**
50
117
  * Checks for idle streams and terminates them. Called periodically by the idle detection interval.
51
118
  */
52
119
  export declare function cleanupIdleStreams(): void;
120
+ export {};