prismcast 1.10.3 → 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 +1 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +103 -50
- 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 +23 -6
- package/dist/browser/hlsPlaylistObserver.d.ts.map +1 -0
- package/dist/browser/hlsPlaylistObserver.js +27 -8
- package/dist/browser/hlsPlaylistObserver.js.map +1 -1
- package/dist/browser/index.d.ts +44 -27
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +427 -244
- 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 +88 -35
- package/dist/browser/manifestInterceptor.d.ts.map +1 -0
- package/dist/browser/manifestInterceptor.js +165 -77
- 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 +2 -1
- package/dist/browser/tabNetworkObserver.d.ts.map +1 -0
- package/dist/browser/tabNetworkObserver.js +7 -3
- package/dist/browser/tabNetworkObserver.js.map +1 -1
- 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 +15 -11
- 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 +7 -1
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +8 -1
- 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 +21 -14
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +77 -43
- 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 +16 -10
- package/dist/config/services.d.ts.map +1 -0
- package/dist/config/services.js +27 -16
- package/dist/config/services.js.map +1 -1
- package/dist/config/sites.d.ts +4 -2
- package/dist/config/sites.d.ts.map +1 -0
- package/dist/config/sites.js +9 -5
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +23 -18
- package/dist/config/userChannels.d.ts.map +1 -0
- package/dist/config/userChannels.js +45 -34
- 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 +8 -4
- package/dist/config/userProfiles.d.ts.map +1 -0
- package/dist/config/userProfiles.js +48 -23
- 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 +4 -3
- 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 +39 -16
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +273 -103
- 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 +56 -1
- package/dist/native/proxy.d.ts.map +1 -0
- package/dist/native/proxy.js +604 -161
- 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 +4 -3
- package/dist/routes/clientActions.d.ts.map +1 -0
- package/dist/routes/components.d.ts +1 -0
- package/dist/routes/components.d.ts.map +1 -0
- package/dist/routes/components.js +2 -2
- 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 +49 -22
- 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 +1 -0
- package/dist/routes/config/channels/healthBridge.d.ts.map +1 -0
- package/dist/routes/config/channels/healthBridge.js +2 -2
- 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 +55 -27
- 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 +35 -24
- 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 +89 -43
- 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 +2 -2
- 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 +13 -3
- 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 +11 -12
- 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 +10 -8
- 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 +147 -97
- 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 +39 -22
- 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 +52 -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 +18 -6
- package/dist/routes/root/scripts/status.handlers.d.ts.map +1 -0
- package/dist/routes/root/scripts/status.handlers.js +38 -32
- package/dist/routes/root/scripts/status.handlers.js.map +1 -1
- package/dist/routes/root/scripts/status.js +15 -7
- 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 +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 +3 -2
- 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.d.ts +3 -2
- package/dist/service/generators.d.ts.map +1 -0
- package/dist/service/generators.js +108 -20
- 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 +219 -115
- 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 +58 -1
- 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 +31 -4
- package/dist/streaming/preroll.d.ts.map +1 -0
- package/dist/streaming/preroll.js +69 -27
- 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 +5 -2
- package/dist/streaming/statusEmitter.d.ts.map +1 -0
- package/dist/streaming/statusEmitter.js +5 -3
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +15 -12
- 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 +4 -2
- 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.d.ts +1 -0
- package/dist/upgrade/commands.d.ts.map +1 -0
- package/dist/upgrade/commands.js +1 -1
- 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 +2 -0
- package/dist/upgrade/detection.context.js.map +1 -1
- package/dist/upgrade/detection.d.ts +7 -6
- package/dist/upgrade/detection.d.ts.map +1 -0
- package/dist/upgrade/detection.js +4 -4
- package/dist/upgrade/index.d.ts +1 -0
- package/dist/upgrade/index.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.context.d.ts +1 -0
- package/dist/upgrade/lifecycle.context.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.d.ts +7 -7
- package/dist/upgrade/lifecycle.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.js +9 -10
- package/dist/upgrade/lifecycle.js.map +1 -1
- package/dist/upgrade/pathHandle.d.ts +5 -3
- package/dist/upgrade/pathHandle.d.ts.map +1 -0
- package/dist/upgrade/pathHandle.js +3 -2
- package/dist/upgrade/pathHandle.js.map +1 -1
- package/dist/utils/bootSession.context.d.ts +1 -0
- package/dist/utils/bootSession.context.d.ts.map +1 -0
- package/dist/utils/bootSession.context.js +6 -5
- package/dist/utils/bootSession.context.js.map +1 -1
- package/dist/utils/bootSession.d.ts +1 -0
- package/dist/utils/bootSession.d.ts.map +1 -0
- package/dist/utils/bootSession.js.map +1 -1
- 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 +31 -13
- 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 +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- 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 +4 -2
- package/dist/utils/markup.d.ts.map +1 -0
- package/dist/utils/markup.js +6 -5
- 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 +1 -0
- package/dist/utils/pid.d.ts.map +1 -0
- package/dist/utils/pid.js +3 -3
- 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 +1 -0
- package/dist/utils/processInspector.context.d.ts.map +1 -0
- package/dist/utils/processInspector.context.js +3 -1
- package/dist/utils/processInspector.context.js.map +1 -1
- package/dist/utils/processInspector.d.ts +4 -3
- package/dist/utils/processInspector.d.ts.map +1 -0
- package/dist/utils/processInspector.js +2 -0
- package/dist/utils/processInspector.js.map +1 -1
- package/dist/utils/retry.d.ts +24 -1
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +32 -5
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/runtimeIdentity.context.d.ts +1 -0
- package/dist/utils/runtimeIdentity.context.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.context.js +30 -0
- package/dist/utils/runtimeIdentity.context.js.map +1 -1
- package/dist/utils/runtimeIdentity.d.ts +6 -4
- package/dist/utils/runtimeIdentity.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.js +15 -5
- package/dist/utils/runtimeIdentity.js.map +1 -1
- 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 +1 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/version.d.ts +1 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +7 -3
- package/dist/utils/version.js.map +1 -1
- package/package.json +26 -20
package/dist/hdhr/index.js
CHANGED
|
@@ -1,80 +1,255 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
* index.ts: HDHomeRun emulation server for PrismCast.
|
|
4
|
-
*/
|
|
1
|
+
import { HDHR_DISCOVERY_PORT, createUdpSurface } from "./udp.js";
|
|
5
2
|
import { generateDeviceId, validateDeviceId } from "./deviceId.js";
|
|
6
3
|
import { CONFIG } from "../config/index.js";
|
|
7
4
|
import { LOG } from "../utils/index.js";
|
|
8
5
|
import express from "express";
|
|
9
6
|
import { formatError } from "../utils/errors.js";
|
|
10
7
|
import { mutateConfig } from "../config/userConfig.js";
|
|
8
|
+
import { registerConfigChangeHandler } from "../config/reactivity.js";
|
|
11
9
|
import { setupHdhrEndpoints } from "./discover.js";
|
|
12
|
-
/* When HDHomeRun emulation is enabled, PrismCast runs a separate Express server that responds to HDHomeRun API requests from Plex. This server is intentionally
|
|
13
|
-
* lightweight - it only serves device discovery and lineup metadata. All actual video streaming flows through PrismCast's main HTTP server via the HLS URLs in
|
|
14
|
-
* the lineup response.
|
|
15
|
-
*
|
|
16
|
-
* The HDHR server runs on a configurable port (default 5004) independently of the main server. If the port is unavailable, the HDHR feature is disabled
|
|
17
|
-
* gracefully without affecting the main server. Plex does not auto-detect emulated tuners - users must manually enter the address (IP:port) in Plex's DVR setup.
|
|
18
|
-
*/
|
|
19
|
-
// The HDHR HTTP server instance, used for graceful shutdown.
|
|
20
|
-
let hdhrServer = null;
|
|
21
10
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
11
|
+
* Creates an HDHomeRun HTTP surface node. The returned object fully owns its server; nothing outside the closure touches it. ensureBound is the converge-up verb
|
|
12
|
+
* (with the rebind + concession sealed inside it), ensureDown the converge-down verb, and [Symbol.asyncDispose] aliases ensureDown so the surface is a well-formed
|
|
13
|
+
* async-disposable resource.
|
|
14
|
+
* @returns An HttpSurface node.
|
|
24
15
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
function createHttpSurface() {
|
|
17
|
+
// The bound HTTP server, owned entirely by this node. Null when the surface is down.
|
|
18
|
+
let server = null;
|
|
19
|
+
// currentPort resolves the live bound port from the server's address, or null when down. Internal helper so both the public getter and the bind logic read one
|
|
20
|
+
// source. Uses the resolved socket address rather than the requested port so an OS-assigned port (port 0 in tests) reports its real value.
|
|
21
|
+
function currentPort() {
|
|
22
|
+
// This surface always binds a TCP host:port pair, never a Unix domain socket or named pipe, so server.address()
|
|
23
|
+
// cannot return its string form here, and the AddressInfo cast is safe by construction.
|
|
24
|
+
return server ? (server.address()?.port ?? null) : null;
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Closes an HTTP server and resolves only after the underlying socket is fully released. Server.close's callback fires after the socket is gone but the public
|
|
28
|
+
* API is callback-shaped; we surface it as a Promise so callers can compose with await. The callback's error argument is ignored - the only error it can carry
|
|
29
|
+
* is ERR_SERVER_NOT_RUNNING, which cannot occur here because we only close a server we confirmed listening.
|
|
30
|
+
* @param target - The server to close.
|
|
31
|
+
*/
|
|
32
|
+
async function close(target) {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- Standard pattern for signal promises.
|
|
34
|
+
const { promise, resolve } = Promise.withResolvers();
|
|
35
|
+
target.close(() => { resolve(); });
|
|
36
|
+
return promise;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Opens a fresh HDHomeRun HTTP server on the given port and host, capturing it in the node's server reference on success. Returns true once the bind is
|
|
40
|
+
* confirmed listening, false on bind failure. The low-level open primitive; ensureBound layers the rebind + concession policy on top.
|
|
41
|
+
*
|
|
42
|
+
* Detects bind success or failure through the explicit "listening" and "error" events rather than express's listen callback. The listen callback fires even
|
|
43
|
+
* when the bind fails (verified empirically: it resolves on EADDRINUSE and EADDRNOTAVAIL with a non-listening server), so it cannot be trusted to signal
|
|
44
|
+
* success - relying on it would report a port conflict as a successful start. Exactly one of "listening" or "error" fires for a given
|
|
45
|
+
* bind attempt, so the promise always settles. This mirrors the bind-vs-runtime error-handler split the UDP surface uses in udp.ts.
|
|
46
|
+
* @param port - The TCP port to bind.
|
|
47
|
+
* @param host - The host address to bind.
|
|
48
|
+
* @returns True if the server is now listening, false if the bind failed.
|
|
49
|
+
*/
|
|
50
|
+
async function bind(port, host) {
|
|
51
|
+
const app = express();
|
|
52
|
+
// The HDHomeRun HTTP surface can sit behind a reverse proxy, so we trust the X-Forwarded-* chain. With trust proxy enabled, Express derives the client IP,
|
|
53
|
+
// protocol, and hostname from the forwarded headers rather than the immediate proxy hop, so any consumer reading those request properties sees the originating
|
|
54
|
+
// client. This complements resolveHostname in discover.ts, which prefers X-Forwarded-Host when composing the advertised BaseURL.
|
|
55
|
+
app.set("trust proxy", true);
|
|
56
|
+
setupHdhrEndpoints(app);
|
|
57
|
+
const { promise, resolve } = Promise.withResolvers();
|
|
58
|
+
const candidate = app.listen(port, host);
|
|
59
|
+
const onBindError = (error) => {
|
|
60
|
+
if (error.code === "EADDRINUSE") {
|
|
61
|
+
LOG.warn("HDHomeRun port %s is already in use. Check for conflicting services on this port.", port);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
LOG.warn("Failed to start the HDHomeRun HTTP server: %s.", formatError(error));
|
|
65
|
+
}
|
|
66
|
+
resolve(false);
|
|
67
|
+
};
|
|
68
|
+
candidate.once("error", onBindError);
|
|
69
|
+
candidate.once("listening", () => {
|
|
70
|
+
// Bind succeeded: retire the bind-failure handler and attach a long-lived runtime handler so a later socket error is logged rather than crashing the
|
|
71
|
+
// process on an unhandled "error" event.
|
|
72
|
+
candidate.removeListener("error", onBindError);
|
|
73
|
+
candidate.on("error", (error) => {
|
|
74
|
+
LOG.warn("HDHomeRun HTTP server encountered a socket error: %s.", formatError(error));
|
|
42
75
|
});
|
|
76
|
+
server = candidate;
|
|
77
|
+
LOG.info("HDHomeRun emulation is now listening on %s:%s (DeviceID: %s).", host, currentPort() ?? port, CONFIG.hdhr.deviceId.toUpperCase());
|
|
78
|
+
resolve(true);
|
|
79
|
+
});
|
|
80
|
+
return promise;
|
|
81
|
+
}
|
|
82
|
+
async function ensureBound(port, host) {
|
|
83
|
+
// Already listening on the desired port - nothing to do (covers deviceId/friendlyName-only changes, which need no rebind).
|
|
84
|
+
if (currentPort() === port) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
// Capture the prior port before closing so a failed rebind can fall back to it (the concession: a typo'd port must not take down a working tuner).
|
|
88
|
+
const priorPort = currentPort();
|
|
89
|
+
await ensureDown();
|
|
90
|
+
if (await bind(port, host)) {
|
|
91
|
+
return true;
|
|
43
92
|
}
|
|
44
|
-
|
|
45
|
-
|
|
93
|
+
// The desired bind failed. Concession (operator-confirmed): if we were previously listening on another port, re-bind it so the tuner keeps working; the
|
|
94
|
+
// change is still reported rejected so the operator knows it did not take. If there was no prior port (boot or already-down), there is nothing to restore.
|
|
95
|
+
if (priorPort !== null) {
|
|
96
|
+
LOG.warn("HDHomeRun port %s is unavailable; keeping the previous port %s active. The port change was rejected.", port, priorPort);
|
|
97
|
+
await bind(priorPort, host);
|
|
46
98
|
}
|
|
99
|
+
return false;
|
|
47
100
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
101
|
+
async function ensureDown() {
|
|
102
|
+
if (server === null) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const current = server;
|
|
106
|
+
// Clear the reference before the asynchronous close so a concurrent ensureBound during teardown opens a fresh server rather than racing the closing one.
|
|
107
|
+
server = null;
|
|
108
|
+
await close(current);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
get boundPort() {
|
|
112
|
+
return currentPort();
|
|
113
|
+
},
|
|
114
|
+
ensureBound,
|
|
115
|
+
ensureDown,
|
|
116
|
+
[Symbol.asyncDispose]: ensureDown
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Ensures CONFIG.hdhr.deviceId carries a checksum-valid value, generating and persisting a fresh one when missing or invalid. Called from reconcile before
|
|
121
|
+
* bringing the surfaces up so a never-before-enabled HDHR setup gets a DeviceID on first activation rather than only at process boot.
|
|
122
|
+
*/
|
|
123
|
+
async function ensureDeviceId() {
|
|
124
|
+
// Generate a DeviceID on first run, or regenerate if the stored ID fails checksum validation (e.g., hand-edited config with a typo). Plex silently rejects
|
|
125
|
+
// tuners with invalid DeviceIDs during discovery, so we catch this early.
|
|
126
|
+
if (CONFIG.hdhr.deviceId && validateDeviceId(CONFIG.hdhr.deviceId)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (CONFIG.hdhr.deviceId) {
|
|
130
|
+
LOG.warn("HDHomeRun DeviceID '%s' has an invalid checksum. Generating a new one.", CONFIG.hdhr.deviceId.toUpperCase());
|
|
131
|
+
}
|
|
132
|
+
CONFIG.hdhr.deviceId = generateDeviceId();
|
|
133
|
+
LOG.info("Generated HDHomeRun DeviceID: %s.", CONFIG.hdhr.deviceId.toUpperCase());
|
|
134
|
+
// Save the generated ID to the user config so it persists across restarts.
|
|
53
135
|
try {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
LOG.info("HDHomeRun emulation is now listening on %s:%s (DeviceID: %s).", CONFIG.server.host, CONFIG.hdhr.port, CONFIG.hdhr.deviceId.toUpperCase());
|
|
136
|
+
await mutateConfig((config) => {
|
|
137
|
+
config.hdhr ??= {};
|
|
138
|
+
config.hdhr.deviceId = CONFIG.hdhr.deviceId;
|
|
139
|
+
});
|
|
59
140
|
}
|
|
60
141
|
catch (error) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
142
|
+
LOG.warn("Failed to persist HDHomeRun DeviceID: %s. A new ID will be generated on next restart.", formatError(error));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Creates the HDHomeRun controller. The controller owns the two surface nodes for the whole process lifetime; their sockets cycle internally as reconcile drives
|
|
147
|
+
* them. Failures at any surface are reported up, not thrown - the broader application continues to work even if HDHR emulation cannot bind.
|
|
148
|
+
* @returns An HdhrController node.
|
|
149
|
+
*/
|
|
150
|
+
function createHdhrController() {
|
|
151
|
+
// The two HDHomeRun surfaces this controller owns. Created once and live for the controller's lifetime; the controller expresses desired state (policy) and
|
|
152
|
+
// never reaches into how a surface binds, rebinds, or closes (mechanism).
|
|
153
|
+
const http = createHttpSurface();
|
|
154
|
+
const udp = createUdpSurface();
|
|
155
|
+
async function reconcile() {
|
|
156
|
+
// Desired state "disabled": bring both surfaces down. UDP first so it stops advertising a BaseURL before the HTTP server it points at goes away. This cannot
|
|
157
|
+
// fail. The surfaces remain reusable, so a later enable rebinds them.
|
|
158
|
+
if (!CONFIG.hdhr.enabled) {
|
|
159
|
+
await udp.ensureDown();
|
|
160
|
+
await http.ensureDown();
|
|
161
|
+
return { httpFailed: false, udpFailed: false };
|
|
162
|
+
}
|
|
163
|
+
await ensureDeviceId();
|
|
164
|
+
const httpFailed = !(await http.ensureBound(CONFIG.hdhr.port, CONFIG.server.host));
|
|
165
|
+
// UDP is gated on the HTTP server actually being bound: a discovery responder must never advertise a BaseURL pointing at an HTTP port with no listener, so
|
|
166
|
+
// when HTTP is down we stop UDP regardless of the discoveryEnabled flag. The Discover reply advertises http.boundPort (not CONFIG.hdhr.port) so it always
|
|
167
|
+
// reflects reality, including the rejected-port-change concession case where HTTP stays on the prior port.
|
|
168
|
+
let udpFailed = false;
|
|
169
|
+
if (CONFIG.hdhr.discoveryEnabled && (http.boundPort !== null)) {
|
|
170
|
+
udpFailed = !(await udp.ensureUp({ httpPortProvider: () => http.boundPort }));
|
|
64
171
|
}
|
|
65
172
|
else {
|
|
66
|
-
|
|
173
|
+
await udp.ensureDown();
|
|
67
174
|
}
|
|
68
|
-
return;
|
|
175
|
+
return { httpFailed, udpFailed };
|
|
69
176
|
}
|
|
177
|
+
async function disposeAsync() {
|
|
178
|
+
// Terminal teardown: bring both surfaces down, UDP first (stop advertising before the advertised HTTP server dies). The surfaces remain reusable afterward -
|
|
179
|
+
// a later reconcile can bring them back - because closing a socket does not poison the node; this is owner-bounded disposal, not scope-bounded.
|
|
180
|
+
await udp.ensureDown();
|
|
181
|
+
await http.ensureDown();
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
reconcile,
|
|
185
|
+
[Symbol.asyncDispose]: disposeAsync
|
|
186
|
+
};
|
|
70
187
|
}
|
|
188
|
+
// The process-lifetime HDHomeRun controller. Created at module load (a pure factory call - no sockets bind until reconcile runs), so the public lifecycle
|
|
189
|
+
// functions and the live-apply handler share one owner of the emulation surfaces.
|
|
190
|
+
const hdhrController = createHdhrController();
|
|
71
191
|
/**
|
|
72
|
-
*
|
|
192
|
+
* Brings the HDHomeRun emulation surfaces (HTTP + optional UDP discovery) into line with CONFIG.hdhr. Thin delegator to the controller's reconcile so the boot
|
|
193
|
+
* path and the live-apply path share one code path. Failures are reported through the reconcile result and logged at the surface layer; boot treats them as
|
|
194
|
+
* graceful degradation and does not propagate them.
|
|
73
195
|
*/
|
|
74
|
-
export function
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
196
|
+
export async function startHdhrServer() {
|
|
197
|
+
await hdhrController.reconcile();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Stops the HDHomeRun emulation surfaces and waits for the underlying sockets to fully release. Awaiting close completion matters when the caller intends to
|
|
201
|
+
* immediately rebind on the same port - skipping the await races the still in-flight async close, since the old listening socket may not yet have released
|
|
202
|
+
* the port, risking EADDRINUSE on the fresh bind. Safe to call more than once: a second call when nothing is running succeeds as a no-op, and a later
|
|
203
|
+
* startHdhrServer rebinds cleanly.
|
|
204
|
+
*/
|
|
205
|
+
export async function stopHdhrServer() {
|
|
206
|
+
await hdhrController[Symbol.asyncDispose]();
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Live-applies the subset of a config diff that lives under the "hdhr." prefix. Reconciles the HTTP + UDP surfaces to the new CONFIG.hdhr once (whole desired
|
|
210
|
+
* state, no per-change ordering to get wrong) and then maps each input change to an outcome from the reconciliation result: surface-driving fields (enabled,
|
|
211
|
+
* port) report rejected when their surface failed to bind; deviceId and friendlyName are read live by their consumers and always apply; discoveryEnabled reports
|
|
212
|
+
* rejected only when discovery was requested but failed to bind; an unknown hdhr.* field defers so a future field cannot silently no-op.
|
|
213
|
+
*
|
|
214
|
+
* Exported so tests can invoke the dispatch directly with a synthetic diff. Registered with the reactivity primitive at module load (side effect at the bottom
|
|
215
|
+
* of this file) so production settings saves route here automatically.
|
|
216
|
+
* @param changes - The subset of the diff whose path begins with "hdhr.".
|
|
217
|
+
* @returns Per-change outcomes.
|
|
218
|
+
*/
|
|
219
|
+
export async function applyHdhrConfigChanges(changes) {
|
|
220
|
+
const { httpFailed, udpFailed } = await hdhrController.reconcile();
|
|
221
|
+
return changes.map((change) => {
|
|
222
|
+
switch (change.path) {
|
|
223
|
+
case "hdhr.enabled":
|
|
224
|
+
case "hdhr.port": {
|
|
225
|
+
// These fields drive the HTTP surface. A failed bind (port in use) is surfaced as rejected; the concession inside HttpSurface.ensureBound has already
|
|
226
|
+
// kept the prior port alive, so "rejected" accurately means "the change you saved did not take, but the tuner is still running on its previous configuration."
|
|
227
|
+
return httpFailed ?
|
|
228
|
+
{ kind: "rejected", path: change.path, reason: "HDHomeRun could not bind port " + String(CONFIG.hdhr.port) + " (in use); the previous port remains active." } :
|
|
229
|
+
{ kind: "applied", path: change.path };
|
|
230
|
+
}
|
|
231
|
+
case "hdhr.discoveryEnabled": {
|
|
232
|
+
// Drives the UDP surface. udpFailed is only true when discovery was requested (enabled) and the bind failed; turning discovery off cannot fail.
|
|
233
|
+
return udpFailed ?
|
|
234
|
+
{ kind: "rejected", path: change.path, reason: "HDHomeRun LAN discovery could not bind UDP port " + String(HDHR_DISCOVERY_PORT) + " (in use)." } :
|
|
235
|
+
{ kind: "applied", path: change.path };
|
|
236
|
+
}
|
|
237
|
+
case "hdhr.deviceId":
|
|
238
|
+
case "hdhr.friendlyName": {
|
|
239
|
+
// Read live from CONFIG by their consumers (discover.json, the UDP discover reply). The reconcile above needed no surface change for them; the new value
|
|
240
|
+
// propagates on the next request.
|
|
241
|
+
return { kind: "applied", path: change.path };
|
|
242
|
+
}
|
|
243
|
+
default: {
|
|
244
|
+
// An unknown hdhr.* path means a new field was added to HdhrConfig without extending this mapping. Conservatively defer so the operator gets a restart.
|
|
245
|
+
return { kind: "deferred", path: change.path, reason: "no live-apply rule for this HDHomeRun field" };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
});
|
|
79
249
|
}
|
|
250
|
+
// Module-load side effect: register the live-apply handler exactly once per process. ESM modules load at most once per process so this runs deterministically
|
|
251
|
+
// at boot - before app.ts's startHdhrServer call, before any settings save can fire, and before any test interaction. Tests that explicitly reset the registry
|
|
252
|
+
// via resetConfigChangeHandlers() can re-register by calling registerConfigChangeHandler("hdhr.", applyHdhrConfigChanges) themselves; both symbols are
|
|
253
|
+
// exported. Co-locating the registration here (rather than at startHdhrServer call time) keeps registry state and registration state from diverging.
|
|
254
|
+
registerConfigChangeHandler("hdhr.", applyHdhrConfigChanges);
|
|
80
255
|
//# sourceMappingURL=index.js.map
|
package/dist/hdhr/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hdhr/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hdhr/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Nullable } from "../types/index.ts";
|
|
2
|
+
export declare const PACKET_DISCOVER_REQUEST = 2;
|
|
3
|
+
export declare const PACKET_DISCOVER_REPLY = 3;
|
|
4
|
+
export declare const PACKET_GET_REQUEST = 4;
|
|
5
|
+
export declare const PACKET_GET_REPLY = 5;
|
|
6
|
+
export declare const PACKET_UPGRADE_REQUEST = 6;
|
|
7
|
+
export declare const PACKET_UPGRADE_REPLY = 7;
|
|
8
|
+
export declare const TLV_DEVICE_TYPE = 1;
|
|
9
|
+
export declare const TLV_DEVICE_ID = 2;
|
|
10
|
+
export declare const TLV_GETSET_NAME = 3;
|
|
11
|
+
export declare const TLV_GETSET_VALUE = 4;
|
|
12
|
+
export declare const TLV_ERROR = 5;
|
|
13
|
+
export declare const TLV_TUNER_COUNT = 16;
|
|
14
|
+
export declare const TLV_BASE_URL = 42;
|
|
15
|
+
export declare const HDHR_WILDCARD = 4294967295;
|
|
16
|
+
/**
|
|
17
|
+
* Parsed shape of an incoming packet. The discriminated union lets the transport layer route by `type` without re-decoding. `unsupported` covers packet types
|
|
18
|
+
* PrismCast does not handle (the transport layer responds with an error reply).
|
|
19
|
+
*/
|
|
20
|
+
export type ParsedPacket = {
|
|
21
|
+
readonly requestedDeviceId: number;
|
|
22
|
+
readonly requestedDeviceType: number;
|
|
23
|
+
readonly type: "discover";
|
|
24
|
+
} | {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly type: "get";
|
|
27
|
+
} | {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly type: "set";
|
|
30
|
+
readonly value: string;
|
|
31
|
+
} | {
|
|
32
|
+
readonly packetType: number;
|
|
33
|
+
readonly type: "unsupported";
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Fields required to build a Discover reply. The transport layer composes these from CONFIG and the requesting client's network position; the protocol layer
|
|
37
|
+
* only knows how to serialize them.
|
|
38
|
+
*/
|
|
39
|
+
export interface DiscoverReplyFields {
|
|
40
|
+
readonly baseUrl: string;
|
|
41
|
+
readonly deviceId: number;
|
|
42
|
+
readonly deviceType: number;
|
|
43
|
+
readonly tunerCount: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parses an incoming packet. Returns null when the packet is structurally malformed (too short, length mismatch, bad CRC). Otherwise returns the discriminated
|
|
47
|
+
* record describing the packet's intent. Unknown TLVs within a known packet type are silently skipped - the protocol allows extension TLVs that PrismCast does
|
|
48
|
+
* not understand.
|
|
49
|
+
* @param buf - The raw datagram bytes.
|
|
50
|
+
* @returns The parsed packet or null on malformed input.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parsePacket(buf: Buffer): Nullable<ParsedPacket>;
|
|
53
|
+
/**
|
|
54
|
+
* Builds a Discover reply packet. The reply is short enough to fit in a single datagram even with all fields populated; the largest contributor is the base
|
|
55
|
+
* URL string which is typically under 50 bytes.
|
|
56
|
+
* @param fields - The device-identity values to serialize.
|
|
57
|
+
* @returns A complete wire-formatted packet ready to send via socket.send.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildDiscoverReply(fields: DiscoverReplyFields): Buffer;
|
|
60
|
+
/**
|
|
61
|
+
* Builds a Get reply packet carrying a name/value pair. Used when answering a known Get key with a real value.
|
|
62
|
+
* @param name - The Get key being answered (echoed back in the reply).
|
|
63
|
+
* @param value - The value returned for that key.
|
|
64
|
+
* @returns A complete wire-formatted packet.
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildGetReply(name: string, value: string): Buffer;
|
|
67
|
+
/**
|
|
68
|
+
* Builds a Get reply packet carrying an error string. Used when answering a Get for an unknown key or rejecting a Set or Upgrade request. Real HDHomeRun
|
|
69
|
+
* firmware uses "ERROR: ..." prose for the error TLV; we follow the same convention so client error messages remain familiar to operators.
|
|
70
|
+
* @param name - The key being answered (echoed back).
|
|
71
|
+
* @param error - The error string. Should begin with "ERROR: " per HDHR convention.
|
|
72
|
+
* @returns A complete wire-formatted packet.
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildErrorReply(name: string, error: string): Buffer;
|
|
75
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/hdhr/protocol.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOlD,eAAO,MAAM,uBAAuB,IAAS,CAAC;AAC9C,eAAO,MAAM,qBAAqB,IAAS,CAAC;AAC5C,eAAO,MAAM,kBAAkB,IAAS,CAAC;AACzC,eAAO,MAAM,gBAAgB,IAAS,CAAC;AACvC,eAAO,MAAM,sBAAsB,IAAS,CAAC;AAC7C,eAAO,MAAM,oBAAoB,IAAS,CAAC;AAK3C,eAAO,MAAM,eAAe,IAAO,CAAC;AACpC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,eAAe,IAAO,CAAC;AACpC,eAAO,MAAM,gBAAgB,IAAO,CAAC;AACrC,eAAO,MAAM,SAAS,IAAO,CAAC;AAC9B,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,YAAY,KAAO,CAAC;AAGjC,eAAO,MAAM,aAAa,aAAa,CAAC;AAExC;;;GAGG;AACH,MAAM,MAAM,YAAY,GACtB;IAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACvG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAGlC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAwE/D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAatE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnE"}
|