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
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* consent.ts: Automatic consent-overlay and interstitial handling for externally navigated pages in PrismCast.
|
|
4
|
+
*/
|
|
5
|
+
import { LOG, delay, realClock } from "../utils/index.js";
|
|
6
|
+
import { CONFIG } from "../config/index.js";
|
|
7
|
+
/* This module is the single source of truth for getting consent overlays and interstitials out of the way on any page PrismCast navigates on the viewer's behalf -
|
|
8
|
+
* a tune's channel-selection walk and video wait, a discovery or precache walk, a static capture. Each distinct overlay class is handled with its own correct
|
|
9
|
+
* action, because "consent overlay" is not one homogeneous pattern:
|
|
10
|
+
*
|
|
11
|
+
* 1. Cookie-consent CMP banners (Didomi, OneTrust, ...). These are vendor-standardized: every site using a given vendor renders the same markup, so a small,
|
|
12
|
+
* vendor-keyed registry (CMP_REGISTRY) - not a per-site whitelist - covers thousands of sites with a handful of entries. The correct action is to REJECT, which
|
|
13
|
+
* dismisses the banner and is the privacy-protective choice. Adding a vendor is one entry.
|
|
14
|
+
*
|
|
15
|
+
* 2. Embedded-player consent gates. These are the GDPR "2-click embed" / content-blocker pattern: the site refuses to create the third-party player iframe (and
|
|
16
|
+
* send the viewer to the embed provider) until the viewer consents, painting its own placeholder overlay in the meantime. The markup is SITE-BESPOKE (france24's
|
|
17
|
+
* `.o-em-consent`, another site's different class), so there is no global selector - we detect it by SHAPE (a player-blocking overlay whose text matches the
|
|
18
|
+
* 2-click-embed phrasing AND which carries an accept affordance). The correct action is to ACCEPT, since the gated content cannot play otherwise. Because the
|
|
19
|
+
* real player iframe is only created after consent is granted, acceptance is paired with a single page reload by the caller so the player resolves on the second
|
|
20
|
+
* pass (consent persists in the Chrome profile, exactly like a TV-provider login).
|
|
21
|
+
*
|
|
22
|
+
* 3. Per-site intermittent modals (the existing `dismissSelector` mechanism - Paramount+ "Watch Live", c-span, cbs). These are arbitrary, site-specific modals, so
|
|
23
|
+
* they remain per-site configuration rather than a global pattern. They are folded into this one poll so a single mechanism - and a single auto-dismiss logging
|
|
24
|
+
* convention - owns all "click an overlay out of the way" behavior.
|
|
25
|
+
*
|
|
26
|
+
* Which of the permitted actions a given poll may take, and how long it may run, is not a call-site decision: it is declared by an OverlayPhase and read from the
|
|
27
|
+
* PHASE_POLICY table below. The video wait is the only phase that composes with an embed-gate accept - accepting a gate is a page-mutating, reload-triggering action
|
|
28
|
+
* whose only safe home is the caller that owns the reload - so every other phase forbids the accept and never runs the acting gate probe. This keeps the
|
|
29
|
+
* privacy-sensitive auto-accept structurally confined to the one place that can follow through on it, while cookie rejection and per-site modal dismissal run on every
|
|
30
|
+
* navigated surface. Detection stays specific by design: the embed-gate heuristic only fires when its 2-click-embed phrasing matches AND no video is already buffered
|
|
31
|
+
* enough to play (readyState >= HAVE_FUTURE_DATA), so a normal navigation (where nothing blocks the page) never triggers an accept. Where the heuristic cannot resolve
|
|
32
|
+
* a blocking overlay, the caller falls back to detect-and-guide: it surfaces an actionable message telling the viewer to dismiss the prompt once in setup/login mode,
|
|
33
|
+
* instead of a cryptic timeout.
|
|
34
|
+
*/
|
|
35
|
+
// Interval in milliseconds between overlay-handling poll checks. This cadence is responsive enough to catch a late-rendering overlay while keeping each tick cheap.
|
|
36
|
+
const OVERLAY_POLL_INTERVAL = 500;
|
|
37
|
+
// Settle delay in milliseconds after scrolling an element into view, before dispatching a coordinate click. Mirrors the shared scrollAndClick helper's settle so
|
|
38
|
+
// lazy-loaded content and scroll animations finish before the pointer-event chain is dispatched. Named here (matching OVERLAY_POLL_INTERVAL's convention) rather than
|
|
39
|
+
// repeated as a bare literal across every coordinate-click site in this module.
|
|
40
|
+
const SCROLL_SETTLE_DELAY = 200;
|
|
41
|
+
// Source for the accept-affordance match - the visible text or aria-label of a button that grants consent. Kept narrow (no "watch"/"play"/"continue") so a generic
|
|
42
|
+
// media-play or navigation button is never mistaken for a consent accept; the embed-gate container phrasing below is the second, decisive guard. Passed to the
|
|
43
|
+
// browser context as a string because a RegExp cannot cross the page.evaluate boundary. Exported so scanForEmbedGate and its DOM-fixture tests consume one definition
|
|
44
|
+
// of the pattern rather than duplicating it.
|
|
45
|
+
export const ACCEPT_AFFORDANCE_SOURCE = "\\b(accept|agree|allow|enable|consent|got it|i understand|load)\\b";
|
|
46
|
+
// Source for the embedded-player consent-gate phrasing - the "2-click embed" / content-blocker wording a site uses when it withholds a third-party player until the
|
|
47
|
+
// viewer enables tracking. This is the decisive specificity guard: a button is only treated as an embed-gate accept when an ancestor container carries this phrasing.
|
|
48
|
+
// It is deliberately limited to tracking / external-content wording and does NOT include generic "to view this content" phrasing, because that is also how age gates,
|
|
49
|
+
// paywalls, and TV-provider sign-in walls read - and those must never be auto-accepted. Anything outside this narrow shape degrades to detect-and-guide. Exported so
|
|
50
|
+
// scanForEmbedGate and its DOM-fixture tests consume one definition of the pattern rather than duplicating it.
|
|
51
|
+
export const EMBED_GATE_SOURCE = "(enable .{0,40}(tracking|cookies)|advertisement tracking|audience measurement|" +
|
|
52
|
+
"(load|show|display|view|enable) (external|third.?party) content)";
|
|
53
|
+
// Source for the anti-pattern exclusion - phrasing that marks an overlay as a sign-in, subscription, age, or paywall gate rather than a privacy-consent gate. A
|
|
54
|
+
// candidate is skipped when its label or container text matches this, so even a wall that also happens to mention tracking is never auto-accepted; it routes to
|
|
55
|
+
// detect-and-guide instead. Auto-accepting tracking is the privacy-sensitive action, so it is only ever performed on an unambiguous consent overlay. Exported so
|
|
56
|
+
// scanForEmbedGate and its DOM-fixture tests consume one definition of the pattern rather than duplicating it.
|
|
57
|
+
export const EXCLUDE_SOURCE = "\\b(sign[ -]?in|log[ -]?in|subscribe|subscription|paywall|provider|account|18\\+|adults?|age[ -]?gate|years? old|" +
|
|
58
|
+
"must be (18|over|of)|create an? (free )?account)\\b";
|
|
59
|
+
// Selectors whose configured dismissSelector value proved to be an invalid CSS selector, tracked process-wide so the warning about a malformed selector is emitted
|
|
60
|
+
// exactly once per selector no matter how many poll instances encounter it. The per-poll dismiss state gates the action; this set gates the log.
|
|
61
|
+
const warnedInvalidSelectors = new Set();
|
|
62
|
+
/**
|
|
63
|
+
* The per-phase overlay policy. This is the single source of truth for which overlay actions each phase permits AND how long that phase's poll may run. A phase
|
|
64
|
+
* forbids the embed-gate accept unless its reload semantics can follow through on it, so only the video wait sets embedGate true.
|
|
65
|
+
*/
|
|
66
|
+
const PHASE_POLICY = {
|
|
67
|
+
// A discovery or precache walk. Navigation plus a cold-cache guide walk can span far longer than a single page load, so the 60-second window is generous; the
|
|
68
|
+
// helper aborts the poll on walk completion, so the window is the backstop, not the terminator. No embed-gate accept: discovery has no reload to pair with one.
|
|
69
|
+
discovery: { cmpReject: true, dismissSelector: true, embedGate: false, window: 60000 },
|
|
70
|
+
// The reload the video wait performs after accepting an embed gate. Cookie rejection and per-site modal dismissal stay live on the reloaded page, but the gate
|
|
71
|
+
// probe is structurally off: a second acceptance would re-detect unrelated consent overlays elsewhere on the page (carousel tiles on a site like france24), scroll
|
|
72
|
+
// one into view, and yank the main player offscreen. The window tracks the video-wait window (byte-parity with the post-gate second wait).
|
|
73
|
+
postGateReload: { cmpReject: true, dismissSelector: true, embedGate: false, window: "videoTimeout" },
|
|
74
|
+
// A static-page capture. The captured pixels ARE the content, so a dismissal click lands in the capture by design. This phase has no abort owner, so the bounded
|
|
75
|
+
// 30-second load window - long enough for banners to render - is what stops the poll. No embed-gate accept: a static capture never reloads.
|
|
76
|
+
staticCapture: { cmpReject: true, dismissSelector: true, embedGate: false, window: 30000 },
|
|
77
|
+
// A tune's channel-selection walk and click-to-play, before the video wait. The caller aborts this poll at the phase boundary, so the 45-second window is only the
|
|
78
|
+
// backstop. It is a deliberately independent consent-layer value, NOT coupled to setup.ts's playback-initialization race - the two may legitimately diverge, the
|
|
79
|
+
// abort is the terminator and the window the backstop. No embed-gate accept: the walk phase has no reload to pair with one.
|
|
80
|
+
tuneSetup: { cmpReject: true, dismissSelector: true, embedGate: false, window: 45000 },
|
|
81
|
+
// The tune's wait for the player to become ready. The only phase whose reload semantics compose with an embed-gate accept, so the only phase that runs the acting
|
|
82
|
+
// gate probe. The window derives from the profile's videoTimeout at poll start so a late-rendering gate is still caught; the caller's abort stops it the instant
|
|
83
|
+
// the wait settles.
|
|
84
|
+
videoWait: { cmpReject: true, dismissSelector: true, embedGate: true, window: "videoTimeout" }
|
|
85
|
+
};
|
|
86
|
+
/* Compile-time pin: the video wait is the only phase whose policy may accept an embed gate. If a policy edit ever flips a second phase's embedGate to true,
|
|
87
|
+
* EmbedGatePhase widens past "videoWait", the conditional below collapses to `never`, and the assignment of `true` fails to compile - a build error rather than a
|
|
88
|
+
* silent widening of the privacy-sensitive auto-accept surface. The binding is read once at module scope purely so the pin is live code, not a dead type alias.
|
|
89
|
+
*/
|
|
90
|
+
const embedGatePhaseIsVideoWaitOnly = true;
|
|
91
|
+
void embedGatePhaseIsVideoWaitOnly;
|
|
92
|
+
/**
|
|
93
|
+
* Vendor-keyed registry of known cookie-consent CMPs. This is NOT a per-site whitelist - each entry covers every site that embeds the vendor. Seeded with Didomi,
|
|
94
|
+
* whose reject selector was verified live (france24); additional vendors (OneTrust, Cookiebot, ...) are added here as their reject selectors are verified. Exported so
|
|
95
|
+
* the DOM-fixture tests build a banner fixture from the same detect and reject selectors the poll uses, rather than duplicating the vendor's markers into the test.
|
|
96
|
+
*/
|
|
97
|
+
export const CMP_REGISTRY = [
|
|
98
|
+
{ detect: ".didomi-popup-notice, #didomi-host", reject: "#didomi-notice-disagree-button", vendor: "Didomi" }
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* Emits the unified auto-dismiss log line. Every path that automatically acts on an overlay - CMP reject, embed-gate accept, per-site modal dismiss, and the Comcast
|
|
102
|
+
* "Watch Now" modal - routes through here so the behavior is reported consistently at INFO with the same voice, plus a verbose DEBUG companion under the
|
|
103
|
+
* browser:consent category. This is the single source of truth for "we interacted with an on-page prompt on the viewer's behalf" reporting.
|
|
104
|
+
* @param kind - Which overlay class was handled.
|
|
105
|
+
* @param detail - Identifying detail for the overlay (vendor, selector, or label).
|
|
106
|
+
*/
|
|
107
|
+
export function logAutoDismiss(kind, detail = {}) {
|
|
108
|
+
switch (kind) {
|
|
109
|
+
case "cookie-consent": {
|
|
110
|
+
LOG.info("Automatically rejected the %s cookie-consent prompt.", detail.vendor ?? "site");
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "embed-gate": {
|
|
114
|
+
LOG.info("Automatically accepted an embedded-player consent prompt so the video could load.");
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "modal": {
|
|
118
|
+
LOG.info("Automatically dismissed an interstitial modal.");
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
LOG.debug("browser:consent", "Auto-dismiss detail: kind=%s, vendor=%s, selector=%s, label=%s.", kind, detail.vendor ?? "-", detail.selector ?? "-", detail.label ?? "-");
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* In-page coordinate resolver for a selector-identified element. Returns the viewport-center coordinates of the element after scrolling it into view, or null when the
|
|
126
|
+
* element is absent or has zero layout size (display:none, an unlaid-out node) and therefore cannot be coordinate-clicked. This is the read half of
|
|
127
|
+
* clickSelectorByCoordinate: it resolves where to click, and the Node-side caller dispatches the real pointer-event chain at those coordinates.
|
|
128
|
+
*
|
|
129
|
+
* This function crosses the page.evaluate boundary by source serialization, so it is self-contained: it references only its argument and the page's document global,
|
|
130
|
+
* with every input a parameter and zero outer-scope references - a captured variable would be undefined once the function is stringified into the page. Exported so
|
|
131
|
+
* unit tests can run it against a synthetic DOM.
|
|
132
|
+
* @param sel - The CSS selector for the element to locate.
|
|
133
|
+
* @returns The element's post-scroll viewport-center coordinates, or null when it is absent or has zero layout size.
|
|
134
|
+
*/
|
|
135
|
+
export function locateSelectorCoordinate(sel) {
|
|
136
|
+
const el = document.querySelector(sel);
|
|
137
|
+
if (!el) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const rect = el.getBoundingClientRect();
|
|
141
|
+
// A present-but-unlaid-out element (display:none, zero size) cannot be coordinate-clicked; skip it and let the caller poll again.
|
|
142
|
+
if ((rect.width === 0) || (rect.height === 0)) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
el.scrollIntoView({ block: "center" });
|
|
146
|
+
const scrolled = el.getBoundingClientRect();
|
|
147
|
+
return { x: scrolled.x + (scrolled.width / 2), y: scrolled.y + (scrolled.height / 2) };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Clicks an element identified by a CSS selector using a real coordinate mouse click, if the element is present and laid out. Coordinate clicking generates the
|
|
151
|
+
* full pointer event chain, which consent buttons in SPA frameworks require to register (a synthetic element.click() is silently dropped by some, as observed on
|
|
152
|
+
* the embed-gate accept button). Returns false when the element is absent or has zero layout size, so callers can keep polling.
|
|
153
|
+
* @param page - The Puppeteer page.
|
|
154
|
+
* @param selector - The CSS selector for the element to click.
|
|
155
|
+
* @returns True if the element was found and clicked.
|
|
156
|
+
*/
|
|
157
|
+
async function clickSelectorByCoordinate(page, selector) {
|
|
158
|
+
const target = await page.evaluate(locateSelectorCoordinate, selector);
|
|
159
|
+
if (!target) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
// Brief settle delay after scrolling, mirroring the shared scrollAndClick helper, before dispatching the real pointer-event chain. This paces real page physics
|
|
163
|
+
// inside an action and is exercised only when a click actually dispatches, so it stays on delay() rather than the injected poll clock.
|
|
164
|
+
await delay(SCROLL_SETTLE_DELAY);
|
|
165
|
+
await page.mouse.click(target.x, target.y);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* In-page synthetic click for a selector-identified element. Guards its querySelector so a malformed selector is reported as "invalid-selector" rather than throwing
|
|
170
|
+
* and killing the poll tick. Reports "clicked" when the element is found and clicked, and "absent" when a valid selector matches nothing this tick.
|
|
171
|
+
*
|
|
172
|
+
* This function crosses the page.evaluate boundary by source serialization, so it is self-contained: it references only its argument and the page's document global,
|
|
173
|
+
* with every input a parameter and zero outer-scope references - a captured variable would be undefined once the function is stringified into the page. Exported so
|
|
174
|
+
* unit tests can run it against a synthetic DOM.
|
|
175
|
+
* @param sel - The CSS selector for the element to dismiss.
|
|
176
|
+
* @returns "clicked" when the element was found and clicked, "absent" when the valid selector matched nothing, "invalid-selector" when the selector is malformed.
|
|
177
|
+
*/
|
|
178
|
+
export function clickSelectorInPage(sel) {
|
|
179
|
+
let el;
|
|
180
|
+
try {
|
|
181
|
+
el = document.querySelector(sel);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// querySelector throws a SyntaxError on a malformed selector. Report it so the caller disables just this action rather than stopping the whole poll.
|
|
185
|
+
return "invalid-selector";
|
|
186
|
+
}
|
|
187
|
+
if (el) {
|
|
188
|
+
el.click();
|
|
189
|
+
return "clicked";
|
|
190
|
+
}
|
|
191
|
+
return "absent";
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Attempts to dismiss the profile's per-site modal with a synthetic in-page click. The per-site dismissSelector modals (Paramount+ "Watch Live", c-span, cbs) are
|
|
195
|
+
* reliably dismissed by synthetic clicks, so coordinate clicking is reserved for the consent paths that require it. The in-page function guards its querySelector so
|
|
196
|
+
* a malformed selector is reported as "invalid-selector" rather than throwing and killing the tick.
|
|
197
|
+
* @param page - The Puppeteer page.
|
|
198
|
+
* @param selector - The CSS selector for the modal element to dismiss.
|
|
199
|
+
* @returns "clicked" when the element was found and clicked, "absent" when the valid selector matched nothing, "invalid-selector" when the selector is malformed.
|
|
200
|
+
*/
|
|
201
|
+
async function clickSelectorSynthetic(page, selector) {
|
|
202
|
+
return page.evaluate(clickSelectorInPage, selector);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* In-page embed-gate scanner. Recognizes an embedded-player consent gate by shape: a button, a button-role element, or an anchor whose label matches the accept
|
|
206
|
+
* affordance AND whose ancestor container (within a bounded depth) carries the 2-click-embed phrasing, excluding sign-in/paywall/age walls. Early-outs to null when a
|
|
207
|
+
* video is already buffered for playback, so it never fires on a page that is succeeding without an overlay. The act flag splits detection from action: act false
|
|
208
|
+
* reports presence and label only, touching nothing; act true scrolls the matched control into view and returns its viewport-center coordinates for a real click.
|
|
209
|
+
*
|
|
210
|
+
* This function crosses the page.evaluate boundary by source serialization, so it is self-contained: it references only its argument and the page's document global,
|
|
211
|
+
* with every input a parameter - the accept, exclude, and gate regex SOURCES (a RegExp cannot cross the boundary, so they arrive as strings and are compiled here)
|
|
212
|
+
* and the act flag - and zero outer-scope references, since a captured variable would be undefined once the function is stringified into the page. Exported so unit
|
|
213
|
+
* tests can run it against a synthetic DOM.
|
|
214
|
+
* @param args - The accept-affordance, exclude, and embed-gate phrasing regex sources, plus the act flag.
|
|
215
|
+
* @returns The gate's label (and, on the acting path, its post-scroll center coordinates), or null when no gate is detected.
|
|
216
|
+
*/
|
|
217
|
+
export function scanForEmbedGate(args) {
|
|
218
|
+
// If a video element is already buffered for playback, the page is not blocked by a consent gate; do not act.
|
|
219
|
+
const existing = document.querySelector("video");
|
|
220
|
+
if (existing && (existing.readyState >= 3)) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const acceptRe = new RegExp(args.accept, "i");
|
|
224
|
+
const excludeRe = new RegExp(args.exclude, "i");
|
|
225
|
+
const gateRe = new RegExp(args.gate, "i");
|
|
226
|
+
const candidates = Array.from(document.querySelectorAll("button, [role=\"button\"], a"));
|
|
227
|
+
for (const candidate of candidates) {
|
|
228
|
+
const label = (candidate.textContent + " " + (candidate.getAttribute("aria-label") ?? "")).trim();
|
|
229
|
+
if (!acceptRe.test(label)) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// Walk up a bounded number of ancestors looking for the container that carries the 2-click-embed phrasing. The bound is deep enough to reach the typical
|
|
233
|
+
// wrapper nesting seen on embed-gate sites (verified against france24's markup), shallow enough to avoid matching the whole document body, which would
|
|
234
|
+
// defeat the specificity guard.
|
|
235
|
+
let node = candidate.parentElement;
|
|
236
|
+
let containerText = "";
|
|
237
|
+
for (let depth = 0; node && (depth < 6); depth++) {
|
|
238
|
+
if (gateRe.test(node.textContent)) {
|
|
239
|
+
containerText = node.textContent;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
node = node.parentElement;
|
|
243
|
+
}
|
|
244
|
+
if (!containerText) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
// Skip sign-in, subscription, age, and paywall walls even when they happen to mention tracking. Auto-accepting tracking is the privacy-sensitive action and is
|
|
248
|
+
// only ever performed on an unambiguous consent overlay; an ambiguous wall routes to detect-and-guide instead.
|
|
249
|
+
if (excludeRe.test(label) || excludeRe.test(containerText)) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
const rect = candidate.getBoundingClientRect();
|
|
253
|
+
if ((rect.width === 0) || (rect.height === 0)) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// Read-only probe: report presence and label without touching the page. The acting path scrolls the control into view and returns post-scroll coordinates.
|
|
257
|
+
if (!args.act) {
|
|
258
|
+
return { label: label.slice(0, 80) };
|
|
259
|
+
}
|
|
260
|
+
candidate.scrollIntoView({ block: "center" });
|
|
261
|
+
const scrolled = candidate.getBoundingClientRect();
|
|
262
|
+
return { label: label.slice(0, 80), x: scrolled.x + (scrolled.width / 2), y: scrolled.y + (scrolled.height / 2) };
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
async function locateEmbedGate(page, act) {
|
|
267
|
+
return page.evaluate(scanForEmbedGate, { accept: ACCEPT_AFFORDANCE_SOURCE, act, exclude: EXCLUDE_SOURCE, gate: EMBED_GATE_SOURCE });
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Reports whether a consent or cookie prompt is currently present on the page. Used on the failure path to decide whether to replace a cryptic video-selector
|
|
271
|
+
* timeout with actionable detect-and-guide messaging. A prompt is "present" when a known CMP banner is detected or an embedded-player consent gate is located. The
|
|
272
|
+
* gate probe runs in read-only mode, so this detection never scrolls or clicks the page it is classifying.
|
|
273
|
+
* @param page - The Puppeteer page.
|
|
274
|
+
* @returns True if a consent overlay is present.
|
|
275
|
+
*/
|
|
276
|
+
export async function consentOverlayPresent(page) {
|
|
277
|
+
try {
|
|
278
|
+
const cmpPresent = await page.evaluate((selectors) => {
|
|
279
|
+
return selectors.some((sel) => document.querySelector(sel) !== null);
|
|
280
|
+
}, CMP_REGISTRY.map((vendor) => vendor.detect));
|
|
281
|
+
if (cmpPresent) {
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
return (await locateEmbedGate(page, false)) !== null;
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// The page navigated or closed while probing; treat as no detectable overlay.
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Runs a single overlay-handling poll tick, taking exactly the actions the acting phase's policy permits: reject any known CMP cookie banner, accept an embedded-
|
|
293
|
+
* player consent gate (terminal, videoWait only), then dismiss a per-site modal. Ordering matters - the embed gate often only becomes interactable after the cookie
|
|
294
|
+
* banner above it is dismissed, so the CMP reject runs first each tick. The signal is checked between action groups so an in-flight tick cannot keep acting after the
|
|
295
|
+
* caller has handed the page to the next phase.
|
|
296
|
+
* @param page - The Puppeteer page.
|
|
297
|
+
* @param profile - The resolved site profile (supplies the optional per-site dismissSelector).
|
|
298
|
+
* @param options - The acting phase's policy, the abort signal, and the mutable per-poll state. See OverlayTickOptions.
|
|
299
|
+
* @returns The tick outcome - "gate" when an embed gate was accepted, "stop" when the poll should end, otherwise "continue".
|
|
300
|
+
*/
|
|
301
|
+
async function runOverlayTick(page, profile, options) {
|
|
302
|
+
const { policy, signal, state } = options;
|
|
303
|
+
try {
|
|
304
|
+
// Reject any known cookie-consent banner, when the phase permits it. Each vendor is acted on at most once.
|
|
305
|
+
if (policy.cmpReject) {
|
|
306
|
+
for (const vendor of CMP_REGISTRY) {
|
|
307
|
+
if (state.handledVendors.has(vendor.vendor)) {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
// eslint-disable-next-line no-await-in-loop
|
|
311
|
+
const rejected = await clickSelectorByCoordinate(page, vendor.reject);
|
|
312
|
+
if (rejected) {
|
|
313
|
+
state.handledVendors.add(vendor.vendor);
|
|
314
|
+
logAutoDismiss("cookie-consent", { selector: vendor.reject, vendor: vendor.vendor });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Stop acting the instant the caller aborts, so an outgoing poll's in-flight tick cannot double-act against the next phase's poll.
|
|
319
|
+
if (signal?.aborted) {
|
|
320
|
+
return "stop";
|
|
321
|
+
}
|
|
322
|
+
// Accept an embedded-player consent gate, when the phase permits it. This is terminal: the player iframe is only created after consent, so the caller must reload
|
|
323
|
+
// to resolve the video. Only the video wait reaches here - every other phase's policy forbids the accept, so the acting gate probe never runs for them.
|
|
324
|
+
if (policy.embedGate) {
|
|
325
|
+
const gate = await locateEmbedGate(page, true);
|
|
326
|
+
if (gate) {
|
|
327
|
+
// The settle after locateEmbedGate's scroll paces real page physics inside an action, exercised only when an accept actually dispatches - so it stays on
|
|
328
|
+
// delay() rather than the injected poll clock, exactly like the coordinate-click settle.
|
|
329
|
+
await delay(SCROLL_SETTLE_DELAY);
|
|
330
|
+
await page.mouse.click(gate.x, gate.y);
|
|
331
|
+
logAutoDismiss("embed-gate", { label: gate.label });
|
|
332
|
+
return "gate";
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (signal?.aborted) {
|
|
336
|
+
return "stop";
|
|
337
|
+
}
|
|
338
|
+
// Dismiss the profile's per-site intermittent modal, if configured, armed, and permitted, using a synthetic click. A malformed selector disables just this
|
|
339
|
+
// action for the rest of the poll (and warns once per selector per process); an absent element keeps the action armed for a later tick.
|
|
340
|
+
if (policy.dismissSelector && profile.dismissSelector && (state.dismissSelector === "armed")) {
|
|
341
|
+
const result = await clickSelectorSynthetic(page, profile.dismissSelector);
|
|
342
|
+
switch (result) {
|
|
343
|
+
case "absent": {
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
case "clicked": {
|
|
347
|
+
state.dismissSelector = "done";
|
|
348
|
+
logAutoDismiss("modal", { selector: profile.dismissSelector });
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
case "invalid-selector": {
|
|
352
|
+
state.dismissSelector = "disabled";
|
|
353
|
+
if (!warnedInvalidSelectors.has(profile.dismissSelector)) {
|
|
354
|
+
warnedInvalidSelectors.add(profile.dismissSelector);
|
|
355
|
+
LOG.warn("The configured dismiss selector is not a valid CSS selector and will be ignored.", { selector: profile.dismissSelector });
|
|
356
|
+
}
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return "continue";
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
// Tick-error taxonomy: a closed page or a disconnected browser is terminal, so the poll stops. Any other rejection - most commonly a destroyed execution context
|
|
365
|
+
// from an in-walk navigation, which is transient - lets the poll survive and try again on the next tick.
|
|
366
|
+
return (page.isClosed() || !page.browser().connected) ? "stop" : "continue";
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Launches the fire-and-forget overlay-handling poll for one phase of a page's lifecycle. Runs concurrently with whatever the phase covers, never blocks it, and
|
|
371
|
+
* never throws - it is the single mechanism that rejects known cookie banners, accepts embedded-player consent gates (video wait only), and dismisses per-site
|
|
372
|
+
* modals on any externally navigated page. The phase declares which of those actions are safe and how long the poll may run; the caller's abort signal stops it as
|
|
373
|
+
* soon as its phase settles.
|
|
374
|
+
*
|
|
375
|
+
* When an embedded-player consent gate is accepted (only reachable in the videoWait phase), onEmbedGateAccepted() is invoked and the poll stops, because the gate's
|
|
376
|
+
* acceptance only takes effect on a fresh load - the caller abandons the in-flight wait and reloads.
|
|
377
|
+
* @param page - The Puppeteer page.
|
|
378
|
+
* @param profile - The resolved site profile.
|
|
379
|
+
* @param options - The phase, an optional clock and abort signal, and (videoWait only) the embed-gate callback. See StartOverlayHandlingOptions.
|
|
380
|
+
*/
|
|
381
|
+
export async function startOverlayHandling(page, profile, options) {
|
|
382
|
+
const { clock = realClock, phase, signal } = options;
|
|
383
|
+
// Capture the gate callback once, while the union is narrowed: only the videoWait arm carries it. Every other phase forbids the accept, so the tick never returns
|
|
384
|
+
// "gate" for them and this stays undefined.
|
|
385
|
+
const onGate = (options.phase === "videoWait") ? options.onEmbedGateAccepted : undefined;
|
|
386
|
+
const policy = PHASE_POLICY[phase];
|
|
387
|
+
const state = { dismissSelector: "armed", handledVendors: new Set() };
|
|
388
|
+
// Resolve the poll window from the phase's policy: a fixed millisecond budget, or the profile-derived video-wait window for the phases whose timing tracks the
|
|
389
|
+
// wait. One time origin end to end (clock.now() for both the deadline and the loop condition), because realClock.now() is performance.now()-based - a half-migration
|
|
390
|
+
// that mixed it with Date.now() would invert the loop condition and zero-tick every poll.
|
|
391
|
+
const windowMs = (policy.window === "videoTimeout") ? (profile.videoTimeout ?? CONFIG.streaming.videoTimeout) : policy.window;
|
|
392
|
+
const deadline = clock.now() + windowMs;
|
|
393
|
+
let firstCheck = true;
|
|
394
|
+
while (clock.now() < deadline) {
|
|
395
|
+
if (signal?.aborted) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
// The first check is immediate; subsequent checks are spaced by the poll interval.
|
|
399
|
+
if (!firstCheck) {
|
|
400
|
+
// eslint-disable-next-line no-await-in-loop
|
|
401
|
+
await clock.sleep(OVERLAY_POLL_INTERVAL);
|
|
402
|
+
if (signal?.aborted) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
firstCheck = false;
|
|
407
|
+
// eslint-disable-next-line no-await-in-loop
|
|
408
|
+
const result = await runOverlayTick(page, profile, { policy, signal, state });
|
|
409
|
+
if (result === "gate") {
|
|
410
|
+
onGate?.();
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (result === "stop") {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../../src/browser/consent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/browser/display.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAiBlD;;GAEG;AACH,MAAM,WAAW,eAAe;IAG9B,mBAAmB,EAAE,OAAO,CAAC;IAG7B,oBAAoB,EAAE,OAAO,CAAC;IAG9B,oBAAoB,EAAE,OAAO,CAAC;IAG9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAWD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAGrF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAG9E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,CAGtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAAC,eAAe,CAAC,CAG9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Nullable } from "../types/index.ts";
|
|
2
|
+
import type { Page } from "puppeteer-core";
|
|
3
|
+
/**
|
|
4
|
+
* A recognized HLS playlist observed by the tab, delivered as a discriminated union on kind so master-only and media-only facts each live on the arm that owns
|
|
5
|
+
* them. Every arm carries the URL the player loaded and the wire-arrival sequence; the master arm adds its declared child playlist URLs, the media arm its
|
|
6
|
+
* liveness. Unknown bodies (no `#EXT-X-STREAM-INF` and no `#EXTINF`/`#EXT-X-TARGETDURATION`) are never delivered.
|
|
7
|
+
*/
|
|
8
|
+
export type ObservedHlsPlaylist = ObservedHlsMasterPlaylist | ObservedHlsMediaPlaylist;
|
|
9
|
+
/**
|
|
10
|
+
* The master (multivariant) arm of ObservedHlsPlaylist, delivered for a body carrying `#EXT-X-STREAM-INF`.
|
|
11
|
+
*/
|
|
12
|
+
export interface ObservedHlsMasterPlaylist {
|
|
13
|
+
readonly childUrls: readonly string[];
|
|
14
|
+
readonly kind: "master";
|
|
15
|
+
readonly sequence: number;
|
|
16
|
+
readonly url: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The media (segment) arm of ObservedHlsPlaylist, delivered for a body carrying `#EXTINF` / `#EXT-X-TARGETDURATION`.
|
|
20
|
+
*/
|
|
21
|
+
export interface ObservedHlsMediaPlaylist {
|
|
22
|
+
readonly kind: "media";
|
|
23
|
+
readonly live: boolean;
|
|
24
|
+
readonly sequence: number;
|
|
25
|
+
readonly url: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Options accepted by observeHlsPlaylists(). The callback fires once per unique HLS playlist URL observed during the observer's lifetime.
|
|
29
|
+
*/
|
|
30
|
+
export interface HlsPlaylistObserverOptions {
|
|
31
|
+
readonly logCategory: string;
|
|
32
|
+
readonly onPlaylist: (playlist: ObservedHlsPlaylist) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Handle returned by observeHlsPlaylists(). Implements both the project's dispose() convention and TC39 Symbol.dispose so callers may use either an explicit
|
|
36
|
+
* dispose() call or the "using" keyword. Disposal is safe to call more than once and tears down the underlying tab network observer.
|
|
37
|
+
*/
|
|
38
|
+
export interface HlsPlaylistObserver extends Disposable {
|
|
39
|
+
readonly currentSequence: () => number;
|
|
40
|
+
readonly dispose: () => void;
|
|
41
|
+
readonly [Symbol.dispose]: () => void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Installs an HLS playlist observer on the given page. The callback fires once per unique recognized HLS playlist URL observed across the tab's entire target
|
|
45
|
+
* tree (top frame, iframes including OOPIFs, workers, service workers). The OOPIF-aware transport is provided by tabNetworkObserver underneath; this observer
|
|
46
|
+
* adds the HLS-specific filter, body fetch, classification dispatch, and per-URL dedup.
|
|
47
|
+
*
|
|
48
|
+
* Returns null when the underlying tab network observer could not be installed (page closed, root CDP session creation failed).
|
|
49
|
+
*
|
|
50
|
+
* @param page - The puppeteer page to observe.
|
|
51
|
+
* @param options - Observer options including the playlist callback and the debug log category.
|
|
52
|
+
* @returns The observer handle, or null if installation failed.
|
|
53
|
+
*/
|
|
54
|
+
export declare function observeHlsPlaylists(page: Page, options: HlsPlaylistObserverOptions): Promise<Nullable<HlsPlaylistObserver>>;
|
|
55
|
+
//# sourceMappingURL=hlsPlaylistObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hlsPlaylistObserver.d.ts","sourceRoot":"","sources":["../../src/browser/hlsPlaylistObserver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA8B3C;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,GAAG,wBAAwB,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,yBAAyB;IAGxC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAGtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAGxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAGvC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAIzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAG7B,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC9D;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IAIrD,QAAQ,CAAC,eAAe,EAAE,MAAM,MAAM,CAAC;IAGvC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAG7B,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAgIjI"}
|