@bnhf/prismcast 1.3.4-2026.2.19
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/LICENSE.md +7 -0
- package/README.md +347 -0
- package/bin/prismcast +6 -0
- package/dist/app.d.ts +6 -0
- package/dist/app.js +315 -0
- package/dist/app.js.map +1 -0
- package/dist/browser/cdp.d.ts +38 -0
- package/dist/browser/cdp.js +155 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/channelSelection.d.ts +65 -0
- package/dist/browser/channelSelection.js +202 -0
- package/dist/browser/channelSelection.js.map +1 -0
- package/dist/browser/display.d.ts +34 -0
- package/dist/browser/display.js +54 -0
- package/dist/browser/display.js.map +1 -0
- package/dist/browser/index.d.ts +205 -0
- package/dist/browser/index.js +1205 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/tuning/fox.d.ts +2 -0
- package/dist/browser/tuning/fox.js +83 -0
- package/dist/browser/tuning/fox.js.map +1 -0
- package/dist/browser/tuning/hbo.d.ts +2 -0
- package/dist/browser/tuning/hbo.js +237 -0
- package/dist/browser/tuning/hbo.js.map +1 -0
- package/dist/browser/tuning/hulu.d.ts +2 -0
- package/dist/browser/tuning/hulu.js +550 -0
- package/dist/browser/tuning/hulu.js.map +1 -0
- package/dist/browser/tuning/sling.d.ts +2 -0
- package/dist/browser/tuning/sling.js +518 -0
- package/dist/browser/tuning/sling.js.map +1 -0
- package/dist/browser/tuning/thumbnailRow.d.ts +2 -0
- package/dist/browser/tuning/thumbnailRow.js +108 -0
- package/dist/browser/tuning/thumbnailRow.js.map +1 -0
- package/dist/browser/tuning/tileClick.d.ts +2 -0
- package/dist/browser/tuning/tileClick.js +103 -0
- package/dist/browser/tuning/tileClick.js.map +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts +2 -0
- package/dist/browser/tuning/youtubeTv.js +182 -0
- package/dist/browser/tuning/youtubeTv.js.map +1 -0
- package/dist/browser/video.d.ts +289 -0
- package/dist/browser/video.js +996 -0
- package/dist/browser/video.js.map +1 -0
- package/dist/channels/index.d.ts +3 -0
- package/dist/channels/index.js +392 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/config/index.d.ts +53 -0
- package/dist/config/index.js +233 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/presets.d.ts +98 -0
- package/dist/config/presets.js +241 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/profiles.d.ts +79 -0
- package/dist/config/profiles.js +245 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/providers.d.ts +120 -0
- package/dist/config/providers.js +450 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/sites.d.ts +22 -0
- package/dist/config/sites.js +377 -0
- package/dist/config/sites.js.map +1 -0
- package/dist/config/userChannels.d.ts +178 -0
- package/dist/config/userChannels.js +543 -0
- package/dist/config/userChannels.js.map +1 -0
- package/dist/config/userConfig.d.ts +235 -0
- package/dist/config/userConfig.js +913 -0
- package/dist/config/userConfig.js.map +1 -0
- package/dist/hdhr/channelMap.d.ts +21 -0
- package/dist/hdhr/channelMap.js +82 -0
- package/dist/hdhr/channelMap.js.map +1 -0
- package/dist/hdhr/deviceId.d.ts +11 -0
- package/dist/hdhr/deviceId.js +84 -0
- package/dist/hdhr/deviceId.js.map +1 -0
- package/dist/hdhr/discover.d.ts +6 -0
- package/dist/hdhr/discover.js +155 -0
- package/dist/hdhr/discover.js.map +1 -0
- package/dist/hdhr/index.d.ts +9 -0
- package/dist/hdhr/index.js +87 -0
- package/dist/hdhr/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/assets.d.ts +6 -0
- package/dist/routes/assets.js +79 -0
- package/dist/routes/assets.js.map +1 -0
- package/dist/routes/auth.d.ts +6 -0
- package/dist/routes/auth.js +77 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/channels.d.ts +6 -0
- package/dist/routes/channels.js +40 -0
- package/dist/routes/channels.js.map +1 -0
- package/dist/routes/components.d.ts +138 -0
- package/dist/routes/components.js +210 -0
- package/dist/routes/components.js.map +1 -0
- package/dist/routes/config.d.ts +72 -0
- package/dist/routes/config.js +1977 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/debug.d.ts +6 -0
- package/dist/routes/debug.js +274 -0
- package/dist/routes/debug.js.map +1 -0
- package/dist/routes/health.d.ts +6 -0
- package/dist/routes/health.js +85 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/hls.d.ts +6 -0
- package/dist/routes/hls.js +25 -0
- package/dist/routes/hls.js.map +1 -0
- package/dist/routes/index.d.ts +19 -0
- package/dist/routes/index.js +49 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/logs.d.ts +6 -0
- package/dist/routes/logs.js +164 -0
- package/dist/routes/logs.js.map +1 -0
- package/dist/routes/mpegts.d.ts +6 -0
- package/dist/routes/mpegts.js +19 -0
- package/dist/routes/mpegts.js.map +1 -0
- package/dist/routes/play.d.ts +6 -0
- package/dist/routes/play.js +18 -0
- package/dist/routes/play.js.map +1 -0
- package/dist/routes/playlist.d.ts +36 -0
- package/dist/routes/playlist.js +134 -0
- package/dist/routes/playlist.js.map +1 -0
- package/dist/routes/root.d.ts +6 -0
- package/dist/routes/root.js +2920 -0
- package/dist/routes/root.js.map +1 -0
- package/dist/routes/streams.d.ts +6 -0
- package/dist/routes/streams.js +88 -0
- package/dist/routes/streams.js.map +1 -0
- package/dist/routes/theme.d.ts +15 -0
- package/dist/routes/theme.js +275 -0
- package/dist/routes/theme.js.map +1 -0
- package/dist/routes/ui.d.ts +56 -0
- package/dist/routes/ui.js +354 -0
- package/dist/routes/ui.js.map +1 -0
- package/dist/service/commands.d.ts +41 -0
- package/dist/service/commands.js +391 -0
- package/dist/service/commands.js.map +1 -0
- package/dist/service/generators.d.ts +33 -0
- package/dist/service/generators.js +432 -0
- package/dist/service/generators.js.map +1 -0
- package/dist/service/index.d.ts +2 -0
- package/dist/service/index.js +7 -0
- package/dist/service/index.js.map +1 -0
- package/dist/streaming/clients.d.ts +48 -0
- package/dist/streaming/clients.js +114 -0
- package/dist/streaming/clients.js.map +1 -0
- package/dist/streaming/fmp4Segmenter.d.ts +61 -0
- package/dist/streaming/fmp4Segmenter.js +461 -0
- package/dist/streaming/fmp4Segmenter.js.map +1 -0
- package/dist/streaming/hls.d.ts +120 -0
- package/dist/streaming/hls.js +722 -0
- package/dist/streaming/hls.js.map +1 -0
- package/dist/streaming/hlsSegments.d.ts +54 -0
- package/dist/streaming/hlsSegments.js +162 -0
- package/dist/streaming/hlsSegments.js.map +1 -0
- package/dist/streaming/lifecycle.d.ts +33 -0
- package/dist/streaming/lifecycle.js +185 -0
- package/dist/streaming/lifecycle.js.map +1 -0
- package/dist/streaming/monitor.d.ts +74 -0
- package/dist/streaming/monitor.js +1310 -0
- package/dist/streaming/monitor.js.map +1 -0
- package/dist/streaming/mp4Parser.d.ts +74 -0
- package/dist/streaming/mp4Parser.js +566 -0
- package/dist/streaming/mp4Parser.js.map +1 -0
- package/dist/streaming/mpegts.d.ts +14 -0
- package/dist/streaming/mpegts.js +248 -0
- package/dist/streaming/mpegts.js.map +1 -0
- package/dist/streaming/registry.d.ts +119 -0
- package/dist/streaming/registry.js +127 -0
- package/dist/streaming/registry.js.map +1 -0
- package/dist/streaming/setup.d.ts +135 -0
- package/dist/streaming/setup.js +670 -0
- package/dist/streaming/setup.js.map +1 -0
- package/dist/streaming/showInfo.d.ts +30 -0
- package/dist/streaming/showInfo.js +362 -0
- package/dist/streaming/showInfo.js.map +1 -0
- package/dist/streaming/statusEmitter.d.ts +125 -0
- package/dist/streaming/statusEmitter.js +139 -0
- package/dist/streaming/statusEmitter.js.map +1 -0
- package/dist/types/index.d.ts +403 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/debugFilter.d.ts +38 -0
- package/dist/utils/debugFilter.js +157 -0
- package/dist/utils/debugFilter.js.map +1 -0
- package/dist/utils/delay.d.ts +6 -0
- package/dist/utils/delay.js +15 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/errors.d.ts +15 -0
- package/dist/utils/errors.js +40 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/evaluate.d.ts +51 -0
- package/dist/utils/evaluate.js +124 -0
- package/dist/utils/evaluate.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +65 -0
- package/dist/utils/ffmpeg.js +317 -0
- package/dist/utils/ffmpeg.js.map +1 -0
- package/dist/utils/fileLogger.d.ts +25 -0
- package/dist/utils/fileLogger.js +248 -0
- package/dist/utils/fileLogger.js.map +1 -0
- package/dist/utils/format.d.ts +16 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/html.d.ts +6 -0
- package/dist/utils/html.js +24 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logEmitter.d.ts +17 -0
- package/dist/utils/logEmitter.js +30 -0
- package/dist/utils/logEmitter.js.map +1 -0
- package/dist/utils/logger.d.ts +82 -0
- package/dist/utils/logger.js +219 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/m3u.d.ts +32 -0
- package/dist/utils/m3u.js +148 -0
- package/dist/utils/m3u.js.map +1 -0
- package/dist/utils/morganStream.d.ts +7 -0
- package/dist/utils/morganStream.js +33 -0
- package/dist/utils/morganStream.js.map +1 -0
- package/dist/utils/platform.d.ts +64 -0
- package/dist/utils/platform.js +157 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/retry.d.ts +15 -0
- package/dist/utils/retry.js +82 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/streamContext.d.ts +28 -0
- package/dist/utils/streamContext.js +33 -0
- package/dist/utils/streamContext.js.map +1 -0
- package/dist/utils/version.d.ts +37 -0
- package/dist/utils/version.js +228 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +92 -0
- package/prismcast.png +0 -0
- package/prismcast.svg +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hls.js","sourceRoot":"","sources":["../../src/streaming/hls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stores a media segment received from the segmenter. Enforces the segment count limit by removing the oldest segment when necessary. This is for .m4s media segments,
|
|
3
|
+
* not the init segment.
|
|
4
|
+
* @param streamId - The numeric stream ID.
|
|
5
|
+
* @param filename - The segment filename (e.g., "segment0.m4s").
|
|
6
|
+
* @param data - The segment binary data.
|
|
7
|
+
*/
|
|
8
|
+
export declare function storeSegment(streamId: number, filename: string, data: Buffer): void;
|
|
9
|
+
/**
|
|
10
|
+
* Gets a media segment by filename.
|
|
11
|
+
* @param streamId - The numeric stream ID.
|
|
12
|
+
* @param filename - The segment filename.
|
|
13
|
+
* @returns The segment data, or undefined if not found.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getSegment(streamId: number, filename: string): Buffer | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Stores the fMP4 initialization segment for a stream. The init segment contains codec configuration and is sent once at stream start. Unlike media segments, it is
|
|
18
|
+
* retained for the entire stream lifetime (not subject to rotation).
|
|
19
|
+
* @param streamId - The numeric stream ID.
|
|
20
|
+
* @param data - The init segment binary data.
|
|
21
|
+
*/
|
|
22
|
+
export declare function storeInitSegment(streamId: number, data: Buffer): void;
|
|
23
|
+
/**
|
|
24
|
+
* Gets the fMP4 initialization segment for a stream.
|
|
25
|
+
* @param streamId - The numeric stream ID.
|
|
26
|
+
* @returns The init segment data, or undefined if not found or not yet received.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getInitSegment(streamId: number): Buffer | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Updates the playlist content for a stream. If this is the first playlist, signals that the stream is ready.
|
|
31
|
+
* @param streamId - The numeric stream ID.
|
|
32
|
+
* @param content - The m3u8 playlist content.
|
|
33
|
+
*/
|
|
34
|
+
export declare function updatePlaylist(streamId: number, content: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Gets the current playlist for a stream.
|
|
37
|
+
* @param streamId - The numeric stream ID.
|
|
38
|
+
* @returns The playlist content, or undefined if not found.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPlaylist(streamId: number): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Waits for the first playlist to be available for a stream.
|
|
43
|
+
* @param streamId - The numeric stream ID.
|
|
44
|
+
* @param timeout - Maximum time to wait in milliseconds.
|
|
45
|
+
* @returns True if playlist is ready, false if timeout or stream not found.
|
|
46
|
+
*/
|
|
47
|
+
export declare function waitForPlaylist(streamId: number, timeout: number): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* Waits for the first init segment to be available for a stream. Used by MPEG-TS consumers to wait for codec configuration before starting their FFmpeg remuxer.
|
|
50
|
+
* @param streamId - The numeric stream ID.
|
|
51
|
+
* @param timeout - Maximum time to wait in milliseconds.
|
|
52
|
+
* @returns True if init segment is ready, false if timeout or stream not found.
|
|
53
|
+
*/
|
|
54
|
+
export declare function waitForInitSegment(streamId: number, timeout: number): Promise<boolean>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* hlsSegments.ts: HLS segment storage functions for PrismCast.
|
|
4
|
+
*/
|
|
5
|
+
import { CONFIG } from "../config/index.js";
|
|
6
|
+
import { LOG } from "../utils/index.js";
|
|
7
|
+
import { getStream } from "./registry.js";
|
|
8
|
+
/* This module provides functions for storing and retrieving HLS segments, playlists, and init segments. All data is stored in the stream registry's HLSState, which is
|
|
9
|
+
* the single source of truth for stream data. Key responsibilities:
|
|
10
|
+
*
|
|
11
|
+
* 1. Store init segment, media segments, and playlists per stream
|
|
12
|
+
* 2. Enforce segment count limits to control memory usage
|
|
13
|
+
* 3. Provide access to segments and playlists for HTTP handlers
|
|
14
|
+
*
|
|
15
|
+
* For fMP4 HLS, there are three types of data:
|
|
16
|
+
* - Init segment (init.mp4): Contains codec configuration, sent once at stream start, retained for stream lifetime
|
|
17
|
+
* - Media segments (.m4s): Contain audio/video data, rotated based on maxSegments config
|
|
18
|
+
* - Playlist (.m3u8): Updated as new segments are produced
|
|
19
|
+
*
|
|
20
|
+
* Note: Stream lifecycle (creation, cleanup) is managed by the registry. This module focuses solely on segment storage operations.
|
|
21
|
+
*/
|
|
22
|
+
// Segment Management.
|
|
23
|
+
/**
|
|
24
|
+
* Stores a media segment received from the segmenter. Enforces the segment count limit by removing the oldest segment when necessary. This is for .m4s media segments,
|
|
25
|
+
* not the init segment.
|
|
26
|
+
* @param streamId - The numeric stream ID.
|
|
27
|
+
* @param filename - The segment filename (e.g., "segment0.m4s").
|
|
28
|
+
* @param data - The segment binary data.
|
|
29
|
+
*/
|
|
30
|
+
export function storeSegment(streamId, filename, data) {
|
|
31
|
+
const stream = getStream(streamId);
|
|
32
|
+
if (!stream) {
|
|
33
|
+
LOG.debug("streaming:hls", "Attempted to store segment for unknown stream %s.", streamId);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
stream.hls.segments.set(filename, data);
|
|
37
|
+
// Notify MPEG-TS consumers that a new segment is available. Emit before rotation so the data is guaranteed accessible in the Map.
|
|
38
|
+
stream.hls.segmentEmitter.emit("segment", filename, data);
|
|
39
|
+
// Enforce segment limit by removing oldest segments. JavaScript Maps maintain insertion order, so the first key is always the oldest segment.
|
|
40
|
+
while (stream.hls.segments.size > CONFIG.hls.maxSegments) {
|
|
41
|
+
const oldestKey = stream.hls.segments.keys().next().value;
|
|
42
|
+
if (oldestKey === undefined) {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
stream.hls.segments.delete(oldestKey);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Gets a media segment by filename.
|
|
50
|
+
* @param streamId - The numeric stream ID.
|
|
51
|
+
* @param filename - The segment filename.
|
|
52
|
+
* @returns The segment data, or undefined if not found.
|
|
53
|
+
*/
|
|
54
|
+
export function getSegment(streamId, filename) {
|
|
55
|
+
const stream = getStream(streamId);
|
|
56
|
+
if (!stream) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return stream.hls.segments.get(filename);
|
|
60
|
+
}
|
|
61
|
+
// Init Segment Management.
|
|
62
|
+
/**
|
|
63
|
+
* Stores the fMP4 initialization segment for a stream. The init segment contains codec configuration and is sent once at stream start. Unlike media segments, it is
|
|
64
|
+
* retained for the entire stream lifetime (not subject to rotation).
|
|
65
|
+
* @param streamId - The numeric stream ID.
|
|
66
|
+
* @param data - The init segment binary data.
|
|
67
|
+
*/
|
|
68
|
+
export function storeInitSegment(streamId, data) {
|
|
69
|
+
const stream = getStream(streamId);
|
|
70
|
+
if (!stream) {
|
|
71
|
+
LOG.debug("streaming:hls", "Attempted to store init segment for unknown stream %s.", streamId);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const isFirstInit = stream.hls.initSegment === null;
|
|
75
|
+
stream.hls.initSegment = data;
|
|
76
|
+
// Notify MPEG-TS consumers that the init segment is available.
|
|
77
|
+
stream.hls.segmentEmitter.emit("initSegment", data);
|
|
78
|
+
if (isFirstInit) {
|
|
79
|
+
stream.hls.signalInitSegmentReady();
|
|
80
|
+
const elapsed = ((Date.now() - stream.startTime.getTime()) / 1000).toFixed(3);
|
|
81
|
+
LOG.debug("timing:startup", "Init segment ready in %ss.", elapsed);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gets the fMP4 initialization segment for a stream.
|
|
86
|
+
* @param streamId - The numeric stream ID.
|
|
87
|
+
* @returns The init segment data, or undefined if not found or not yet received.
|
|
88
|
+
*/
|
|
89
|
+
export function getInitSegment(streamId) {
|
|
90
|
+
const stream = getStream(streamId);
|
|
91
|
+
if (!stream) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
return stream.hls.initSegment ?? undefined;
|
|
95
|
+
}
|
|
96
|
+
// Playlist Management.
|
|
97
|
+
/**
|
|
98
|
+
* Updates the playlist content for a stream. If this is the first playlist, signals that the stream is ready.
|
|
99
|
+
* @param streamId - The numeric stream ID.
|
|
100
|
+
* @param content - The m3u8 playlist content.
|
|
101
|
+
*/
|
|
102
|
+
export function updatePlaylist(streamId, content) {
|
|
103
|
+
const stream = getStream(streamId);
|
|
104
|
+
if (!stream) {
|
|
105
|
+
LOG.debug("streaming:hls", "Attempted to update playlist for unknown stream %s.", streamId);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const isFirstPlaylist = stream.hls.playlist === "";
|
|
109
|
+
stream.hls.playlist = content;
|
|
110
|
+
if (isFirstPlaylist) {
|
|
111
|
+
stream.hls.signalPlaylistReady();
|
|
112
|
+
const elapsed = ((Date.now() - stream.startTime.getTime()) / 1000).toFixed(3);
|
|
113
|
+
LOG.debug("timing:startup", "First playlist ready in %ss.", elapsed);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Gets the current playlist for a stream.
|
|
118
|
+
* @param streamId - The numeric stream ID.
|
|
119
|
+
* @returns The playlist content, or undefined if not found.
|
|
120
|
+
*/
|
|
121
|
+
export function getPlaylist(streamId) {
|
|
122
|
+
return getStream(streamId)?.hls.playlist;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Waits for the first playlist to be available for a stream.
|
|
126
|
+
* @param streamId - The numeric stream ID.
|
|
127
|
+
* @param timeout - Maximum time to wait in milliseconds.
|
|
128
|
+
* @returns True if playlist is ready, false if timeout or stream not found.
|
|
129
|
+
*/
|
|
130
|
+
export async function waitForPlaylist(streamId, timeout) {
|
|
131
|
+
return waitForReady(streamId, async (stream) => stream.hls.playlistReady, timeout);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Waits for the first init segment to be available for a stream. Used by MPEG-TS consumers to wait for codec configuration before starting their FFmpeg remuxer.
|
|
135
|
+
* @param streamId - The numeric stream ID.
|
|
136
|
+
* @param timeout - Maximum time to wait in milliseconds.
|
|
137
|
+
* @returns True if init segment is ready, false if timeout or stream not found.
|
|
138
|
+
*/
|
|
139
|
+
export async function waitForInitSegment(streamId, timeout) {
|
|
140
|
+
return waitForReady(streamId, async (stream) => stream.hls.initSegmentReady, timeout);
|
|
141
|
+
}
|
|
142
|
+
// Internal Helpers.
|
|
143
|
+
/**
|
|
144
|
+
* Races a readiness promise from a stream's HLS state against a timeout. Returns true if the promise resolves before the timeout, false if the timeout fires first or
|
|
145
|
+
* the stream doesn't exist.
|
|
146
|
+
* @param streamId - The numeric stream ID.
|
|
147
|
+
* @param getPromise - Accessor that extracts the readiness promise from the stream's HLS state.
|
|
148
|
+
* @param timeout - Maximum time to wait in milliseconds.
|
|
149
|
+
* @returns True if ready before timeout, false otherwise.
|
|
150
|
+
*/
|
|
151
|
+
async function waitForReady(streamId, getPromise, timeout) {
|
|
152
|
+
const stream = getStream(streamId);
|
|
153
|
+
if (!stream) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
157
|
+
setTimeout(() => { resolve(false); }, timeout);
|
|
158
|
+
});
|
|
159
|
+
const readyPromise = getPromise(stream).then(() => true);
|
|
160
|
+
return Promise.race([readyPromise, timeoutPromise]);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=hlsSegments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hlsSegments.js","sourceRoot":"","sources":["../../src/streaming/hlsSegments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the stream ID for a channel, if one exists.
|
|
3
|
+
* @param channelName - The channel name to look up.
|
|
4
|
+
* @returns The stream ID if found, undefined otherwise.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getChannelStreamId(channelName: string): number | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Associates a channel name with a stream ID.
|
|
9
|
+
* @param channelName - The channel name.
|
|
10
|
+
* @param streamId - The stream ID to associate.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setChannelStreamId(channelName: string, streamId: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Removes the channel-to-stream mapping for a channel.
|
|
15
|
+
* @param channelName - The channel name to remove.
|
|
16
|
+
*/
|
|
17
|
+
export declare function deleteChannelStreamId(channelName: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if termination has been initiated for a stream.
|
|
20
|
+
* @param streamId - The stream ID to check.
|
|
21
|
+
* @returns True if termination has been initiated, false otherwise.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isTerminationInitiated(streamId: number): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Terminates a stream, cleaning up all resources. This is the authoritative termination function that all code paths should use for consistent cleanup.
|
|
26
|
+
*
|
|
27
|
+
* Note: This function does NOT call emitCurrentSystemStatus() to avoid circular dependencies with the browser module. Callers should call emitCurrentSystemStatus()
|
|
28
|
+
* after termination if they need to update the SSE system status.
|
|
29
|
+
* @param streamId - The numeric stream ID.
|
|
30
|
+
* @param channelName - The channel name for channel mapping cleanup.
|
|
31
|
+
* @param reason - The reason for termination (e.g., "idle timeout", "circuit breaker").
|
|
32
|
+
*/
|
|
33
|
+
export declare function terminateStream(streamId: number, channelName: string, reason: string): void;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* lifecycle.ts: Stream lifecycle management for PrismCast.
|
|
4
|
+
*/
|
|
5
|
+
import { LOG, formatDuration, formatError, getAbortController, unregisterAbortController } from "../utils/index.js";
|
|
6
|
+
import { formatRecoveryMetricsSummary, getTotalRecoveryAttempts } from "./monitor.js";
|
|
7
|
+
import { getStream, unregisterStream } from "./registry.js";
|
|
8
|
+
import { clearClients } from "./clients.js";
|
|
9
|
+
import { clearShowName } from "./showInfo.js";
|
|
10
|
+
import { emitStreamRemoved } from "./statusEmitter.js";
|
|
11
|
+
import { formatKeyframeStatsSummary } from "./fmp4Segmenter.js";
|
|
12
|
+
import { isGracefulShutdown } from "../browser/index.js";
|
|
13
|
+
/* This module provides the authoritative stream termination logic. All code paths that need to terminate a stream should call terminateStream() from this module. This
|
|
14
|
+
* ensures consistent cleanup behavior including:
|
|
15
|
+
*
|
|
16
|
+
* - Stopping the segmenter
|
|
17
|
+
* - Removing channel-to-stream mapping
|
|
18
|
+
* - Stopping the health monitor
|
|
19
|
+
* - Closing the browser page
|
|
20
|
+
* - Unregistering from the stream registry
|
|
21
|
+
* - Clearing client tracking data
|
|
22
|
+
* - Emitting SSE events
|
|
23
|
+
*
|
|
24
|
+
* Callers are responsible for calling emitCurrentSystemStatus() after termination if they need to update the SSE system status. This is not done automatically to
|
|
25
|
+
* avoid circular dependencies with the browser module.
|
|
26
|
+
*/
|
|
27
|
+
// State.
|
|
28
|
+
/**
|
|
29
|
+
* Map of channel names to their active HLS stream IDs. Used to share streams between multiple clients requesting the same channel. This is kept separate from the
|
|
30
|
+
* stream registry because it's a lookup index for deduplication, not stream state.
|
|
31
|
+
*/
|
|
32
|
+
const channelToStreamId = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Set of stream IDs for which termination has been initiated. Used to suppress warnings from segmenter callbacks during cleanup.
|
|
35
|
+
*/
|
|
36
|
+
const terminationInitiated = new Set();
|
|
37
|
+
// Channel Mapping Functions.
|
|
38
|
+
/**
|
|
39
|
+
* Gets the stream ID for a channel, if one exists.
|
|
40
|
+
* @param channelName - The channel name to look up.
|
|
41
|
+
* @returns The stream ID if found, undefined otherwise.
|
|
42
|
+
*/
|
|
43
|
+
export function getChannelStreamId(channelName) {
|
|
44
|
+
return channelToStreamId.get(channelName);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Associates a channel name with a stream ID.
|
|
48
|
+
* @param channelName - The channel name.
|
|
49
|
+
* @param streamId - The stream ID to associate.
|
|
50
|
+
*/
|
|
51
|
+
export function setChannelStreamId(channelName, streamId) {
|
|
52
|
+
channelToStreamId.set(channelName, streamId);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Removes the channel-to-stream mapping for a channel.
|
|
56
|
+
* @param channelName - The channel name to remove.
|
|
57
|
+
*/
|
|
58
|
+
export function deleteChannelStreamId(channelName) {
|
|
59
|
+
channelToStreamId.delete(channelName);
|
|
60
|
+
}
|
|
61
|
+
// Termination State Functions.
|
|
62
|
+
/**
|
|
63
|
+
* Checks if termination has been initiated for a stream.
|
|
64
|
+
* @param streamId - The stream ID to check.
|
|
65
|
+
* @returns True if termination has been initiated, false otherwise.
|
|
66
|
+
*/
|
|
67
|
+
export function isTerminationInitiated(streamId) {
|
|
68
|
+
return terminationInitiated.has(streamId);
|
|
69
|
+
}
|
|
70
|
+
// Capture Stream Cleanup.
|
|
71
|
+
/**
|
|
72
|
+
* Destroys the raw capture stream to ensure chrome.tabCapture releases the capture. This MUST be called before closing the page to prevent capture state corruption.
|
|
73
|
+
* When the stream is destroyed, puppeteer-stream's close handler fires synchronously (while the browser is still connected), which calls STOP_RECORDING in the
|
|
74
|
+
* extension. Without this, the extension may think a capture is still active, causing subsequent getStream() calls to hang with "Cannot capture a tab with an active
|
|
75
|
+
* stream" errors.
|
|
76
|
+
* @param rawCaptureStream - The raw capture stream from puppeteer-stream, or null if not available.
|
|
77
|
+
*/
|
|
78
|
+
function destroyCaptureStream(rawCaptureStream) {
|
|
79
|
+
if (!rawCaptureStream) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!rawCaptureStream.destroyed) {
|
|
83
|
+
rawCaptureStream.destroy();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Stream Termination.
|
|
87
|
+
/**
|
|
88
|
+
* Terminates a stream, cleaning up all resources. This is the authoritative termination function that all code paths should use for consistent cleanup.
|
|
89
|
+
*
|
|
90
|
+
* Note: This function does NOT call emitCurrentSystemStatus() to avoid circular dependencies with the browser module. Callers should call emitCurrentSystemStatus()
|
|
91
|
+
* after termination if they need to update the SSE system status.
|
|
92
|
+
* @param streamId - The numeric stream ID.
|
|
93
|
+
* @param channelName - The channel name for channel mapping cleanup.
|
|
94
|
+
* @param reason - The reason for termination (e.g., "idle timeout", "circuit breaker").
|
|
95
|
+
*/
|
|
96
|
+
export function terminateStream(streamId, channelName, reason) {
|
|
97
|
+
// Mark termination as initiated to suppress spurious warnings from segmenter callbacks.
|
|
98
|
+
if (terminationInitiated.has(streamId)) {
|
|
99
|
+
// Termination already in progress.
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
terminationInitiated.add(streamId);
|
|
103
|
+
// Get stream info early to calculate duration and access resources.
|
|
104
|
+
const streamInfo = getStream(streamId);
|
|
105
|
+
const durationMs = streamInfo ? (Date.now() - streamInfo.startTime.getTime()) : 0;
|
|
106
|
+
// Abort pending evaluate calls for this stream. This immediately rejects any pending page.evaluate() calls, preventing them from hanging for up to 180 seconds
|
|
107
|
+
// (Puppeteer's protocolTimeout). We do this first so pending operations fail fast before we start cleaning up resources.
|
|
108
|
+
if (streamInfo?.streamIdStr) {
|
|
109
|
+
const controller = getAbortController(streamInfo.streamIdStr);
|
|
110
|
+
if (controller) {
|
|
111
|
+
controller.abort();
|
|
112
|
+
}
|
|
113
|
+
unregisterAbortController(streamInfo.streamIdStr);
|
|
114
|
+
}
|
|
115
|
+
// Destroy the raw capture stream BEFORE killing FFmpeg or closing the page. This triggers puppeteer-stream's close handler while the browser is still connected,
|
|
116
|
+
// ensuring STOP_RECORDING is called and chrome.tabCapture releases the capture. Without this, subsequent getStream() calls may hang with "active stream" errors.
|
|
117
|
+
if (streamInfo) {
|
|
118
|
+
destroyCaptureStream(streamInfo.rawCaptureStream);
|
|
119
|
+
}
|
|
120
|
+
// Kill the FFmpeg process if using FFmpeg mode. This sets FFmpeg's internal shuttingDown flag, so when the segmenter stops (which closes the capture stream and
|
|
121
|
+
// FFmpeg's stdin), FFmpeg won't report spurious errors about truncated input. The order matters: kill() must be called before segmenter.stop() to set the flag
|
|
122
|
+
// before stdin closes.
|
|
123
|
+
if (streamInfo?.ffmpegProcess) {
|
|
124
|
+
streamInfo.ffmpegProcess.kill();
|
|
125
|
+
}
|
|
126
|
+
// Capture keyframe statistics before stopping the segmenter. The stats are a snapshot of the accumulated state, so they remain valid after stop() is called.
|
|
127
|
+
let keyframeStats = null;
|
|
128
|
+
if (streamInfo?.segmenter) {
|
|
129
|
+
keyframeStats = streamInfo.segmenter.getKeyframeStats();
|
|
130
|
+
streamInfo.segmenter.stop();
|
|
131
|
+
}
|
|
132
|
+
// Remove channel mapping.
|
|
133
|
+
if (channelToStreamId.get(channelName) === streamId) {
|
|
134
|
+
channelToStreamId.delete(channelName);
|
|
135
|
+
}
|
|
136
|
+
// Clean up stream resources and capture recovery metrics.
|
|
137
|
+
let recoveryMetrics = null;
|
|
138
|
+
if (streamInfo) {
|
|
139
|
+
// Stop the health monitor and get recovery metrics.
|
|
140
|
+
if (streamInfo.stopMonitor) {
|
|
141
|
+
recoveryMetrics = streamInfo.stopMonitor();
|
|
142
|
+
}
|
|
143
|
+
// Close the browser page. Skip during graceful shutdown since closeBrowser() will close all pages and we'd get spurious "Target closed" errors.
|
|
144
|
+
if (!isGracefulShutdown() && !streamInfo.page.isClosed()) {
|
|
145
|
+
streamInfo.page.close().catch((error) => {
|
|
146
|
+
LOG.debug("streaming:hls", "Error closing page for stream %s: %s.", streamId, formatError(error));
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Notify MPEG-TS clients that this stream is ending. This must happen before unregisterStream() which destroys the HLSState. Removing all listeners prevents
|
|
151
|
+
// memory leaks from orphaned event handlers.
|
|
152
|
+
if (streamInfo) {
|
|
153
|
+
streamInfo.hls.segmentEmitter.emit("terminated");
|
|
154
|
+
streamInfo.hls.segmentEmitter.removeAllListeners();
|
|
155
|
+
}
|
|
156
|
+
// Unregister from registry. This also clears the HLS segment storage.
|
|
157
|
+
unregisterStream(streamId);
|
|
158
|
+
// Clear client tracking data for this stream.
|
|
159
|
+
clearClients(streamId);
|
|
160
|
+
// Clear cached show name.
|
|
161
|
+
clearShowName(streamId);
|
|
162
|
+
// Emit stream removed event.
|
|
163
|
+
emitStreamRemoved(streamId);
|
|
164
|
+
// Clean up termination tracking.
|
|
165
|
+
terminationInitiated.delete(streamId);
|
|
166
|
+
// Log termination with stream ID prefix since we're outside the stream context. Include recovery summary if there were any recoveries.
|
|
167
|
+
const streamIdStr = streamInfo?.streamIdStr ?? ("s" + String(streamId).padStart(4, "0"));
|
|
168
|
+
const reasonSuffix = (reason === "no active clients") ? "" : " (" + reason + ")";
|
|
169
|
+
const streamLog = LOG.withStreamId(streamIdStr);
|
|
170
|
+
// Include recovery summary and keyframe statistics in the termination log when available.
|
|
171
|
+
const keyframeSummary = keyframeStats ? formatKeyframeStatsSummary(keyframeStats) : "";
|
|
172
|
+
if (recoveryMetrics && (getTotalRecoveryAttempts(recoveryMetrics) > 0) && keyframeSummary) {
|
|
173
|
+
streamLog.info("Stream ended after %s%s. %s %s", formatDuration(durationMs), reasonSuffix, formatRecoveryMetricsSummary(recoveryMetrics), keyframeSummary);
|
|
174
|
+
}
|
|
175
|
+
else if (recoveryMetrics && (getTotalRecoveryAttempts(recoveryMetrics) > 0)) {
|
|
176
|
+
streamLog.info("Stream ended after %s%s. %s", formatDuration(durationMs), reasonSuffix, formatRecoveryMetricsSummary(recoveryMetrics));
|
|
177
|
+
}
|
|
178
|
+
else if (keyframeSummary) {
|
|
179
|
+
streamLog.info("Stream ended after %s%s. %s", formatDuration(durationMs), reasonSuffix, keyframeSummary);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
streamLog.info("Stream ended after %s%s.", formatDuration(durationMs), reasonSuffix);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/streaming/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Frame, Page } from "puppeteer-core";
|
|
2
|
+
import type { Nullable, ResolvedSiteProfile } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Recovery metrics tracked throughout the stream's lifetime. Returned when the monitor stops for inclusion in termination logs.
|
|
5
|
+
*/
|
|
6
|
+
export interface RecoveryMetrics {
|
|
7
|
+
currentRecoveryStartTime: Nullable<number>;
|
|
8
|
+
currentRecoveryMethod: Nullable<string>;
|
|
9
|
+
pageNavigationAttempts: number;
|
|
10
|
+
pageNavigationSuccesses: number;
|
|
11
|
+
playUnmuteAttempts: number;
|
|
12
|
+
playUnmuteSuccesses: number;
|
|
13
|
+
sourceReloadAttempts: number;
|
|
14
|
+
sourceReloadSuccesses: number;
|
|
15
|
+
tabReplacementAttempts: number;
|
|
16
|
+
tabReplacementSuccesses: number;
|
|
17
|
+
totalRecoveryTimeMs: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gets the total number of recovery attempts across all methods. Iterates over ATTEMPT_FIELDS to sum all attempt counters, ensuring new recovery methods are
|
|
21
|
+
* automatically included without code changes.
|
|
22
|
+
* @param metrics - The recovery metrics object.
|
|
23
|
+
* @returns Total recovery attempts.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getTotalRecoveryAttempts(metrics: RecoveryMetrics): number;
|
|
26
|
+
/**
|
|
27
|
+
* Formats the recovery metrics summary for the termination log. Uses the SUCCESS_FIELDS mapping to iterate over all recovery methods, eliminating hardcoded
|
|
28
|
+
* checks for each method type. This ensures new recovery methods are automatically included in the summary.
|
|
29
|
+
* @param metrics - The recovery metrics object.
|
|
30
|
+
* @returns Formatted summary string, or empty string if no recoveries occurred.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatRecoveryMetricsSummary(metrics: RecoveryMetrics): string;
|
|
33
|
+
/**
|
|
34
|
+
* Result from tab replacement recovery. When a browser tab becomes unresponsive (consecutive evaluate timeouts), the recovery handler closes the old tab, creates a
|
|
35
|
+
* new one with fresh capture, and returns the new page and context. The monitor then updates its internal references to continue monitoring the new tab.
|
|
36
|
+
*/
|
|
37
|
+
export interface TabReplacementResult {
|
|
38
|
+
context: Frame | Page;
|
|
39
|
+
page: Page;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Monitors video playback health and attempts escalating recovery when issues are detected. This function runs on an interval, checking video state and triggering
|
|
43
|
+
* increasingly aggressive recovery actions when playback stalls, pauses, or errors occur.
|
|
44
|
+
*
|
|
45
|
+
* The monitor includes a circuit breaker that terminates the stream after a configurable number of consecutive failures within a time window. This prevents endless
|
|
46
|
+
* recovery attempts on fundamentally broken streams.
|
|
47
|
+
*
|
|
48
|
+
* Tab replacement recovery: When the browser tab becomes unresponsive (3+ consecutive evaluate timeouts), the monitor triggers tab replacement via the
|
|
49
|
+
* onTabReplacement callback. This closes the hung tab, creates a fresh one with new capture, and continues the stream. This is more reliable than page.goto-based
|
|
50
|
+
* recovery because a hung tab may not respond to navigation commands.
|
|
51
|
+
*
|
|
52
|
+
* The returned cleanup function should be called when the stream ends to stop monitoring and release resources.
|
|
53
|
+
*
|
|
54
|
+
* @param page - The Puppeteer page object.
|
|
55
|
+
* @param context - The frame or page containing the video element.
|
|
56
|
+
* @param profile - The site profile for behavior configuration.
|
|
57
|
+
* @param url - The URL of the stream, needed for page reload recovery.
|
|
58
|
+
* @param streamId - A concise identifier for the stream, used in log messages.
|
|
59
|
+
* @param streamInfo - Stream metadata for status updates.
|
|
60
|
+
* @param onCircuitBreak - Callback function called when circuit breaker trips.
|
|
61
|
+
* @param onTabReplacement - Optional callback for tab replacement recovery. When provided and 3+ consecutive timeouts occur, this is called to replace the hung tab.
|
|
62
|
+
* If null/undefined, tab replacement is not available and timeouts will eventually trip the circuit breaker.
|
|
63
|
+
* @returns A cleanup function to stop the monitor.
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Stream info passed to the monitor for status updates.
|
|
67
|
+
*/
|
|
68
|
+
export interface MonitorStreamInfo {
|
|
69
|
+
channelName: Nullable<string>;
|
|
70
|
+
numericStreamId: number;
|
|
71
|
+
providerName: string;
|
|
72
|
+
startTime: Date;
|
|
73
|
+
}
|
|
74
|
+
export declare function monitorPlaybackHealth(page: Page, context: Frame | Page, profile: ResolvedSiteProfile, url: string, streamId: string, streamInfo: MonitorStreamInfo, onCircuitBreak: () => void, onTabReplacement?: () => Promise<Nullable<TabReplacementResult>>): () => RecoveryMetrics;
|