prismcast 1.10.2 → 1.11.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 +6 -3
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +140 -86
- package/dist/app.js.map +1 -1
- package/dist/browser/blockedPage.d.ts +80 -0
- package/dist/browser/blockedPage.d.ts.map +1 -0
- package/dist/browser/blockedPage.js +209 -0
- package/dist/browser/blockedPage.js.map +1 -0
- package/dist/browser/browserSupervisor.d.ts +80 -0
- package/dist/browser/browserSupervisor.d.ts.map +1 -0
- package/dist/browser/browserSupervisor.js +186 -0
- package/dist/browser/browserSupervisor.js.map +1 -0
- package/dist/browser/cdp.d.ts +1 -0
- package/dist/browser/cdp.d.ts.map +1 -0
- package/dist/browser/cdp.js +6 -5
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/channelSelection.d.ts +45 -14
- package/dist/browser/channelSelection.d.ts.map +1 -0
- package/dist/browser/channelSelection.js +81 -18
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/consent.d.ts +152 -0
- package/dist/browser/consent.d.ts.map +1 -0
- package/dist/browser/consent.js +418 -0
- package/dist/browser/consent.js.map +1 -0
- package/dist/browser/display.d.ts +1 -0
- package/dist/browser/display.d.ts.map +1 -0
- package/dist/browser/hlsPlaylistObserver.d.ts +55 -0
- package/dist/browser/hlsPlaylistObserver.d.ts.map +1 -0
- package/dist/browser/hlsPlaylistObserver.js +132 -0
- package/dist/browser/hlsPlaylistObserver.js.map +1 -0
- package/dist/browser/index.d.ts +67 -40
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +508 -300
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/launchGovernor.d.ts +89 -0
- package/dist/browser/launchGovernor.d.ts.map +1 -0
- package/dist/browser/launchGovernor.js +96 -0
- package/dist/browser/launchGovernor.js.map +1 -0
- package/dist/browser/login.d.ts +10 -2
- package/dist/browser/login.d.ts.map +1 -0
- package/dist/browser/login.js +36 -5
- package/dist/browser/login.js.map +1 -1
- package/dist/browser/manifestInterceptor.d.ts +102 -49
- package/dist/browser/manifestInterceptor.d.ts.map +1 -0
- package/dist/browser/manifestInterceptor.js +219 -237
- package/dist/browser/manifestInterceptor.js.map +1 -1
- package/dist/browser/pageStaleness.d.ts +30 -0
- package/dist/browser/pageStaleness.d.ts.map +1 -0
- package/dist/browser/pageStaleness.js +76 -0
- package/dist/browser/pageStaleness.js.map +1 -0
- package/dist/browser/precaching.d.ts +95 -3
- package/dist/browser/precaching.d.ts.map +1 -0
- package/dist/browser/precaching.js +499 -65
- package/dist/browser/precaching.js.map +1 -1
- package/dist/browser/tabNetworkObserver.d.ts +49 -0
- package/dist/browser/tabNetworkObserver.d.ts.map +1 -0
- package/dist/browser/tabNetworkObserver.js +144 -0
- package/dist/browser/tabNetworkObserver.js.map +1 -0
- package/dist/browser/tuning/cache.d.ts +61 -0
- package/dist/browser/tuning/cache.d.ts.map +1 -0
- package/dist/browser/tuning/cache.js +62 -0
- package/dist/browser/tuning/cache.js.map +1 -0
- package/dist/browser/tuning/comcastPolymer.d.ts +3 -2
- package/dist/browser/tuning/comcastPolymer.d.ts.map +1 -0
- package/dist/browser/tuning/comcastPolymer.js +79 -102
- package/dist/browser/tuning/comcastPolymer.js.map +1 -1
- package/dist/browser/tuning/cox.d.ts +1 -0
- package/dist/browser/tuning/cox.d.ts.map +1 -0
- package/dist/browser/tuning/directv.d.ts +1 -0
- package/dist/browser/tuning/directv.d.ts.map +1 -0
- package/dist/browser/tuning/directv.js +52 -46
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +1 -0
- package/dist/browser/tuning/fox.d.ts.map +1 -0
- package/dist/browser/tuning/fox.js +13 -12
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/gridSearch.d.ts +68 -0
- package/dist/browser/tuning/gridSearch.d.ts.map +1 -0
- package/dist/browser/tuning/gridSearch.js +85 -0
- package/dist/browser/tuning/gridSearch.js.map +1 -0
- package/dist/browser/tuning/hbo.d.ts +1 -0
- package/dist/browser/tuning/hbo.d.ts.map +1 -0
- package/dist/browser/tuning/hbo.js +73 -45
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +1 -0
- package/dist/browser/tuning/hulu.d.ts.map +1 -0
- package/dist/browser/tuning/hulu.js +128 -173
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/shared.d.ts +75 -5
- package/dist/browser/tuning/shared.d.ts.map +1 -0
- package/dist/browser/tuning/shared.js +216 -6
- package/dist/browser/tuning/shared.js.map +1 -1
- package/dist/browser/tuning/sling.d.ts +1 -0
- package/dist/browser/tuning/sling.d.ts.map +1 -0
- package/dist/browser/tuning/sling.js +105 -126
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/spectrum.d.ts +1 -0
- package/dist/browser/tuning/spectrum.d.ts.map +1 -0
- package/dist/browser/tuning/spectrum.js +80 -125
- package/dist/browser/tuning/spectrum.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.d.ts +1 -0
- package/dist/browser/tuning/thumbnailRow.d.ts.map +1 -0
- package/dist/browser/tuning/thumbnailRow.js +8 -2
- package/dist/browser/tuning/thumbnailRow.js.map +1 -1
- package/dist/browser/tuning/tileClick.d.ts +1 -0
- package/dist/browser/tuning/tileClick.d.ts.map +1 -0
- package/dist/browser/tuning/tileClick.js +3 -2
- package/dist/browser/tuning/tileClick.js.map +1 -1
- package/dist/browser/tuning/xfinity.d.ts +1 -0
- package/dist/browser/tuning/xfinity.d.ts.map +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts.map +1 -0
- package/dist/browser/tuning/youtubeTv.js +74 -127
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +54 -14
- package/dist/browser/video.d.ts.map +1 -0
- package/dist/browser/video.js +296 -138
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.d.ts +1 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -9
- package/dist/channels/index.js.map +1 -1
- package/dist/config/channelForm.d.ts +15 -1
- package/dist/config/channelForm.d.ts.map +1 -0
- package/dist/config/channelForm.js +28 -12
- package/dist/config/channelForm.js.map +1 -1
- package/dist/config/consistencyProbe.d.ts +1 -0
- package/dist/config/consistencyProbe.d.ts.map +1 -0
- package/dist/config/consistencyProbe.js +27 -21
- package/dist/config/consistencyProbe.js.map +1 -1
- package/dist/config/health.d.ts +41 -8
- package/dist/config/health.d.ts.map +1 -0
- package/dist/config/health.js +189 -38
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.d.ts +55 -3
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +320 -69
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +10 -9
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +11 -11
- package/dist/config/paths.js.map +1 -1
- package/dist/config/persistence.context.d.ts +1 -0
- package/dist/config/persistence.context.d.ts.map +1 -0
- package/dist/config/persistence.d.ts +13 -10
- package/dist/config/persistence.d.ts.map +1 -0
- package/dist/config/persistence.js +40 -21
- package/dist/config/persistence.js.map +1 -1
- package/dist/config/presets.d.ts +1 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/profiles.d.ts +22 -15
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +81 -47
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/providerLineups.d.ts +47 -0
- package/dist/config/providerLineups.d.ts.map +1 -0
- package/dist/config/providerLineups.js +137 -0
- package/dist/config/providerLineups.js.map +1 -0
- package/dist/config/reactivity.d.ts +84 -0
- package/dist/config/reactivity.d.ts.map +1 -0
- package/dist/config/reactivity.js +226 -0
- package/dist/config/reactivity.js.map +1 -0
- package/dist/config/servicePacks.d.ts +18 -2
- package/dist/config/servicePacks.d.ts.map +1 -0
- package/dist/config/servicePacks.js +53 -11
- package/dist/config/servicePacks.js.map +1 -1
- package/dist/config/services.d.ts +21 -15
- package/dist/config/services.d.ts.map +1 -0
- package/dist/config/services.js +35 -24
- package/dist/config/services.js.map +1 -1
- package/dist/config/sites.d.ts +6 -4
- package/dist/config/sites.d.ts.map +1 -0
- package/dist/config/sites.js +15 -11
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +129 -30
- package/dist/config/userChannels.d.ts.map +1 -0
- package/dist/config/userChannels.js +333 -68
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +14 -9
- package/dist/config/userConfig.d.ts.map +1 -0
- package/dist/config/userConfig.js +87 -25
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +10 -6
- package/dist/config/userProfiles.d.ts.map +1 -0
- package/dist/config/userProfiles.js +64 -39
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.d.ts +1 -0
- package/dist/hdhr/channelMap.d.ts.map +1 -0
- package/dist/hdhr/deviceId.d.ts +1 -0
- package/dist/hdhr/deviceId.d.ts.map +1 -0
- package/dist/hdhr/discover.d.ts +1 -0
- package/dist/hdhr/discover.d.ts.map +1 -0
- package/dist/hdhr/discover.js +48 -47
- package/dist/hdhr/discover.js.map +1 -1
- package/dist/hdhr/getHandlers.d.ts +29 -0
- package/dist/hdhr/getHandlers.d.ts.map +1 -0
- package/dist/hdhr/getHandlers.js +196 -0
- package/dist/hdhr/getHandlers.js.map +1 -0
- package/dist/hdhr/identity.d.ts +36 -0
- package/dist/hdhr/identity.d.ts.map +1 -0
- package/dist/hdhr/identity.js +51 -0
- package/dist/hdhr/identity.js.map +1 -0
- package/dist/hdhr/index.d.ts +22 -4
- package/dist/hdhr/index.d.ts.map +1 -0
- package/dist/hdhr/index.js +229 -54
- package/dist/hdhr/index.js.map +1 -1
- package/dist/hdhr/protocol.d.ts +75 -0
- package/dist/hdhr/protocol.d.ts.map +1 -0
- package/dist/hdhr/protocol.js +264 -0
- package/dist/hdhr/protocol.js.map +1 -0
- package/dist/hdhr/tunerState.d.ts +24 -0
- package/dist/hdhr/tunerState.d.ts.map +1 -0
- package/dist/hdhr/tunerState.js +67 -0
- package/dist/hdhr/tunerState.js.map +1 -0
- package/dist/hdhr/udp.d.ts +43 -0
- package/dist/hdhr/udp.d.ts.map +1 -0
- package/dist/hdhr/udp.js +277 -0
- package/dist/hdhr/udp.js.map +1 -0
- package/dist/identity.d.ts +1 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +13 -11
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -12
- package/dist/index.js.map +1 -1
- package/dist/native/codecInference.d.ts +1 -0
- package/dist/native/codecInference.d.ts.map +1 -0
- package/dist/native/codecInference.js +50 -5
- package/dist/native/codecInference.js.map +1 -1
- package/dist/native/decrypt.d.ts +6 -2
- package/dist/native/decrypt.d.ts.map +1 -0
- package/dist/native/decrypt.js +15 -8
- package/dist/native/decrypt.js.map +1 -1
- package/dist/native/index.d.ts +40 -17
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +281 -120
- package/dist/native/index.js.map +1 -1
- package/dist/native/probe.d.ts +114 -18
- package/dist/native/probe.d.ts.map +1 -0
- package/dist/native/probe.js +452 -115
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +57 -5
- package/dist/native/proxy.d.ts.map +1 -0
- package/dist/native/proxy.js +604 -170
- package/dist/native/proxy.js.map +1 -1
- package/dist/native/tokenExpiry.d.ts +1 -0
- package/dist/native/tokenExpiry.d.ts.map +1 -0
- package/dist/native/tokenExpiry.js +1 -1
- package/dist/routes/assets.d.ts +1 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +4 -2
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/auth.d.ts +1 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +0 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/cdp.d.ts +5 -5
- package/dist/routes/cdp.d.ts.map +1 -0
- package/dist/routes/cdp.js +59 -20
- package/dist/routes/cdp.js.map +1 -1
- package/dist/routes/channels.d.ts +1 -0
- package/dist/routes/channels.d.ts.map +1 -0
- package/dist/routes/channels.js +2 -1
- package/dist/routes/channels.js.map +1 -1
- package/dist/routes/clientActions.d.ts +98 -0
- package/dist/routes/clientActions.d.ts.map +1 -0
- package/dist/routes/clientActions.js +113 -0
- package/dist/routes/clientActions.js.map +1 -0
- package/dist/routes/components.d.ts +5 -3
- package/dist/routes/components.d.ts.map +1 -0
- package/dist/routes/components.js +36 -39
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/endpoints/browse.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/browse.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/browse.js +23 -10
- package/dist/routes/config/channels/endpoints/browse.js.map +1 -1
- package/dist/routes/config/channels/endpoints/bulk.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/bulk.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/bulk.js +5 -3
- package/dist/routes/config/channels/endpoints/bulk.js.map +1 -1
- package/dist/routes/config/channels/endpoints/crud.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/crud.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/crud.js +85 -93
- package/dist/routes/config/channels/endpoints/crud.js.map +1 -1
- package/dist/routes/config/channels/endpoints/importExport.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/importExport.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/importExport.js +6 -3
- package/dist/routes/config/channels/endpoints/importExport.js.map +1 -1
- package/dist/routes/config/channels/endpoints/predefined.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/predefined.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.js +2 -1
- package/dist/routes/config/channels/endpoints/prefs.js.map +1 -1
- package/dist/routes/config/channels/endpoints/service.d.ts +2 -1
- package/dist/routes/config/channels/endpoints/service.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/service.js +3 -1
- package/dist/routes/config/channels/endpoints/service.js.map +1 -1
- package/dist/routes/config/channels/endpoints/tags.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/tags.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/tags.js +13 -7
- package/dist/routes/config/channels/endpoints/tags.js.map +1 -1
- package/dist/routes/config/channels/healthBridge.d.ts +24 -0
- package/dist/routes/config/channels/healthBridge.d.ts.map +1 -0
- package/dist/routes/config/channels/healthBridge.js +71 -0
- package/dist/routes/config/channels/healthBridge.js.map +1 -0
- package/dist/routes/config/channels/http/handler.d.ts +1 -0
- package/dist/routes/config/channels/http/handler.d.ts.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.d.ts +2 -1
- package/dist/routes/config/channels/http/playlistHint.d.ts.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.js +16 -2
- package/dist/routes/config/channels/http/playlistHint.js.map +1 -1
- package/dist/routes/config/channels/http/serviceWarning.d.ts +4 -2
- package/dist/routes/config/channels/http/serviceWarning.d.ts.map +1 -0
- package/dist/routes/config/channels/http/serviceWarning.js +3 -2
- package/dist/routes/config/channels/http/serviceWarning.js.map +1 -1
- package/dist/routes/config/channels/index.d.ts +1 -0
- package/dist/routes/config/channels/index.d.ts.map +1 -0
- package/dist/routes/config/channels/setup.d.ts +1 -0
- package/dist/routes/config/channels/setup.d.ts.map +1 -0
- package/dist/routes/config/channels/table.d.ts +3 -3
- package/dist/routes/config/channels/table.d.ts.map +1 -0
- package/dist/routes/config/channels/table.js +148 -107
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/http/envelope.d.ts +1 -0
- package/dist/routes/config/http/envelope.d.ts.map +1 -0
- package/dist/routes/config/index.d.ts +35 -3
- package/dist/routes/config/index.d.ts.map +1 -0
- package/dist/routes/config/index.js +51 -2
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/services.d.ts +5 -4
- package/dist/routes/config/services.d.ts.map +1 -0
- package/dist/routes/config/services.js +57 -43
- package/dist/routes/config/services.js.map +1 -1
- package/dist/routes/config/settings.d.ts +1 -0
- package/dist/routes/config/settings.d.ts.map +1 -0
- package/dist/routes/config/settings.js +98 -49
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.d.ts +1 -0
- package/dist/routes/debug.d.ts.map +1 -0
- package/dist/routes/debug.js +277 -139
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/health.d.ts +39 -1
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +33 -27
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/hls.d.ts +1 -0
- package/dist/routes/hls.d.ts.map +1 -0
- package/dist/routes/icons.d.ts +1 -0
- package/dist/routes/icons.d.ts.map +1 -0
- package/dist/routes/icons.js +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/logs.d.ts +1 -0
- package/dist/routes/logs.d.ts.map +1 -0
- package/dist/routes/logs.js +14 -4
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/mpegts.d.ts +1 -0
- package/dist/routes/mpegts.d.ts.map +1 -0
- package/dist/routes/play.d.ts +1 -0
- package/dist/routes/play.d.ts.map +1 -0
- package/dist/routes/playlist.d.ts +1 -0
- package/dist/routes/playlist.d.ts.map +1 -0
- package/dist/routes/playlist.js +7 -2
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.d.ts +8 -5
- package/dist/routes/root/content.d.ts.map +1 -0
- package/dist/routes/root/content.js +29 -26
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/index.d.ts +2 -1
- package/dist/routes/root/index.d.ts.map +1 -0
- package/dist/routes/root/index.js +26 -21
- package/dist/routes/root/index.js.map +1 -1
- package/dist/routes/root/scripts/channels.d.ts +6 -0
- package/dist/routes/root/scripts/channels.d.ts.map +1 -0
- package/dist/routes/root/scripts/channels.js +197 -118
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/clientEscape.d.ts +22 -0
- package/dist/routes/root/scripts/clientEscape.d.ts.map +1 -0
- package/dist/routes/root/scripts/clientEscape.js +41 -0
- package/dist/routes/root/scripts/clientEscape.js.map +1 -0
- package/dist/routes/root/scripts/clientUrl.d.ts +23 -0
- package/dist/routes/root/scripts/clientUrl.d.ts.map +1 -0
- package/dist/routes/root/scripts/clientUrl.js +44 -0
- package/dist/routes/root/scripts/clientUrl.js.map +1 -0
- package/dist/routes/root/scripts/config.d.ts +6 -0
- package/dist/routes/root/scripts/config.d.ts.map +1 -0
- package/dist/routes/root/scripts/config.js +110 -24
- package/dist/routes/root/scripts/config.js.map +1 -1
- package/dist/routes/root/scripts/index.d.ts +1 -0
- package/dist/routes/root/scripts/index.d.ts.map +1 -0
- package/dist/routes/root/scripts/shared.d.ts +1 -0
- package/dist/routes/root/scripts/shared.d.ts.map +1 -0
- package/dist/routes/root/scripts/shared.js +112 -26
- package/dist/routes/root/scripts/shared.js.map +1 -1
- package/dist/routes/root/scripts/status.d.ts +1 -0
- package/dist/routes/root/scripts/status.d.ts.map +1 -0
- package/dist/routes/root/scripts/status.handlers.d.ts +23 -33
- package/dist/routes/root/scripts/status.handlers.d.ts.map +1 -0
- package/dist/routes/root/scripts/status.handlers.js +46 -92
- package/dist/routes/root/scripts/status.handlers.js.map +1 -1
- package/dist/routes/root/scripts/status.js +21 -8
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.d.ts +1 -0
- package/dist/routes/root/styles.d.ts.map +1 -0
- package/dist/routes/root/styles.js +7 -4
- package/dist/routes/root/styles.js.map +1 -1
- package/dist/routes/services.d.ts +13 -1
- package/dist/routes/services.d.ts.map +1 -0
- package/dist/routes/services.js +81 -68
- package/dist/routes/services.js.map +1 -1
- package/dist/routes/sse.d.ts +1 -0
- package/dist/routes/sse.d.ts.map +1 -0
- package/dist/routes/sse.js +1 -1
- package/dist/routes/sse.js.map +1 -1
- package/dist/routes/streams.d.ts +2 -1
- package/dist/routes/streams.d.ts.map +1 -0
- package/dist/routes/streams.js +6 -4
- package/dist/routes/streams.js.map +1 -1
- package/dist/routes/theme.d.ts +3 -2
- package/dist/routes/theme.d.ts.map +1 -0
- package/dist/routes/theme.js +6 -5
- package/dist/routes/theme.js.map +1 -1
- package/dist/routes/ui.d.ts +3 -1
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +16 -4
- package/dist/routes/ui.js.map +1 -1
- package/dist/routes/upgrade.d.ts +1 -0
- package/dist/routes/upgrade.d.ts.map +1 -0
- package/dist/routes/upgrade.js +6 -2
- package/dist/routes/upgrade.js.map +1 -1
- package/dist/service/commands.context.d.ts +1 -0
- package/dist/service/commands.context.d.ts.map +1 -0
- package/dist/service/commands.context.js +4 -3
- package/dist/service/commands.context.js.map +1 -1
- package/dist/service/commands.d.ts +1 -0
- package/dist/service/commands.d.ts.map +1 -0
- package/dist/service/commands.js +10 -13
- package/dist/service/commands.js.map +1 -1
- package/dist/service/generators.context.d.ts +1 -0
- package/dist/service/generators.context.d.ts.map +1 -0
- package/dist/service/generators.context.js +1 -1
- package/dist/service/generators.context.js.map +1 -1
- package/dist/service/generators.d.ts +4 -3
- package/dist/service/generators.d.ts.map +1 -0
- package/dist/service/generators.js +111 -31
- package/dist/service/generators.js.map +1 -1
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/streaming/captureLock.d.ts +44 -0
- package/dist/streaming/captureLock.d.ts.map +1 -0
- package/dist/streaming/captureLock.js +95 -0
- package/dist/streaming/captureLock.js.map +1 -0
- package/dist/streaming/captureSession.d.ts +31 -0
- package/dist/streaming/captureSession.d.ts.map +1 -0
- package/dist/streaming/captureSession.js +54 -0
- package/dist/streaming/captureSession.js.map +1 -0
- package/dist/streaming/clients.d.ts +1 -0
- package/dist/streaming/clients.d.ts.map +1 -0
- package/dist/streaming/codec.d.ts +1 -0
- package/dist/streaming/codec.d.ts.map +1 -0
- package/dist/streaming/fmp4Segmenter.d.ts +29 -2
- package/dist/streaming/fmp4Segmenter.d.ts.map +1 -0
- package/dist/streaming/fmp4Segmenter.js +79 -26
- package/dist/streaming/fmp4Segmenter.js.map +1 -1
- package/dist/streaming/hls.d.ts +18 -7
- package/dist/streaming/hls.d.ts.map +1 -0
- package/dist/streaming/hls.js +220 -120
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +1 -0
- package/dist/streaming/hlsResume.d.ts.map +1 -0
- package/dist/streaming/hlsResume.js +1 -1
- package/dist/streaming/hlsResume.js.map +1 -1
- package/dist/streaming/hlsSegments.d.ts +59 -2
- package/dist/streaming/hlsSegments.d.ts.map +1 -0
- package/dist/streaming/hlsSegments.js +147 -17
- package/dist/streaming/hlsSegments.js.map +1 -1
- package/dist/streaming/lifecycle.d.ts +4 -1
- package/dist/streaming/lifecycle.d.ts.map +1 -0
- package/dist/streaming/lifecycle.js +65 -85
- package/dist/streaming/lifecycle.js.map +1 -1
- package/dist/streaming/monitor.d.ts +6 -4
- package/dist/streaming/monitor.d.ts.map +1 -0
- package/dist/streaming/monitor.js +343 -145
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mp4Parser.d.ts +5 -4
- package/dist/streaming/mp4Parser.d.ts.map +1 -0
- package/dist/streaming/mp4Parser.js +36 -13
- package/dist/streaming/mp4Parser.js.map +1 -1
- package/dist/streaming/mpegts.d.ts +16 -0
- package/dist/streaming/mpegts.d.ts.map +1 -0
- package/dist/streaming/mpegts.js +61 -17
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/playlistBuilder.d.ts +1 -0
- package/dist/streaming/playlistBuilder.d.ts.map +1 -0
- package/dist/streaming/preroll.d.ts +32 -5
- package/dist/streaming/preroll.d.ts.map +1 -0
- package/dist/streaming/preroll.js +70 -32
- package/dist/streaming/preroll.js.map +1 -1
- package/dist/streaming/pretune.d.ts +26 -1
- package/dist/streaming/pretune.d.ts.map +1 -0
- package/dist/streaming/pretune.js +22 -24
- package/dist/streaming/pretune.js.map +1 -1
- package/dist/streaming/pretuneTimers.d.ts +24 -0
- package/dist/streaming/pretuneTimers.d.ts.map +1 -0
- package/dist/streaming/pretuneTimers.js +56 -0
- package/dist/streaming/pretuneTimers.js.map +1 -0
- package/dist/streaming/recovery.d.ts +139 -5
- package/dist/streaming/recovery.d.ts.map +1 -0
- package/dist/streaming/recovery.js +160 -16
- package/dist/streaming/recovery.js.map +1 -1
- package/dist/streaming/registry.d.ts +27 -9
- package/dist/streaming/registry.d.ts.map +1 -0
- package/dist/streaming/registry.js +21 -3
- package/dist/streaming/registry.js.map +1 -1
- package/dist/streaming/setup.d.ts +157 -29
- package/dist/streaming/setup.d.ts.map +1 -0
- package/dist/streaming/setup.js +1034 -458
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +21 -1
- package/dist/streaming/showInfo.d.ts.map +1 -0
- package/dist/streaming/showInfo.js +31 -16
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +10 -10
- package/dist/streaming/statusEmitter.d.ts.map +1 -0
- package/dist/streaming/statusEmitter.js +5 -8
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +16 -4
- package/dist/types/channels.d.ts.map +1 -0
- package/dist/types/channels.js +4 -2
- package/dist/types/channels.js.map +1 -1
- package/dist/types/config.d.ts +16 -5
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/profiles.d.ts +6 -4
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/selection.d.ts +31 -3
- package/dist/types/selection.d.ts.map +1 -0
- package/dist/types/selection.js +4 -2
- package/dist/types/selection.js.map +1 -1
- package/dist/types/shared.d.ts +1 -0
- package/dist/types/shared.d.ts.map +1 -0
- package/dist/types/streaming.d.ts +8 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/upgrade/commands.context.d.ts +1 -0
- package/dist/upgrade/commands.context.d.ts.map +1 -0
- package/dist/upgrade/commands.context.js +14 -10
- package/dist/upgrade/commands.context.js.map +1 -1
- package/dist/upgrade/commands.d.ts +8 -15
- package/dist/upgrade/commands.d.ts.map +1 -0
- package/dist/upgrade/commands.js +27 -28
- package/dist/upgrade/commands.js.map +1 -1
- package/dist/upgrade/detection.context.d.ts +1 -0
- package/dist/upgrade/detection.context.d.ts.map +1 -0
- package/dist/upgrade/detection.context.js +4 -1
- package/dist/upgrade/detection.context.js.map +1 -1
- package/dist/upgrade/detection.d.ts +9 -7
- package/dist/upgrade/detection.d.ts.map +1 -0
- package/dist/upgrade/detection.js +23 -54
- package/dist/upgrade/detection.js.map +1 -1
- package/dist/upgrade/index.d.ts +2 -0
- package/dist/upgrade/index.d.ts.map +1 -0
- package/dist/upgrade/index.js +1 -0
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/lifecycle.context.d.ts +20 -0
- package/dist/upgrade/lifecycle.context.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.context.js +47 -0
- package/dist/upgrade/lifecycle.context.js.map +1 -0
- package/dist/upgrade/lifecycle.d.ts +72 -0
- package/dist/upgrade/lifecycle.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.js +175 -0
- package/dist/upgrade/lifecycle.js.map +1 -0
- package/dist/upgrade/pathHandle.d.ts +30 -0
- package/dist/upgrade/pathHandle.d.ts.map +1 -0
- package/dist/upgrade/pathHandle.js +102 -0
- package/dist/upgrade/pathHandle.js.map +1 -0
- package/dist/utils/bootSession.context.d.ts +16 -0
- package/dist/utils/bootSession.context.d.ts.map +1 -0
- package/dist/utils/bootSession.context.js +60 -0
- package/dist/utils/bootSession.context.js.map +1 -0
- package/dist/utils/bootSession.d.ts +17 -0
- package/dist/utils/bootSession.d.ts.map +1 -0
- package/dist/utils/bootSession.js +20 -0
- package/dist/utils/bootSession.js.map +1 -0
- package/dist/utils/chromeFetch.d.ts +1 -0
- package/dist/utils/chromeFetch.d.ts.map +1 -0
- package/dist/utils/cliOutput.d.ts +1 -0
- package/dist/utils/cliOutput.d.ts.map +1 -0
- package/dist/utils/clock.d.ts +5 -4
- package/dist/utils/clock.d.ts.map +1 -0
- package/dist/utils/clock.js +19 -16
- package/dist/utils/clock.js.map +1 -1
- package/dist/utils/debugFilter.d.ts +9 -1
- package/dist/utils/debugFilter.d.ts.map +1 -0
- package/dist/utils/debugFilter.js +60 -33
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/delay.d.ts +48 -15
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +73 -20
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +45 -4
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/evaluate.d.ts +1 -0
- package/dist/utils/evaluate.d.ts.map +1 -0
- package/dist/utils/evaluate.js +29 -23
- package/dist/utils/evaluate.js.map +1 -1
- package/dist/utils/ffmpeg.context.d.ts +1 -0
- package/dist/utils/ffmpeg.context.d.ts.map +1 -0
- package/dist/utils/ffmpeg.context.js.map +1 -1
- package/dist/utils/ffmpeg.d.ts +29 -7
- package/dist/utils/ffmpeg.d.ts.map +1 -0
- package/dist/utils/ffmpeg.js +32 -14
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/fileLogger.d.ts +3 -1
- package/dist/utils/fileLogger.d.ts.map +1 -0
- package/dist/utils/fileLogger.js +64 -29
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +14 -1
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +19 -5
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logEmitter.d.ts +1 -0
- package/dist/utils/logEmitter.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/m3u.d.ts +3 -2
- package/dist/utils/m3u.d.ts.map +1 -0
- package/dist/utils/m3u.js +4 -3
- package/dist/utils/m3u.js.map +1 -1
- package/dist/utils/markup.d.ts +13 -1
- package/dist/utils/markup.d.ts.map +1 -0
- package/dist/utils/markup.js +28 -4
- package/dist/utils/markup.js.map +1 -1
- package/dist/utils/memo.d.ts +3 -2
- package/dist/utils/memo.d.ts.map +1 -0
- package/dist/utils/memo.js +3 -3
- package/dist/utils/morganStream.d.ts +1 -0
- package/dist/utils/morganStream.d.ts.map +1 -0
- package/dist/utils/network.d.ts +1 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +2 -2
- package/dist/utils/pid.d.ts +3 -25
- package/dist/utils/pid.d.ts.map +1 -0
- package/dist/utils/pid.js +10 -49
- package/dist/utils/pid.js.map +1 -1
- package/dist/utils/platform.d.ts +3 -1
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +2 -1
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/processInspector.context.d.ts +8 -0
- package/dist/utils/processInspector.context.d.ts.map +1 -0
- package/dist/utils/processInspector.context.js +106 -0
- package/dist/utils/processInspector.context.js.map +1 -0
- package/dist/utils/processInspector.d.ts +55 -0
- package/dist/utils/processInspector.d.ts.map +1 -0
- package/dist/utils/processInspector.js +127 -0
- package/dist/utils/processInspector.js.map +1 -0
- package/dist/utils/retry.d.ts +25 -2
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +33 -6
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/runtimeIdentity.context.d.ts +7 -0
- package/dist/utils/runtimeIdentity.context.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.context.js +43 -0
- package/dist/utils/runtimeIdentity.context.js.map +1 -0
- package/dist/utils/runtimeIdentity.d.ts +98 -0
- package/dist/utils/runtimeIdentity.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.js +181 -0
- package/dist/utils/runtimeIdentity.js.map +1 -0
- package/dist/utils/sanitize.d.ts +1 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/streamContext.d.ts +2 -1
- package/dist/utils/streamContext.d.ts.map +1 -0
- package/dist/utils/streamContext.js +1 -1
- package/dist/utils/timing.d.ts +2 -1
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +0 -5
- package/dist/utils/timing.js.map +1 -1
- package/dist/utils/version.d.ts +1 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +47 -13
- package/dist/utils/version.js.map +1 -1
- package/package.json +26 -20
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
*
|
|
3
3
|
* pretune.ts: Predictive channel pretuning from Channels DVR schedule.
|
|
4
4
|
*/
|
|
5
|
-
import { LOG,
|
|
5
|
+
import { LOG, formatError } from "../utils/index.js";
|
|
6
|
+
import { clearAllPretuneSafetyTimers, forgetPretuneSafetyTimer, setPretuneSafetyTimer } from "./pretuneTimers.js";
|
|
6
7
|
import { fetchFromDvr, getDeviceMappings, getDvrHost } from "./showInfo.js";
|
|
7
8
|
import { getChannelStreamId, terminateStream } from "./lifecycle.js";
|
|
8
9
|
import { initializeStream, validateChannel } from "./hls.js";
|
|
9
10
|
import { emitCurrentSystemStatus } from "../browser/index.js";
|
|
10
11
|
import { getStream } from "./registry.js";
|
|
12
|
+
import { realClock } from "../utils/clock.js";
|
|
11
13
|
/* This module polls the Channels DVR schedule API to discover upcoming recordings and pretunes channels 30 seconds before they start. When the DVR requests the
|
|
12
14
|
* stream, it's already live with buffered segments - achieving near-instant tuning instead of 3-7 second cold starts.
|
|
13
15
|
*
|
|
14
16
|
* The polling loop runs every 60 seconds, checking for jobs starting within a 5-minute scheduling horizon. For each eligible job (PrismCast channel as the DVR's
|
|
15
|
-
* preferred source), a precise setTimeout is scheduled for 30 seconds before the recording start time. When the timer fires, the module
|
|
16
|
-
*
|
|
17
|
+
* preferred source), a precise setTimeout is scheduled for 30 seconds before the recording start time. When the timer fires, the module checks for conflicts,
|
|
18
|
+
* validates the channel, and calls initializeStream() with the preTuned flag. A safety timeout tears down unclaimed streams 90 seconds after the scheduled start.
|
|
17
19
|
*
|
|
18
20
|
* Key design decisions:
|
|
19
21
|
* - Only pretune when a PrismCast guide number is the FIRST entry in the job's channels array (DVR's preferred source).
|
|
@@ -35,27 +37,26 @@ const SAFETY_TIMEOUT_MS = 90000;
|
|
|
35
37
|
const MAX_RETRIES = 5;
|
|
36
38
|
// Delay between retry attempts (5 seconds).
|
|
37
39
|
const RETRY_DELAY_MS = 5000;
|
|
40
|
+
const defaultPretuneDeps = { clock: realClock, fetchFromDvr, getDeviceMappings, getDvrHost, initializeStream };
|
|
38
41
|
// State.
|
|
39
42
|
// Interval handle for periodic job polling.
|
|
40
43
|
let pollInterval = null;
|
|
41
44
|
// Active pretune timers keyed by job ID. Used to avoid duplicate scheduling and to clear timers when jobs disappear.
|
|
42
45
|
const activeTimers = new Map();
|
|
43
|
-
// Safety timers keyed by stream ID. Used to tear down unclaimed pretuned streams after the scheduled start time.
|
|
44
|
-
const safetyTimers = new Map();
|
|
45
46
|
// Public API.
|
|
46
47
|
/**
|
|
47
48
|
* Starts the pretune polling loop. Should be called on server startup after show info polling is initialized.
|
|
48
49
|
*/
|
|
49
|
-
export function startPretunePolling() {
|
|
50
|
+
export function startPretunePolling(deps = defaultPretuneDeps) {
|
|
50
51
|
if (pollInterval) {
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
54
|
// Run the first poll after a short delay to allow the persisted DVR host to load.
|
|
54
55
|
setTimeout(() => {
|
|
55
|
-
void pollForUpcomingJobs();
|
|
56
|
+
void pollForUpcomingJobs(deps);
|
|
56
57
|
}, 5000);
|
|
57
58
|
pollInterval = setInterval(() => {
|
|
58
|
-
void pollForUpcomingJobs();
|
|
59
|
+
void pollForUpcomingJobs(deps);
|
|
59
60
|
}, POLL_INTERVAL_MS);
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
@@ -71,22 +72,19 @@ export function stopPretunePolling() {
|
|
|
71
72
|
clearTimeout(timer);
|
|
72
73
|
}
|
|
73
74
|
activeTimers.clear();
|
|
74
|
-
// Clear all safety timers.
|
|
75
|
-
|
|
76
|
-
clearTimeout(timer);
|
|
77
|
-
}
|
|
78
|
-
safetyTimers.clear();
|
|
75
|
+
// Clear all safety timers via their owning registry.
|
|
76
|
+
clearAllPretuneSafetyTimers();
|
|
79
77
|
}
|
|
80
78
|
// Internal Functions.
|
|
81
79
|
/**
|
|
82
80
|
* Polls the Channels DVR API for upcoming scheduled recordings and schedules pretune timers for eligible jobs.
|
|
83
81
|
*/
|
|
84
|
-
async function pollForUpcomingJobs() {
|
|
85
|
-
const host = getDvrHost();
|
|
82
|
+
async function pollForUpcomingJobs(deps) {
|
|
83
|
+
const host = deps.getDvrHost();
|
|
86
84
|
if (!host) {
|
|
87
85
|
return;
|
|
88
86
|
}
|
|
89
|
-
const jobs = await fetchFromDvr(host, "/api/v1/jobs");
|
|
87
|
+
const jobs = await deps.fetchFromDvr(host, "/api/v1/jobs");
|
|
90
88
|
if (jobs.length === 0) {
|
|
91
89
|
return;
|
|
92
90
|
}
|
|
@@ -95,7 +93,7 @@ async function pollForUpcomingJobs() {
|
|
|
95
93
|
// Track which job IDs we see this poll cycle so we can clear timers for removed jobs.
|
|
96
94
|
const seenJobIds = new Set();
|
|
97
95
|
// Get the device mappings once for resolving guide numbers. The cache ensures this is fast on repeated calls.
|
|
98
|
-
const mappings = await getDeviceMappings(host);
|
|
96
|
+
const mappings = await deps.getDeviceMappings(host);
|
|
99
97
|
if (mappings.size === 0) {
|
|
100
98
|
return;
|
|
101
99
|
}
|
|
@@ -129,7 +127,7 @@ async function pollForUpcomingJobs() {
|
|
|
129
127
|
LOG.debug("streaming:pretune", "Scheduling pretune for '%s' (%s) in %ds.", job.name, channelId, Math.round(effectiveDelay / 1000));
|
|
130
128
|
const timer = setTimeout(() => {
|
|
131
129
|
activeTimers.delete(job.id);
|
|
132
|
-
void pretuneChannel(channelId, job.name, startMs);
|
|
130
|
+
void pretuneChannel(channelId, job.name, startMs, deps);
|
|
133
131
|
}, effectiveDelay);
|
|
134
132
|
activeTimers.set(job.id, timer);
|
|
135
133
|
}
|
|
@@ -158,13 +156,13 @@ function resolveGuideNumber(mappings, guideNumber) {
|
|
|
158
156
|
return undefined;
|
|
159
157
|
}
|
|
160
158
|
/**
|
|
161
|
-
* Pretunes a channel ahead of a scheduled recording.
|
|
159
|
+
* Pretunes a channel ahead of a scheduled recording. Checks for conflicts, validates the channel, initializes the stream with the preTuned flag, and sets up a
|
|
162
160
|
* safety timeout for unclaimed streams. Retries on failure up to MAX_RETRIES times within the pretune window.
|
|
163
161
|
* @param channelId - The PrismCast channel key (e.g., "cnn").
|
|
164
162
|
* @param jobName - The program title for logging (e.g., "Anderson Cooper 360").
|
|
165
163
|
* @param startTimeMs - The recording start time in milliseconds.
|
|
166
164
|
*/
|
|
167
|
-
async function pretuneChannel(channelId, jobName, startTimeMs) {
|
|
165
|
+
async function pretuneChannel(channelId, jobName, startTimeMs, deps) {
|
|
168
166
|
// Check if the channel is already streaming.
|
|
169
167
|
const existingStreamId = getChannelStreamId(channelId);
|
|
170
168
|
if (existingStreamId !== undefined) {
|
|
@@ -182,7 +180,7 @@ async function pretuneChannel(channelId, jobName, startTimeMs) {
|
|
|
182
180
|
attempts++;
|
|
183
181
|
try {
|
|
184
182
|
// eslint-disable-next-line no-await-in-loop
|
|
185
|
-
const streamId = await initializeStream({
|
|
183
|
+
const streamId = await deps.initializeStream({
|
|
186
184
|
channel: validation.channel,
|
|
187
185
|
channelName: channelId,
|
|
188
186
|
clientAddress: null,
|
|
@@ -195,7 +193,7 @@ async function pretuneChannel(channelId, jobName, startTimeMs) {
|
|
|
195
193
|
// Set a safety timeout to tear down the stream if no real client connects within 90 seconds of the scheduled start.
|
|
196
194
|
const safetyDelay = Math.max(0, (startTimeMs + SAFETY_TIMEOUT_MS) - Date.now());
|
|
197
195
|
const safetyTimer = setTimeout(() => {
|
|
198
|
-
|
|
196
|
+
forgetPretuneSafetyTimer(streamId);
|
|
199
197
|
const stream = getStream(streamId);
|
|
200
198
|
if (stream?.preTuned) {
|
|
201
199
|
LOG.info("No client connected for pretuned %s. Ending stream.", displayName);
|
|
@@ -203,7 +201,7 @@ async function pretuneChannel(channelId, jobName, startTimeMs) {
|
|
|
203
201
|
void emitCurrentSystemStatus();
|
|
204
202
|
}
|
|
205
203
|
}, safetyDelay);
|
|
206
|
-
|
|
204
|
+
setPretuneSafetyTimer(streamId, safetyTimer);
|
|
207
205
|
return;
|
|
208
206
|
}
|
|
209
207
|
}
|
|
@@ -218,7 +216,7 @@ async function pretuneChannel(channelId, jobName, startTimeMs) {
|
|
|
218
216
|
// Brief delay before retry.
|
|
219
217
|
if (attempts < MAX_RETRIES) {
|
|
220
218
|
// eslint-disable-next-line no-await-in-loop
|
|
221
|
-
await
|
|
219
|
+
await deps.clock.sleep(RETRY_DELAY_MS);
|
|
222
220
|
}
|
|
223
221
|
}
|
|
224
222
|
LOG.warn("All %d pretune attempts failed for %s.", MAX_RETRIES, displayName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pretune.js","sourceRoot":"","sources":["../../src/streaming/pretune.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"pretune.js","sourceRoot":"","sources":["../../src/streaming/pretune.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records the pending safety timer for a pretuned stream, replacing any existing entry for that stream ID. Called by pretune.ts when it schedules the reaper.
|
|
3
|
+
* @param streamId - The numeric stream ID the timer guards.
|
|
4
|
+
* @param timer - The timer handle to track.
|
|
5
|
+
*/
|
|
6
|
+
export declare function setPretuneSafetyTimer(streamId: number, timer: ReturnType<typeof setTimeout>): void;
|
|
7
|
+
/**
|
|
8
|
+
* Forgets a safety timer entry without cancelling it. Called from inside the timer's own callback after it has fired, where clearing the (already-elapsed) timer
|
|
9
|
+
* would be redundant; we only need to drop the bookkeeping entry.
|
|
10
|
+
* @param streamId - The numeric stream ID whose entry to drop.
|
|
11
|
+
*/
|
|
12
|
+
export declare function forgetPretuneSafetyTimer(streamId: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Cancels and forgets the pending safety timer for a pretuned stream. Called by terminateStream() when a pretuned stream is claimed and torn down through the normal
|
|
15
|
+
* lifecycle, so the safety timeout - which exists only to reap streams that were never claimed - does not linger in the Map until it fires harmlessly against an
|
|
16
|
+
* already-gone stream. Safe to call for any stream ID; streams without a pending safety timer are a no-op.
|
|
17
|
+
* @param streamId - The numeric stream ID whose safety timer to clear.
|
|
18
|
+
*/
|
|
19
|
+
export declare function clearPretuneSafetyTimer(streamId: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* Cancels and forgets every pending safety timer. Called by stopPretunePolling() on server shutdown so no reaper survives the polling loop.
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearAllPretuneSafetyTimers(): void;
|
|
24
|
+
//# sourceMappingURL=pretuneTimers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretuneTimers.d.ts","sourceRoot":"","sources":["../../src/streaming/pretuneTimers.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAQlG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS9D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* pretuneTimers.ts: Ownership of the pretune safety-timer registry.
|
|
4
|
+
*
|
|
5
|
+
* A pretuned stream is started ahead of its scheduled time and reaped by a per-stream safety timer if no real client ever claims it. That timer must be cancelled
|
|
6
|
+
* when the stream IS claimed and terminated through the normal lifecycle, so terminateStream() (lifecycle.ts) needs to clear it. This registry lives in its own
|
|
7
|
+
* leaf module - importing nothing from the streaming graph - so lifecycle.ts can clear a timer without importing pretune.ts. pretune.ts imports lifecycle.ts (for
|
|
8
|
+
* terminateStream) and hls.ts (for initializeStream/validateChannel), so a direct lifecycle->pretune edge would close a hls -> lifecycle -> pretune -> hls import
|
|
9
|
+
* cycle. Keeping the timer state here is the single source of truth for the registry and keeps the dependency edges acyclic.
|
|
10
|
+
*/
|
|
11
|
+
// Safety timers keyed by stream ID. Used to tear down unclaimed pretuned streams after the scheduled start time. Owned here so both the producer (pretune.ts, which
|
|
12
|
+
// schedules them) and the consumer (lifecycle.ts, which clears them on normal termination) reference one registry without a cyclic import.
|
|
13
|
+
const safetyTimers = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Records the pending safety timer for a pretuned stream, replacing any existing entry for that stream ID. Called by pretune.ts when it schedules the reaper.
|
|
16
|
+
* @param streamId - The numeric stream ID the timer guards.
|
|
17
|
+
* @param timer - The timer handle to track.
|
|
18
|
+
*/
|
|
19
|
+
export function setPretuneSafetyTimer(streamId, timer) {
|
|
20
|
+
// Cancel any prior reaper for this stream before tracking the new one, so the registry holds at most one live timer per stream and an overwritten handle can never
|
|
21
|
+
// survive to fire against the same stream later. In practice a stream is pretuned once, so this is a no-op; it keeps the registry holding at most one live timer
|
|
22
|
+
// per stream even if a stream is ever re-registered.
|
|
23
|
+
clearPretuneSafetyTimer(streamId);
|
|
24
|
+
safetyTimers.set(streamId, timer);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Forgets a safety timer entry without cancelling it. Called from inside the timer's own callback after it has fired, where clearing the (already-elapsed) timer
|
|
28
|
+
* would be redundant; we only need to drop the bookkeeping entry.
|
|
29
|
+
* @param streamId - The numeric stream ID whose entry to drop.
|
|
30
|
+
*/
|
|
31
|
+
export function forgetPretuneSafetyTimer(streamId) {
|
|
32
|
+
safetyTimers.delete(streamId);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Cancels and forgets the pending safety timer for a pretuned stream. Called by terminateStream() when a pretuned stream is claimed and torn down through the normal
|
|
36
|
+
* lifecycle, so the safety timeout - which exists only to reap streams that were never claimed - does not linger in the Map until it fires harmlessly against an
|
|
37
|
+
* already-gone stream. Safe to call for any stream ID; streams without a pending safety timer are a no-op.
|
|
38
|
+
* @param streamId - The numeric stream ID whose safety timer to clear.
|
|
39
|
+
*/
|
|
40
|
+
export function clearPretuneSafetyTimer(streamId) {
|
|
41
|
+
const timer = safetyTimers.get(streamId);
|
|
42
|
+
if (timer) {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
safetyTimers.delete(streamId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Cancels and forgets every pending safety timer. Called by stopPretunePolling() on server shutdown so no reaper survives the polling loop.
|
|
49
|
+
*/
|
|
50
|
+
export function clearAllPretuneSafetyTimers() {
|
|
51
|
+
for (const timer of safetyTimers.values()) {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
safetyTimers.clear();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=pretuneTimers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretuneTimers.js","sourceRoot":"","sources":["../../src/streaming/pretuneTimers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oKAAoK;AACpK,2IAA2I;AAC3I,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,KAAoC;IAE1F,mKAAmK;IACnK,iKAAiK;IACjK,qDAAqD;IACrD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAElC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IAEvD,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IAEtD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAG,KAAK,EAAE,CAAC;QAET,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IAEzC,KAAI,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;QAEzC,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Frame, Page } from "puppeteer-core";
|
|
2
2
|
import type { Nullable, VideoState } from "../types/index.ts";
|
|
3
|
+
import type { StreamHealthStatus } from "./statusEmitter.ts";
|
|
3
4
|
/**
|
|
4
5
|
* Recovery metrics tracked throughout the stream's lifetime. Returned when the monitor stops for inclusion in termination logs.
|
|
5
6
|
*/
|
|
@@ -16,6 +17,18 @@ export interface RecoveryMetrics {
|
|
|
16
17
|
tabReplacementSuccesses: number;
|
|
17
18
|
totalRecoveryTimeMs: number;
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Handle returned by monitorPlaybackHealth. The playback monitor is a self-contained resource node: it owns a polling interval and exposes its accumulated recovery
|
|
22
|
+
* metrics for reading, separately from stopping. The metrics counters are live throughout the monitor's lifetime and remain valid after disposal (the interval is
|
|
23
|
+
* cleared but the counter object is retained), so the termination prologue reads getMetrics() while the stream is still live, then dispose() stops the interval -
|
|
24
|
+
* the same read-then-dispose shape as the capture session's segmenter stats and the native proxy's getStats(). Implements both dispose() (project convention) and
|
|
25
|
+
* TC39 Symbol.dispose so the monitor composes uniformly with the other capture-mode resources.
|
|
26
|
+
*/
|
|
27
|
+
export interface MonitorHandle extends Disposable {
|
|
28
|
+
readonly dispose: () => void;
|
|
29
|
+
readonly getMetrics: () => RecoveryMetrics;
|
|
30
|
+
readonly [Symbol.dispose]: () => void;
|
|
31
|
+
}
|
|
19
32
|
export declare const RECOVERY_METHODS: {
|
|
20
33
|
readonly pageNavigation: "page navigation";
|
|
21
34
|
readonly playUnmute: "play/unmute";
|
|
@@ -78,13 +91,51 @@ export declare function recordRecoverySuccess(metrics: RecoveryMetrics, method:
|
|
|
78
91
|
*/
|
|
79
92
|
export declare function formatRecoveryMetricsSummary(metrics: RecoveryMetrics): string;
|
|
80
93
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
94
|
+
* State for failure accrual within a sliding time window. This is the single failure-counting primitive in PrismCast: the per-stream circuit breaker below and the
|
|
95
|
+
* browser relaunch governor (browser/launchGovernor.ts) both judge "have there been too many failures recently?" through it, differing only in the policy bounds they
|
|
96
|
+
* pass and what they do when the window trips. The state is a plain record the caller owns and persists across calls; the bounds are supplied per call so one primitive
|
|
97
|
+
* serves consumers with different tolerances without hard-coding any single config value.
|
|
83
98
|
*/
|
|
84
|
-
export interface
|
|
99
|
+
export interface FailureWindowState {
|
|
85
100
|
firstFailureTime: Nullable<number>;
|
|
86
101
|
totalFailureCount: number;
|
|
87
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Policy bounds for a failure window: how long the window lasts and how many failures within it constitute a trip.
|
|
105
|
+
*/
|
|
106
|
+
export interface FailureWindowOptions {
|
|
107
|
+
readonly threshold: number;
|
|
108
|
+
readonly windowMs: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Result of recording one failure against a window.
|
|
112
|
+
*/
|
|
113
|
+
export interface FailureWindowResult {
|
|
114
|
+
readonly totalCount: number;
|
|
115
|
+
readonly tripped: boolean;
|
|
116
|
+
readonly withinWindow: boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Records a failure against a sliding window and reports whether the window has tripped. Deterministic over (state, now, options): given the same inputs it always
|
|
120
|
+
* mutates the supplied state the same way and returns the same decision plus diagnostics, with no reliance on the wall clock or any module-level state. When a
|
|
121
|
+
* failure arrives after the window has lapsed, the window restarts from it (count resets to 1) so accrual reflects only the recent window. This is the single
|
|
122
|
+
* source of truth for failure accrual; consumers differ only in the bounds they pass and what a trip means to them.
|
|
123
|
+
* @param state - The failure-window state to update.
|
|
124
|
+
* @param now - The current timestamp in milliseconds.
|
|
125
|
+
* @param options - The window duration and trip threshold.
|
|
126
|
+
* @returns The trip decision and diagnostics.
|
|
127
|
+
*/
|
|
128
|
+
export declare function recordFailure(state: FailureWindowState, now: number, options: FailureWindowOptions): FailureWindowResult;
|
|
129
|
+
/**
|
|
130
|
+
* Resets a failure window to its empty state. Called when sustained health is achieved (the stream recovered; the browser is durably ready).
|
|
131
|
+
* @param state - The failure-window state to reset.
|
|
132
|
+
*/
|
|
133
|
+
export declare function resetFailureWindow(state: FailureWindowState): void;
|
|
134
|
+
/**
|
|
135
|
+
* The per-stream circuit breaker's state is a failure window. The alias keeps the breaker's vocabulary at its call sites while there is exactly one underlying state
|
|
136
|
+
* type and one accrual implementation.
|
|
137
|
+
*/
|
|
138
|
+
export type CircuitBreakerState = FailureWindowState;
|
|
88
139
|
/**
|
|
89
140
|
* Result from checking circuit breaker state.
|
|
90
141
|
*/
|
|
@@ -94,8 +145,9 @@ export interface CircuitBreakerResult {
|
|
|
94
145
|
withinWindow: boolean;
|
|
95
146
|
}
|
|
96
147
|
/**
|
|
97
|
-
* Records a failure and checks whether the circuit breaker should trip. This is the single entry point for circuit breaker decisions across every
|
|
98
|
-
* path - any code that wants to count a failure goes through this function.
|
|
148
|
+
* Records a failure and checks whether the per-stream circuit breaker should trip. This is the single entry point for circuit breaker decisions across every
|
|
149
|
+
* recovery path - any code that wants to count a stream failure goes through this function. It is the stream-scoped policy binding of recordFailure: the window and
|
|
150
|
+
* threshold come from CONFIG.recovery, and a trip means "terminate the stream."
|
|
99
151
|
* @param state - The circuit breaker state to update.
|
|
100
152
|
* @param now - The current timestamp.
|
|
101
153
|
* @returns Result indicating whether the circuit breaker should trip and diagnostic info.
|
|
@@ -135,3 +187,85 @@ export declare function formatIssueType(state: VideoState, isStalled: boolean, i
|
|
|
135
187
|
* @returns The issue category for recovery path selection.
|
|
136
188
|
*/
|
|
137
189
|
export declare function getIssueCategory(state: VideoState, isStalled: boolean, isBuffering: boolean): "paused" | "buffering" | "other";
|
|
190
|
+
/**
|
|
191
|
+
* Classifies whether an error originates in Chrome's capture infrastructure (the extension, the capture lock, or stream initialization) rather than in a specific
|
|
192
|
+
* site or stream. This is the single source of truth for that judgment: the stream-setup path uses it to decide a 503 back-off, and the browser supervisor uses it
|
|
193
|
+
* to decide whether a setup failure is evidence the browser may no longer be capture-ready. It is layered with, not exclusive of, the narrower isStaleCaptureMutexError
|
|
194
|
+
* predicate (utils/errors.ts), which matches only the stale-mutex string: a stale-mutex error is also a capture-infrastructure error (so this matches it too), but the
|
|
195
|
+
* process-exit decision that the stale-mutex case alone warrants stays a distinct check at that predicate's own call sites.
|
|
196
|
+
* @param error - The error or message to classify.
|
|
197
|
+
* @returns True when the message carries a capture-infrastructure signature.
|
|
198
|
+
*/
|
|
199
|
+
export declare function isCaptureInfrastructureError(error: unknown): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* Derives the reported health status for a capture stream from its recovery and playback state. This is the single source of truth for the health precedence
|
|
202
|
+
* ladder the monitor emits over SSE: an error state - or a page-reload-level escalation (>= 3), which is equally severe - reports "error"; an active escalation
|
|
203
|
+
* (levels 1-2) reports "recovering"; buffering within the grace window reports "buffering"; consecutive stalls that have not yet crossed the recovery trigger
|
|
204
|
+
* report "stalled"; otherwise "healthy". Deterministic and side-effect free over its inputs, so the precedence lives in exactly one place and is directly testable.
|
|
205
|
+
* @param inputs - The recovery escalation level, error flag, buffering flag, and consecutive stall count read from the monitor's state.
|
|
206
|
+
* @returns The stream health status to report.
|
|
207
|
+
*/
|
|
208
|
+
export declare function deriveStreamHealth(inputs: {
|
|
209
|
+
escalationLevel: number;
|
|
210
|
+
hasError: boolean;
|
|
211
|
+
isBuffering: boolean;
|
|
212
|
+
stallCount: number;
|
|
213
|
+
}): StreamHealthStatus;
|
|
214
|
+
/**
|
|
215
|
+
* Decides whether the monitor should trigger a recovery action this tick. This is the single source of truth for the recovery-trigger condition: recovery never
|
|
216
|
+
* fires inside the post-recovery grace window; otherwise it fires on an error, an ended stream, a persistent pause (paused past the stall-count hysteresis while
|
|
217
|
+
* outside the buffering grace window), a persistent stall (not progressing past the same hysteresis while outside the buffering grace window), or a stalled
|
|
218
|
+
* capture pipeline. The buffering grace window filters transient rebuffer pauses so they do not escalate. Deterministic and side-effect free over its inputs.
|
|
219
|
+
* @param inputs - The grace-window flags, playback state flags, pause/stall counts, the stall-count threshold, and the production-stalled flag from the monitor.
|
|
220
|
+
* @returns True when a recovery action is warranted.
|
|
221
|
+
*/
|
|
222
|
+
export declare function shouldTriggerRecovery(inputs: {
|
|
223
|
+
hasEnded: boolean;
|
|
224
|
+
hasError: boolean;
|
|
225
|
+
isPaused: boolean;
|
|
226
|
+
isProgressing: boolean;
|
|
227
|
+
pauseCount: number;
|
|
228
|
+
productionStalled: boolean;
|
|
229
|
+
stallCount: number;
|
|
230
|
+
stallCountThreshold: number;
|
|
231
|
+
withinBufferingGrace: boolean;
|
|
232
|
+
withinRecoveryGrace: boolean;
|
|
233
|
+
}): boolean;
|
|
234
|
+
/**
|
|
235
|
+
* Computes the recovery escalation level to enter for a fresh recovery episode. This is the single source of truth for the issue-aware escalation ladder: a
|
|
236
|
+
* paused stream from a clean slate tries L1 (play/unmute) first, since it resolves paused playback roughly half the time; a first attempt for a buffering or
|
|
237
|
+
* other issue - or a pause that L1 did not fix - escalates to L2 (source reload); and once a source reload has already been attempted, it escalates to L3 (page
|
|
238
|
+
* navigation). The distinct L3-to-L2 fallback under a navigation rate limit is a separate concern owned by the recovery executor, not this ladder.
|
|
239
|
+
* @param inputs - The current escalation level, the classified issue category, and whether a source reload has already been attempted this episode.
|
|
240
|
+
* @returns The escalation level (1, 2, or 3) to enter.
|
|
241
|
+
*/
|
|
242
|
+
export declare function computeNextRecoveryLevel(inputs: {
|
|
243
|
+
currentEscalationLevel: number;
|
|
244
|
+
issueCategory: "buffering" | "other" | "paused";
|
|
245
|
+
sourceReloadAttempted: boolean;
|
|
246
|
+
}): number;
|
|
247
|
+
/**
|
|
248
|
+
* The health classification and recovery escalation warranted by a native stream's segment-delivery metrics.
|
|
249
|
+
*/
|
|
250
|
+
export interface NativeSegmentHealthDecision {
|
|
251
|
+
readonly action: "l2" | "l3" | "none";
|
|
252
|
+
readonly health: StreamHealthStatus;
|
|
253
|
+
readonly issueType: Nullable<string>;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Classifies a native (proxied HLS) stream's health from its segment-delivery metrics and decides the recovery escalation, if any. This is the single source of
|
|
257
|
+
* truth for the native staleness ladder: active fetch errors report "recovering" without escalating from here (the proxy retries internally); otherwise, once at
|
|
258
|
+
* least one segment has been produced, staleness beyond 2x the target duration reports "stalled", with escalation to an L2 page reload at 4x on the first attempt
|
|
259
|
+
* and, once that reload has not resolved the stall, an L3 capture fallback. Below the staleness threshold the stream is healthy. Pure and total; the
|
|
260
|
+
* caller owns the segment-advance bookkeeping, issue-timestamp recording, logging, and firing of the returned action.
|
|
261
|
+
* @param inputs - Consecutive fetch errors, the last-segment timestamp, prior recovery attempts, staleness in milliseconds, and the target duration in milliseconds.
|
|
262
|
+
* @returns The health status, the warranted escalation action, and the issue label to record.
|
|
263
|
+
*/
|
|
264
|
+
export declare function classifyNativeSegmentHealth(inputs: {
|
|
265
|
+
consecutiveErrors: number;
|
|
266
|
+
lastSegmentTime: number;
|
|
267
|
+
recoveryAttempts: number;
|
|
268
|
+
stalenessMs: number;
|
|
269
|
+
targetDurationMs: number;
|
|
270
|
+
}): NativeSegmentHealthDecision;
|
|
271
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/streaming/recovery.ts"],"names":[],"mappings":"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"}
|