prismcast 1.12.0 → 1.13.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.
Files changed (631) hide show
  1. package/dist/app.d.ts +41 -1
  2. package/dist/app.js +164 -76
  3. package/dist/app.js.map +1 -1
  4. package/dist/browser/blockedPage.d.ts +0 -1
  5. package/dist/browser/browserSupervisor.d.ts +34 -5
  6. package/dist/browser/browserSupervisor.js +39 -12
  7. package/dist/browser/browserSupervisor.js.map +1 -1
  8. package/dist/browser/cdp.d.ts +58 -6
  9. package/dist/browser/cdp.js +147 -9
  10. package/dist/browser/cdp.js.map +1 -1
  11. package/dist/browser/channelSelection.d.ts +18 -6
  12. package/dist/browser/channelSelection.js +47 -36
  13. package/dist/browser/channelSelection.js.map +1 -1
  14. package/dist/browser/consent.d.ts +33 -4
  15. package/dist/browser/consent.js +87 -50
  16. package/dist/browser/consent.js.map +1 -1
  17. package/dist/browser/display.d.ts +0 -1
  18. package/dist/browser/hlsPlaylistObserver.d.ts +3 -2
  19. package/dist/browser/hlsPlaylistObserver.js +11 -6
  20. package/dist/browser/hlsPlaylistObserver.js.map +1 -1
  21. package/dist/browser/index.d.ts +273 -59
  22. package/dist/browser/index.js +768 -255
  23. package/dist/browser/index.js.map +1 -1
  24. package/dist/browser/launchGovernor.d.ts +0 -1
  25. package/dist/browser/login.d.ts +11 -10
  26. package/dist/browser/login.js +42 -33
  27. package/dist/browser/login.js.map +1 -1
  28. package/dist/browser/manifestInterceptor.d.ts +14 -5
  29. package/dist/browser/manifestInterceptor.js +26 -13
  30. package/dist/browser/manifestInterceptor.js.map +1 -1
  31. package/dist/browser/navigation.d.ts +28 -0
  32. package/dist/browser/navigation.js +57 -0
  33. package/dist/browser/navigation.js.map +1 -0
  34. package/dist/browser/pageStaleness.d.ts +1 -2
  35. package/dist/browser/pageStaleness.js +9 -9
  36. package/dist/browser/pageStaleness.js.map +1 -1
  37. package/dist/browser/precaching.d.ts +27 -13
  38. package/dist/browser/precaching.js +219 -73
  39. package/dist/browser/precaching.js.map +1 -1
  40. package/dist/browser/tabCapture.d.ts +97 -0
  41. package/dist/browser/tabCapture.js +314 -0
  42. package/dist/browser/tabCapture.js.map +1 -0
  43. package/dist/browser/tabNetworkObserver.d.ts +0 -1
  44. package/dist/browser/tabSelection.d.ts +117 -0
  45. package/dist/browser/tabSelection.js +547 -0
  46. package/dist/browser/tabSelection.js.map +1 -0
  47. package/dist/browser/tuning/cache.d.ts +0 -1
  48. package/dist/browser/tuning/comcastPolymer.d.ts +0 -1
  49. package/dist/browser/tuning/comcastPolymer.js +18 -19
  50. package/dist/browser/tuning/comcastPolymer.js.map +1 -1
  51. package/dist/browser/tuning/cox.d.ts +0 -1
  52. package/dist/browser/tuning/directv.d.ts +0 -1
  53. package/dist/browser/tuning/directv.js +12 -13
  54. package/dist/browser/tuning/directv.js.map +1 -1
  55. package/dist/browser/tuning/fox.d.ts +0 -1
  56. package/dist/browser/tuning/fox.js +2 -2
  57. package/dist/browser/tuning/fox.js.map +1 -1
  58. package/dist/browser/tuning/gridSearch.d.ts +0 -1
  59. package/dist/browser/tuning/hbo.d.ts +0 -1
  60. package/dist/browser/tuning/hbo.js +2 -2
  61. package/dist/browser/tuning/hbo.js.map +1 -1
  62. package/dist/browser/tuning/hulu.d.ts +14 -2
  63. package/dist/browser/tuning/hulu.js +150 -24
  64. package/dist/browser/tuning/hulu.js.map +1 -1
  65. package/dist/browser/tuning/shared.d.ts +1 -2
  66. package/dist/browser/tuning/shared.js +1 -1
  67. package/dist/browser/tuning/sling.d.ts +0 -1
  68. package/dist/browser/tuning/sling.js +17 -22
  69. package/dist/browser/tuning/sling.js.map +1 -1
  70. package/dist/browser/tuning/spectrum.d.ts +0 -1
  71. package/dist/browser/tuning/thumbnailRow.d.ts +0 -1
  72. package/dist/browser/tuning/tileClick.d.ts +0 -1
  73. package/dist/browser/tuning/xfinity.d.ts +0 -1
  74. package/dist/browser/tuning/youtubeTv.d.ts +0 -1
  75. package/dist/browser/tuning/youtubeTv.js +1 -2
  76. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  77. package/dist/browser/video.d.ts +55 -33
  78. package/dist/browser/video.js +213 -169
  79. package/dist/browser/video.js.map +1 -1
  80. package/dist/browser/windowSync.d.ts +45 -0
  81. package/dist/browser/windowSync.js +153 -0
  82. package/dist/browser/windowSync.js.map +1 -0
  83. package/dist/channels/index.d.ts +7 -1
  84. package/dist/channels/index.js +24 -8
  85. package/dist/channels/index.js.map +1 -1
  86. package/dist/config/channelForm.d.ts +0 -1
  87. package/dist/config/channelIdentity.d.ts +27 -0
  88. package/dist/config/channelIdentity.js +72 -0
  89. package/dist/config/channelIdentity.js.map +1 -0
  90. package/dist/config/channelSort.d.ts +25 -0
  91. package/dist/config/channelSort.js +101 -0
  92. package/dist/config/channelSort.js.map +1 -0
  93. package/dist/config/consistencyProbe.d.ts +0 -1
  94. package/dist/config/consistencyProbe.js +1 -1
  95. package/dist/config/consistencyProbe.js.map +1 -1
  96. package/dist/config/health.d.ts +3 -2
  97. package/dist/config/health.js +41 -31
  98. package/dist/config/health.js.map +1 -1
  99. package/dist/config/index.d.ts +12 -1
  100. package/dist/config/index.js +77 -31
  101. package/dist/config/index.js.map +1 -1
  102. package/dist/config/paths.d.ts +17 -2
  103. package/dist/config/paths.js +21 -1
  104. package/dist/config/paths.js.map +1 -1
  105. package/dist/config/persistence.context.d.ts +0 -1
  106. package/dist/config/persistence.d.ts +8 -4
  107. package/dist/config/persistence.js +143 -82
  108. package/dist/config/persistence.js.map +1 -1
  109. package/dist/config/presets.d.ts +0 -1
  110. package/dist/config/profiles.d.ts +9 -4
  111. package/dist/config/profiles.js +39 -6
  112. package/dist/config/profiles.js.map +1 -1
  113. package/dist/config/providerLineups.d.ts +0 -1
  114. package/dist/config/providerLineups.js +0 -3
  115. package/dist/config/providerLineups.js.map +1 -1
  116. package/dist/config/reactivity.d.ts +0 -1
  117. package/dist/config/servicePacks.d.ts +0 -1
  118. package/dist/config/services.d.ts +1 -47
  119. package/dist/config/services.js +4 -135
  120. package/dist/config/services.js.map +1 -1
  121. package/dist/config/sites.d.ts +0 -9
  122. package/dist/config/sites.js +82 -98
  123. package/dist/config/sites.js.map +1 -1
  124. package/dist/config/userChannels.d.ts +22 -29
  125. package/dist/config/userChannels.js +47 -65
  126. package/dist/config/userChannels.js.map +1 -1
  127. package/dist/config/userConfig.d.ts +19 -4
  128. package/dist/config/userConfig.js +123 -25
  129. package/dist/config/userConfig.js.map +1 -1
  130. package/dist/config/userProfiles.d.ts +2 -3
  131. package/dist/config/userProfiles.js +16 -13
  132. package/dist/config/userProfiles.js.map +1 -1
  133. package/dist/hdhr/channelMap.d.ts +0 -1
  134. package/dist/hdhr/deviceId.d.ts +0 -1
  135. package/dist/hdhr/discover.d.ts +0 -1
  136. package/dist/hdhr/getHandlers.d.ts +0 -1
  137. package/dist/hdhr/identity.d.ts +0 -1
  138. package/dist/hdhr/index.d.ts +0 -1
  139. package/dist/hdhr/protocol.d.ts +1 -2
  140. package/dist/hdhr/protocol.js +1 -1
  141. package/dist/hdhr/tunerState.d.ts +0 -1
  142. package/dist/hdhr/udp.d.ts +0 -1
  143. package/dist/hdhr/udp.js +16 -4
  144. package/dist/hdhr/udp.js.map +1 -1
  145. package/dist/identity.d.ts +0 -1
  146. package/dist/index.d.ts +0 -1
  147. package/dist/index.js +10 -3
  148. package/dist/index.js.map +1 -1
  149. package/dist/native/codecInference.d.ts +5 -4
  150. package/dist/native/codecInference.js +12 -7
  151. package/dist/native/codecInference.js.map +1 -1
  152. package/dist/native/decrypt.d.ts +10 -3
  153. package/dist/native/decrypt.js +9 -5
  154. package/dist/native/decrypt.js.map +1 -1
  155. package/dist/native/index.d.ts +26 -24
  156. package/dist/native/index.js +26 -20
  157. package/dist/native/index.js.map +1 -1
  158. package/dist/native/probe.d.ts +7 -10
  159. package/dist/native/probe.js +41 -37
  160. package/dist/native/probe.js.map +1 -1
  161. package/dist/native/proxy.d.ts +3 -4
  162. package/dist/native/proxy.js +91 -69
  163. package/dist/native/proxy.js.map +1 -1
  164. package/dist/native/tokenExpiry.d.ts +0 -1
  165. package/dist/routes/assets.d.ts +0 -1
  166. package/dist/routes/auth.d.ts +0 -1
  167. package/dist/routes/auth.js +1 -1
  168. package/dist/routes/auth.js.map +1 -1
  169. package/dist/routes/cdp.d.ts +11 -5
  170. package/dist/routes/cdp.js +91 -63
  171. package/dist/routes/cdp.js.map +1 -1
  172. package/dist/routes/channels.d.ts +0 -1
  173. package/dist/routes/clientActions.d.ts +0 -1
  174. package/dist/routes/components.d.ts +0 -1
  175. package/dist/routes/config/channels/endpoints/browse.d.ts +0 -1
  176. package/dist/routes/config/channels/endpoints/bulk.d.ts +0 -1
  177. package/dist/routes/config/channels/endpoints/bulk.js +3 -3
  178. package/dist/routes/config/channels/endpoints/bulk.js.map +1 -1
  179. package/dist/routes/config/channels/endpoints/crud.d.ts +0 -1
  180. package/dist/routes/config/channels/endpoints/crud.js +4 -3
  181. package/dist/routes/config/channels/endpoints/crud.js.map +1 -1
  182. package/dist/routes/config/channels/endpoints/importExport.d.ts +0 -1
  183. package/dist/routes/config/channels/endpoints/importExport.js +7 -3
  184. package/dist/routes/config/channels/endpoints/importExport.js.map +1 -1
  185. package/dist/routes/config/channels/endpoints/predefined.d.ts +0 -1
  186. package/dist/routes/config/channels/endpoints/prefs.d.ts +0 -1
  187. package/dist/routes/config/channels/endpoints/prefs.js +1 -1
  188. package/dist/routes/config/channels/endpoints/prefs.js.map +1 -1
  189. package/dist/routes/config/channels/endpoints/service.d.ts +0 -1
  190. package/dist/routes/config/channels/endpoints/service.js +8 -5
  191. package/dist/routes/config/channels/endpoints/service.js.map +1 -1
  192. package/dist/routes/config/channels/endpoints/tags.d.ts +0 -1
  193. package/dist/routes/config/channels/endpoints/tags.js +3 -3
  194. package/dist/routes/config/channels/endpoints/tags.js.map +1 -1
  195. package/dist/routes/config/channels/healthBridge.d.ts +4 -1
  196. package/dist/routes/config/channels/healthBridge.js +9 -5
  197. package/dist/routes/config/channels/healthBridge.js.map +1 -1
  198. package/dist/routes/config/channels/http/handler.d.ts +0 -1
  199. package/dist/routes/config/channels/http/playlistHint.d.ts +0 -1
  200. package/dist/routes/config/channels/http/serviceWarning.d.ts +0 -1
  201. package/dist/routes/config/channels/http/serviceWarning.js +1 -1
  202. package/dist/routes/config/channels/http/serviceWarning.js.map +1 -1
  203. package/dist/routes/config/channels/index.d.ts +0 -1
  204. package/dist/routes/config/channels/setup.d.ts +0 -1
  205. package/dist/routes/config/channels/table.d.ts +0 -1
  206. package/dist/routes/config/channels/table.js +66 -134
  207. package/dist/routes/config/channels/table.js.map +1 -1
  208. package/dist/routes/config/http/envelope.d.ts +1 -2
  209. package/dist/routes/config/index.d.ts +5 -5
  210. package/dist/routes/config/index.js +7 -5
  211. package/dist/routes/config/index.js.map +1 -1
  212. package/dist/routes/config/services.d.ts +0 -1
  213. package/dist/routes/config/services.js +17 -19
  214. package/dist/routes/config/services.js.map +1 -1
  215. package/dist/routes/config/settings.d.ts +6 -15
  216. package/dist/routes/config/settings.js +16 -35
  217. package/dist/routes/config/settings.js.map +1 -1
  218. package/dist/routes/debug.d.ts +0 -1
  219. package/dist/routes/debug.js +1 -1
  220. package/dist/routes/debug.js.map +1 -1
  221. package/dist/routes/health.d.ts +16 -8
  222. package/dist/routes/health.js +27 -12
  223. package/dist/routes/health.js.map +1 -1
  224. package/dist/routes/hls.d.ts +0 -1
  225. package/dist/routes/icons.d.ts +0 -1
  226. package/dist/routes/index.d.ts +0 -1
  227. package/dist/routes/logs.d.ts +3 -2
  228. package/dist/routes/logs.js +54 -14
  229. package/dist/routes/logs.js.map +1 -1
  230. package/dist/routes/mpegts.d.ts +0 -1
  231. package/dist/routes/play.d.ts +0 -1
  232. package/dist/routes/playlist.d.ts +0 -1
  233. package/dist/routes/playlist.js +2 -1
  234. package/dist/routes/playlist.js.map +1 -1
  235. package/dist/routes/root/content.d.ts +0 -1
  236. package/dist/routes/root/content.js +32 -11
  237. package/dist/routes/root/content.js.map +1 -1
  238. package/dist/routes/root/index.d.ts +10 -1
  239. package/dist/routes/root/index.js +17 -7
  240. package/dist/routes/root/index.js.map +1 -1
  241. package/dist/routes/root/scripts/channels.d.ts +0 -1
  242. package/dist/routes/root/scripts/channels.js +10 -20
  243. package/dist/routes/root/scripts/channels.js.map +1 -1
  244. package/dist/routes/root/scripts/clientEscape.d.ts +0 -1
  245. package/dist/routes/root/scripts/clientEscape.js +1 -1
  246. package/dist/routes/root/scripts/clientUrl.d.ts +0 -1
  247. package/dist/routes/root/scripts/config.d.ts +0 -1
  248. package/dist/routes/root/scripts/config.js +8 -29
  249. package/dist/routes/root/scripts/config.js.map +1 -1
  250. package/dist/routes/root/scripts/index.d.ts +0 -1
  251. package/dist/routes/root/scripts/shared.d.ts +0 -1
  252. package/dist/routes/root/scripts/shared.js +16 -13
  253. package/dist/routes/root/scripts/shared.js.map +1 -1
  254. package/dist/routes/root/scripts/status.d.ts +0 -1
  255. package/dist/routes/root/scripts/status.handlers.d.ts +3 -1
  256. package/dist/routes/root/scripts/status.handlers.js +52 -26
  257. package/dist/routes/root/scripts/status.handlers.js.map +1 -1
  258. package/dist/routes/root/styles.d.ts +0 -1
  259. package/dist/routes/root/styles.js +10 -18
  260. package/dist/routes/root/styles.js.map +1 -1
  261. package/dist/routes/services.d.ts +0 -1
  262. package/dist/routes/services.js +1 -1
  263. package/dist/routes/services.js.map +1 -1
  264. package/dist/routes/sse.d.ts +3 -2
  265. package/dist/routes/sse.js +7 -3
  266. package/dist/routes/sse.js.map +1 -1
  267. package/dist/routes/streams.d.ts +4 -2
  268. package/dist/routes/streams.js +8 -5
  269. package/dist/routes/streams.js.map +1 -1
  270. package/dist/routes/theme.d.ts +0 -1
  271. package/dist/routes/theme.js +3 -3
  272. package/dist/routes/theme.js.map +1 -1
  273. package/dist/routes/ui.d.ts +0 -1
  274. package/dist/routes/ui.js +5 -5
  275. package/dist/routes/ui.js.map +1 -1
  276. package/dist/routes/upgrade.d.ts +0 -1
  277. package/dist/routes/upgrade.js +2 -1
  278. package/dist/routes/upgrade.js.map +1 -1
  279. package/dist/service/commands.context.d.ts +0 -1
  280. package/dist/service/commands.context.js +7 -1
  281. package/dist/service/commands.context.js.map +1 -1
  282. package/dist/service/commands.d.ts +0 -1
  283. package/dist/service/generators.context.d.ts +0 -1
  284. package/dist/service/generators.d.ts +0 -1
  285. package/dist/service/index.d.ts +0 -1
  286. package/dist/streaming/captureLock.d.ts +1 -2
  287. package/dist/streaming/captureLock.js +8 -7
  288. package/dist/streaming/captureLock.js.map +1 -1
  289. package/dist/streaming/captureSession.d.ts +0 -1
  290. package/dist/streaming/clients.d.ts +4 -3
  291. package/dist/streaming/clients.js +5 -4
  292. package/dist/streaming/clients.js.map +1 -1
  293. package/dist/streaming/codec.d.ts +0 -1
  294. package/dist/streaming/fmp4Segmenter.d.ts +11 -6
  295. package/dist/streaming/fmp4Segmenter.js +39 -17
  296. package/dist/streaming/fmp4Segmenter.js.map +1 -1
  297. package/dist/streaming/hls.d.ts +96 -3
  298. package/dist/streaming/hls.js +282 -171
  299. package/dist/streaming/hls.js.map +1 -1
  300. package/dist/streaming/hlsResume.d.ts +8 -5
  301. package/dist/streaming/hlsResume.js +10 -8
  302. package/dist/streaming/hlsResume.js.map +1 -1
  303. package/dist/streaming/hlsSegments.d.ts +11 -8
  304. package/dist/streaming/hlsSegments.js +38 -18
  305. package/dist/streaming/hlsSegments.js.map +1 -1
  306. package/dist/streaming/lifecycle.d.ts +5 -4
  307. package/dist/streaming/lifecycle.js +43 -13
  308. package/dist/streaming/lifecycle.js.map +1 -1
  309. package/dist/streaming/monitor.d.ts +14 -3
  310. package/dist/streaming/monitor.js +447 -234
  311. package/dist/streaming/monitor.js.map +1 -1
  312. package/dist/streaming/mp4Parser.d.ts +0 -1
  313. package/dist/streaming/mpegts.d.ts +11 -1
  314. package/dist/streaming/mpegts.js +92 -28
  315. package/dist/streaming/mpegts.js.map +1 -1
  316. package/dist/streaming/playlistBuilder.d.ts +0 -1
  317. package/dist/streaming/preroll.d.ts +34 -15
  318. package/dist/streaming/preroll.js +32 -30
  319. package/dist/streaming/preroll.js.map +1 -1
  320. package/dist/streaming/pretune.d.ts +2 -3
  321. package/dist/streaming/pretune.js +45 -45
  322. package/dist/streaming/pretune.js.map +1 -1
  323. package/dist/streaming/pretuneTimers.d.ts +16 -12
  324. package/dist/streaming/pretuneTimers.js +27 -37
  325. package/dist/streaming/pretuneTimers.js.map +1 -1
  326. package/dist/streaming/recovery.d.ts +97 -9
  327. package/dist/streaming/recovery.js +96 -18
  328. package/dist/streaming/recovery.js.map +1 -1
  329. package/dist/streaming/registry.d.ts +102 -15
  330. package/dist/streaming/registry.js +90 -5
  331. package/dist/streaming/registry.js.map +1 -1
  332. package/dist/streaming/setup.d.ts +90 -32
  333. package/dist/streaming/setup.js +379 -248
  334. package/dist/streaming/setup.js.map +1 -1
  335. package/dist/streaming/showInfo.d.ts +8 -4
  336. package/dist/streaming/showInfo.js +54 -45
  337. package/dist/streaming/showInfo.js.map +1 -1
  338. package/dist/streaming/statusEmitter.d.ts +5 -3
  339. package/dist/streaming/statusEmitter.js +20 -8
  340. package/dist/streaming/statusEmitter.js.map +1 -1
  341. package/dist/types/channels.d.ts +0 -1
  342. package/dist/types/channels.js +0 -4
  343. package/dist/types/channels.js.map +1 -1
  344. package/dist/types/config.d.ts +0 -1
  345. package/dist/types/index.d.ts +4 -4
  346. package/dist/types/index.js +2 -1
  347. package/dist/types/index.js.map +1 -1
  348. package/dist/types/profiles.d.ts +51 -9
  349. package/dist/types/profiles.js +35 -1
  350. package/dist/types/profiles.js.map +1 -1
  351. package/dist/types/selection.d.ts +10 -1
  352. package/dist/types/shared.d.ts +0 -1
  353. package/dist/types/streaming.d.ts +8 -1
  354. package/dist/types/streaming.js +7 -0
  355. package/dist/types/streaming.js.map +1 -1
  356. package/dist/upgrade/commands.context.d.ts +0 -1
  357. package/dist/upgrade/commands.d.ts +0 -1
  358. package/dist/upgrade/commands.js +1 -1
  359. package/dist/upgrade/commands.js.map +1 -1
  360. package/dist/upgrade/detection.context.d.ts +0 -1
  361. package/dist/upgrade/detection.d.ts +1 -2
  362. package/dist/upgrade/index.d.ts +0 -1
  363. package/dist/upgrade/lifecycle.context.d.ts +2 -1
  364. package/dist/upgrade/lifecycle.context.js +9 -4
  365. package/dist/upgrade/lifecycle.context.js.map +1 -1
  366. package/dist/upgrade/lifecycle.d.ts +0 -1
  367. package/dist/upgrade/pathHandle.d.ts +0 -1
  368. package/dist/utils/bootSession.context.d.ts +0 -1
  369. package/dist/utils/bootSession.context.js +3 -2
  370. package/dist/utils/bootSession.context.js.map +1 -1
  371. package/dist/utils/bootSession.d.ts +0 -1
  372. package/dist/utils/chromeFetch.d.ts +0 -1
  373. package/dist/utils/cliOutput.d.ts +0 -1
  374. package/dist/utils/debugFilter.d.ts +0 -1
  375. package/dist/utils/debugFilter.js +5 -3
  376. package/dist/utils/debugFilter.js.map +1 -1
  377. package/dist/utils/delay.d.ts +65 -13
  378. package/dist/utils/delay.js +96 -23
  379. package/dist/utils/delay.js.map +1 -1
  380. package/dist/utils/errors.d.ts +0 -11
  381. package/dist/utils/errors.js +3 -14
  382. package/dist/utils/errors.js.map +1 -1
  383. package/dist/utils/evaluate.d.ts +11 -3
  384. package/dist/utils/evaluate.js +4 -3
  385. package/dist/utils/evaluate.js.map +1 -1
  386. package/dist/utils/ffmpeg.context.d.ts +0 -1
  387. package/dist/utils/ffmpeg.d.ts +1 -1
  388. package/dist/utils/ffmpeg.js +2 -1
  389. package/dist/utils/ffmpeg.js.map +1 -1
  390. package/dist/utils/fileLogger.d.ts +26 -7
  391. package/dist/utils/fileLogger.js +241 -102
  392. package/dist/utils/fileLogger.js.map +1 -1
  393. package/dist/utils/format.d.ts +36 -4
  394. package/dist/utils/format.js +66 -12
  395. package/dist/utils/format.js.map +1 -1
  396. package/dist/utils/index.d.ts +1 -2
  397. package/dist/utils/index.js +1 -1
  398. package/dist/utils/index.js.map +1 -1
  399. package/dist/utils/logEmitter.d.ts +0 -1
  400. package/dist/utils/logger.d.ts +0 -1
  401. package/dist/utils/m3u.d.ts +0 -1
  402. package/dist/utils/markup.d.ts +0 -1
  403. package/dist/utils/memo.d.ts +0 -1
  404. package/dist/utils/morganStream.d.ts +2 -3
  405. package/dist/utils/morganStream.js +6 -8
  406. package/dist/utils/morganStream.js.map +1 -1
  407. package/dist/utils/network.d.ts +0 -1
  408. package/dist/utils/never.d.ts +8 -0
  409. package/dist/utils/never.js +20 -0
  410. package/dist/utils/never.js.map +1 -0
  411. package/dist/utils/pid.d.ts +0 -1
  412. package/dist/utils/platform.d.ts +0 -1
  413. package/dist/utils/processInspector.context.d.ts +32 -2
  414. package/dist/utils/processInspector.context.js +117 -1
  415. package/dist/utils/processInspector.context.js.map +1 -1
  416. package/dist/utils/processInspector.d.ts +0 -32
  417. package/dist/utils/processInspector.js +10 -117
  418. package/dist/utils/processInspector.js.map +1 -1
  419. package/dist/utils/retry.d.ts +5 -4
  420. package/dist/utils/retry.js +43 -33
  421. package/dist/utils/retry.js.map +1 -1
  422. package/dist/utils/runtimeIdentity.context.d.ts +0 -1
  423. package/dist/utils/runtimeIdentity.context.js +3 -1
  424. package/dist/utils/runtimeIdentity.context.js.map +1 -1
  425. package/dist/utils/runtimeIdentity.d.ts +1 -1
  426. package/dist/utils/runtimeIdentity.js +1 -1
  427. package/dist/utils/runtimeIdentity.js.map +1 -1
  428. package/dist/utils/sanitize.d.ts +8 -1
  429. package/dist/utils/sanitize.js +19 -0
  430. package/dist/utils/sanitize.js.map +1 -1
  431. package/dist/utils/streamContext.d.ts +0 -1
  432. package/dist/utils/timing.d.ts +3 -4
  433. package/dist/utils/timing.js +4 -4
  434. package/dist/utils/timing.js.map +1 -1
  435. package/dist/utils/version.d.ts +14 -8
  436. package/dist/utils/version.js +35 -24
  437. package/dist/utils/version.js.map +1 -1
  438. package/package.json +7 -7
  439. package/dist/app.d.ts.map +0 -1
  440. package/dist/browser/blockedPage.d.ts.map +0 -1
  441. package/dist/browser/browserSupervisor.d.ts.map +0 -1
  442. package/dist/browser/cdp.d.ts.map +0 -1
  443. package/dist/browser/channelSelection.d.ts.map +0 -1
  444. package/dist/browser/consent.d.ts.map +0 -1
  445. package/dist/browser/display.d.ts.map +0 -1
  446. package/dist/browser/hlsPlaylistObserver.d.ts.map +0 -1
  447. package/dist/browser/index.d.ts.map +0 -1
  448. package/dist/browser/launchGovernor.d.ts.map +0 -1
  449. package/dist/browser/login.d.ts.map +0 -1
  450. package/dist/browser/manifestInterceptor.d.ts.map +0 -1
  451. package/dist/browser/pageStaleness.d.ts.map +0 -1
  452. package/dist/browser/precaching.d.ts.map +0 -1
  453. package/dist/browser/tabNetworkObserver.d.ts.map +0 -1
  454. package/dist/browser/tuning/cache.d.ts.map +0 -1
  455. package/dist/browser/tuning/comcastPolymer.d.ts.map +0 -1
  456. package/dist/browser/tuning/cox.d.ts.map +0 -1
  457. package/dist/browser/tuning/directv.d.ts.map +0 -1
  458. package/dist/browser/tuning/fox.d.ts.map +0 -1
  459. package/dist/browser/tuning/gridSearch.d.ts.map +0 -1
  460. package/dist/browser/tuning/hbo.d.ts.map +0 -1
  461. package/dist/browser/tuning/hulu.d.ts.map +0 -1
  462. package/dist/browser/tuning/shared.d.ts.map +0 -1
  463. package/dist/browser/tuning/sling.d.ts.map +0 -1
  464. package/dist/browser/tuning/spectrum.d.ts.map +0 -1
  465. package/dist/browser/tuning/thumbnailRow.d.ts.map +0 -1
  466. package/dist/browser/tuning/tileClick.d.ts.map +0 -1
  467. package/dist/browser/tuning/xfinity.d.ts.map +0 -1
  468. package/dist/browser/tuning/youtubeTv.d.ts.map +0 -1
  469. package/dist/browser/video.d.ts.map +0 -1
  470. package/dist/channels/index.d.ts.map +0 -1
  471. package/dist/config/channelForm.d.ts.map +0 -1
  472. package/dist/config/consistencyProbe.d.ts.map +0 -1
  473. package/dist/config/health.d.ts.map +0 -1
  474. package/dist/config/index.d.ts.map +0 -1
  475. package/dist/config/paths.d.ts.map +0 -1
  476. package/dist/config/persistence.context.d.ts.map +0 -1
  477. package/dist/config/persistence.d.ts.map +0 -1
  478. package/dist/config/presets.d.ts.map +0 -1
  479. package/dist/config/profiles.d.ts.map +0 -1
  480. package/dist/config/providerLineups.d.ts.map +0 -1
  481. package/dist/config/reactivity.d.ts.map +0 -1
  482. package/dist/config/servicePacks.d.ts.map +0 -1
  483. package/dist/config/services.d.ts.map +0 -1
  484. package/dist/config/sites.d.ts.map +0 -1
  485. package/dist/config/userChannels.d.ts.map +0 -1
  486. package/dist/config/userConfig.d.ts.map +0 -1
  487. package/dist/config/userProfiles.d.ts.map +0 -1
  488. package/dist/hdhr/channelMap.d.ts.map +0 -1
  489. package/dist/hdhr/deviceId.d.ts.map +0 -1
  490. package/dist/hdhr/discover.d.ts.map +0 -1
  491. package/dist/hdhr/getHandlers.d.ts.map +0 -1
  492. package/dist/hdhr/identity.d.ts.map +0 -1
  493. package/dist/hdhr/index.d.ts.map +0 -1
  494. package/dist/hdhr/protocol.d.ts.map +0 -1
  495. package/dist/hdhr/tunerState.d.ts.map +0 -1
  496. package/dist/hdhr/udp.d.ts.map +0 -1
  497. package/dist/identity.d.ts.map +0 -1
  498. package/dist/index.d.ts.map +0 -1
  499. package/dist/native/codecInference.d.ts.map +0 -1
  500. package/dist/native/decrypt.d.ts.map +0 -1
  501. package/dist/native/index.d.ts.map +0 -1
  502. package/dist/native/probe.d.ts.map +0 -1
  503. package/dist/native/proxy.d.ts.map +0 -1
  504. package/dist/native/tokenExpiry.d.ts.map +0 -1
  505. package/dist/routes/assets.d.ts.map +0 -1
  506. package/dist/routes/auth.d.ts.map +0 -1
  507. package/dist/routes/cdp.d.ts.map +0 -1
  508. package/dist/routes/channels.d.ts.map +0 -1
  509. package/dist/routes/clientActions.d.ts.map +0 -1
  510. package/dist/routes/components.d.ts.map +0 -1
  511. package/dist/routes/config/channels/endpoints/browse.d.ts.map +0 -1
  512. package/dist/routes/config/channels/endpoints/bulk.d.ts.map +0 -1
  513. package/dist/routes/config/channels/endpoints/crud.d.ts.map +0 -1
  514. package/dist/routes/config/channels/endpoints/importExport.d.ts.map +0 -1
  515. package/dist/routes/config/channels/endpoints/predefined.d.ts.map +0 -1
  516. package/dist/routes/config/channels/endpoints/prefs.d.ts.map +0 -1
  517. package/dist/routes/config/channels/endpoints/service.d.ts.map +0 -1
  518. package/dist/routes/config/channels/endpoints/tags.d.ts.map +0 -1
  519. package/dist/routes/config/channels/healthBridge.d.ts.map +0 -1
  520. package/dist/routes/config/channels/http/handler.d.ts.map +0 -1
  521. package/dist/routes/config/channels/http/playlistHint.d.ts.map +0 -1
  522. package/dist/routes/config/channels/http/serviceWarning.d.ts.map +0 -1
  523. package/dist/routes/config/channels/index.d.ts.map +0 -1
  524. package/dist/routes/config/channels/setup.d.ts.map +0 -1
  525. package/dist/routes/config/channels/table.d.ts.map +0 -1
  526. package/dist/routes/config/http/envelope.d.ts.map +0 -1
  527. package/dist/routes/config/index.d.ts.map +0 -1
  528. package/dist/routes/config/services.d.ts.map +0 -1
  529. package/dist/routes/config/settings.d.ts.map +0 -1
  530. package/dist/routes/debug.d.ts.map +0 -1
  531. package/dist/routes/health.d.ts.map +0 -1
  532. package/dist/routes/hls.d.ts.map +0 -1
  533. package/dist/routes/icons.d.ts.map +0 -1
  534. package/dist/routes/index.d.ts.map +0 -1
  535. package/dist/routes/logs.d.ts.map +0 -1
  536. package/dist/routes/mpegts.d.ts.map +0 -1
  537. package/dist/routes/play.d.ts.map +0 -1
  538. package/dist/routes/playlist.d.ts.map +0 -1
  539. package/dist/routes/root/content.d.ts.map +0 -1
  540. package/dist/routes/root/index.d.ts.map +0 -1
  541. package/dist/routes/root/scripts/channels.d.ts.map +0 -1
  542. package/dist/routes/root/scripts/clientEscape.d.ts.map +0 -1
  543. package/dist/routes/root/scripts/clientUrl.d.ts.map +0 -1
  544. package/dist/routes/root/scripts/config.d.ts.map +0 -1
  545. package/dist/routes/root/scripts/index.d.ts.map +0 -1
  546. package/dist/routes/root/scripts/shared.d.ts.map +0 -1
  547. package/dist/routes/root/scripts/status.d.ts.map +0 -1
  548. package/dist/routes/root/scripts/status.handlers.d.ts.map +0 -1
  549. package/dist/routes/root/styles.d.ts.map +0 -1
  550. package/dist/routes/services.d.ts.map +0 -1
  551. package/dist/routes/sse.d.ts.map +0 -1
  552. package/dist/routes/streams.d.ts.map +0 -1
  553. package/dist/routes/theme.d.ts.map +0 -1
  554. package/dist/routes/ui.d.ts.map +0 -1
  555. package/dist/routes/upgrade.d.ts.map +0 -1
  556. package/dist/service/commands.context.d.ts.map +0 -1
  557. package/dist/service/commands.d.ts.map +0 -1
  558. package/dist/service/generators.context.d.ts.map +0 -1
  559. package/dist/service/generators.d.ts.map +0 -1
  560. package/dist/service/index.d.ts.map +0 -1
  561. package/dist/streaming/captureLock.d.ts.map +0 -1
  562. package/dist/streaming/captureSession.d.ts.map +0 -1
  563. package/dist/streaming/clients.d.ts.map +0 -1
  564. package/dist/streaming/codec.d.ts.map +0 -1
  565. package/dist/streaming/fmp4Segmenter.d.ts.map +0 -1
  566. package/dist/streaming/hls.d.ts.map +0 -1
  567. package/dist/streaming/hlsResume.d.ts.map +0 -1
  568. package/dist/streaming/hlsSegments.d.ts.map +0 -1
  569. package/dist/streaming/lifecycle.d.ts.map +0 -1
  570. package/dist/streaming/monitor.d.ts.map +0 -1
  571. package/dist/streaming/mp4Parser.d.ts.map +0 -1
  572. package/dist/streaming/mpegts.d.ts.map +0 -1
  573. package/dist/streaming/playlistBuilder.d.ts.map +0 -1
  574. package/dist/streaming/preroll.d.ts.map +0 -1
  575. package/dist/streaming/pretune.d.ts.map +0 -1
  576. package/dist/streaming/pretuneTimers.d.ts.map +0 -1
  577. package/dist/streaming/recovery.d.ts.map +0 -1
  578. package/dist/streaming/registry.d.ts.map +0 -1
  579. package/dist/streaming/setup.d.ts.map +0 -1
  580. package/dist/streaming/showInfo.d.ts.map +0 -1
  581. package/dist/streaming/statusEmitter.d.ts.map +0 -1
  582. package/dist/types/channels.d.ts.map +0 -1
  583. package/dist/types/config.d.ts.map +0 -1
  584. package/dist/types/index.d.ts.map +0 -1
  585. package/dist/types/profiles.d.ts.map +0 -1
  586. package/dist/types/selection.d.ts.map +0 -1
  587. package/dist/types/shared.d.ts.map +0 -1
  588. package/dist/types/streaming.d.ts.map +0 -1
  589. package/dist/upgrade/commands.context.d.ts.map +0 -1
  590. package/dist/upgrade/commands.d.ts.map +0 -1
  591. package/dist/upgrade/detection.context.d.ts.map +0 -1
  592. package/dist/upgrade/detection.d.ts.map +0 -1
  593. package/dist/upgrade/index.d.ts.map +0 -1
  594. package/dist/upgrade/lifecycle.context.d.ts.map +0 -1
  595. package/dist/upgrade/lifecycle.d.ts.map +0 -1
  596. package/dist/upgrade/pathHandle.d.ts.map +0 -1
  597. package/dist/utils/bootSession.context.d.ts.map +0 -1
  598. package/dist/utils/bootSession.d.ts.map +0 -1
  599. package/dist/utils/chromeFetch.d.ts.map +0 -1
  600. package/dist/utils/cliOutput.d.ts.map +0 -1
  601. package/dist/utils/clock.d.ts +0 -15
  602. package/dist/utils/clock.d.ts.map +0 -1
  603. package/dist/utils/clock.js +0 -31
  604. package/dist/utils/clock.js.map +0 -1
  605. package/dist/utils/debugFilter.d.ts.map +0 -1
  606. package/dist/utils/delay.d.ts.map +0 -1
  607. package/dist/utils/errors.d.ts.map +0 -1
  608. package/dist/utils/evaluate.d.ts.map +0 -1
  609. package/dist/utils/ffmpeg.context.d.ts.map +0 -1
  610. package/dist/utils/ffmpeg.d.ts.map +0 -1
  611. package/dist/utils/fileLogger.d.ts.map +0 -1
  612. package/dist/utils/format.d.ts.map +0 -1
  613. package/dist/utils/index.d.ts.map +0 -1
  614. package/dist/utils/logEmitter.d.ts.map +0 -1
  615. package/dist/utils/logger.d.ts.map +0 -1
  616. package/dist/utils/m3u.d.ts.map +0 -1
  617. package/dist/utils/markup.d.ts.map +0 -1
  618. package/dist/utils/memo.d.ts.map +0 -1
  619. package/dist/utils/morganStream.d.ts.map +0 -1
  620. package/dist/utils/network.d.ts.map +0 -1
  621. package/dist/utils/pid.d.ts.map +0 -1
  622. package/dist/utils/platform.d.ts.map +0 -1
  623. package/dist/utils/processInspector.context.d.ts.map +0 -1
  624. package/dist/utils/processInspector.d.ts.map +0 -1
  625. package/dist/utils/retry.d.ts.map +0 -1
  626. package/dist/utils/runtimeIdentity.context.d.ts.map +0 -1
  627. package/dist/utils/runtimeIdentity.d.ts.map +0 -1
  628. package/dist/utils/sanitize.d.ts.map +0 -1
  629. package/dist/utils/streamContext.d.ts.map +0 -1
  630. package/dist/utils/timing.d.ts.map +0 -1
  631. package/dist/utils/version.d.ts.map +0 -1
@@ -1,16 +1,17 @@
1
- import { LOG, extractDomain, formatError, startTimer } from "../utils/index.js";
1
+ import { LOG, extractDomain, formatError, startTimer, timeoutSignal } from "../utils/index.js";
2
2
  import { clearDomainAuthRequirement, getDomainAuthState, markDomainAuth, markDomainAuthRequired } from "../config/health.js";
3
- import { getCurrentBrowser, isGracefulShutdown, minimizeBrowserWindow, registerManagedPage, unregisterManagedPage } from "./index.js";
3
+ import { createDiscoveryPage, emulateLayoutSurface, getCurrentBrowser, isGracefulShutdown, registerManagedPage, syncWindowVisibility, unregisterManagedPage } from "./index.js";
4
+ import { getPersistedLineup, persistProviderLineup } from "../config/providerLineups.js";
4
5
  import { getProviderBySlug, getProvidersForDomain } from "./channelSelection.js";
6
+ import { systemClock, waitWithSignal } from "homebridge-plugin-utils";
5
7
  import { CONFIG } from "../config/index.js";
6
8
  import { classifyBlockedPage } from "./blockedPage.js";
7
9
  import { getProfileForUrl } from "../config/profiles.js";
8
10
  import { isLoginModeActive } from "./login.js";
9
- import { persistProviderLineup } from "../config/providerLineups.js";
10
11
  import { startOverlayHandling } from "./consent.js";
11
12
  /* Precaching discovers channel lineups for selected services at startup so that even the first tune benefits from cached lineup data. Each service is precached
12
- * sequentially - discovery opens a browser page and navigates to a heavy SPA, so running all services concurrently would stress CPU and GPU on resource-constrained
13
- * systems. The HTTP server starts immediately; precaching begins in the background after a brief delay.
13
+ * sequentially - discovery opens a browser page in a window of its own and navigates to a heavy SPA, so running all services concurrently would stress CPU and
14
+ * GPU on resource-constrained systems. The HTTP server starts immediately; precaching begins in the background after a brief delay.
14
15
  *
15
16
  * Precaching is triggered from launchBrowser() in browser/index.ts. This covers both initial server startup and browser crash recovery (where all caches are cleared).
16
17
  * Each service has its own try/catch - one failure does not stop the rest. The browser reference is obtained per-service via getCurrentBrowser() so that a browser
@@ -21,35 +22,67 @@ import { startOverlayHandling } from "./consent.js";
21
22
  * mutator or the lineup store directly - it calls the recorder, which does. The page session itself is owned by withProviderGuidePage: the single guarded-page
22
23
  * primitive both the precache cycle and that endpoint walk their guides through, and the one place the empty-walk retry policy lives, so no provider carries a
23
24
  * retry of its own.
25
+ *
26
+ * Every timer and deadline this module arms - the startup cycle's delay, the deferred re-attempt, and each walk's ceiling - runs on the clock its dependencies
27
+ * carry, so one injected clock drives the whole schedule.
24
28
  */
25
29
  // Delay in milliseconds before precaching begins after browser launch. This gives the browser time to settle after initialization.
26
30
  const PRECACHE_DELAY = 5000;
27
- /* Delay in milliseconds before the services that discovered nothing are re-attempted. Five minutes puts the second pass well past the contention a boot creates -
28
- * the browser launch, the first tunes, the DVR's own channel scan - which is the likeliest reason a provider's lazy content never appeared inside its walk. There
29
- * is exactly one such pass: a service still empty on a settled system has a standing problem that another walk will not solve, and a repeating attempt would keep
30
- * waking the browser for it indefinitely.
31
+ /* Delay in milliseconds before the services a cycle could not settle are re-attempted. Five minutes puts the second pass well past the contention a boot creates -
32
+ * the browser launch, the first tunes, the DVR's own channel scan - which is the likeliest reason a provider's lazy content never appeared inside its walk. A
33
+ * service whose walk did not settle - it came back empty, or it was stopped at its budget - gets exactly one such pass: unsettled again on a quiet system, it has
34
+ * a standing problem that another walk will not solve, and a repeating attempt would keep waking the browser for it indefinitely. A service deferred because a
35
+ * login session was on screen is the separate case: its walk never ran, so the pass re-arms itself for it until the session ends rather than spending its one
36
+ * attempt on a window the user is working in.
31
37
  */
32
38
  const PRECACHE_RETRY_DELAY = 300000;
39
+ /* The fraction of the saved lineup a walk has to reach before the store is allowed to replace that lineup with it. A non-empty walk returning fewer channels
40
+ * than this fraction of what is already on file is treated as an incomplete read of the guide: a slice is replaced wholesale, so one screenful read off a
41
+ * virtualized guide - twelve rows where the guide carries a hundred and twenty-nine - would otherwise become the whole saved lineup. A quarter sits well below
42
+ * any plausible change a provider makes to its own channel list and well above what that truncation produces, so a count alone tells the two apart without a
43
+ * provider-declared completeness signal.
44
+ *
45
+ * Below the threshold the walk is never accepted automatically, and the reason is what a count can and cannot say: it cannot tell a truncated read from a
46
+ * provider that genuinely shrank, and a second walk agreeing with the first settles nothing either, because a one-screenful truncation reads the same twelve
47
+ * rows every time. So a provider that really did cut its lineup by more than this keeps its extra channel rows until a walk lands at or above the threshold, an
48
+ * on-demand discovery from the channel table refreshes it, or the saved file is corrected by hand. The warn line the guard emits carries both counts and names
49
+ * that outcome.
50
+ */
51
+ const SUSPECT_WALK_RATIO = 0.25;
52
+ /* The ceiling on a single discovery walk, in milliseconds. Measured walks finish in a few seconds to about seventeen, and an empty walk's reload-and-retry gets a
53
+ * budget of its own, so a minute is far past anything a healthy walk needs: a walk still running at that point is wedged on a page that is not going to answer.
54
+ * The ceiling is a failure to report rather than a delay anyone pays, and it sits deliberately low because the alternative is worse - the stale-page sweep is a
55
+ * safety net for pages nothing owns, not this walk's timer, so a walk without a ceiling of its own has none at all. Failing fast hands the service to the
56
+ * deferred re-attempt, which tries again on a settled system.
57
+ */
58
+ const DISCOVERY_WALK_TIMEOUT = 60000;
59
+ /**
60
+ * A discovery walk stopped at its budget. The precache cycle and the deferred re-attempt each treat a wedged walk differently from every other discovery failure,
61
+ * so the lapse carries its own type rather than making either of them read a message.
62
+ */
63
+ export class DiscoveryWalkTimeoutError extends Error {
64
+ constructor(label, timeoutMs) {
65
+ super("The channel discovery walk for " + label + " did not finish within " + String(timeoutMs / 1000) + " seconds.");
66
+ this.name = "DiscoveryWalkTimeoutError";
67
+ }
68
+ }
33
69
  // Guard flag preventing overlapping precache cycles. Set to true before the cycle starts, cleared through releasePrecacheGuard in a finally block.
34
70
  let precacheInProgress = false;
35
- // Handle for the scheduled precache cycle, tracked so a graceful shutdown can cancel it before it fires. Null when no cycle is pending.
36
- let precacheTimer = null;
37
- /* The pending deferred re-attempt: the services still to re-walk and the timer that will do it. One value rather than two fields, so arming, cancelling, and
38
- * firing each move the whole thing at once - a slug list with no timer behind it, or a timer whose slugs were cleared, is not a state this can reach.
39
- */
40
- let deferredRetry = null;
71
+ // The scheduler's pending work, or null when it has none.
72
+ let scheduled = null;
41
73
  /* Whether a full precache cycle was requested while the single-flight guard was held. The request always comes from a browser relaunch, which cleared every
42
74
  * provider cache, so the run holding the guard is walking guides for a browser that no longer exists and its result is worth nothing - dropping the request would
43
75
  * leave the new browser with no lineups at all. Whoever releases the guard runs it; releasePrecacheGuard is where that happens, and it is the only place.
44
76
  */
45
77
  let fullCycleRequested = false;
46
78
  /**
47
- * Cancels a pending deferred re-attempt and drops its state as one unit. A no-op when nothing is pending.
79
+ * Cancels a pending deferred re-attempt and drops its state as one unit. A no-op when nothing is pending, and equally a no-op when what is pending is a cycle -
80
+ * only the re-attempt arm is cancelled here.
48
81
  */
49
82
  function clearDeferredRetry() {
50
- if (deferredRetry) {
51
- clearTimeout(deferredRetry.timer);
52
- deferredRetry = null;
83
+ if (scheduled?.kind === "deferred") {
84
+ scheduled.timer[Symbol.dispose]();
85
+ scheduled = null;
53
86
  }
54
87
  }
55
88
  /**
@@ -70,19 +103,24 @@ function releasePrecacheGuard(deps) {
70
103
  startPrecaching(deps);
71
104
  }
72
105
  export const defaultPrecachingDeps = {
106
+ clock: systemClock,
107
+ createDiscoveryPage,
108
+ emulateLayoutSurface,
73
109
  getCurrentBrowser,
110
+ getPersistedLineup,
74
111
  getProviderBySlug,
75
112
  getProvidersForDomain,
76
113
  isGracefulShutdown,
77
- minimizeBrowserWindow,
78
114
  persistProviderLineup,
79
115
  registerManagedPage,
80
116
  startOverlayHandling,
117
+ syncWindowVisibility,
81
118
  unregisterManagedPage
82
119
  };
83
120
  /**
84
121
  * Starts the precaching cycle if services are configured. Called from launchBrowser() after the browser is ready. If no services are selected, a shutdown is in
85
- * progress, or a precache cycle is already in progress, returns immediately. The actual work is scheduled via setTimeout to avoid blocking browser launch.
122
+ * progress, or a precache cycle is already in progress, returns immediately. The actual work is scheduled on the dependencies' clock to avoid blocking browser
123
+ * launch.
86
124
  * @param deps - The injected browser and provider-registry dependencies; defaults to defaultPrecachingDeps.
87
125
  */
88
126
  export function startPrecaching(deps = defaultPrecachingDeps) {
@@ -108,10 +146,10 @@ export function startPrecaching(deps = defaultPrecachingDeps) {
108
146
  clearDeferredRetry();
109
147
  // Schedule the precache cycle after a brief delay to let the browser settle. The handle is tracked so stopPrecaching() can cancel it if shutdown begins during the
110
148
  // delay window; the ref is cleared when the timer fires since it is then spent.
111
- precacheTimer = setTimeout(() => {
112
- precacheTimer = null;
113
- void runPrecacheCycle(deps);
114
- }, PRECACHE_DELAY);
149
+ scheduled = { kind: "cycle", timer: deps.clock.schedule(() => {
150
+ scheduled = null;
151
+ void runPrecacheCycle(deps);
152
+ }, PRECACHE_DELAY) };
115
153
  }
116
154
  /**
117
155
  * Cancels every scheduled precache - the startup cycle and the deferred re-attempt alike - and clears the in-progress guard. Called during graceful shutdown so
@@ -121,9 +159,9 @@ export function startPrecaching(deps = defaultPrecachingDeps) {
121
159
  * which is exactly what releasing through the hand-off would do.
122
160
  */
123
161
  export function stopPrecaching() {
124
- if (precacheTimer) {
125
- clearTimeout(precacheTimer);
126
- precacheTimer = null;
162
+ if (scheduled) {
163
+ scheduled.timer[Symbol.dispose]();
164
+ scheduled = null;
127
165
  }
128
166
  clearDeferredRetry();
129
167
  fullCycleRequested = false;
@@ -137,13 +175,14 @@ export function stopPrecaching() {
137
175
  *
138
176
  * An empty result classifies the still-open page: a confirmed authentication wall marks the provider's domain needs-sign-in; a consent overlay and the unknown
139
177
  * classification change no state (an unexplained empty walk is not evidence of anything). A non-empty result that the provider's validatePrecache accepts (or that
140
- * needs no validation) marks the domain verified and persists the lineup; a non-empty result the validator rejects proves the wall is gone but not that paid access
141
- * exists, so it clears a standing needs-sign-in entry back to unknown, changes nothing else, and persists nothing - a rejected walk is not a lineup the store can
142
- * safely replace a slice with.
178
+ * needs no validation) marks the domain verified and persists the lineup, unless it holds too small a fraction of the lineup already on file to be a complete read
179
+ * of the guide, in which case the mark still lands and the saved lineup stands; a non-empty result the validator rejects proves the wall is gone but not that paid
180
+ * access exists, so it clears a standing needs-sign-in entry back to unknown, changes nothing else, and persists nothing - a rejected walk is not a lineup the
181
+ * store can safely replace a slice with.
143
182
  * @param provider - The provider whose discovery completed.
144
183
  * @param channels - The discovered channels (possibly empty).
145
184
  * @param page - The still-open discovery page, inspected only when the result is empty.
146
- * @param deps - The injected dependencies; the lineup write runs through deps.persistProviderLineup.
185
+ * @param deps - The injected dependencies; the saved-lineup read and the lineup write both run through this port.
147
186
  * @param classification - A classification the caller already performed against the page state it wants recorded. When omitted, the still-open page is classified
148
187
  * here, which is what every caller that has not already looked does.
149
188
  * @returns A promise that resolves once any classification and state recording completes.
@@ -175,13 +214,25 @@ export async function recordDiscoveryOutcome(provider, channels, page, deps, cla
175
214
  // authentication, so a non-empty result alone does not prove paid access.
176
215
  if (!provider.validatePrecache || provider.validatePrecache(channels)) {
177
216
  markDomainAuth(domain);
217
+ /* A walk far smaller than the lineup already on file reads as an incomplete pass over the guide rather than as a statement that the provider cut its channel
218
+ * list, so the durable write is withheld and what is on file stands. The order here is the contract: the domain is marked above regardless, because channels
219
+ * came back and that proves access whatever the count says, and the live cache this walk already filled is untouched, so the session still tunes from what
220
+ * the walk did reach. Only the write to the store is given up.
221
+ */
222
+ const saved = deps.getPersistedLineup(provider.slug);
223
+ if ((saved !== null) && (channels.length < (saved.length * SUSPECT_WALK_RATIO))) {
224
+ LOG.warn("%s returned %d channels where its saved lineup holds %d, so the walk is treated as incomplete and the saved lineup is kept.", provider.label, channels.length, saved.length);
225
+ return;
226
+ }
178
227
  /* Persist what the walk found so the lineup outlives this browser session. The provider states its own durable shape through exportDurableLineup - which
179
228
  * fields survive a session is provider knowledge, not the recorder's - and a provider with nothing durable to add contributes the channel identities the walk
180
229
  * returned.
181
230
  *
182
- * Only a walk the validator accepted is written, and the reason is the store's replace semantics: a slice is replaced wholesale, so a rejected walk - one the
183
- * provider itself judges not to be a trustworthy statement of its lineup - could shrink a fuller slice written earlier, dropping channels out of the
184
- * cold-listing fallback and taking their durable watch URLs with them. Verify-on-use covers staleness, not a lineup the provider has already rejected.
231
+ * Every condition a write has to pass exists because of the store's replace semantics: a slice is replaced wholesale, so anything short of a trustworthy full
232
+ * statement of the lineup could shrink a fuller slice written earlier, dropping channels out of the cold-listing fallback and taking their durable watch URLs
233
+ * with them. The provider's own validator is the first, and a walk it judges untrustworthy never reaches this block at all; the plausibility guard above is
234
+ * the second, and it withholds a walk too small to be a complete read of the guide. Verify-on-use covers staleness, not a lineup the provider has already
235
+ * rejected or a read that plainly did not finish.
185
236
  *
186
237
  * The write is fire-and-forget by design: it never throws, and making the discovery endpoint's response wait on a file write would charge the user for a
187
238
  * durability guarantee they did not ask for.
@@ -199,6 +250,32 @@ export async function recordDiscoveryOutcome(provider, channels, page, deps, cla
199
250
  // state never outlives the wall it reported - clearDomainAuthRequirement is a no-op unless the domain is currently flagged, so verified state is never touched.
200
251
  clearDomainAuthRequirement(domain);
201
252
  }
253
+ /**
254
+ * Runs a provider's discovery walk under a deadline, and cancels the walk when that deadline lapses rather than merely giving up on waiting for it.
255
+ *
256
+ * The cancellation is the whole point. A lapse closes the page, which throws whatever Puppeteer operation the walk is sitting on and unwinds the walk itself -
257
+ * the same mechanism the guarded session uses for a caller's abort. A bound that only stopped the wait would leave the walk driving a page the session has moved
258
+ * on from. The lapse is held in a local and handed to the timeout as its abort reason, so the rejection carries that exact error object; every other rejection
259
+ * travels through untouched. Each call gets its own budget, which is what lets an empty walk's retry be bounded exactly like the first attempt.
260
+ * @param provider - The provider whose walk to run.
261
+ * @param page - The guide page the walk runs against, closed if the deadline lapses.
262
+ * @param clock - The clock the deadline arms on.
263
+ * @returns The discovered channels (possibly empty).
264
+ * @throws DiscoveryWalkTimeoutError when the walk outlives its budget, and whatever the walk itself rejected with otherwise.
265
+ */
266
+ async function walkWithDeadline(provider, page, clock) {
267
+ const lapse = new DiscoveryWalkTimeoutError(provider.label, DISCOVERY_WALK_TIMEOUT);
268
+ const deadline = timeoutSignal(DISCOVERY_WALK_TIMEOUT, { clock, reason: lapse });
269
+ deadline.signal.addEventListener("abort", () => {
270
+ void page.close().catch(() => { });
271
+ }, { once: true });
272
+ try {
273
+ return await waitWithSignal(provider.discoverChannels(page), deadline.signal);
274
+ }
275
+ finally {
276
+ deadline.cancel();
277
+ }
278
+ }
202
279
  /**
203
280
  * Gives an empty discovery walk one more chance, when the page it left behind says the emptiness is unexplained.
204
281
  *
@@ -236,8 +313,8 @@ async function retryAfterEmptyWalk(options) {
236
313
  // reusing it would silently leave the retry unprotected against a banner that reappears after the reload.
237
314
  const retryController = new AbortController();
238
315
  try {
239
- void deps.startOverlayHandling(page, profile, { phase: "discovery", signal: retryController.signal });
240
- return { channels: await provider.discoverChannels(page) };
316
+ void deps.startOverlayHandling(page, profile, { clock: deps.clock, phase: "discovery", signal: retryController.signal });
317
+ return { channels: await walkWithDeadline(provider, page, deps.clock) };
241
318
  }
242
319
  finally {
243
320
  retryController.abort();
@@ -245,10 +322,11 @@ async function retryAfterEmptyWalk(options) {
245
322
  }
246
323
  /**
247
324
  * Opens a guarded browser page for a provider's guide, runs its discovery walk under a consent-overlay poll, and cleans the page up. This is the single owner of the
248
- * discovery page session shared by the precache cycle and the /services/:slug/channels endpoint: it holds the page lifecycle (creation, managed-page registration,
249
- * close), the abort mechanics (close-on-abort plus the pre-navigation early-abort), the audio-mute override, and the discovery-phase overlay poll that dismisses
250
- * cookie banners and per-site modals during the walk. The overlay poll is aborted the instant the walk completes, so the page is quiet by construction before the
251
- * afterWalk hook inspects it - a poll still clicking could dismiss the very overlay a classification is about to report.
325
+ * discovery page session shared by the precache cycle and the /services/:slug/channels endpoint: it asks the browser layer's creator for the page and holds
326
+ * everything that happens to it afterwards - managed-page registration, the abort mechanics (close-on-abort plus the pre-navigation early-abort), the audio-mute
327
+ * override, the discovery-phase overlay poll that dismisses cookie banners and per-site modals during the walk, and the close. The overlay poll is aborted the
328
+ * instant the walk completes, so the page is quiet by construction before the afterWalk hook inspects it - a poll still clicking could dismiss the very overlay
329
+ * a classification is about to report.
252
330
  *
253
331
  * A walk that comes back empty gets one reload-and-retry, on the terms retryAfterEmptyWalk sets out. The hook still runs exactly once, against whichever result
254
332
  * stands.
@@ -259,8 +337,13 @@ async function retryAfterEmptyWalk(options) {
259
337
  */
260
338
  export async function withProviderGuidePage(provider, options = {}, deps = defaultPrecachingDeps) {
261
339
  const { afterWalk, signal } = options;
262
- const browser = await deps.getCurrentBrowser();
263
- const page = await browser.newPage();
340
+ const browser = await deps.getCurrentBrowser("page");
341
+ /* The guide page is the active tab of a browser window of its own, opened in the background at the shared window's placement and presented by the creator for
342
+ * the page's whole life. A guide renders only while Chrome presents its document, and a walk is never captured, so the page gets a window that never disturbs
343
+ * the shared window's own state or the tab the user has selected there, and a presentation that does not depend on that window being shown. The window closes
344
+ * with the page.
345
+ */
346
+ const page = await deps.createDiscoveryPage(browser);
264
347
  // Close the page the moment the caller aborts, so any in-progress Puppeteer operation throws and propagates the cancellation through discoverChannels without each
265
348
  // provider having to poll the signal. The helper owns this mechanism because it owns page creation - no caller ever holds the page reference, so close-on-abort
266
349
  // must live beside the lifecycle it cancels. The listener is registered the instant the page exists and removed in the finally.
@@ -289,18 +372,25 @@ export async function withProviderGuidePage(provider, options = {}, deps = defau
289
372
  return originalPlay.call(this);
290
373
  };
291
374
  });
292
- deps.registerManagedPage(page);
375
+ /* Hold the page against the stale-page sweep for as long as the walk runs. A discovery page is owned by this walk rather than by any stream the registry
376
+ * records, so without the mark the sweep starts a staleness clock on it at first sight and closes it partway through a long walk. The finally below
377
+ * unregisters the page, which drops the mark, so the sweep stays a safety net for a leaked page while the deadline above is what bounds the walk.
378
+ */
379
+ deps.registerManagedPage(page, { inFlight: true });
380
+ // Declare the layout the walk runs against, before the first navigation so the guide loads once at the surface it will be read on. A page carries no
381
+ // emulation of its own, and every guide strategy was written against the preset's dimensions.
382
+ await deps.emulateLayoutSurface(page);
293
383
  // Launch the discovery-phase overlay poll before navigation: a handlesOwnNavigation provider navigates inside discoverChannels, and the tick-error taxonomy lets
294
384
  // the poll survive that navigation. The phase's window is the backstop; the abort after the walk is the terminator. The guide page is not a tune, so the phase
295
385
  // forbids the embed-gate accept - only cookie rejection and per-site modal dismissal run here.
296
386
  const { profile } = getProfileForUrl(provider.guideUrl);
297
- void deps.startOverlayHandling(page, profile, { phase: "discovery", signal: overlayController.signal });
387
+ void deps.startOverlayHandling(page, profile, { clock: deps.clock, phase: "discovery", signal: overlayController.signal });
298
388
  // Navigate to the service's guide URL unless the provider module handles its own navigation (e.g., sets up response interception before navigating). We use
299
389
  // networkidle2 rather than load because SPA-based services (e.g., Hulu) have heavy async initialization that can prevent the load event from firing reliably.
300
390
  if (!provider.handlesOwnNavigation) {
301
391
  await page.goto(provider.guideUrl, { timeout: CONFIG.streaming.navigationTimeout, waitUntil: "networkidle2" });
302
392
  }
303
- let channels = await provider.discoverChannels(page);
393
+ let channels = await walkWithDeadline(provider, page, deps.clock);
304
394
  // The walk is complete. Abort the overlay poll so the page is quiet by construction before anything classifies it.
305
395
  overlayController.abort();
306
396
  let classification;
@@ -326,11 +416,10 @@ export async function withProviderGuidePage(provider, options = {}, deps = defau
326
416
  catch {
327
417
  // Page may already be closed if the browser disconnected during discovery or the abort handler already closed it.
328
418
  }
329
- // Re-minimize the browser window. Opening the temporary discovery page may have restored the window on macOS. Skipped while login mode is active so a
330
- // discovery finishing mid-login never minimizes the window under the user.
331
- if (!isLoginModeActive()) {
332
- await deps.minimizeBrowserWindow();
333
- }
419
+ // Settle the shared browser window against the policy now that the walk is done. The walk's browser acquisition may have relaunched Chrome, which leaves
420
+ // that window as the launch left it, and a walk runs long enough to span a stream state change; the pass is unconditional because the policy already
421
+ // accounts for a login session or a running capture.
422
+ await deps.syncWindowVisibility();
334
423
  }
335
424
  }
336
425
  /**
@@ -380,7 +469,7 @@ export async function revalidateDomainAuth(url, deps = defaultPrecachingDeps) {
380
469
  if (deps.isGracefulShutdown()) {
381
470
  return;
382
471
  }
383
- // Defer to an in-flight precache cycle rather than overlapping it. Honest limitation: if the flagged provider is not in that cycle's configured service set,
472
+ // Defer to an in-flight precache cycle rather than overlapping it. Limitation: if the flagged provider is not in that cycle's configured service set,
384
473
  // the flag persists until the next successful discovery or tune for the domain - an in-flight cycle cannot be retargeted.
385
474
  if (precacheInProgress) {
386
475
  LOG.info("Deferring the post-login revalidation for %s to the precache cycle already in progress.", domain);
@@ -417,9 +506,10 @@ export async function revalidateDomainAuth(url, deps = defaultPrecachingDeps) {
417
506
  }
418
507
  }
419
508
  /**
420
- * Schedules the one deferred re-attempt for the services a cycle finished with nothing to show for. Does nothing when every service came back with a lineup, and
421
- * nothing during a shutdown, where scheduling work against the browser is precisely what teardown is closing down.
422
- * @param slugs - The services that walked and found no channels.
509
+ * Schedules the deferred re-attempt for the services a pass could not settle. Does nothing when every service came back with a lineup, and nothing during a
510
+ * shutdown, where scheduling work against the browser is precisely what teardown is closing down. This is the one place a re-attempt is scheduled, so every
511
+ * reason a service is still owed a walk - it ran and found nothing, it was stopped at its budget, or it never ran at all - arrives on the same schedule.
512
+ * @param slugs - The services a pass could not settle: walked without settling, or deferred because a login session was on screen.
423
513
  * @param deps - The injected dependencies, handed to the pass this schedules.
424
514
  */
425
515
  function armDeferredRetry(slugs, deps) {
@@ -427,23 +517,27 @@ function armDeferredRetry(slugs, deps) {
427
517
  return;
428
518
  }
429
519
  LOG.debug("precache", "Scheduling one deferred discovery re-attempt for %d service%s in %d minutes.", slugs.length, (slugs.length === 1) ? "" : "s", PRECACHE_RETRY_DELAY / 60000);
430
- deferredRetry = { slugs, timer: setTimeout(() => void runDeferredRetry(deps), PRECACHE_RETRY_DELAY) };
520
+ scheduled = { kind: "deferred", slugs, timer: deps.clock.schedule(() => void runDeferredRetry(deps), PRECACHE_RETRY_DELAY) };
431
521
  }
432
522
  /**
433
- * Runs the single deferred re-attempt for the services a cycle left empty. Never rejects - it is driven by a timer with nobody to hand a rejection to, so every
523
+ * Runs the deferred re-attempt for the services a cycle could not settle. Never rejects - it is driven by a timer with nobody to hand a rejection to, so every
434
524
  * per-service failure is contained the same way the cycle contains its own.
435
525
  *
436
526
  * A service whose lineup arrived in the interval - from a later full cycle, or from an on-demand discovery a user triggered - is skipped rather than re-walked,
437
- * because the walk it would run is the expensive part and the answer is already in hand.
527
+ * because the walk it would run is the expensive part and the answer is already in hand. A login session that begins before the pass fires stops it where it
528
+ * stands and re-arms everything still owed, so the walks resume once the user is done rather than opening a window over the one they are signing in through.
438
529
  * @param deps - The injected browser and provider-registry dependencies.
439
530
  * @returns A promise that resolves once the pass completes or is skipped.
440
531
  */
441
532
  async function runDeferredRetry(deps) {
442
- const pending = deferredRetry;
533
+ if (scheduled?.kind !== "deferred") {
534
+ return;
535
+ }
536
+ const pending = scheduled;
443
537
  // Drop the state before acting on it. This is the only pass there will be, so a handle left standing would tell a later cancellation that something is still
444
538
  // scheduled when nothing is.
445
- deferredRetry = null;
446
- if (!pending || deps.isGracefulShutdown()) {
539
+ scheduled = null;
540
+ if (deps.isGracefulShutdown()) {
447
541
  return;
448
542
  }
449
543
  /* A cycle or a post-login revalidation holding the guard is already walking guides, quite possibly these same ones. This pass exists to try again on a settled
@@ -456,8 +550,10 @@ async function runDeferredRetry(deps) {
456
550
  precacheInProgress = true;
457
551
  let attempted = 0;
458
552
  let succeeded = 0;
553
+ // The services this pass leaves unwalked because a login session came up, named rather than counted: they are re-armed below on the same schedule.
554
+ let remaining = [];
459
555
  try {
460
- for (const slug of pending.slugs) {
556
+ for (const [index, slug] of pending.slugs.entries()) {
461
557
  // Re-checked every iteration, exactly as the cycle's own loop does: a shutdown that begins mid-pass must stop opening discovery pages, or the next
462
558
  // getCurrentBrowser relaunches the Chrome that teardown just closed.
463
559
  if (deps.isGracefulShutdown()) {
@@ -471,6 +567,14 @@ async function runDeferredRetry(deps) {
471
567
  LOG.debug("precache", "Skipping the deferred re-attempt for %s: its lineup was discovered in the meantime.", provider.label);
472
568
  continue;
473
569
  }
570
+ /* Stop where the login session found us, and take everything from here with us. A walk opens its window at the shared window's placement, which during a
571
+ * login session is the window the user is signing in through. The check reads live state, so the pass that re-arms below runs to the end once the
572
+ * session is over; the slugs already walked are behind us and the one skipped above is settled, so what remains is exactly what is still owed.
573
+ */
574
+ if (isLoginModeActive()) {
575
+ remaining = pending.slugs.slice(index);
576
+ break;
577
+ }
474
578
  attempted++;
475
579
  try {
476
580
  // eslint-disable-next-line no-await-in-loop
@@ -480,12 +584,27 @@ async function runDeferredRetry(deps) {
480
584
  }
481
585
  }
482
586
  catch (error) {
483
- LOG.warn("The deferred channel discovery re-attempt failed for %s: %s.", provider.label, formatError(error));
587
+ /* This is the one pass a service gets, so a lapse here is reported and left there. Queuing it again would put a wedged walk on an unbounded loop, waking
588
+ * the browser for it every few minutes for the life of the process.
589
+ */
590
+ if (error instanceof DiscoveryWalkTimeoutError) {
591
+ LOG.warn("%s's discovery walk exceeded its %d second budget and was stopped.", provider.label, DISCOVERY_WALK_TIMEOUT / 1000);
592
+ }
593
+ else {
594
+ LOG.warn("The deferred channel discovery re-attempt failed for %s: %s.", provider.label, formatError(error));
595
+ }
484
596
  }
485
597
  }
486
598
  if (attempted > 0) {
487
599
  LOG.info("Deferred channel discovery re-attempt complete: %d of %d service%s now have a lineup.", succeeded, attempted, (attempted === 1) ? "" : "s");
488
600
  }
601
+ /* Re-arm what the login session interrupted. This function drops the pending state at entry, so arming here schedules exactly one fresh pass rather than
602
+ * stacking on a handle that is still standing.
603
+ */
604
+ if (remaining.length > 0) {
605
+ LOG.debug("precache", "Deferring %d service%s from the discovery re-attempt: a login session is on screen.", remaining.length, (remaining.length === 1) ? "" : "s");
606
+ armDeferredRetry(remaining, deps);
607
+ }
489
608
  }
490
609
  finally {
491
610
  releasePrecacheGuard(deps);
@@ -493,8 +612,9 @@ async function runDeferredRetry(deps) {
493
612
  }
494
613
  /**
495
614
  * Executes the sequential precaching cycle. Discovers channel lineups for each configured service, clearing the service's cache first to ensure a complete walk.
496
- * Services not in the active service filter are silently skipped when the filter is non-empty. Services that walk and find nothing are handed to a single deferred
497
- * re-attempt, minutes later, once whatever startup contention may have starved them has passed.
615
+ * Services not in the active service filter are silently skipped when the filter is non-empty. Services the cycle could not settle - they walked and found
616
+ * nothing, their walk ran past its budget, or a login session on screen kept them from walking at all - are handed to the deferred re-attempt, minutes later,
617
+ * once whatever startup contention or user session may have starved them has passed.
498
618
  */
499
619
  async function runPrecacheCycle(deps) {
500
620
  /* Bail if a graceful shutdown began while this cycle was queued. Discovery opens browser pages via getCurrentBrowser(), which would relaunch Chrome after shutdown
@@ -510,8 +630,13 @@ async function runPrecacheCycle(deps) {
510
630
  const enabledFilter = CONFIG.channels.enabledServices;
511
631
  const hasFilter = enabledFilter.length > 0;
512
632
  const cycleElapsed = startTimer();
513
- // The services that walked but found nothing, named rather than counted: the deferred re-attempt below needs to know which ones to come back to.
514
- const emptySlugs = [];
633
+ /* The services that walked without settling - they came back with nothing, or the walk ran past its budget and was stopped - named rather than counted, because
634
+ * the deferred re-attempt below needs to know which ones to come back to. Both readings say the same thing about the service: the guide did not answer this
635
+ * time, and a second pass on a settled system is worth trying.
636
+ */
637
+ const unsettledSlugs = [];
638
+ // The services this cycle stood aside from because a login session was on screen. They travel to the same re-attempt, for the same reason: a walk is still owed.
639
+ const deferredSlugs = [];
515
640
  let skipped = 0;
516
641
  let succeeded = 0;
517
642
  LOG.info("Starting channel lineup precaching for %d service%s.", slugs.length, (slugs.length === 1) ? "" : "s");
@@ -534,26 +659,47 @@ async function runPrecacheCycle(deps) {
534
659
  skipped++;
535
660
  continue;
536
661
  }
662
+ /* Stand aside while a login session is on screen. A walk opens its window at the shared window's placement, which during a login session is the window
663
+ * the user is signing in through, and a second window over it would take their clicks. The service is collected for the deferred re-attempt below, which
664
+ * is the machinery that already exists for a service this cycle could not settle. The check sits after the filter skip so a filtered-out service is
665
+ * still counted as filtered rather than queued for a walk it would never get.
666
+ */
667
+ if (isLoginModeActive()) {
668
+ LOG.debug("precache", "Deferring the precache for %s: a login session is on screen.", provider.label);
669
+ deferredSlugs.push(slug);
670
+ continue;
671
+ }
537
672
  try {
538
673
  // eslint-disable-next-line no-await-in-loop
539
674
  const channels = await precacheService(provider, deps);
540
- // An empty walk cached nothing, so it is counted honestly as empty rather than folded into the success count.
675
+ // An empty walk cached nothing, so it is counted as unsettled rather than folded into the success count.
541
676
  if (channels.length > 0) {
542
677
  succeeded++;
543
678
  }
544
679
  else {
545
- emptySlugs.push(slug);
680
+ unsettledSlugs.push(slug);
546
681
  }
547
682
  }
548
683
  catch (error) {
549
- LOG.warn("Failed to precache %s: %s.", provider.label, formatError(error));
684
+ /* A walk stopped at its budget is its own outcome rather than a general failure: the ceiling ended a walk that was still going, which says nothing about
685
+ * whether the guide would answer on a settled system, so the service joins the deferred re-attempt exactly as an empty walk does. Every other failure
686
+ * keeps the general warn and is not queued - a provider that threw has a standing problem another walk will not solve.
687
+ */
688
+ if (error instanceof DiscoveryWalkTimeoutError) {
689
+ LOG.warn("%s's discovery walk exceeded its %d second budget and was stopped; the service will be re-attempted.", provider.label, DISCOVERY_WALK_TIMEOUT / 1000);
690
+ unsettledSlugs.push(slug);
691
+ }
692
+ else {
693
+ LOG.warn("Failed to precache %s: %s.", provider.label, formatError(error));
694
+ }
550
695
  }
551
696
  }
552
697
  const elapsed = (cycleElapsed() / 1000).toFixed(1).replace(/\.0$/, "");
553
- const emptySuffix = (emptySlugs.length > 0) ? ", " + String(emptySlugs.length) + " returned no channels" : "";
698
+ const unsettledSuffix = (unsettledSlugs.length > 0) ? ", " + String(unsettledSlugs.length) + " returned no channels or timed out" : "";
699
+ const deferredSuffix = (deferredSlugs.length > 0) ? ", " + String(deferredSlugs.length) + " deferred for a login session" : "";
554
700
  const skippedSuffix = (skipped > 0) ? ", " + String(skipped) + " skipped (filtered)" : "";
555
- LOG.info("Channel lineup precaching complete: %d service%s cached%s%s in %ss.", succeeded, (succeeded === 1) ? "" : "s", emptySuffix, skippedSuffix, elapsed);
556
- armDeferredRetry(emptySlugs, deps);
701
+ LOG.info("Channel lineup precaching complete: %d service%s cached%s%s%s in %ss.", succeeded, (succeeded === 1) ? "" : "s", unsettledSuffix, deferredSuffix, skippedSuffix, elapsed);
702
+ armDeferredRetry([...unsettledSlugs, ...deferredSlugs], deps);
557
703
  }
558
704
  finally {
559
705
  releasePrecacheGuard(deps);
@@ -1 +1 @@
1
- {"version":3,"file":"precaching.js","sourceRoot":"","sources":["../../src/browser/precaching.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACtI,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;;;;;;;;GAaG;AAEH,mIAAmI;AACnI,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,mJAAmJ;AACnJ,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,wIAAwI;AACxI,IAAI,aAAa,GAA4C,IAAI,CAAC;AAElE;;GAEG;AACH,IAAI,aAAa,GAAwE,IAAI,CAAC;AAE9F;;;GAGG;AACH,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B;;GAEG;AACH,SAAS,kBAAkB;IAEzB,IAAG,aAAa,EAAE,CAAC;QAEjB,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAElC,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAAC,IAAoB;IAEhD,kBAAkB,GAAG,KAAK,CAAC;IAE3B,IAAG,CAAC,kBAAkB,EAAE,CAAC;QAEvB,OAAO;IACT,CAAC;IAED,kBAAkB,GAAG,KAAK,CAAC;IAE3B,eAAe,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAyBD,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IAEnD,iBAAiB;IACjB,iBAAiB;IACjB,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB,qBAAqB;IAE1E,IAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAEjD,OAAO;IACT,CAAC;IAED,kKAAkK;IAClK,yCAAyC;IACzC,IAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAE7B,OAAO;IACT,CAAC;IAED,IAAG,kBAAkB,EAAE,CAAC;QAEtB,+JAA+J;QAC/J,gIAAgI;QAChI,kBAAkB,GAAG,IAAI,CAAC;QAE1B,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,yCAAyC,CAAC,CAAC;QAEjE,OAAO;IACT,CAAC;IAED,iJAAiJ;IACjJ,kBAAkB,GAAG,IAAI,CAAC;IAE1B,iKAAiK;IACjK,sDAAsD;IACtD,kBAAkB,EAAE,CAAC;IAErB,mKAAmK;IACnK,gFAAgF;IAChF,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;QAE9B,aAAa,GAAG,IAAI,CAAC;QACrB,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,EAAE,cAAc,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAE5B,IAAG,aAAa,EAAE,CAAC;QAEjB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,kBAAkB,EAAE,CAAC;IAErB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,kBAAkB,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAwB,EAAE,QAA6B,EAAE,IAAU,EAAE,IAAoB,EACpI,cAA0C;IAE1C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAEzB,MAAM,OAAO,GAAG,cAAc,IAAI,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,kBAAkB,EAAE,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhJ,QAAO,OAAO,CAAC,IAAI,EAAE,CAAC;YAEpB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAEhB,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBAC/B,GAAG,CAAC,IAAI,CAAC,sIAAsI,EAC7I,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAEpC,MAAM;YACR,CAAC;YAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBAEtB,GAAG,CAAC,IAAI,CAAC,2IAA2I;oBAClJ,2BAA2B,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE/C,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBAEf,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,0HAA0H,EAC9I,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAElB,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO;IACT,CAAC;IAED,8JAA8J;IAC9J,+JAA+J;IAC/J,0EAA0E;IAC1E,IAAG,CAAC,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAErE,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvB;;;;;;;;;;WAUG;QACH,MAAM,MAAM,GAA6B,QAAQ,CAAC,mBAAmB,EAAE,EAAE;YACvE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEhG,6JAA6J;QAC7J,oJAAoJ;QACpJ,KAAK,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAE9E,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,uDAAuD,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACrH,CAAC,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,6JAA6J;IAC7J,gKAAgK;IAChK,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAmDD;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAmC;IAEpE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,kBAAkB,EAAE,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErI,IAAG,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAErC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,6FAA6F,EAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAE1J,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;IAC1C,CAAC;IAED,IAAG,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAEjC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,2FAA2F,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrI,CAAC;SAAM,CAAC;QAEN,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,mEAAmE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE3G,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YAEd,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,uFAAuF,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAEnJ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,2JAA2J;IAC3J,0GAA0G;IAC1G,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,IAAI,CAAC;QAEH,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtG,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7D,CAAC;YAAS,CAAC;QAET,eAAe,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAwB,EAAE,UAAwC,EAAE,EAC9G,OAAuB,qBAAqB;IAE5C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,mKAAmK;IACnK,gKAAgK;IAChK,gIAAgI;IAChI,MAAM,OAAO,GAAG,GAAS,EAAE;QAEzB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,+JAA+J;IAC/J,kKAAkK;IAClK,UAAU;IACV,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;IAEhD,IAAI,CAAC;QAEH,8JAA8J;QAC9J,qHAAqH;QACrH,IAAG,MAAM,EAAE,OAAO,EAAE,CAAC;YAEnB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,0JAA0J;QAC1J,8JAA8J;QAC9J,sFAAsF;QACtF,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAS,EAAE;YAE1C,6DAA6D;YAC7D,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;YAErD,gBAAgB,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;gBAErC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;gBAElB,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE/B,iKAAiK;QACjK,+JAA+J;QAC/J,+FAA+F;QAC/F,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAExD,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAExG,4JAA4J;QAC5J,8JAA8J;QAC9J,IAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAElC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QACjH,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAErD,mHAAmH;QACnH,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE1B,IAAI,cAAqD,CAAC;QAE1D;;;WAGG;QACH,IAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAEjG,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;QAED,0JAA0J;QAC1J,4EAA4E;QAC5E,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAElD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QAET,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YAEP,kHAAkH;QACpH,CAAC;QAED,sJAAsJ;QACtJ,2EAA2E;QAC3E,IAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAExB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAwB,EAAE,OAAuB,qBAAqB;IAE1G,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IAEpC,4IAA4I;IAC5I,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;IAEjC,OAAO,qBAAqB,CAAC,QAAQ,EAAE;QAErC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAiB,EAAE;YAEjE,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;YAExI,4JAA4J;YAC5J,0HAA0H;YAC1H,MAAM,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC/E,CAAC;KACF,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,OAAuB,qBAAqB;IAElG,IAAI,CAAC;QAEH,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAElC,2HAA2H;QAC3H,IAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,EAAE,CAAC;YAEvD,OAAO;QACT,CAAC;QAED,0JAA0J;QAC1J,mEAAmE;QACnE,IAAG,iBAAiB,EAAE,EAAE,CAAC;YAEvB,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,sEAAsE,EAAE,MAAM,CAAC,CAAC;YAEtG,OAAO;QACT,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAE7B,OAAO;QACT,CAAC;QAED,6JAA6J;QAC7J,0HAA0H;QAC1H,IAAG,kBAAkB,EAAE,CAAC;YAEtB,GAAG,CAAC,IAAI,CAAC,yFAAyF,EAAE,MAAM,CAAC,CAAC;YAE5G,OAAO;QACT,CAAC;QAED,6JAA6J;QAC7J,mFAAmF;QACnF,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAErD,IAAG,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAE1B,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,iEAAiE,EAAE,MAAM,CAAC,CAAC;YAEjG,OAAO;QACT,CAAC;QAED,mGAAmG;QACnG,kBAAkB,GAAG,IAAI,CAAC;QAE1B,IAAI,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,6EAA6E,EAAE,MAAM,CAAC,CAAC;YAEhG,KAAI,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAEhC,IAAI,CAAC;oBAEH,4CAA4C;oBAC5C,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAM,KAAK,EAAE,CAAC;oBAEd,yJAAyJ;oBACzJ,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7F,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YAET,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAe,EAAE,IAAoB;IAE7D,IAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAErD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,8EAA8E,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EACjJ,oBAAoB,GAAG,KAAK,CAAC,CAAC;IAEhC,aAAa,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,gBAAgB,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,EAAE,CAAC;AACxG,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IAElD,MAAM,OAAO,GAAG,aAAa,CAAC;IAE9B,6JAA6J;IAC7J,6BAA6B;IAC7B,aAAa,GAAG,IAAI,CAAC;IAErB,IAAG,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAEzC,OAAO;IACT,CAAC;IAED;;OAEG;IACH,IAAG,kBAAkB,EAAE,CAAC;QAEtB,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,sFAAsF,CAAC,CAAC;QAE9G,OAAO;IACT,CAAC;IAED,kBAAkB,GAAG,IAAI,CAAC;IAE1B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAI,CAAC;QAEH,KAAI,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhC,mJAAmJ;YACnJ,qEAAqE;YACrE,IAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAE7B,MAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,IAAG,CAAC,QAAQ,EAAE,CAAC;gBAEb,SAAS;YACX,CAAC;YAED,IAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAEhC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,qFAAqF,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE7H,SAAS;YACX,CAAC;YAED,SAAS,EAAE,CAAC;YAEZ,IAAI,CAAC;gBAEH,4CAA4C;gBAC5C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAEvD,IAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAEvB,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,OAAM,KAAK,EAAE,CAAC;gBAEd,GAAG,CAAC,IAAI,CAAC,8DAA8D,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC;QAED,IAAG,SAAS,GAAG,CAAC,EAAE,CAAC;YAEjB,GAAG,CAAC,IAAI,CAAC,uFAAuF,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxJ,CAAC;IACH,CAAC;YAAS,CAAC;QAET,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IAElD;;;;OAIG;IACH,IAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAE7B,kBAAkB,GAAG,KAAK,CAAC;QAE3B,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;IACtD,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;IAElC,iJAAiJ;IACjJ,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,GAAG,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEhH,IAAI,CAAC;QAEH,uJAAuJ;QACvJ,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAExB,4JAA4J;YAC5J,0JAA0J;YAC1J,iHAAiH;YACjH,IAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAE7B,MAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,IAAG,CAAC,QAAQ,EAAE,CAAC;gBAEb,SAAS;YACX,CAAC;YAED,qHAAqH;YACrH,IAAG,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAE9C,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,yDAAyD,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjG,OAAO,EAAE,CAAC;gBAEV,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBAEH,4CAA4C;gBAC5C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAEvD,8GAA8G;gBAC9G,IAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAEvB,SAAS,EAAE,CAAC;gBACd,CAAC;qBAAM,CAAC;oBAEN,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,OAAM,KAAK,EAAE,CAAC;gBAEd,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,MAAM,aAAa,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,GAAG,CAAC,IAAI,CAAC,qEAAqE,EAAE,SAAS,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAE9J,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QAET,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"precaching.js","sourceRoot":"","sources":["../../src/browser/precaching.ts"],"names":[],"mappings":"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"}