prismcast 1.9.0 → 1.10.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.
- package/dist/app.d.ts +1 -1
- package/dist/app.js +27 -9
- package/dist/app.js.map +1 -1
- package/dist/browser/cdp.js +7 -7
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/channelSelection.d.ts +41 -11
- package/dist/browser/channelSelection.js +75 -24
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/display.d.ts +1 -1
- package/dist/browser/index.d.ts +8 -8
- package/dist/browser/index.js +42 -43
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/login.d.ts +2 -2
- package/dist/browser/login.js +1 -1
- package/dist/browser/manifestInterceptor.d.ts +77 -0
- package/dist/browser/manifestInterceptor.js +323 -0
- package/dist/browser/manifestInterceptor.js.map +1 -0
- package/dist/browser/precaching.js +4 -4
- package/dist/browser/tuning/comcastPolymer.d.ts +1 -1
- package/dist/browser/tuning/cox.d.ts +1 -1
- package/dist/browser/tuning/directv.d.ts +1 -1
- package/dist/browser/tuning/directv.js +61 -62
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +1 -1
- package/dist/browser/tuning/fox.js +171 -14
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.d.ts +1 -1
- package/dist/browser/tuning/hbo.js +6 -6
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +1 -1
- package/dist/browser/tuning/hulu.js +117 -110
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/shared.d.ts +3 -3
- package/dist/browser/tuning/shared.js +5 -5
- package/dist/browser/tuning/sling.d.ts +1 -1
- package/dist/browser/tuning/sling.js +28 -28
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/spectrum.d.ts +1 -1
- package/dist/browser/tuning/spectrum.js +21 -22
- package/dist/browser/tuning/spectrum.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.d.ts +1 -1
- package/dist/browser/tuning/thumbnailRow.js +1 -1
- package/dist/browser/tuning/tileClick.d.ts +1 -1
- package/dist/browser/tuning/tileClick.js +5 -5
- package/dist/browser/tuning/xfinity.d.ts +1 -1
- package/dist/browser/tuning/youtubeTv.d.ts +1 -1
- package/dist/browser/tuning/youtubeTv.js +17 -18
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +20 -6
- package/dist/browser/video.js +30 -38
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.d.ts +1 -2
- package/dist/channels/index.js +73 -40
- package/dist/channels/index.js.map +1 -1
- package/dist/config/channelForm.d.ts +58 -0
- package/dist/config/channelForm.js +129 -0
- package/dist/config/channelForm.js.map +1 -0
- package/dist/config/consistencyProbe.d.ts +7 -0
- package/dist/config/consistencyProbe.js +143 -0
- package/dist/config/consistencyProbe.js.map +1 -0
- package/dist/config/health.d.ts +4 -3
- package/dist/config/health.js +75 -62
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +19 -12
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +9 -3
- package/dist/config/paths.js +12 -4
- package/dist/config/paths.js.map +1 -1
- package/dist/config/persistence.context.d.ts +8 -0
- package/dist/config/persistence.context.js +30 -0
- package/dist/config/persistence.context.js.map +1 -0
- package/dist/config/persistence.d.ts +110 -12
- package/dist/config/persistence.js +351 -32
- package/dist/config/persistence.js.map +1 -1
- package/dist/config/presets.d.ts +14 -4
- package/dist/config/presets.js +84 -75
- package/dist/config/presets.js.map +1 -1
- package/dist/config/profiles.d.ts +2 -2
- package/dist/config/profiles.js +7 -9
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/servicePacks.d.ts +2 -2
- package/dist/config/servicePacks.js +28 -28
- package/dist/config/servicePacks.js.map +1 -1
- package/dist/config/services.d.ts +62 -36
- package/dist/config/services.js +150 -136
- package/dist/config/services.js.map +1 -1
- package/dist/config/sites.d.ts +3 -3
- package/dist/config/sites.js +16 -16
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +500 -41
- package/dist/config/userChannels.js +1201 -312
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +103 -10
- package/dist/config/userConfig.js +277 -117
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +4 -2
- package/dist/config/userProfiles.js +72 -26
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.js +8 -11
- package/dist/hdhr/channelMap.js.map +1 -1
- package/dist/hdhr/deviceId.js +10 -9
- package/dist/hdhr/deviceId.js.map +1 -1
- package/dist/hdhr/discover.js +4 -5
- package/dist/hdhr/discover.js.map +1 -1
- package/dist/hdhr/index.js +6 -10
- package/dist/hdhr/index.js.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/native/codecInference.d.ts +44 -0
- package/dist/native/codecInference.js +327 -0
- package/dist/native/codecInference.js.map +1 -0
- package/dist/native/decrypt.d.ts +1 -1
- package/dist/native/index.d.ts +5 -5
- package/dist/native/index.js +42 -64
- package/dist/native/index.js.map +1 -1
- package/dist/native/probe.d.ts +27 -9
- package/dist/native/probe.js +158 -67
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +4 -2
- package/dist/native/proxy.js +52 -49
- package/dist/native/proxy.js.map +1 -1
- package/dist/native/tokenExpiry.d.ts +22 -0
- package/dist/native/tokenExpiry.js +153 -0
- package/dist/native/tokenExpiry.js.map +1 -0
- package/dist/routes/auth.js +6 -10
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/components.js +2 -2
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/endpoints/browse.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/browse.js +195 -0
- package/dist/routes/config/channels/endpoints/browse.js.map +1 -0
- package/dist/routes/config/channels/endpoints/bulk.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/bulk.js +128 -0
- package/dist/routes/config/channels/endpoints/bulk.js.map +1 -0
- package/dist/routes/config/channels/endpoints/crud.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/crud.js +504 -0
- package/dist/routes/config/channels/endpoints/crud.js.map +1 -0
- package/dist/routes/config/channels/endpoints/importExport.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/importExport.js +131 -0
- package/dist/routes/config/channels/endpoints/importExport.js.map +1 -0
- package/dist/routes/config/channels/endpoints/predefined.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/predefined.js +78 -0
- package/dist/routes/config/channels/endpoints/predefined.js.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/prefs.js +58 -0
- package/dist/routes/config/channels/endpoints/prefs.js.map +1 -0
- package/dist/routes/config/channels/endpoints/service.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/service.js +149 -0
- package/dist/routes/config/channels/endpoints/service.js.map +1 -0
- package/dist/routes/config/channels/endpoints/tags.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/tags.js +185 -0
- package/dist/routes/config/channels/endpoints/tags.js.map +1 -0
- package/dist/routes/config/channels/http/handler.d.ts +10 -0
- package/dist/routes/config/channels/http/handler.js +20 -0
- package/dist/routes/config/channels/http/handler.js.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.d.ts +25 -0
- package/dist/routes/config/channels/http/playlistHint.js +40 -0
- package/dist/routes/config/channels/http/playlistHint.js.map +1 -0
- package/dist/routes/config/channels/http/serviceWarning.d.ts +10 -0
- package/dist/routes/config/channels/http/serviceWarning.js +28 -0
- package/dist/routes/config/channels/http/serviceWarning.js.map +1 -0
- package/dist/routes/config/channels/index.d.ts +3 -3
- package/dist/routes/config/channels/index.js +1 -1
- package/dist/routes/config/channels/index.js.map +1 -1
- package/dist/routes/config/channels/{routes.d.ts → setup.d.ts} +1 -1
- package/dist/routes/config/channels/setup.js +23 -0
- package/dist/routes/config/channels/setup.js.map +1 -0
- package/dist/routes/config/channels/table.d.ts +9 -9
- package/dist/routes/config/channels/table.js +124 -76
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/http/envelope.d.ts +111 -0
- package/dist/routes/config/http/envelope.js +103 -0
- package/dist/routes/config/http/envelope.js.map +1 -0
- package/dist/routes/config/index.d.ts +9 -9
- package/dist/routes/config/index.js +2 -2
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/services.js +69 -68
- package/dist/routes/config/services.js.map +1 -1
- package/dist/routes/config/settings.d.ts +1 -1
- package/dist/routes/config/settings.js +45 -38
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.js +12 -11
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/icons.js +2 -2
- package/dist/routes/icons.js.map +1 -1
- package/dist/routes/logs.js +19 -30
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/mpegts.js +1 -1
- package/dist/routes/playlist.d.ts +1 -1
- package/dist/routes/playlist.js +37 -26
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.js +27 -6
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/index.js +2 -5
- package/dist/routes/root/index.js.map +1 -1
- package/dist/routes/root/scripts/channels.js +16 -16
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/config.js +59 -59
- package/dist/routes/root/scripts/config.js.map +1 -1
- package/dist/routes/root/scripts/index.d.ts +4 -4
- package/dist/routes/root/scripts/shared.js +24 -10
- package/dist/routes/root/scripts/shared.js.map +1 -1
- package/dist/routes/root/scripts/status.d.ts +4 -0
- package/dist/routes/root/scripts/status.handlers.d.ts +182 -0
- package/dist/routes/root/scripts/status.handlers.js +713 -0
- package/dist/routes/root/scripts/status.handlers.js.map +1 -0
- package/dist/routes/root/scripts/status.js +86 -488
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.js +5 -5
- package/dist/routes/services.js +18 -15
- package/dist/routes/services.js.map +1 -1
- package/dist/routes/sse.d.ts +16 -0
- package/dist/routes/sse.js +29 -0
- package/dist/routes/sse.js.map +1 -0
- package/dist/routes/streams.js +10 -23
- package/dist/routes/streams.js.map +1 -1
- package/dist/routes/ui.d.ts +2 -2
- package/dist/routes/upgrade.js +6 -7
- package/dist/routes/upgrade.js.map +1 -1
- package/dist/service/commands.context.d.ts +6 -0
- package/dist/service/commands.context.js +47 -0
- package/dist/service/commands.context.js.map +1 -0
- package/dist/service/commands.d.ts +53 -8
- package/dist/service/commands.js +171 -188
- package/dist/service/commands.js.map +1 -1
- package/dist/service/generators.context.d.ts +6 -0
- package/dist/service/generators.context.js +45 -0
- package/dist/service/generators.context.js.map +1 -0
- package/dist/service/generators.d.ts +56 -16
- package/dist/service/generators.js +499 -383
- package/dist/service/generators.js.map +1 -1
- package/dist/service/index.d.ts +2 -2
- package/dist/streaming/clients.d.ts +2 -2
- package/dist/streaming/clients.js +2 -2
- package/dist/streaming/codec.d.ts +2 -2
- package/dist/streaming/codec.js +0 -1
- package/dist/streaming/codec.js.map +1 -1
- package/dist/streaming/fmp4Segmenter.d.ts +2 -2
- package/dist/streaming/fmp4Segmenter.js +12 -12
- package/dist/streaming/hls.d.ts +3 -3
- package/dist/streaming/hls.js +81 -70
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +3 -3
- package/dist/streaming/hlsResume.js +5 -5
- package/dist/streaming/hlsSegments.d.ts +5 -2
- package/dist/streaming/hlsSegments.js +14 -9
- package/dist/streaming/hlsSegments.js.map +1 -1
- package/dist/streaming/monitor.d.ts +12 -12
- package/dist/streaming/monitor.js +80 -54
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mp4Parser.d.ts +34 -4
- package/dist/streaming/mp4Parser.js +111 -29
- package/dist/streaming/mp4Parser.js.map +1 -1
- package/dist/streaming/mpegts.d.ts +1 -1
- package/dist/streaming/mpegts.js +13 -10
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/playlistBuilder.d.ts +1 -1
- package/dist/streaming/playlistBuilder.js +2 -2
- package/dist/streaming/preroll.d.ts +9 -9
- package/dist/streaming/preroll.js +39 -41
- package/dist/streaming/preroll.js.map +1 -1
- package/dist/streaming/pretune.js +4 -4
- package/dist/streaming/pretune.js.map +1 -1
- package/dist/streaming/recovery.d.ts +3 -3
- package/dist/streaming/recovery.js +4 -4
- package/dist/streaming/registry.d.ts +6 -6
- package/dist/streaming/setup.d.ts +9 -8
- package/dist/streaming/setup.js +97 -49
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +9 -3
- package/dist/streaming/showInfo.js +26 -18
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +4 -4
- package/dist/streaming/statusEmitter.js +2 -2
- package/dist/types/channels.d.ts +133 -34
- package/dist/types/channels.js +39 -1
- package/dist/types/channels.js.map +1 -1
- package/dist/types/config.d.ts +20 -1
- package/dist/types/index.d.ts +9 -8
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/profiles.d.ts +5 -4
- package/dist/types/selection.d.ts +48 -4
- package/dist/types/streaming.d.ts +1 -1
- package/dist/upgrade/commands.context.d.ts +6 -0
- package/dist/upgrade/commands.context.js +29 -0
- package/dist/upgrade/commands.context.js.map +1 -0
- package/dist/upgrade/commands.d.ts +29 -2
- package/dist/upgrade/commands.js +87 -134
- package/dist/upgrade/commands.js.map +1 -1
- package/dist/upgrade/detection.context.d.ts +6 -0
- package/dist/upgrade/detection.context.js +24 -0
- package/dist/upgrade/detection.context.js.map +1 -0
- package/dist/upgrade/detection.d.ts +140 -10
- package/dist/upgrade/detection.js +153 -66
- package/dist/upgrade/detection.js.map +1 -1
- package/dist/upgrade/index.d.ts +2 -2
- package/dist/utils/chromeFetch.d.ts +1 -1
- package/dist/utils/chromeFetch.js +1 -1
- package/dist/utils/clock.d.ts +14 -0
- package/dist/utils/clock.js +28 -0
- package/dist/utils/clock.js.map +1 -0
- package/dist/utils/debugFilter.d.ts +1 -1
- package/dist/utils/debugFilter.js +6 -4
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/delay.d.ts +2 -3
- package/dist/utils/delay.js +10 -16
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/evaluate.js +12 -14
- package/dist/utils/evaluate.js.map +1 -1
- package/dist/utils/ffmpeg.context.d.ts +6 -0
- package/dist/utils/ffmpeg.context.js +31 -0
- package/dist/utils/ffmpeg.context.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +85 -29
- package/dist/utils/ffmpeg.js +126 -129
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/fileLogger.d.ts +18 -2
- package/dist/utils/fileLogger.js +58 -30
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +2 -2
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/html.js +1 -3
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/index.d.ts +21 -20
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js +16 -20
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/m3u.d.ts +18 -3
- package/dist/utils/m3u.js +28 -14
- package/dist/utils/m3u.js.map +1 -1
- package/dist/utils/memo.d.ts +19 -0
- package/dist/utils/memo.js +53 -0
- package/dist/utils/memo.js.map +1 -0
- package/dist/utils/morganStream.js +2 -2
- package/dist/utils/morganStream.js.map +1 -1
- package/dist/utils/pid.d.ts +2 -2
- package/dist/utils/pid.js +2 -2
- package/dist/utils/platform.d.ts +1 -1
- package/dist/utils/platform.js +3 -3
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/retry.d.ts +2 -0
- package/dist/utils/retry.js +9 -7
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sanitize.d.ts +2 -2
- package/dist/utils/sanitize.js +4 -4
- package/dist/utils/timing.d.ts +6 -3
- package/dist/utils/timing.js +10 -6
- package/dist/utils/timing.js.map +1 -1
- package/dist/utils/version.d.ts +3 -2
- package/dist/utils/version.js +14 -27
- package/dist/utils/version.js.map +1 -1
- package/package.json +13 -7
- package/dist/native/intercept.d.ts +0 -35
- package/dist/native/intercept.js +0 -181
- package/dist/native/intercept.js.map +0 -1
- package/dist/routes/config/channels/routes.js +0 -1505
- package/dist/routes/config/channels/routes.js.map +0 -1
|
@@ -41,20 +41,34 @@ export function generateSharedUtilitiesScript() {
|
|
|
41
41
|
" if(ms > 0) { setTimeout(() => { dismissToast(toast); }, ms); }",
|
|
42
42
|
" }",
|
|
43
43
|
" window.showToast = showToast;",
|
|
44
|
+
/* Single source of truth for extracting a user-facing error message from a server error response. The envelope emits two shapes: { error: string } for
|
|
45
|
+
* top-level failures (validation, not-found, conflict, server error) and { errors: Record<field, message> } for form submissions that surface multiple
|
|
46
|
+
* field errors at once. Callers pass a fallback string for the rare case where neither field is present. Every client that handles a !success response
|
|
47
|
+
* flows through this helper so error-reading logic lives in one place instead of drifting per call site.
|
|
48
|
+
*/
|
|
49
|
+
" window.extractErrorMessage = (response, fallback) => {",
|
|
50
|
+
" if(response && response.errors) {",
|
|
51
|
+
" const entries = Object.entries(response.errors);",
|
|
52
|
+
" if(entries.length > 0) {",
|
|
53
|
+
" return entries.map(([ field, message ]) => field + ': ' + message).join(', ');",
|
|
54
|
+
" }",
|
|
55
|
+
" }",
|
|
56
|
+
" return (response && (response.error || response.message)) || fallback;",
|
|
57
|
+
" };",
|
|
44
58
|
// Dismiss a toast with slide-out animation.
|
|
45
59
|
" function dismissToast(toast) {",
|
|
46
60
|
" if(toast.classList.contains('toast-exit')) return;",
|
|
47
61
|
" toast.classList.add('toast-exit');",
|
|
48
62
|
" toast.addEventListener('animationend', () => { toast.remove(); });",
|
|
49
63
|
" }",
|
|
50
|
-
/* Client-side namespace SSOT for all dropdown operations
|
|
64
|
+
/* Client-side namespace SSOT for all dropdown operations - close, and before-close hook registration. Private state (the hook array and both functions)
|
|
51
65
|
* lives in module-scope closures so the scroll/resize listener references stay stable across open/close cycles. The namespace object exposes the two
|
|
52
66
|
* operations as property references into those module-scope functions, which keeps both entries structurally symmetric and preserves identity for
|
|
53
67
|
* addEventListener / removeEventListener. Consumers call dropdowns.close() to close all open menus and dropdowns.addHook(fn) to register a before-close
|
|
54
|
-
* callback
|
|
68
|
+
* callback - for example, the inline tag editor registers a batch-save callback so pending changes flush on any close path (click outside, scroll,
|
|
55
69
|
* resize, next toggle). Registration is de-duplicated so accidental double-registration is a no-op.
|
|
56
70
|
*
|
|
57
|
-
* This is the "closure-backed" variant of the client-side namespace pattern
|
|
71
|
+
* This is the "closure-backed" variant of the client-side namespace pattern. The channelTable namespace uses the this.*-backed
|
|
58
72
|
* variant because its methods are only ever called as methods, never as detached listener references; dropdowns cannot use that variant because close()
|
|
59
73
|
* must survive being passed to addEventListener and later matched in removeEventListener.
|
|
60
74
|
*/
|
|
@@ -75,7 +89,7 @@ export function generateSharedUtilitiesScript() {
|
|
|
75
89
|
" };",
|
|
76
90
|
/* Safe localStorage wrappers. localStorage access can throw in private browsing mode or when storage quota is exceeded. Centralizing the try/catch here
|
|
77
91
|
* means every call site treats localStorage as best-effort persistence without repeating the same try/catch at every site. Failures are silently ignored
|
|
78
|
-
* because they are not actionable by the client
|
|
92
|
+
* because they are not actionable by the client - there is no way to recover quota or exit private browsing from JavaScript, and log noise from every
|
|
79
93
|
* subtab switch or page load would dominate useful diagnostics. Callers that need to react to failure should use the raw localStorage API directly.
|
|
80
94
|
*/
|
|
81
95
|
" window.safeStorageGet = (key) => {",
|
|
@@ -91,7 +105,7 @@ export function generateSharedUtilitiesScript() {
|
|
|
91
105
|
" catch(e) {}",
|
|
92
106
|
" };",
|
|
93
107
|
/* Persist channel table display preferences to the server. Single source of truth for POSTs to /config/channels/display-prefs so every call site (sort,
|
|
94
|
-
* column visibility, and any future preference) shares one fetch path and one error-handling decision. Fire-and-forget
|
|
108
|
+
* column visibility, and any future preference) shares one fetch path and one error-handling decision. Fire-and-forget - the caller does not await the
|
|
95
109
|
* round-trip because the client state is already updated and the persist is a best-effort sync to the server.
|
|
96
110
|
*/
|
|
97
111
|
" window.persistDisplayPrefs = (body) => {",
|
|
@@ -228,7 +242,7 @@ export function generateSharedUtilitiesScript() {
|
|
|
228
242
|
" if(sib && (sib.style.display === 'none')) sib.style.display = 'inline';",
|
|
229
243
|
" }",
|
|
230
244
|
" };",
|
|
231
|
-
// Service icon renderer with three modes, mirroring channelDisplayHtml. The icon source chain is: iconUrl (if specified)
|
|
245
|
+
// Service icon renderer with three modes, mirroring channelDisplayHtml. The icon source chain is: iconUrl (if specified) -> Apple touch icon -> favicon.
|
|
232
246
|
// Fallback URLs are stored in a data-fallbacks attribute and processed by the shared imgFallback handler.
|
|
233
247
|
" window.serviceIconHtml = (domain, name, iconClass, textClass, mode, iconUrl) => {",
|
|
234
248
|
" const m = mode || 'logo';",
|
|
@@ -419,7 +433,7 @@ export function generateSharedUtilitiesScript() {
|
|
|
419
433
|
" window.channelTable = {",
|
|
420
434
|
/* Cached column index map for _getSortValue. Built lazily on first access by scanning the table header row's data-sort-field attributes, then held for
|
|
421
435
|
* the page lifetime with no invalidation path. This relies on a load-bearing invariant: the channel table header is rendered once by the server and
|
|
422
|
-
* never rebuilt client-side
|
|
436
|
+
* never rebuilt client-side - only CSS visibility classes are toggled by toggleColumn, never DOM structure. Do not introduce dynamic thead mutation
|
|
423
437
|
* without also adding an explicit cache invalidation (e.g., set _colIndexCache = null after rewriting the header row).
|
|
424
438
|
*/
|
|
425
439
|
" _colIndexCache: null,",
|
|
@@ -497,7 +511,7 @@ export function generateSharedUtilitiesScript() {
|
|
|
497
511
|
" if(tcount) tcount.textContent = tc.count + ' of ' + tc.total;",
|
|
498
512
|
" }",
|
|
499
513
|
" }",
|
|
500
|
-
// Apply channel logos from a logo map (key
|
|
514
|
+
// Apply channel logos from a logo map (key -> URL). Sets data-logo attributes on matching rows so processLogos() can render the images.
|
|
501
515
|
" if(patch.logos) {",
|
|
502
516
|
" for(const [ key, logoUrl ] of Object.entries(patch.logos)) {",
|
|
503
517
|
" const logoRow = document.getElementById('display-row-' + key);",
|
|
@@ -549,13 +563,13 @@ export function generateSharedUtilitiesScript() {
|
|
|
549
563
|
" document.getElementById('edit-row-' + key)?.remove();",
|
|
550
564
|
" },",
|
|
551
565
|
/* Apply the service filter to all channel rows. Hides rows whose service tags aren't enabled and filters service dropdown options for multi-service channels.
|
|
552
|
-
* Uses a persistent _allOptions array on each select to remember all server-rendered options across filter applications
|
|
566
|
+
* Uses a persistent _allOptions array on each select to remember all server-rendered options across filter applications - the server marks disabled options
|
|
553
567
|
* with the hidden attribute, but Safari ignores hidden on option elements, so we rebuild the select with only enabled options each time. Selection restore
|
|
554
568
|
* priority: (1) saved server choice (HTML selected attribute), (2) previous visual selection, (3) first option.
|
|
555
569
|
*
|
|
556
570
|
* Cache lifecycle: _allOptions is attached to the DOM select element itself, so its lifetime is tied to that element. Row replacement via insertRow() drops
|
|
557
571
|
* the old row (and its select) and inserts fresh server-rendered HTML, which transparently resets the cache with whatever option set the server just sent.
|
|
558
|
-
* This invariant is load-bearing
|
|
572
|
+
* This invariant is load-bearing - do not refactor insertRow() into an in-place row update without also adding an explicit cache invalidation path here.
|
|
559
573
|
*/
|
|
560
574
|
" filter(enabledTags) {",
|
|
561
575
|
" const rows = document.querySelectorAll('tr[data-provider-tags]');",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/shared.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape of a single stream as carried over the SSE wire and stored in the client state. This is the script-side projection - only the fields the renderers
|
|
3
|
+
* and handlers actually read are declared. The server-side StreamListItem and statusEmitter payloads are richer; the script consumes a subset.
|
|
4
|
+
*/
|
|
5
|
+
export interface StreamSummary {
|
|
6
|
+
readonly captureCodec?: string;
|
|
7
|
+
readonly channel?: string | null;
|
|
8
|
+
readonly clientCount: number;
|
|
9
|
+
readonly clients: readonly {
|
|
10
|
+
readonly count: number;
|
|
11
|
+
readonly type: string;
|
|
12
|
+
}[];
|
|
13
|
+
readonly duration: number;
|
|
14
|
+
readonly escalationLevel?: number;
|
|
15
|
+
readonly hardwareAccelerated?: boolean;
|
|
16
|
+
readonly health: "buffering" | "error" | "healthy" | "recovering" | "stalled";
|
|
17
|
+
readonly id: number | string;
|
|
18
|
+
readonly lastIssueTime?: string;
|
|
19
|
+
readonly lastIssueType?: string;
|
|
20
|
+
readonly logoUrl?: string;
|
|
21
|
+
readonly memoryBytes: number;
|
|
22
|
+
readonly nativeBandwidth?: number;
|
|
23
|
+
readonly nativeResolution?: string;
|
|
24
|
+
readonly pageReloadsInWindow: number;
|
|
25
|
+
readonly recoveryAttempts: number;
|
|
26
|
+
readonly serviceName?: string;
|
|
27
|
+
readonly showName?: string;
|
|
28
|
+
readonly startTime: string;
|
|
29
|
+
readonly streamingMode?: "capture" | "native";
|
|
30
|
+
readonly url: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The shape of the system-status payload (snapshot.system and systemStatusChanged events). Subset of the server-side HealthStatus; only what updateSystemStatus
|
|
34
|
+
* reads.
|
|
35
|
+
*/
|
|
36
|
+
export interface SystemSummary {
|
|
37
|
+
readonly browser: {
|
|
38
|
+
readonly connected: boolean;
|
|
39
|
+
};
|
|
40
|
+
readonly streams: {
|
|
41
|
+
readonly active: number;
|
|
42
|
+
readonly limit: number;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The shape of the snapshot SSE payload. snapshot is the only event that delivers the full state in one message; subsequent events are deltas.
|
|
47
|
+
*/
|
|
48
|
+
export interface SnapshotPayload {
|
|
49
|
+
readonly health?: HealthSnapshot;
|
|
50
|
+
readonly streams: readonly StreamSummary[];
|
|
51
|
+
readonly system: SystemSummary;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The shape of the streamRemoved SSE payload. Just the id.
|
|
55
|
+
*/
|
|
56
|
+
export interface StreamRemovedPayload {
|
|
57
|
+
readonly id: number | string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The shape of the healthChanged SSE payload. Carries the per-channel update plus the domain that owns the auth context.
|
|
61
|
+
*/
|
|
62
|
+
export interface HealthChangedPayload {
|
|
63
|
+
readonly channelKey: string;
|
|
64
|
+
readonly domain?: string;
|
|
65
|
+
readonly status: "failed" | "success";
|
|
66
|
+
readonly timestamp: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Health snapshot delivered inside the snapshot event. Channels and domains are independent maps keyed by their respective identifiers.
|
|
70
|
+
*/
|
|
71
|
+
export interface HealthSnapshot {
|
|
72
|
+
readonly channels: Readonly<Record<string, {
|
|
73
|
+
readonly domain?: string;
|
|
74
|
+
readonly status: "failed" | "success";
|
|
75
|
+
readonly timestamp: number;
|
|
76
|
+
}>>;
|
|
77
|
+
readonly domains: Readonly<Record<string, number>>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Mutable client state. The IIFE shell constructs one of these at startup; every handler reads and writes it via ctx.state. Handlers mutate ctx.state fields
|
|
81
|
+
* directly; mutation methods would add no value over field assignment.
|
|
82
|
+
*/
|
|
83
|
+
export interface ClientState {
|
|
84
|
+
expandedStreams: Record<string, boolean>;
|
|
85
|
+
hiddenSince: number;
|
|
86
|
+
lastStatusEventTime: number;
|
|
87
|
+
popoverRenderPending: boolean;
|
|
88
|
+
streamData: Record<string, StreamSummary>;
|
|
89
|
+
systemData: SystemSummary | null;
|
|
90
|
+
tableRenderPending: boolean;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Readonly handle to sibling-script window.* APIs. Resolved at IIFE construction time; tests pass stub literals. updateRestartDialogStatus is read via a getter
|
|
94
|
+
* in the IIFE so the streamRemoved handler picks up later registration from config.ts (the script that defines it loads after status.ts in the page).
|
|
95
|
+
*/
|
|
96
|
+
export interface ClientExternals {
|
|
97
|
+
readonly channelDisplayHtml: (logoUrl: string | undefined, name: string, logoClass: string, textClass: string) => string;
|
|
98
|
+
readonly channelTable: {
|
|
99
|
+
readonly applyPatch: (patch: unknown) => void;
|
|
100
|
+
};
|
|
101
|
+
readonly copyToClipboard: (text: string, message: string) => void;
|
|
102
|
+
readonly dropdowns: {
|
|
103
|
+
readonly close: () => void;
|
|
104
|
+
};
|
|
105
|
+
readonly updateRestartDialogStatus: (() => void) | undefined;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The runtime-input port every handler consumes. document is the DOM; state is the mutable record; externals are the sibling-script window.* APIs. Decision
|
|
109
|
+
* logic is a pure function of this shape - production wires it inside the IIFE (constructed by generateStatusScript), tests pass a context literal.
|
|
110
|
+
*/
|
|
111
|
+
export interface HandlerContext {
|
|
112
|
+
readonly document: Document;
|
|
113
|
+
readonly externals: ClientExternals;
|
|
114
|
+
readonly state: ClientState;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Builds an empty client state. The IIFE calls this at startup; tests call it for fixtures. Defaults to "no streams, no system data, watchdog timestamps zeroed,
|
|
118
|
+
* rAF gates open." lastStatusEventTime is zeroed here; the IIFE reseeds it to Date.now() right before opening the EventSource so the staleness watchdog has a
|
|
119
|
+
* meaningful baseline. Tests that exercise the watchdog seed it explicitly.
|
|
120
|
+
*/
|
|
121
|
+
export declare function createInitialState(): ClientState;
|
|
122
|
+
/**
|
|
123
|
+
* The script-side constant registry. generateStatusScript() emits each entry as `const NAME = <JSON.stringify(value)>;`. Naming is the IIFE-side identifier
|
|
124
|
+
* (matches the closure references inside the function bodies below). Adding a new constant means appending here and using its name in handler bodies; nothing
|
|
125
|
+
* else changes.
|
|
126
|
+
*/
|
|
127
|
+
export declare const HANDLER_CONSTANTS: readonly {
|
|
128
|
+
readonly name: string;
|
|
129
|
+
readonly value: unknown;
|
|
130
|
+
}[];
|
|
131
|
+
declare function formatDuration(seconds: number): string;
|
|
132
|
+
declare function formatBytes(bytes: number): string;
|
|
133
|
+
declare function formatTime(isoString: string): string;
|
|
134
|
+
declare function formatTimeAgo(ts: number): string;
|
|
135
|
+
declare function getDomain(url: string): string;
|
|
136
|
+
declare function getRecoveringLabel(level: number): string;
|
|
137
|
+
declare function getHealthBadge(health: string, level: number): string;
|
|
138
|
+
declare function formatLastIssue(s: StreamSummary): string;
|
|
139
|
+
declare function formatAutoRecovery(s: StreamSummary): string;
|
|
140
|
+
declare function formatClients(s: StreamSummary): string;
|
|
141
|
+
declare function renderHealthCellContent(s: StreamSummary): string;
|
|
142
|
+
declare function renderDetailCodec(s: StreamSummary): string;
|
|
143
|
+
declare function renderDetailStarted(s: StreamSummary): string;
|
|
144
|
+
declare function updateSystemStatus(ctx: HandlerContext): void;
|
|
145
|
+
declare function buildStreamPopoverContent(menu: Element, ctx: HandlerContext): void;
|
|
146
|
+
declare function updateStreamPopover(ctx: HandlerContext): void;
|
|
147
|
+
declare function scheduleTableRender(ctx: HandlerContext): void;
|
|
148
|
+
declare function schedulePopoverRender(ctx: HandlerContext): void;
|
|
149
|
+
declare function renderStreamsTable(ctx: HandlerContext): void;
|
|
150
|
+
declare function updateStreamRow(s: StreamSummary, ctx: HandlerContext): void;
|
|
151
|
+
declare function toggleStreamDetails(id: number | string, ctx: HandlerContext): void;
|
|
152
|
+
declare function updateDurations(ctx: HandlerContext): void;
|
|
153
|
+
declare function updateChannelHealth(channelKey: string, status: "failed" | "success", timestamp: number, domain: string | undefined, ctx: HandlerContext): void;
|
|
154
|
+
declare function updateDomainAuth(domain: string, timestamp: number, ctx: HandlerContext): void;
|
|
155
|
+
declare function applyHealthSnapshot(data: HealthSnapshot, ctx: HandlerContext): void;
|
|
156
|
+
declare function handleSnapshot(data: SnapshotPayload, ctx: HandlerContext): void;
|
|
157
|
+
declare function handleStreamAdded(data: StreamSummary, ctx: HandlerContext): void;
|
|
158
|
+
declare function handleStreamRemoved(data: StreamRemovedPayload, ctx: HandlerContext): void;
|
|
159
|
+
declare function handleStreamHealthChanged(data: StreamSummary, ctx: HandlerContext): void;
|
|
160
|
+
declare function handleSystemStatusChanged(data: SystemSummary, ctx: HandlerContext): void;
|
|
161
|
+
declare function handleHealthChanged(data: HealthChangedPayload, ctx: HandlerContext): void;
|
|
162
|
+
declare function handleChannelUpdate(data: unknown, ctx: HandlerContext): void;
|
|
163
|
+
declare function handleSseError(ctx: HandlerContext): void;
|
|
164
|
+
declare function toggleStreamPopover(ctx: HandlerContext): void;
|
|
165
|
+
declare function copyOverviewPlaylistUrl(ctx: HandlerContext): void;
|
|
166
|
+
declare function handleVisibilityChange(ctx: HandlerContext, reconnect: () => void): void;
|
|
167
|
+
declare function initIPadTooltips(ctx: HandlerContext): void;
|
|
168
|
+
/**
|
|
169
|
+
* The narrowly-typed function shape consumers of HANDLER_FUNCTIONS see. `(...args: never[]) => unknown` is the TS-idiomatic "any function" type that does not
|
|
170
|
+
* fall back to the unsafe Function global - it is contravariant on parameters so it accepts any specific signature, and unknown on return so callers narrow at
|
|
171
|
+
* the use site. The registry consumer (status.ts:generateStatusScript) only ever calls .toString() on each entry, so any function-shape works.
|
|
172
|
+
*/
|
|
173
|
+
type EmittableFn = (...args: never[]) => unknown;
|
|
174
|
+
/**
|
|
175
|
+
* The script-side function registry. generateStatusScript() emits each entry's .toString() output in order. Order is hoisting-irrelevant for function
|
|
176
|
+
* declarations but reflects the logical groups: pure formatters, state-derived renderers, DOM mutators, render schedulers, SSE handlers, then trampolines and
|
|
177
|
+
* lifecycle helpers. Adding a new function means appending here and using its identifier in the IIFE; nothing else changes.
|
|
178
|
+
*
|
|
179
|
+
* The exported individual functions remain importable for tests; this registry is just the emission order for the script body.
|
|
180
|
+
*/
|
|
181
|
+
export declare const HANDLER_FUNCTIONS: readonly EmittableFn[];
|
|
182
|
+
export { applyHealthSnapshot, buildStreamPopoverContent, copyOverviewPlaylistUrl, formatAutoRecovery, formatBytes, formatClients, formatDuration, formatLastIssue, formatTime, formatTimeAgo, getDomain, getHealthBadge, getRecoveringLabel, handleChannelUpdate, handleHealthChanged, handleSnapshot, handleSseError, handleStreamAdded, handleStreamHealthChanged, handleStreamRemoved, handleSystemStatusChanged, handleVisibilityChange, initIPadTooltips, renderDetailCodec, renderDetailStarted, renderHealthCellContent, renderStreamsTable, schedulePopoverRender, scheduleTableRender, toggleStreamDetails, toggleStreamPopover, updateChannelHealth, updateDomainAuth, updateDurations, updateStreamPopover, updateStreamRow, updateSystemStatus };
|