prismcast 1.8.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/README.md +6 -6
- package/dist/app.d.ts +1 -1
- package/dist/app.js +41 -13
- package/dist/app.js.map +1 -1
- package/dist/browser/cdp.d.ts +4 -6
- package/dist/browser/cdp.js +18 -22
- 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 +44 -45
- 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.d.ts +1 -1
- package/dist/browser/precaching.js +23 -23
- package/dist/browser/precaching.js.map +1 -1
- 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 +65 -69
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +1 -1
- package/dist/browser/tuning/fox.js +172 -15
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.d.ts +1 -1
- package/dist/browser/tuning/hbo.js +7 -7
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +1 -1
- package/dist/browser/tuning/hulu.js +120 -113
- 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 +30 -30
- 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 +475 -442
- 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 +7 -6
- package/dist/config/health.js +78 -65
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +21 -14
- 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 +157 -0
- package/dist/config/persistence.js +446 -0
- package/dist/config/persistence.js.map +1 -0
- 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 +46 -0
- package/dist/config/{providerPacks.js → servicePacks.js} +50 -53
- package/dist/config/servicePacks.js.map +1 -0
- package/dist/config/services.d.ts +228 -0
- package/dist/config/services.js +772 -0
- package/dist/config/services.js.map +1 -0
- package/dist/config/sites.d.ts +3 -3
- package/dist/config/sites.js +75 -75
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +522 -54
- package/dist/config/userChannels.js +1343 -366
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +108 -13
- package/dist/config/userConfig.js +296 -143
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +34 -16
- package/dist/config/userProfiles.js +189 -100
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.d.ts +1 -1
- package/dist/hdhr/channelMap.js +10 -16
- 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 +12 -19
- 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 +45 -67
- package/dist/native/index.js.map +1 -1
- package/dist/native/probe.d.ts +27 -9
- package/dist/native/probe.js +159 -68
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +4 -2
- package/dist/native/proxy.js +56 -53
- 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/assets.js +3 -3
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/auth.js +9 -13
- 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 +2 -2
- 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 +13 -13
- package/dist/routes/config/channels/table.js +291 -184
- 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 +5 -5
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/{providers.js → services.js} +105 -99
- package/dist/routes/config/services.js.map +1 -0
- package/dist/routes/config/settings.d.ts +1 -1
- package/dist/routes/config/settings.js +85 -60
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.js +17 -18
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/health.js +1 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/icons.js +2 -2
- package/dist/routes/icons.js.map +1 -1
- package/dist/routes/index.js +2 -2
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/logs.js +23 -34
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/mpegts.js +1 -1
- package/dist/routes/playlist.d.ts +5 -5
- package/dist/routes/playlist.js +84 -61
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.js +82 -61
- 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 +538 -581
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/config.js +868 -1022
- 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 +445 -197
- 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 +85 -436
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.js +16 -8
- package/dist/routes/root/styles.js.map +1 -1
- package/dist/routes/services.d.ts +6 -0
- package/dist/routes/{providers.js → services.js} +58 -55
- package/dist/routes/services.js.map +1 -0
- 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/ui.js +2 -0
- package/dist/routes/ui.js.map +1 -1
- 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 +172 -192
- 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 +509 -291
- 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 +7 -7
- package/dist/streaming/hls.js +104 -92
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +3 -3
- package/dist/streaming/hlsResume.js +6 -6
- package/dist/streaming/hlsResume.js.map +1 -1
- 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 +98 -66
- 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 +40 -42
- 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/registry.js +4 -8
- package/dist/streaming/registry.js.map +1 -1
- package/dist/streaming/setup.d.ts +11 -10
- package/dist/streaming/setup.js +120 -71
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +9 -3
- package/dist/streaming/showInfo.js +33 -27
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +8 -7
- package/dist/streaming/statusEmitter.js +5 -5
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +139 -36
- package/dist/types/channels.js +39 -1
- package/dist/types/channels.js.map +1 -1
- package/dist/types/config.d.ts +22 -3
- 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 +14 -13
- package/dist/types/selection.d.ts +49 -5
- package/dist/types/shared.d.ts +1 -1
- package/dist/types/streaming.d.ts +2 -2
- 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 +2 -2
- 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 +8 -6
- 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 +60 -31
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +7 -1
- package/dist/utils/format.js +22 -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 +31 -45
- 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 +4 -4
- 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 -2
- 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/streamContext.d.ts +7 -0
- package/dist/utils/streamContext.js +10 -1
- package/dist/utils/streamContext.js.map +1 -1
- 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 +15 -28
- package/dist/utils/version.js.map +1 -1
- package/package.json +14 -10
- package/dist/config/providerPacks.d.ts +0 -46
- package/dist/config/providerPacks.js.map +0 -1
- package/dist/config/providers.d.ts +0 -175
- package/dist/config/providers.js +0 -691
- package/dist/config/providers.js.map +0 -1
- package/dist/native/intercept.d.ts +0 -35
- package/dist/native/intercept.js +0 -184
- package/dist/native/intercept.js.map +0 -1
- package/dist/routes/config/channels/routes.js +0 -1477
- package/dist/routes/config/channels/routes.js.map +0 -1
- package/dist/routes/config/providers.js.map +0 -1
- package/dist/routes/providers.d.ts +0 -6
- package/dist/routes/providers.js.map +0 -1
- /package/dist/routes/config/{providers.d.ts → services.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.handlers.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/status.handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,446 +1,95 @@
|
|
|
1
1
|
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
2
|
*
|
|
3
|
-
* status.ts: Client-side JavaScript generator for the PrismCast status display.
|
|
3
|
+
* status.ts: Client-side JavaScript generator for the PrismCast status display. The pure handler logic lives in status.handlers.ts as ports-and-adapters TS
|
|
4
|
+
* functions over a HandlerContext; this file is the boundary that builds the script string.
|
|
5
|
+
*
|
|
6
|
+
* The generator emits three sections in order:
|
|
7
|
+
*
|
|
8
|
+
* 1. The script-side constants (HANDLER_CONSTANTS) as `const NAME = <JSON.stringify(value)>;` lines. The handler bodies reference these by their TS-side
|
|
9
|
+
* identifiers; emitting them via JSON.stringify keeps the constants single-sourced rather than hand-mirrored as string templates.
|
|
10
|
+
*
|
|
11
|
+
* 2. The pure handler functions (HANDLER_FUNCTIONS) via Function.prototype.toString() concatenation. Each function declaration emits its full source; the
|
|
12
|
+
* browser parses them as siblings in script-tag scope, so cross-handler references resolve naturally. TypeScript type annotations strip to whitespace via
|
|
13
|
+
* Node's strip-types and to nothing via tsc compilation; the runtime body is identical between test and production.
|
|
14
|
+
*
|
|
15
|
+
* 3. A small IIFE that constructs the initial state, resolves the window.* externals, opens the EventSource, dispatches incoming events to the extracted
|
|
16
|
+
* handlers, attaches the window-bound trampolines (toggleStreamPopover, toggleStreamDetails, copyOverviewPlaylistUrl), and starts the periodic timers
|
|
17
|
+
* (1-second duration tick, 45-second staleness watchdog) plus the visibility-driven reconnect listener and the iPad tooltip initializer.
|
|
18
|
+
*
|
|
19
|
+
* Every function the IIFE references is one of: a sibling extracted via .toString() (resolves at the script-tag top scope), or a browser global (Date,
|
|
20
|
+
* EventSource, JSON, document, setInterval, window). The IIFE has no closures over server-side TS state.
|
|
21
|
+
*/
|
|
22
|
+
import { HANDLER_CONSTANTS, HANDLER_FUNCTIONS } from "./status.handlers.js";
|
|
23
|
+
/**
|
|
24
|
+
* Generates the inline <script> block that drives the status display. Returns a complete <script>...</script> string ready to embed in the page wrapper.
|
|
25
|
+
* @returns The script string.
|
|
4
26
|
*/
|
|
5
27
|
export function generateStatusScript() {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
// Format absolute time (e.g., "6:54 AM" or "Jan 14, 6:54 AM" if different day).
|
|
30
|
-
"function formatTime(isoString) {",
|
|
31
|
-
" var date = new Date(isoString);",
|
|
32
|
-
" var now = new Date();",
|
|
33
|
-
" var hours = date.getHours();",
|
|
34
|
-
" var minutes = date.getMinutes();",
|
|
35
|
-
" var ampm = hours >= 12 ? 'PM' : 'AM';",
|
|
36
|
-
" hours = hours % 12;",
|
|
37
|
-
" hours = hours ? hours : 12;",
|
|
38
|
-
" var timeStr = hours + ':' + (minutes < 10 ? '0' : '') + minutes + ' ' + ampm;",
|
|
39
|
-
" if (date.toDateString() !== now.toDateString()) {",
|
|
40
|
-
" var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];",
|
|
41
|
-
" timeStr = months[date.getMonth()] + ' ' + date.getDate() + ', ' + timeStr;",
|
|
42
|
-
" }",
|
|
43
|
-
" return timeStr;",
|
|
44
|
-
"}",
|
|
45
|
-
// Extract concise domain from URL for display (last two hostname parts). Mirrors the server-side extractDomain() in utils/format.ts.
|
|
46
|
-
"function getDomain(url) {",
|
|
47
|
-
" try {",
|
|
48
|
-
" var parts = new URL(url).hostname.split('.');",
|
|
49
|
-
" return parts.length > 2 ? parts.slice(-2).join('.') : parts.join('.');",
|
|
50
|
-
" } catch (e) {",
|
|
51
|
-
" return url;",
|
|
52
|
-
" }",
|
|
53
|
-
"}",
|
|
54
|
-
// Get row background color based on health status. Uses CSS variables for theme support.
|
|
55
|
-
"function getRowTint(health) {",
|
|
56
|
-
" var tints = {",
|
|
57
|
-
" healthy: 'transparent',",
|
|
58
|
-
" buffering: 'var(--stream-tint-buffering)',",
|
|
59
|
-
" stalled: 'var(--stream-tint-stalled)',",
|
|
60
|
-
" recovering: 'var(--stream-tint-recovering)',",
|
|
61
|
-
" error: 'var(--stream-tint-error)'",
|
|
28
|
+
// Section 1: emit each constant as a `const name = <json>;` declaration. Stable serialization (Object.entries are emitted in declaration order from
|
|
29
|
+
// status.handlers.ts) keeps generation deterministic across calls.
|
|
30
|
+
const constantDecls = HANDLER_CONSTANTS.map((c) => "const " + c.name + " = " + JSON.stringify(c.value) + ";").join("\n");
|
|
31
|
+
// Section 2: emit each handler/helper as its source via Function.prototype.toString(). Function declarations are hoisted in script-tag scope, so cross-handler
|
|
32
|
+
// references resolve regardless of declaration order; the order chosen in HANDLER_FUNCTIONS reflects the logical groups (formatters, renderers, mutators,
|
|
33
|
+
// schedulers, handlers, trampolines).
|
|
34
|
+
const handlerSources = HANDLER_FUNCTIONS.map((fn) => fn.toString()).join("\n\n");
|
|
35
|
+
// Section 3: the IIFE. Wires the runtime side - constructs the state and externals, opens the EventSource, dispatches events, attaches window.* trampolines,
|
|
36
|
+
// starts the timers. The handler-side state mutations all go through the ctx that is built here. The shared sibling-script values (channelDisplayHtml,
|
|
37
|
+
// channelTable, copyToClipboard, dropdowns) are referenced as bare identifiers, matching the existing client-side idiom - shared.ts assigns them via
|
|
38
|
+
// window.X = ... before this script loads, and bare identifiers in non-strict script-tag scope resolve through the global object. updateRestartDialogStatus
|
|
39
|
+
// is wrapped in a typeof guard inside a getter because config.ts loads after status.ts; a streamRemoved event arriving before config.ts has registered the
|
|
40
|
+
// callback must not throw.
|
|
41
|
+
const iife = [
|
|
42
|
+
"(function() {",
|
|
43
|
+
" const state = {",
|
|
44
|
+
" expandedStreams: {},",
|
|
45
|
+
" hiddenSince: 0,",
|
|
46
|
+
" lastStatusEventTime: Date.now(),",
|
|
47
|
+
" popoverRenderPending: false,",
|
|
48
|
+
" streamData: {},",
|
|
49
|
+
" systemData: null,",
|
|
50
|
+
" tableRenderPending: false",
|
|
62
51
|
" };",
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
" if (health === 'healthy') { label = 'Healthy'; }",
|
|
70
|
-
" else if (health === 'buffering') { label = 'Buffering'; }",
|
|
71
|
-
" else if (health === 'stalled') { label = 'Stalled'; }",
|
|
72
|
-
" else if (health === 'error') { label = 'Error'; }",
|
|
73
|
-
" else if (health === 'recovering') {",
|
|
74
|
-
" if (level === 1) { label = 'Resuming playback'; }",
|
|
75
|
-
" else if (level === 2) { label = 'Syncing to live'; }",
|
|
76
|
-
" else if (level === 3) { label = 'Reloading player'; }",
|
|
77
|
-
" else if (level >= 4) { label = 'Reloading page'; }",
|
|
78
|
-
" else { label = 'Recovering'; }",
|
|
79
|
-
" }",
|
|
80
|
-
" else { label = health; }",
|
|
81
|
-
" return '<span class=\"status-dot\" style=\"color: ' + (healthColorVars[health] || 'var(--text-muted)') + ';\">●</span> ' +",
|
|
82
|
-
" '<span style=\"color: var(--text-secondary);\">' + label + '</span>';",
|
|
83
|
-
"}",
|
|
84
|
-
// Update system status display in header. Shows system health (green dot when connected, red with label when not) and stream count.
|
|
85
|
-
"function updateSystemStatus() {",
|
|
86
|
-
" if(!systemData) return;",
|
|
87
|
-
" var healthEl = document.getElementById('system-health');",
|
|
88
|
-
" var streamEl = document.getElementById('stream-count');",
|
|
89
|
-
" if(systemData.browser.connected) {",
|
|
90
|
-
" healthEl.innerHTML = '<span class=\"status-dot\" style=\"color: var(--stream-healthy);\">●</span>';",
|
|
91
|
-
" } else {",
|
|
92
|
-
" healthEl.innerHTML = '<span class=\"status-dot\" style=\"color: var(--stream-error);\">●</span> Browser offline';",
|
|
93
|
-
" }",
|
|
94
|
-
" var active = systemData.streams.active;",
|
|
95
|
-
" var limit = systemData.streams.limit;",
|
|
96
|
-
" if(active === 0) {",
|
|
97
|
-
" streamEl.textContent = '0 streams';",
|
|
98
|
-
" streamEl.classList.remove('clickable');",
|
|
99
|
-
" var popMenu = document.getElementById('stream-popover-menu');",
|
|
100
|
-
" if(popMenu) popMenu.classList.remove('show');",
|
|
101
|
-
" } else {",
|
|
102
|
-
" streamEl.textContent = active + '/' + limit + ' streams';",
|
|
103
|
-
" streamEl.classList.add('clickable');",
|
|
104
|
-
" }",
|
|
105
|
-
"}",
|
|
106
|
-
// Build the popover content from streamData. Populates the given menu element with one row per active stream.
|
|
107
|
-
"function buildStreamPopoverContent(menu) {",
|
|
108
|
-
" var ids = Object.keys(streamData);",
|
|
109
|
-
" var html = '';",
|
|
110
|
-
" var now = Date.now();",
|
|
111
|
-
" for(var i = 0; i < ids.length; i++) {",
|
|
112
|
-
" var s = streamData[ids[i]];",
|
|
113
|
-
" var color = healthColorVars[s.health] || 'var(--text-muted)';",
|
|
114
|
-
" var name = s.channel || s.providerName || getDomain(s.url);",
|
|
115
|
-
" var dur = Math.floor((now - new Date(s.startTime).getTime()) / 1000);",
|
|
116
|
-
" var hwBadge = s.hardwareAccelerated ? ' <span title=\"Hardware accelerated\">\\u26A1</span>' : '';",
|
|
117
|
-
" var showSuffix = s.showName ? ' <span class=\"stream-popover-show\">' + s.showName + '</span>' : '';",
|
|
118
|
-
" html += '<div class=\"stream-popover-row\">';",
|
|
119
|
-
" html += '<span class=\"status-dot\" style=\"color: ' + color + ';\">●</span>';",
|
|
120
|
-
" html += channelDisplayHtml(s.logoUrl, name, 'stream-popover-logo', 'stream-popover-channel');",
|
|
121
|
-
" html += hwBadge + showSuffix;",
|
|
122
|
-
" html += '<span class=\"stream-popover-duration\">' + formatDuration(dur) + '</span>';",
|
|
123
|
-
" html += '</div>';",
|
|
124
|
-
" }",
|
|
125
|
-
" menu.innerHTML = html;",
|
|
126
|
-
"}",
|
|
127
|
-
// Update an already-open stream popover with current data. Called from SSE handlers and the duration interval.
|
|
128
|
-
"function updateStreamPopover() {",
|
|
129
|
-
" var menu = document.getElementById('stream-popover-menu');",
|
|
130
|
-
" if(!menu || !menu.classList.contains('show')) return;",
|
|
131
|
-
" var ids = Object.keys(streamData);",
|
|
132
|
-
" if(ids.length === 0) {",
|
|
133
|
-
" menu.classList.remove('show');",
|
|
134
|
-
" return;",
|
|
135
|
-
" }",
|
|
136
|
-
" buildStreamPopoverContent(menu);",
|
|
137
|
-
"}",
|
|
138
|
-
// Toggle the stream popover open or closed.
|
|
139
|
-
"window.toggleStreamPopover = function() {",
|
|
140
|
-
" var ids = Object.keys(streamData);",
|
|
141
|
-
" if(ids.length === 0) return;",
|
|
142
|
-
" var menu = document.getElementById('stream-popover-menu');",
|
|
143
|
-
" if(!menu) return;",
|
|
144
|
-
" var isOpen = menu.classList.contains('show');",
|
|
145
|
-
" closeDropdowns();",
|
|
146
|
-
" if(!isOpen) {",
|
|
147
|
-
" buildStreamPopoverContent(menu);",
|
|
148
|
-
" menu.classList.add('show');",
|
|
149
|
-
" }",
|
|
150
|
-
"};",
|
|
151
|
-
// Format last issue for display.
|
|
152
|
-
"function formatLastIssue(s) {",
|
|
153
|
-
" if (!s.lastIssueType || !s.lastIssueTime) { return 'None'; }",
|
|
154
|
-
" var issueLabel = s.lastIssueType.charAt(0).toUpperCase() + s.lastIssueType.slice(1);",
|
|
155
|
-
" var timeStr = formatTime(new Date(s.lastIssueTime).toISOString());",
|
|
156
|
-
" var status = (s.health === 'healthy') ? ' (recovered)' : ' (recovering)';",
|
|
157
|
-
" return issueLabel + ' at ' + timeStr + status;",
|
|
158
|
-
"}",
|
|
159
|
-
// Format auto-recovery info for display.
|
|
160
|
-
"function formatAutoRecovery(s) {",
|
|
161
|
-
" var attempts = s.recoveryAttempts;",
|
|
162
|
-
" var reloads = s.pageReloadsInWindow;",
|
|
163
|
-
" if (attempts === 0) { return 'N/A'; }",
|
|
164
|
-
" var str = attempts + (attempts === 1 ? ' attempt' : ' attempts');",
|
|
165
|
-
" if (reloads > 0) { str += ', ' + reloads + (reloads === 1 ? ' page reload' : ' page reloads'); }",
|
|
166
|
-
" return str;",
|
|
167
|
-
"}",
|
|
168
|
-
// Format client type breakdown for the detail row.
|
|
169
|
-
"function formatClients(s) {",
|
|
170
|
-
" if (s.clientCount === 0) { return 'None'; }",
|
|
171
|
-
" var labels = { 'hls': 'HLS', 'mpegts': 'MPEG-TS' };",
|
|
172
|
-
" var parts = [];",
|
|
173
|
-
" for (var i = 0; i < s.clients.length; i++) {",
|
|
174
|
-
" var c = s.clients[i];",
|
|
175
|
-
" parts.push(c.count + ' ' + (labels[c.type] || c.type));",
|
|
176
|
-
" }",
|
|
177
|
-
" return parts.join(', ');",
|
|
178
|
-
"}",
|
|
179
|
-
// Render the streams table.
|
|
180
|
-
"function renderStreamsTable() {",
|
|
181
|
-
" var tbody = document.getElementById('streams-tbody');",
|
|
182
|
-
" if (!tbody) return;",
|
|
183
|
-
" var streamIds = Object.keys(streamData);",
|
|
184
|
-
" if (streamIds.length === 0) {",
|
|
185
|
-
" tbody.innerHTML = '<tr class=\"empty-row\"><td colspan=\"4\">No active streams</td></tr>';",
|
|
186
|
-
" return;",
|
|
187
|
-
" }",
|
|
188
|
-
" var html = '';",
|
|
189
|
-
" for (var i = 0; i < streamIds.length; i++) {",
|
|
190
|
-
" var id = streamIds[i];",
|
|
191
|
-
" var s = streamData[id];",
|
|
192
|
-
" var isExpanded = expandedStreams[id];",
|
|
193
|
-
" var chevron = isExpanded ? '▼' : '▶';",
|
|
194
|
-
" var rowTint = getRowTint(s.health);",
|
|
195
|
-
" var channelText = s.channel || s.providerName || getDomain(s.url);",
|
|
196
|
-
" var channelDisplay = channelDisplayHtml(s.logoUrl, channelText, 'channel-logo', 'channel-text');",
|
|
197
|
-
" html += '<tr class=\"stream-row\" data-id=\"' + id + '\" onclick=\"toggleStreamDetails(' + id + ')\" style=\"background-color: ' + rowTint + ';\">';",
|
|
198
|
-
" html += '<td class=\"chevron\">' + chevron + '</td>';",
|
|
199
|
-
" var hwIcon = s.hardwareAccelerated ? '\\u26A1 ' : '';",
|
|
200
|
-
" var nativeBadge = '';",
|
|
201
|
-
" if (s.streamingMode === 'native') {",
|
|
202
|
-
" nativeBadge = ' <span class=\"native-badge\" title=\"Native HLS\">Native</span>';",
|
|
203
|
-
" } else if (s.hardwareAccelerated) {",
|
|
204
|
-
" nativeBadge = ' <span class=\"native-badge\" title=\"Hardware accelerated\">' + hwIcon + (s.captureCodec || '') + '</span>';",
|
|
205
|
-
" }",
|
|
206
|
-
" var durationSpan = '<span class=\"stream-duration\" id=\"duration-' + id + '\">\\u00b7 ' + formatDuration(s.duration) + '</span>';",
|
|
207
|
-
" html += '<td class=\"stream-info\">' + channelDisplay + nativeBadge + ' ' + durationSpan + '</td>';",
|
|
208
|
-
" var showDisplay = s.showName ? s.showName : '';",
|
|
209
|
-
" html += '<td class=\"stream-show\">' + showDisplay + '</td>';",
|
|
210
|
-
" var clientIndicator = '';",
|
|
211
|
-
" if (s.clientCount > 0) {",
|
|
212
|
-
" var title = s.clientCount + (s.clientCount !== 1 ? ' clients' : ' client');",
|
|
213
|
-
" clientIndicator = '<span class=\"client-count\" title=\"' + title + '\">◉ ' + s.clientCount + '</span> ';",
|
|
214
|
-
" }",
|
|
215
|
-
" html += '<td class=\"stream-health\">' + clientIndicator + getHealthBadge(s.health, s.escalationLevel) + '</td>';",
|
|
216
|
-
" html += '</tr>';",
|
|
217
|
-
" if (isExpanded) {",
|
|
218
|
-
" html += '<tr class=\"stream-details\" data-id=\"' + id + '\">';",
|
|
219
|
-
" html += '<td colspan=\"4\">';",
|
|
220
|
-
" html += '<div class=\"details-content\">';",
|
|
221
|
-
" html += '<div class=\"details-header\">';",
|
|
222
|
-
" html += '<div class=\"details-url\">' + s.url + '</div>';",
|
|
223
|
-
" var clientSuffix = s.clientCount > 0 ? ' · ' + formatClients(s) : '';",
|
|
224
|
-
" html += '<div class=\"details-started\"><strong>Started:</strong> ' + formatTime(s.startTime) + clientSuffix + '</div>';",
|
|
225
|
-
" html += '</div>';",
|
|
226
|
-
" html += '<div class=\"details-metrics\">';",
|
|
227
|
-
" var codecLabel = s.captureCodec ? (s.hardwareAccelerated ? '\\u26A1 ' + s.captureCodec : s.captureCodec) :",
|
|
228
|
-
" (s.streamingMode === 'native' ? 'Native HLS' : 'Unknown');",
|
|
229
|
-
" var modeLabel = s.streamingMode === 'native' ? 'Native HLS' : 'Capture';",
|
|
230
|
-
" var qualitySuffix = '';",
|
|
231
|
-
" if (s.streamingMode === 'native') {",
|
|
232
|
-
" var qParts = [];",
|
|
233
|
-
" if (s.nativeBandwidth > 0) { qParts.push((s.nativeBandwidth / 1000000).toFixed(1) + 'Mbps'); }",
|
|
234
|
-
" if (s.nativeResolution) {",
|
|
235
|
-
" var resLabels = { '1080': '1080p', '2160': '4K', '360': '360p', '480': '480p', '720': '720p' };",
|
|
236
|
-
" var h = s.nativeResolution.split('x')[1];",
|
|
237
|
-
" qParts.push(resLabels[h] || s.nativeResolution);",
|
|
238
|
-
" }",
|
|
239
|
-
" if (qParts.length > 0) { qualitySuffix = ' - ' + qParts.join(' '); }",
|
|
240
|
-
" }",
|
|
241
|
-
" html += '<div class=\"details-codec\"><strong>Codec:</strong> ' + codecLabel + ' (' + modeLabel + ')' + qualitySuffix + '</div>';",
|
|
242
|
-
" html += '<div class=\"details-issue\"><strong>Last issue:</strong> ' + formatLastIssue(s) + '</div>';",
|
|
243
|
-
" html += '<div class=\"details-recovery\"><strong>Recovery:</strong> ' + formatAutoRecovery(s) + '</div>';",
|
|
244
|
-
" html += '<div class=\"details-memory\"><strong>Memory:</strong> ' + formatBytes(s.memoryBytes) + '</div>';",
|
|
245
|
-
" html += '</div>';",
|
|
246
|
-
" html += '</div>';",
|
|
247
|
-
" html += '</td></tr>';",
|
|
248
|
-
" }",
|
|
249
|
-
" }",
|
|
250
|
-
" tbody.innerHTML = html;",
|
|
251
|
-
"}",
|
|
252
|
-
// Toggle stream details.
|
|
253
|
-
"function toggleStreamDetails(id) {",
|
|
254
|
-
" expandedStreams[id] = !expandedStreams[id];",
|
|
255
|
-
" renderStreamsTable();",
|
|
256
|
-
"}",
|
|
257
|
-
// Update stream durations every second. We calculate duration from the immutable startTime rather than incrementing a counter, ensuring the displayed duration is
|
|
258
|
-
// always accurate regardless of any staleness in server-sent updates.
|
|
259
|
-
"function updateDurations() {",
|
|
260
|
-
" var now = Date.now();",
|
|
261
|
-
" var streamIds = Object.keys(streamData);",
|
|
262
|
-
" for (var i = 0; i < streamIds.length; i++) {",
|
|
263
|
-
" var id = streamIds[i];",
|
|
264
|
-
" var s = streamData[id];",
|
|
265
|
-
" var durationSec = Math.floor((now - new Date(s.startTime).getTime()) / 1000);",
|
|
266
|
-
" var el = document.getElementById('duration-' + id);",
|
|
267
|
-
" if (el) el.textContent = '\\u00b7 ' + formatDuration(durationSec);",
|
|
268
|
-
" }",
|
|
269
|
-
" updateStreamPopover();",
|
|
270
|
-
"}",
|
|
271
|
-
// Track the last time any SSE event was received from the status stream. Used by the staleness checker to detect silently dead connections.
|
|
272
|
-
"var lastStatusEventTime = Date.now();",
|
|
273
|
-
"var hiddenSince = 0;",
|
|
274
|
-
// Real-time health indicator updates. These functions update channel health icons and provider login icons in the Channels tab without a page refresh.
|
|
275
|
-
"function formatTimeAgo(ts) {",
|
|
276
|
-
" var seconds = Math.floor((Date.now() - ts) / 1000);",
|
|
277
|
-
" if(seconds < 60) { return 'just now'; }",
|
|
278
|
-
" var minutes = Math.floor(seconds / 60);",
|
|
279
|
-
" if(minutes < 60) { return minutes + (minutes === 1 ? ' minute ago' : ' minutes ago'); }",
|
|
280
|
-
" var hours = Math.floor(minutes / 60);",
|
|
281
|
-
" if(hours < 24) { return hours + (hours === 1 ? ' hour ago' : ' hours ago'); }",
|
|
282
|
-
" var days = Math.floor(hours / 24);",
|
|
283
|
-
" return days + (days === 1 ? ' day ago' : ' days ago');",
|
|
284
|
-
"}",
|
|
285
|
-
"function updateChannelHealth(channelKey, status, timestamp, domain) {",
|
|
286
|
-
" var row = document.getElementById('display-row-' + channelKey);",
|
|
287
|
-
" if(!row) { return; }",
|
|
288
|
-
// If a domain was supplied (snapshot and real-time events both include it), verify it matches the currently selected domain for this channel. The login button
|
|
289
|
-
// carries a data-auth-domain attribute with the selected domain. If they differ the health entry is from a previous provider and should be ignored.
|
|
290
|
-
" if(domain) {",
|
|
291
|
-
" var loginBtn = row.querySelector('.btn-icon-login');",
|
|
292
|
-
" if(loginBtn && loginBtn.getAttribute('data-auth-domain') !== domain) { return; }",
|
|
293
|
-
" }",
|
|
294
|
-
" var icon = row.querySelector('.btn-icon-health');",
|
|
295
|
-
" if(!icon) { return; }",
|
|
296
|
-
" icon.classList.remove('health-success', 'health-failed');",
|
|
297
|
-
" if(status === 'success') { icon.classList.add('health-success'); }",
|
|
298
|
-
" else if(status === 'failed') { icon.classList.add('health-failed'); }",
|
|
299
|
-
" icon.title = (status === 'success' ? 'Succeeded ' : 'Failed ') + formatTimeAgo(timestamp);",
|
|
300
|
-
"}",
|
|
301
|
-
"function updateDomainAuth(domain, timestamp) {",
|
|
302
|
-
" var buttons = document.querySelectorAll('.btn-icon-login[data-auth-domain=\"' + domain + '\"]');",
|
|
303
|
-
" for(var i = 0; i < buttons.length; i++) {",
|
|
304
|
-
" buttons[i].classList.add('health-success');",
|
|
305
|
-
" buttons[i].title = 'Verified ' + formatTimeAgo(timestamp);",
|
|
306
|
-
" }",
|
|
307
|
-
"}",
|
|
308
|
-
"function applyHealthSnapshot(data) {",
|
|
309
|
-
" var key;",
|
|
310
|
-
" for(key in data.channels) {",
|
|
311
|
-
" var entry = data.channels[key];",
|
|
312
|
-
" updateChannelHealth(key, entry.status, entry.timestamp, entry.domain);",
|
|
313
|
-
" }",
|
|
314
|
-
" for(key in data.domains) {",
|
|
315
|
-
" updateDomainAuth(key, data.domains[key]);",
|
|
316
|
-
" }",
|
|
317
|
-
"}",
|
|
318
|
-
// Connect (or reconnect) to the status SSE stream. Closes any existing connection first so this is safe to call repeatedly.
|
|
319
|
-
"function connectStatusSSE() {",
|
|
320
|
-
" if(statusEventSource) { statusEventSource.close(); }",
|
|
321
|
-
" statusEventSource = new EventSource('/streams/status');",
|
|
322
|
-
" lastStatusEventTime = Date.now();",
|
|
323
|
-
// Local helper that registers an event listener and updates the staleness timestamp on every event. Handlers are optional so heartbeat can
|
|
324
|
-
// be registered with just on('heartbeat') for pure keepalive tracking. The onerror handler stays outside this wrapper because errors must
|
|
325
|
-
// not reset the staleness timer — a connection that only fires errors is still dead.
|
|
326
|
-
" function on(event, handler) {",
|
|
327
|
-
" statusEventSource.addEventListener(event, function(e) {",
|
|
328
|
-
" lastStatusEventTime = Date.now();",
|
|
329
|
-
" if(handler) { handler(e); }",
|
|
330
|
-
" });",
|
|
331
|
-
" }",
|
|
332
|
-
" on('heartbeat');",
|
|
333
|
-
" on('snapshot', function(e) {",
|
|
334
|
-
" var data = JSON.parse(e.data);",
|
|
335
|
-
" systemData = data.system;",
|
|
336
|
-
" streamData = {};",
|
|
337
|
-
" for (var i = 0; i < data.streams.length; i++) {",
|
|
338
|
-
" streamData[data.streams[i].id] = data.streams[i];",
|
|
339
|
-
" }",
|
|
340
|
-
" updateSystemStatus();",
|
|
341
|
-
" renderStreamsTable();",
|
|
342
|
-
" updateStreamPopover();",
|
|
343
|
-
" if(data.health) { applyHealthSnapshot(data.health); }",
|
|
344
|
-
" });",
|
|
345
|
-
" on('streamAdded', function(e) {",
|
|
346
|
-
" var s = JSON.parse(e.data);",
|
|
347
|
-
" streamData[s.id] = s;",
|
|
348
|
-
" renderStreamsTable();",
|
|
349
|
-
" updateStreamPopover();",
|
|
350
|
-
" });",
|
|
351
|
-
" on('streamRemoved', function(e) {",
|
|
352
|
-
" var data = JSON.parse(e.data);",
|
|
353
|
-
" delete streamData[data.id];",
|
|
354
|
-
" delete expandedStreams[data.id];",
|
|
355
|
-
" renderStreamsTable();",
|
|
356
|
-
" updateStreamPopover();",
|
|
357
|
-
" if (typeof updateRestartDialogStatus === 'function') {",
|
|
358
|
-
" updateRestartDialogStatus();",
|
|
359
|
-
" }",
|
|
360
|
-
" });",
|
|
361
|
-
" on('streamHealthChanged', function(e) {",
|
|
362
|
-
" var s = JSON.parse(e.data);",
|
|
363
|
-
" if (streamData[s.id]) {",
|
|
364
|
-
" streamData[s.id] = s;",
|
|
365
|
-
" renderStreamsTable();",
|
|
366
|
-
" updateStreamPopover();",
|
|
367
|
-
" }",
|
|
368
|
-
" });",
|
|
369
|
-
" on('systemStatusChanged', function(e) {",
|
|
370
|
-
" systemData = JSON.parse(e.data);",
|
|
371
|
-
" updateSystemStatus();",
|
|
372
|
-
" });",
|
|
373
|
-
" on('healthChanged', function(e) {",
|
|
374
|
-
" var event = JSON.parse(e.data);",
|
|
375
|
-
" updateChannelHealth(event.channelKey, event.status, event.timestamp, event.domain);",
|
|
376
|
-
" if(event.status === 'success') { updateDomainAuth(event.domain, event.timestamp); }",
|
|
377
|
-
" });",
|
|
378
|
-
// Channel table updates from the server (e.g., logo population after startup). Applies the patch via the shared applyChannelPatch function.
|
|
379
|
-
" on('channelUpdate', function(e) {",
|
|
380
|
-
" if(window.applyChannelPatch) { applyChannelPatch(JSON.parse(e.data)); }",
|
|
381
|
-
" });",
|
|
382
|
-
" statusEventSource.onerror = function() {",
|
|
383
|
-
" document.getElementById('system-health').innerHTML = '<span class=\"status-dot\" style=\"color: var(--stream-stalled);\">●</span> Updates paused';",
|
|
52
|
+
" const externals = {",
|
|
53
|
+
" channelDisplayHtml: channelDisplayHtml,",
|
|
54
|
+
" channelTable: channelTable,",
|
|
55
|
+
" copyToClipboard: copyToClipboard,",
|
|
56
|
+
" dropdowns: dropdowns,",
|
|
57
|
+
" get updateRestartDialogStatus() { return (typeof updateRestartDialogStatus !== 'undefined') ? updateRestartDialogStatus : undefined; }",
|
|
384
58
|
" };",
|
|
385
|
-
"}",
|
|
386
|
-
|
|
387
|
-
"connectStatusSSE()
|
|
388
|
-
"
|
|
389
|
-
|
|
390
|
-
"
|
|
391
|
-
"
|
|
392
|
-
"
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
"
|
|
396
|
-
" if(document.hidden) {",
|
|
397
|
-
" hiddenSince = Date.now();",
|
|
398
|
-
" } else if((hiddenSince > 0) && ((Date.now() - hiddenSince) > 30000)) {",
|
|
399
|
-
" hiddenSince = 0;",
|
|
400
|
-
" connectStatusSSE();",
|
|
401
|
-
" var activeTab = document.querySelector('.tab-btn.active');",
|
|
402
|
-
" if(activeTab) {",
|
|
403
|
-
" document.dispatchEvent(new CustomEvent('tabactivated', { detail: { category: activeTab.getAttribute('data-category') } }));",
|
|
59
|
+
" const ctx = { document: document, externals: externals, state: state };",
|
|
60
|
+
" let statusEventSource = null;",
|
|
61
|
+
" function connectStatusSSE() {",
|
|
62
|
+
" if(statusEventSource) { statusEventSource.close(); }",
|
|
63
|
+
" statusEventSource = new EventSource('/streams/status');",
|
|
64
|
+
" state.lastStatusEventTime = Date.now();",
|
|
65
|
+
" function on(event, handler) {",
|
|
66
|
+
" statusEventSource.addEventListener(event, (e) => {",
|
|
67
|
+
" state.lastStatusEventTime = Date.now();",
|
|
68
|
+
" if(handler) { handler(e); }",
|
|
69
|
+
" });",
|
|
404
70
|
" }",
|
|
405
|
-
"
|
|
406
|
-
"
|
|
407
|
-
"
|
|
408
|
-
"
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
"
|
|
412
|
-
"
|
|
413
|
-
"
|
|
414
|
-
"}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
"(
|
|
419
|
-
"
|
|
420
|
-
"
|
|
421
|
-
"
|
|
422
|
-
"
|
|
423
|
-
" document.addEventListener('
|
|
424
|
-
"
|
|
425
|
-
"
|
|
426
|
-
" var label = btn.getAttribute('title') || btn.getAttribute('aria-label');",
|
|
427
|
-
" if(!label) return;",
|
|
428
|
-
" var rect = btn.getBoundingClientRect();",
|
|
429
|
-
" tip.textContent = label;",
|
|
430
|
-
" tip.classList.add('visible');",
|
|
431
|
-
" tip.style.top = (rect.bottom + 6 + (window.scrollY || 0)) + 'px';",
|
|
432
|
-
" tip.style.left = (rect.left + rect.width / 2 + (window.scrollX || 0)) + 'px';",
|
|
433
|
-
" tip.style.transform = 'translateX(-50%)';",
|
|
434
|
-
" }, true);",
|
|
435
|
-
" document.addEventListener('mouseleave', function(e) {",
|
|
436
|
-
" var src = e.target.closest('.btn-icon[aria-label]');",
|
|
437
|
-
" if(!src) return;",
|
|
438
|
-
" var dest = e.relatedTarget && e.relatedTarget.closest && e.relatedTarget.closest('.btn-icon[aria-label]');",
|
|
439
|
-
" if(dest === src) return;",
|
|
440
|
-
" tip.classList.remove('visible');",
|
|
441
|
-
" }, true);",
|
|
442
|
-
"})();",
|
|
443
|
-
"</script>"
|
|
71
|
+
" on('heartbeat');",
|
|
72
|
+
" on('snapshot', (e) => handleSnapshot(JSON.parse(e.data), ctx));",
|
|
73
|
+
" on('streamAdded', (e) => handleStreamAdded(JSON.parse(e.data), ctx));",
|
|
74
|
+
" on('streamRemoved', (e) => handleStreamRemoved(JSON.parse(e.data), ctx));",
|
|
75
|
+
" on('streamHealthChanged', (e) => handleStreamHealthChanged(JSON.parse(e.data), ctx));",
|
|
76
|
+
" on('systemStatusChanged', (e) => handleSystemStatusChanged(JSON.parse(e.data), ctx));",
|
|
77
|
+
" on('healthChanged', (e) => handleHealthChanged(JSON.parse(e.data), ctx));",
|
|
78
|
+
" on('channelUpdate', (e) => handleChannelUpdate(JSON.parse(e.data), ctx));",
|
|
79
|
+
" statusEventSource.onerror = () => handleSseError(ctx);",
|
|
80
|
+
" }",
|
|
81
|
+
" window.toggleStreamPopover = () => toggleStreamPopover(ctx);",
|
|
82
|
+
" window.toggleStreamDetails = (id) => toggleStreamDetails(id, ctx);",
|
|
83
|
+
" window.copyOverviewPlaylistUrl = () => copyOverviewPlaylistUrl(ctx);",
|
|
84
|
+
" connectStatusSSE();",
|
|
85
|
+
" setInterval(() => updateDurations(ctx), 1000);",
|
|
86
|
+
" setInterval(() => {",
|
|
87
|
+
" if((Date.now() - state.lastStatusEventTime) > 45000) { connectStatusSSE(); }",
|
|
88
|
+
" }, 45000);",
|
|
89
|
+
" document.addEventListener('visibilitychange', () => handleVisibilityChange(ctx, connectStatusSSE));",
|
|
90
|
+
" initIPadTooltips(ctx);",
|
|
91
|
+
"})();"
|
|
444
92
|
].join("\n");
|
|
93
|
+
return ["<script>", constantDecls, handlerSources, iife, "</script>"].join("\n");
|
|
445
94
|
}
|
|
446
95
|
//# sourceMappingURL=status.js.map
|