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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAChH,mCAAmC,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,2EAA2E;AAC3E,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAErH;;;;;;;;;;;;;;;;;GAiBG;AAEH
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { DiscoveredChannel, Nullable } from "../types/index.ts";
|
|
2
|
+
/**
|
|
3
|
+
* One channel of a persisted provider lineup. The identity half is derived from DiscoveredChannel rather than re-declared, so the persisted shape cannot drift
|
|
4
|
+
* from the shape discovery produces. The watch URL is the durable tuning half: present for providers whose direct-tune address survives a browser session,
|
|
5
|
+
* absent for the in-page-tuning platforms that have no such address.
|
|
6
|
+
*/
|
|
7
|
+
export interface PersistedLineupChannel extends Pick<DiscoveredChannel, "channelSelector" | "name"> {
|
|
8
|
+
watchUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Loads the persisted provider lineups from provider-lineups.json into memory. Called once at startup from app.ts, before the browser launches, so the first tune
|
|
12
|
+
* of a boot whose precache has not run yet already has hints to work with.
|
|
13
|
+
* @returns A promise that resolves once the in-memory lineups are hydrated.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadProviderLineups(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Records a provider's discovered lineup, replacing that provider's slice wholesale. An empty lineup is a no-op: a walk that found nothing is not evidence that
|
|
18
|
+
* the provider has no channels, and letting it through would erase the very hints a failed discovery most needs.
|
|
19
|
+
* @param slug - The provider slug the lineup belongs to.
|
|
20
|
+
* @param channels - The lineup rows the discovery produced.
|
|
21
|
+
* @returns A promise that resolves once the write has committed or failed. It never rejects.
|
|
22
|
+
*/
|
|
23
|
+
export declare function persistProviderLineup(slug: string, channels: PersistedLineupChannel[]): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns the persisted lineup for a provider, or null when nothing has been persisted for that slug. The array is the module's own - callers read it and project
|
|
26
|
+
* from it, never mutate it.
|
|
27
|
+
* @param slug - The provider slug to look up.
|
|
28
|
+
* @returns The persisted lineup rows, or null.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getPersistedLineup(slug: string): Nullable<PersistedLineupChannel[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns the persisted direct watch URL for a channel, or null when the provider has no persisted lineup, the channel is not in it, or the provider does not
|
|
33
|
+
* export watch URLs at all. Selector matching is case-insensitive, matching the lowercased-key convention every provider's live cache uses.
|
|
34
|
+
* @param slug - The provider slug to look up.
|
|
35
|
+
* @param channelSelector - The channel selector to match.
|
|
36
|
+
* @returns The persisted watch URL, or null.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getPersistedWatchUrl(slug: string, channelSelector: string): Nullable<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Drops the persisted watch URL for a channel that failed to produce a working stream, keeping the identity row so the lineup still describes what the provider
|
|
41
|
+
* carries. Synchronous in memory with a fire-and-forget write behind it: this runs on a tune-failure path, where the next step is a retry that must not wait on a
|
|
42
|
+
* disk write, and the write itself never rejects.
|
|
43
|
+
* @param slug - The provider slug the channel belongs to.
|
|
44
|
+
* @param channelSelector - The channel selector whose watch URL is no longer trusted.
|
|
45
|
+
*/
|
|
46
|
+
export declare function evictPersistedWatchUrl(slug: string, channelSelector: string): void;
|
|
47
|
+
//# sourceMappingURL=providerLineups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerLineups.d.ts","sourceRoot":"","sources":["../../src/config/providerLineups.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA0BrE;;;;GAIG;AACH,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAGjG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqFD;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3G;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC,CAGnF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAY5F;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAoBlF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { LOG, formatError } from "../utils/index.js";
|
|
2
|
+
import { createFileStore } from "./persistence.js";
|
|
3
|
+
import { getProviderLineupsFilePath } from "./paths.js";
|
|
4
|
+
// Persistence.
|
|
5
|
+
/* Current schema version for provider-lineups.json.
|
|
6
|
+
*
|
|
7
|
+
* Version history:
|
|
8
|
+
* 1 - Original. Each provider slug maps to an array of lineup rows carrying the channel identity and an optional durable watch URL.
|
|
9
|
+
*/
|
|
10
|
+
const CURRENT_LINEUPS_SCHEMA_VERSION = 1;
|
|
11
|
+
/* Declarative schema migrations, keyed by target schema version. The registry is present and empty at version 1: the file store framework arms its migration
|
|
12
|
+
* runner only when currentSchemaVersion, getSchemaVersion, setSchemaVersion, and migrations are all declared, so declaring the whole set now is what makes the
|
|
13
|
+
* version marker on disk mean something. A version marker without a runner behind it is inert.
|
|
14
|
+
*/
|
|
15
|
+
const providerLineupMigrations = {};
|
|
16
|
+
// The lineups this process knows about, keyed by provider slug. Hydrated once at boot by loadProviderLineups and updated at each write. Every read path here is
|
|
17
|
+
// synchronous against this map, because the consumers are on the tune and page-render paths where an await would buy nothing.
|
|
18
|
+
const lineups = new Map();
|
|
19
|
+
/* Transactional store for provider-lineups.json. The parser tolerates a missing providers field so a file written by a partial release, or hand-edited, still
|
|
20
|
+
* loads. There is no load gate of the kind health.json carries: every write here names the one provider slice it replaces rather than serializing whole in-memory
|
|
21
|
+
* state, so a write that lands before the initial load cannot overwrite anything it has not read.
|
|
22
|
+
*/
|
|
23
|
+
const providerLineupsStore = createFileStore({
|
|
24
|
+
// The on-disk envelope, stated in one place. Both fields are always populated by the runtime, so both are emitted unconditionally.
|
|
25
|
+
beforeWrite: (data) => ({ providers: data.providers, schemaVersion: data.schemaVersion }),
|
|
26
|
+
currentSchemaVersion: CURRENT_LINEUPS_SCHEMA_VERSION,
|
|
27
|
+
defaultValue: () => ({ providers: {}, schemaVersion: CURRENT_LINEUPS_SCHEMA_VERSION }),
|
|
28
|
+
getSchemaVersion: (data) => data.schemaVersion,
|
|
29
|
+
label: "provider lineups",
|
|
30
|
+
migrations: providerLineupMigrations,
|
|
31
|
+
parse: (raw) => {
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
// A file predating the version field is treated as version 1, matching the framework's convention for every other store.
|
|
34
|
+
let schemaVersion = 1;
|
|
35
|
+
if ((typeof parsed.schemaVersion === "number") && Number.isFinite(parsed.schemaVersion) && (parsed.schemaVersion >= 1)) {
|
|
36
|
+
schemaVersion = Math.floor(parsed.schemaVersion);
|
|
37
|
+
}
|
|
38
|
+
return { providers: parsed.providers ?? {}, schemaVersion };
|
|
39
|
+
},
|
|
40
|
+
path: getProviderLineupsFilePath,
|
|
41
|
+
setSchemaVersion: (data, version) => { data.schemaVersion = version; }
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Writes one provider's slice to disk, replacing whatever the file held for that slug. This is the single write chokepoint, and it never rejects: a lineup write
|
|
45
|
+
* is the durable half of a discovery that has already succeeded, so a filesystem failure is warned about and absorbed rather than propagated into the walk or the
|
|
46
|
+
* tune-failure path that produced it.
|
|
47
|
+
* @param slug - The provider slug whose slice to replace.
|
|
48
|
+
* @param channels - The lineup rows to persist for that provider.
|
|
49
|
+
* @returns A promise that resolves once the write has committed or failed.
|
|
50
|
+
*/
|
|
51
|
+
async function writeProviderSlice(slug, channels) {
|
|
52
|
+
try {
|
|
53
|
+
await providerLineupsStore.mutate((data) => {
|
|
54
|
+
data.providers[slug] = channels;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
LOG.warn("Failed to persist the channel lineup for %s: %s.", slug, formatError(error));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Loads the persisted provider lineups from provider-lineups.json into memory. Called once at startup from app.ts, before the browser launches, so the first tune
|
|
63
|
+
* of a boot whose precache has not run yet already has hints to work with.
|
|
64
|
+
* @returns A promise that resolves once the in-memory lineups are hydrated.
|
|
65
|
+
*/
|
|
66
|
+
export async function loadProviderLineups() {
|
|
67
|
+
const result = await providerLineupsStore.read();
|
|
68
|
+
lineups.clear();
|
|
69
|
+
for (const [slug, channels] of Object.entries(result.data.providers)) {
|
|
70
|
+
lineups.set(slug, channels);
|
|
71
|
+
}
|
|
72
|
+
if (result.recoveredFromBackup) {
|
|
73
|
+
LOG.info("Provider channel lineups were recovered from backup after a corrupt main file.");
|
|
74
|
+
}
|
|
75
|
+
if (lineups.size > 0) {
|
|
76
|
+
LOG.info("Loaded persisted channel lineups for %d provider%s.", lineups.size, (lineups.size === 1) ? "" : "s");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Records a provider's discovered lineup, replacing that provider's slice wholesale. An empty lineup is a no-op: a walk that found nothing is not evidence that
|
|
81
|
+
* the provider has no channels, and letting it through would erase the very hints a failed discovery most needs.
|
|
82
|
+
* @param slug - The provider slug the lineup belongs to.
|
|
83
|
+
* @param channels - The lineup rows the discovery produced.
|
|
84
|
+
* @returns A promise that resolves once the write has committed or failed. It never rejects.
|
|
85
|
+
*/
|
|
86
|
+
export async function persistProviderLineup(slug, channels) {
|
|
87
|
+
if (channels.length === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
lineups.set(slug, channels);
|
|
91
|
+
await writeProviderSlice(slug, channels);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns the persisted lineup for a provider, or null when nothing has been persisted for that slug. The array is the module's own - callers read it and project
|
|
95
|
+
* from it, never mutate it.
|
|
96
|
+
* @param slug - The provider slug to look up.
|
|
97
|
+
* @returns The persisted lineup rows, or null.
|
|
98
|
+
*/
|
|
99
|
+
export function getPersistedLineup(slug) {
|
|
100
|
+
return lineups.get(slug) ?? null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Returns the persisted direct watch URL for a channel, or null when the provider has no persisted lineup, the channel is not in it, or the provider does not
|
|
104
|
+
* export watch URLs at all. Selector matching is case-insensitive, matching the lowercased-key convention every provider's live cache uses.
|
|
105
|
+
* @param slug - The provider slug to look up.
|
|
106
|
+
* @param channelSelector - The channel selector to match.
|
|
107
|
+
* @returns The persisted watch URL, or null.
|
|
108
|
+
*/
|
|
109
|
+
export function getPersistedWatchUrl(slug, channelSelector) {
|
|
110
|
+
const channels = lineups.get(slug);
|
|
111
|
+
if (!channels) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const target = channelSelector.toLowerCase();
|
|
115
|
+
return channels.find((channel) => channel.channelSelector.toLowerCase() === target)?.watchUrl ?? null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Drops the persisted watch URL for a channel that failed to produce a working stream, keeping the identity row so the lineup still describes what the provider
|
|
119
|
+
* carries. Synchronous in memory with a fire-and-forget write behind it: this runs on a tune-failure path, where the next step is a retry that must not wait on a
|
|
120
|
+
* disk write, and the write itself never rejects.
|
|
121
|
+
* @param slug - The provider slug the channel belongs to.
|
|
122
|
+
* @param channelSelector - The channel selector whose watch URL is no longer trusted.
|
|
123
|
+
*/
|
|
124
|
+
export function evictPersistedWatchUrl(slug, channelSelector) {
|
|
125
|
+
const channels = lineups.get(slug);
|
|
126
|
+
if (!channels) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const target = channelSelector.toLowerCase();
|
|
130
|
+
const entry = channels.find((channel) => channel.channelSelector.toLowerCase() === target);
|
|
131
|
+
if (!entry?.watchUrl) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
delete entry.watchUrl;
|
|
135
|
+
void writeProviderSlice(slug, channels);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=providerLineups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerLineups.js","sourceRoot":"","sources":["../../src/config/providerLineups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single config field that changed between two snapshots. Path is the dot-separated location (e.g., "hdhr.port"). previous and current are the leaf values
|
|
3
|
+
* before and after the change; either may be undefined if the field was added or removed.
|
|
4
|
+
*/
|
|
5
|
+
export interface ConfigChange {
|
|
6
|
+
readonly current: unknown;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly previous: unknown;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Per-change outcome reported by a handler. "applied" means the change is fully live (in-memory CONFIG plus any side effects); "deferred" means the value is in
|
|
12
|
+
* CONFIG but full effect requires a restart; "rejected" means the handler refused the change (e.g., a dependency is unavailable). The reason field on the non-
|
|
13
|
+
* applied variants is surfaced to operators in the settings-save response and the server log.
|
|
14
|
+
*/
|
|
15
|
+
export type ChangeOutcome = {
|
|
16
|
+
readonly kind: "applied";
|
|
17
|
+
readonly path: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: "deferred";
|
|
20
|
+
readonly path: string;
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: "rejected";
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly reason: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Handler signature. Receives the subset of the diff that matched the handler's registered prefix and returns one outcome per change. Handlers may report
|
|
29
|
+
* outcomes for paths they did not receive; the primitive ignores those entries and emits a debug-level warning. Handlers that omit a path are conservatively
|
|
30
|
+
* treated as having deferred that change.
|
|
31
|
+
*
|
|
32
|
+
* Concurrency contract: applyConfigChanges dispatches handlers across distinct prefixes in parallel via Promise.allSettled, so a thrown handler does not
|
|
33
|
+
* short-circuit the rest of the apply - the throwing bucket's changes are converted to rejected outcomes with the formatted error message as the reason, and
|
|
34
|
+
* every other bucket's outcomes flow through unaffected. Within a single prefix, all changes that matched it arrive in one invocation as a sorted batch, so
|
|
35
|
+
* the handler can sequence its internal work however it wants. Across prefixes, handlers run concurrently and must not share mutable state with one another.
|
|
36
|
+
* Subsystems whose live-apply work touches state owned by another subsystem need to coordinate through that subsystem's public API, not through shared globals.
|
|
37
|
+
*/
|
|
38
|
+
export type ConfigChangeHandler = (changes: readonly ConfigChange[]) => Promise<readonly ChangeOutcome[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Aggregate result of applyConfigChanges. The three buckets are disjoint and together cover every ConfigChange in the input diff.
|
|
41
|
+
*/
|
|
42
|
+
export interface ApplyResult {
|
|
43
|
+
readonly applied: readonly ConfigChange[];
|
|
44
|
+
readonly deferred: readonly {
|
|
45
|
+
readonly change: ConfigChange;
|
|
46
|
+
readonly reason: string;
|
|
47
|
+
}[];
|
|
48
|
+
readonly rejected: readonly {
|
|
49
|
+
readonly change: ConfigChange;
|
|
50
|
+
readonly reason: string;
|
|
51
|
+
}[];
|
|
52
|
+
}
|
|
53
|
+
export declare const NO_HANDLER_REASON = "no live-apply handler registered for this field";
|
|
54
|
+
export declare const MISSING_OUTCOME_REASON = "handler did not report an outcome for this field";
|
|
55
|
+
/**
|
|
56
|
+
* Registers a handler that will receive any ConfigChange whose path starts with the given prefix. Throws if a handler is already registered for the prefix to
|
|
57
|
+
* surface duplicate wiring at boot time. Prefixes are matched as plain string prefixes against the dot-separated path - by convention they end with a "."
|
|
58
|
+
* ("hdhr." matches "hdhr.enabled" and "hdhr.port" but not "hdhrFoo").
|
|
59
|
+
* @param prefix - Path prefix (e.g., "hdhr.").
|
|
60
|
+
* @param handler - The handler to invoke for matching changes.
|
|
61
|
+
*/
|
|
62
|
+
export declare function registerConfigChangeHandler(prefix: string, handler: ConfigChangeHandler): void;
|
|
63
|
+
/**
|
|
64
|
+
* Clears the config-change handler registry. Primarily a testing hook - tests register handlers per case, run the dispatch, and reset between cases to keep
|
|
65
|
+
* isolation strong. Production code never calls this; handlers are registered once at module load by each subsystem and remain for the process lifetime.
|
|
66
|
+
*/
|
|
67
|
+
export declare function resetConfigChangeHandlers(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Computes the leaf-value differences between two configuration snapshots. Both inputs are walked recursively; arrays are treated as opaque leaves so an array
|
|
70
|
+
* replacement appears as a single change rather than per-element noise. The returned changes are sorted alphabetically by path for deterministic dispatch order.
|
|
71
|
+
* @param previous - The snapshot before the change.
|
|
72
|
+
* @param current - The snapshot after the change.
|
|
73
|
+
* @returns Array of ConfigChange entries; empty if the snapshots are equivalent.
|
|
74
|
+
*/
|
|
75
|
+
export declare function computeConfigDiff(previous: object, current: object): readonly ConfigChange[];
|
|
76
|
+
/**
|
|
77
|
+
* Dispatches a diff to registered handlers and returns the aggregate outcome. Changes are grouped by longest-matching prefix, handlers are awaited in parallel,
|
|
78
|
+
* and per-change outcomes are folded back into the input order. Changes with no matching prefix are returned as deferred with NO_HANDLER_REASON. Handlers that
|
|
79
|
+
* omit a path from their outcome list have that path conservatively recorded as deferred with MISSING_OUTCOME_REASON.
|
|
80
|
+
* @param diff - The diff to dispatch.
|
|
81
|
+
* @returns Aggregate result partitioning every input change into applied, deferred, or rejected.
|
|
82
|
+
*/
|
|
83
|
+
export declare function applyConfigChanges(diff: readonly ConfigChange[]): Promise<ApplyResult>;
|
|
84
|
+
//# sourceMappingURL=reactivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.d.ts","sourceRoot":"","sources":["../../src/config/reactivity.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAG3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAG1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;AAE1G;;GAEG;AACH,MAAM,WAAW,WAAW;IAG1B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAG1C,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAGzF,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1F;AAMD,eAAO,MAAM,iBAAiB,oDAAoD,CAAC;AAGnF,eAAO,MAAM,sBAAsB,qDAAqD,CAAC;AAEzF;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAQ9F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAQ5F;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAiJ5F"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* reactivity.ts: Config-change reactivity primitive for PrismCast.
|
|
4
|
+
*
|
|
5
|
+
* Subsystems that need to react to configuration changes - opening or closing a network socket, rebinding a server, invalidating a cached resource - register a
|
|
6
|
+
* handler against a path prefix and receive the subset of the diff that matches. Subsystems that simply read CONFIG live at use time need not register; the
|
|
7
|
+
* primitive defaults their paths to "deferred", which preserves the legacy "restart on save" behavior for everything that has not opted in to live application.
|
|
8
|
+
*
|
|
9
|
+
* The primitive owns two responsibilities:
|
|
10
|
+
*
|
|
11
|
+
* 1. Computing a diff between two CONFIG snapshots (computeConfigDiff). Pure function. Walks both objects, emits one ConfigChange per leaf-value difference,
|
|
12
|
+
* treating arrays as opaque leaves so handlers can react to array replacement without per-element noise.
|
|
13
|
+
*
|
|
14
|
+
* 2. Dispatching that diff to registered handlers (applyConfigChanges). Each change is routed to the longest-matching registered prefix; changes whose path
|
|
15
|
+
* is not matched by any handler are reported as deferred. Handlers are awaited; their per-path outcomes are merged into the final ApplyResult.
|
|
16
|
+
*
|
|
17
|
+
* The primitive intentionally does not touch the in-memory CONFIG object. The caller (typically the settings save handler) is responsible for committing the new
|
|
18
|
+
* configuration to CONFIG before invoking applyConfigChanges, so handlers that re-read CONFIG see the post-commit state. Keeping commit and dispatch separate
|
|
19
|
+
* lets callers control ordering and lets test code dispatch synthetic diffs against any handler set without mutating real config state.
|
|
20
|
+
*
|
|
21
|
+
* Multiple handlers per prefix are disallowed at registration time and throw immediately, so duplicate-wiring bugs surface during boot rather than as silent
|
|
22
|
+
* misrouted dispatches at runtime.
|
|
23
|
+
*/
|
|
24
|
+
import { LOG, formatError } from "../utils/index.js";
|
|
25
|
+
// Registry of (prefix -> handler) entries. Lookups walk the entries by descending prefix length to honor longest-prefix-match semantics.
|
|
26
|
+
const handlers = new Map();
|
|
27
|
+
// Default deferral reason when no handler is registered for a path. Surfaced to operators and useful in tests that want to assert this specific code path.
|
|
28
|
+
export const NO_HANDLER_REASON = "no live-apply handler registered for this field";
|
|
29
|
+
// Default deferral reason when a handler did not report an outcome for one of its input changes. A handler bug, but a safe conservative default.
|
|
30
|
+
export const MISSING_OUTCOME_REASON = "handler did not report an outcome for this field";
|
|
31
|
+
/**
|
|
32
|
+
* Registers a handler that will receive any ConfigChange whose path starts with the given prefix. Throws if a handler is already registered for the prefix to
|
|
33
|
+
* surface duplicate wiring at boot time. Prefixes are matched as plain string prefixes against the dot-separated path - by convention they end with a "."
|
|
34
|
+
* ("hdhr." matches "hdhr.enabled" and "hdhr.port" but not "hdhrFoo").
|
|
35
|
+
* @param prefix - Path prefix (e.g., "hdhr.").
|
|
36
|
+
* @param handler - The handler to invoke for matching changes.
|
|
37
|
+
*/
|
|
38
|
+
export function registerConfigChangeHandler(prefix, handler) {
|
|
39
|
+
if (handlers.has(prefix)) {
|
|
40
|
+
throw new Error("A config change handler is already registered for prefix \"" + prefix + "\".");
|
|
41
|
+
}
|
|
42
|
+
handlers.set(prefix, handler);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Clears the config-change handler registry. Primarily a testing hook - tests register handlers per case, run the dispatch, and reset between cases to keep
|
|
46
|
+
* isolation strong. Production code never calls this; handlers are registered once at module load by each subsystem and remain for the process lifetime.
|
|
47
|
+
*/
|
|
48
|
+
export function resetConfigChangeHandlers() {
|
|
49
|
+
handlers.clear();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Computes the leaf-value differences between two configuration snapshots. Both inputs are walked recursively; arrays are treated as opaque leaves so an array
|
|
53
|
+
* replacement appears as a single change rather than per-element noise. The returned changes are sorted alphabetically by path for deterministic dispatch order.
|
|
54
|
+
* @param previous - The snapshot before the change.
|
|
55
|
+
* @param current - The snapshot after the change.
|
|
56
|
+
* @returns Array of ConfigChange entries; empty if the snapshots are equivalent.
|
|
57
|
+
*/
|
|
58
|
+
export function computeConfigDiff(previous, current) {
|
|
59
|
+
const changes = [];
|
|
60
|
+
collectDiff("", previous, current, changes);
|
|
61
|
+
changes.sort((a, b) => a.path.localeCompare(b.path));
|
|
62
|
+
return changes;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Dispatches a diff to registered handlers and returns the aggregate outcome. Changes are grouped by longest-matching prefix, handlers are awaited in parallel,
|
|
66
|
+
* and per-change outcomes are folded back into the input order. Changes with no matching prefix are returned as deferred with NO_HANDLER_REASON. Handlers that
|
|
67
|
+
* omit a path from their outcome list have that path conservatively recorded as deferred with MISSING_OUTCOME_REASON.
|
|
68
|
+
* @param diff - The diff to dispatch.
|
|
69
|
+
* @returns Aggregate result partitioning every input change into applied, deferred, or rejected.
|
|
70
|
+
*/
|
|
71
|
+
export async function applyConfigChanges(diff) {
|
|
72
|
+
if (diff.length === 0) {
|
|
73
|
+
return { applied: [], deferred: [], rejected: [] };
|
|
74
|
+
}
|
|
75
|
+
// Bucket each change by the longest registered prefix that matches its path. Paths with no matching prefix go into the unhandled bucket.
|
|
76
|
+
const byPrefix = new Map();
|
|
77
|
+
const unhandled = [];
|
|
78
|
+
for (const change of diff) {
|
|
79
|
+
const prefix = findLongestPrefix(change.path);
|
|
80
|
+
if (prefix === null) {
|
|
81
|
+
unhandled.push(change);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const bucket = byPrefix.get(prefix) ?? [];
|
|
85
|
+
bucket.push(change);
|
|
86
|
+
byPrefix.set(prefix, bucket);
|
|
87
|
+
}
|
|
88
|
+
// Dispatch each bucket to its handler in parallel via Promise.allSettled so a thrown handler does not short-circuit the rest of the apply. Materializing
|
|
89
|
+
// the buckets up front lets us pair each settled result with its source bucket by index - allSettled preserves array length, so settled[i] aligns with
|
|
90
|
+
// buckets[i] for the lifetime of this dispatch. A handler that throws is treated as having rejected every change in its bucket: the formatted error message
|
|
91
|
+
// becomes the rejection reason for each change, so the dispatcher's guarantee that every input change gets an outcome holds even when handlers fail.
|
|
92
|
+
const buckets = Array.from(byPrefix.entries());
|
|
93
|
+
const settled = await Promise.allSettled(buckets.map(async ([prefix, changes]) => {
|
|
94
|
+
const handler = handlers.get(prefix);
|
|
95
|
+
// The handler must exist - findLongestPrefix returns a prefix only when handlers.has(prefix) is true - but TypeScript widens map.get to T | undefined.
|
|
96
|
+
if (!handler) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
return handler(changes);
|
|
100
|
+
}));
|
|
101
|
+
const dispatched = settled.map((result, index) => {
|
|
102
|
+
// allSettled preserves array length, so buckets[index] is always defined; the explicit guard satisfies TypeScript without leaning on a non-null assertion.
|
|
103
|
+
const bucket = buckets[index];
|
|
104
|
+
if (!bucket) {
|
|
105
|
+
return { changes: [], outcomes: [] };
|
|
106
|
+
}
|
|
107
|
+
const [, changes] = bucket;
|
|
108
|
+
if (result.status === "fulfilled") {
|
|
109
|
+
return { changes, outcomes: result.value };
|
|
110
|
+
}
|
|
111
|
+
// Handler threw - synthesize a rejected outcome so every change in the bucket still gets an outcome.
|
|
112
|
+
const reason = formatError(result.reason);
|
|
113
|
+
const outcomes = changes.map((c) => ({ kind: "rejected", path: c.path, reason }));
|
|
114
|
+
return { changes, outcomes };
|
|
115
|
+
});
|
|
116
|
+
// Build the aggregate result. Iterate the input diff in order so callers see deterministic output even when handlers ran in parallel.
|
|
117
|
+
const applied = [];
|
|
118
|
+
const deferred = [];
|
|
119
|
+
const rejected = [];
|
|
120
|
+
// Index outcomes by path for O(1) lookup during the merge below. A handler is only authoritative for the changes it was actually given, so we accept an
|
|
121
|
+
// outcome only when its path was in that handler's input batch. Ignoring foreign-path outcomes upholds the documented contract and prevents one handler
|
|
122
|
+
// from overriding another handler's classification of a shared path via last-write-wins into this map. Ignored entries are surfaced at debug level so
|
|
123
|
+
// a misbehaving handler is diagnosable without polluting the operator-facing log.
|
|
124
|
+
const outcomeByPath = new Map();
|
|
125
|
+
for (const { changes, outcomes } of dispatched) {
|
|
126
|
+
const inputPaths = new Set(changes.map((change) => change.path));
|
|
127
|
+
for (const outcome of outcomes) {
|
|
128
|
+
if (!inputPaths.has(outcome.path)) {
|
|
129
|
+
LOG.debug("config:reactivity", "Ignoring a config-change outcome for a path the handler was not given: %s.", outcome.path);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
outcomeByPath.set(outcome.path, outcome);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Anything in the unhandled bucket defers with NO_HANDLER_REASON.
|
|
136
|
+
const unhandledPaths = new Set(unhandled.map((c) => c.path));
|
|
137
|
+
for (const change of diff) {
|
|
138
|
+
if (unhandledPaths.has(change.path)) {
|
|
139
|
+
deferred.push({ change, reason: NO_HANDLER_REASON });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const outcome = outcomeByPath.get(change.path);
|
|
143
|
+
if (!outcome) {
|
|
144
|
+
deferred.push({ change, reason: MISSING_OUTCOME_REASON });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
switch (outcome.kind) {
|
|
148
|
+
case "applied": {
|
|
149
|
+
applied.push(change);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case "deferred": {
|
|
153
|
+
deferred.push({ change, reason: outcome.reason });
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "rejected": {
|
|
157
|
+
rejected.push({ change, reason: outcome.reason });
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { applied, deferred, rejected };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Returns the longest registered prefix that the given path starts with, or null if no prefix matches. Used by applyConfigChanges to route changes to handlers.
|
|
166
|
+
* @param path - The dot-separated config path.
|
|
167
|
+
* @returns The matching prefix or null.
|
|
168
|
+
*/
|
|
169
|
+
function findLongestPrefix(path) {
|
|
170
|
+
let best = null;
|
|
171
|
+
for (const prefix of handlers.keys()) {
|
|
172
|
+
if (path.startsWith(prefix) && ((best === null) || (prefix.length > best.length))) {
|
|
173
|
+
best = prefix;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return best;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Recursive walker that populates the changes array with leaf-value differences between two values rooted at the given path prefix. Plain objects recurse; any
|
|
180
|
+
* other value (including arrays, dates, nulls, primitives) is compared as a leaf via deep equality.
|
|
181
|
+
* @param prefix - Current path prefix.
|
|
182
|
+
* @param previous - Previous value at this path.
|
|
183
|
+
* @param current - Current value at this path.
|
|
184
|
+
* @param changes - Accumulator the walker pushes into.
|
|
185
|
+
*/
|
|
186
|
+
function collectDiff(prefix, previous, current, changes) {
|
|
187
|
+
// If either side is not a plain object, treat this position as a leaf and emit a change when the values differ.
|
|
188
|
+
if (!isPlainObject(previous) || !isPlainObject(current)) {
|
|
189
|
+
if (!deepEqual(previous, current)) {
|
|
190
|
+
changes.push({ current, path: prefix, previous });
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Both sides are plain objects: recurse into the union of their keys so additions and removals are captured along with mutations.
|
|
195
|
+
const keys = new Set(Object.keys(previous)).union(new Set(Object.keys(current)));
|
|
196
|
+
for (const key of Array.from(keys).sort()) {
|
|
197
|
+
const childPath = prefix ? (prefix + "." + key) : key;
|
|
198
|
+
collectDiff(childPath, previous[key], current[key], changes);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Predicate: is the value a plain object (not array, not null, not a class instance like Date)? The reactivity primitive treats any non-plain value as a leaf,
|
|
203
|
+
* which is the right behavior for Config - it is JSON-shaped and contains no class instances or arrays-of-objects whose elements should diff independently.
|
|
204
|
+
* @param value - The candidate.
|
|
205
|
+
* @returns True if value is a plain object literal.
|
|
206
|
+
*/
|
|
207
|
+
function isPlainObject(value) {
|
|
208
|
+
if ((value === null) || (typeof value !== "object") || Array.isArray(value)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
// Object.getPrototypeOf is typed as returning any in the standard lib. Cast through unknown so the comparisons below are type-safe.
|
|
212
|
+
const proto = Object.getPrototypeOf(value);
|
|
213
|
+
return (proto === null) || (proto === Object.prototype);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Deep equality check for leaf values. Stringification via JSON.stringify normalizes nested arrays and objects and handles undefined-vs-missing correctly when
|
|
217
|
+
* the values are wrapped in a single-element array. Sufficient for Config which is JSON-shaped throughout.
|
|
218
|
+
* @param a - First value.
|
|
219
|
+
* @param b - Second value.
|
|
220
|
+
* @returns True if the values are deeply equal.
|
|
221
|
+
*/
|
|
222
|
+
function deepEqual(a, b) {
|
|
223
|
+
// Wrapping in an array side-steps the JSON.stringify(undefined) === undefined corner case so the comparison handles undefined leaves correctly.
|
|
224
|
+
return JSON.stringify([a]) === JSON.stringify([b]);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=reactivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.js","sourceRoot":"","sources":["../../src/config/reactivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,11 +18,26 @@ export interface ImportSummary {
|
|
|
18
18
|
success: boolean;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Parses and validates a raw service pack import. Checks the version field, validates profiles and domains via the userProfiles validation functions
|
|
21
|
+
* Parses and validates a raw service pack import. Checks the version field, validates profiles and domains via the userProfiles validation functions, validates
|
|
22
|
+
* channel structure (each channel requires 'name' and 'url'), and sanitizes the pack name and channel string fields to strip non-printable characters.
|
|
22
23
|
* @param data - The raw JSON data to parse.
|
|
24
|
+
* @param options - Parse options. skipChannels leaves the pack's channels out of both the validation and the result, matching the option of the same name on
|
|
25
|
+
* importServicePack so one name means one thing across both stages of an import.
|
|
23
26
|
* @returns Parse result with validated pack or errors.
|
|
24
27
|
*/
|
|
25
|
-
export declare function parseServicePack(data: unknown
|
|
28
|
+
export declare function parseServicePack(data: unknown, options?: {
|
|
29
|
+
skipChannels?: boolean;
|
|
30
|
+
}): ParseResult;
|
|
31
|
+
/**
|
|
32
|
+
* Counts how many keys in the incoming record are net-new relative to the existing record - that is, keys present in incoming but absent from existing. Overwrites of
|
|
33
|
+
* already-present keys are not counted. This is the pure kernel of the import summary's net-new accounting: importServicePack invokes it inside each store mutation
|
|
34
|
+
* against the live pre-mutation state, which is the single source of truth for what already existed and avoids a separate read round-trip with its attendant
|
|
35
|
+
* time-of-check-to-time-of-use window.
|
|
36
|
+
* @param incoming - The record being merged in (e.g., the pack's profiles, domains, or channels).
|
|
37
|
+
* @param existing - The record being merged into (e.g., the store's current profiles, domains, or channels).
|
|
38
|
+
* @returns The number of keys in incoming that do not already exist in existing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function countNewKeys(incoming: Record<string, unknown>, existing: Record<string, unknown>): number;
|
|
26
41
|
/**
|
|
27
42
|
* Imports a validated service pack by writing its contents to profiles.json and optionally channels.json. Returns a summary of what was added.
|
|
28
43
|
* @param pack - The validated service pack to import.
|
|
@@ -44,3 +59,4 @@ export declare function exportServicePack(profileKeys: string[], options?: {
|
|
|
44
59
|
includeDomains?: boolean;
|
|
45
60
|
name?: string;
|
|
46
61
|
}): ServicePack | null;
|
|
62
|
+
//# sourceMappingURL=servicePacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"servicePacks.d.ts","sourceRoot":"","sources":["../../src/config/servicePacks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsD,WAAW,EAAe,MAAM,mBAAmB,CAAC;AAYtH;;GAEG;AACH,MAAM,WAAW,WAAW;IAG1B,MAAM,EAAE,MAAM,EAAE,CAAC;IAGjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAI5B,aAAa,EAAE,MAAM,CAAC;IAGtB,YAAY,EAAE,MAAM,CAAC;IAGrB,MAAM,EAAE,MAAM,EAAE,CAAC;IAGjB,aAAa,EAAE,MAAM,CAAC;IAGtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,WAAW,CAsJrG;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMzG;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAwD3H;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACnF,WAAW,GAAG,IAAI,CA4EpB"}
|