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.
Files changed (693) hide show
  1. package/dist/app.d.ts +6 -3
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +140 -86
  4. package/dist/app.js.map +1 -1
  5. package/dist/browser/blockedPage.d.ts +80 -0
  6. package/dist/browser/blockedPage.d.ts.map +1 -0
  7. package/dist/browser/blockedPage.js +209 -0
  8. package/dist/browser/blockedPage.js.map +1 -0
  9. package/dist/browser/browserSupervisor.d.ts +80 -0
  10. package/dist/browser/browserSupervisor.d.ts.map +1 -0
  11. package/dist/browser/browserSupervisor.js +186 -0
  12. package/dist/browser/browserSupervisor.js.map +1 -0
  13. package/dist/browser/cdp.d.ts +1 -0
  14. package/dist/browser/cdp.d.ts.map +1 -0
  15. package/dist/browser/cdp.js +6 -5
  16. package/dist/browser/cdp.js.map +1 -1
  17. package/dist/browser/channelSelection.d.ts +45 -14
  18. package/dist/browser/channelSelection.d.ts.map +1 -0
  19. package/dist/browser/channelSelection.js +81 -18
  20. package/dist/browser/channelSelection.js.map +1 -1
  21. package/dist/browser/consent.d.ts +152 -0
  22. package/dist/browser/consent.d.ts.map +1 -0
  23. package/dist/browser/consent.js +418 -0
  24. package/dist/browser/consent.js.map +1 -0
  25. package/dist/browser/display.d.ts +1 -0
  26. package/dist/browser/display.d.ts.map +1 -0
  27. package/dist/browser/hlsPlaylistObserver.d.ts +55 -0
  28. package/dist/browser/hlsPlaylistObserver.d.ts.map +1 -0
  29. package/dist/browser/hlsPlaylistObserver.js +132 -0
  30. package/dist/browser/hlsPlaylistObserver.js.map +1 -0
  31. package/dist/browser/index.d.ts +67 -40
  32. package/dist/browser/index.d.ts.map +1 -0
  33. package/dist/browser/index.js +508 -300
  34. package/dist/browser/index.js.map +1 -1
  35. package/dist/browser/launchGovernor.d.ts +89 -0
  36. package/dist/browser/launchGovernor.d.ts.map +1 -0
  37. package/dist/browser/launchGovernor.js +96 -0
  38. package/dist/browser/launchGovernor.js.map +1 -0
  39. package/dist/browser/login.d.ts +10 -2
  40. package/dist/browser/login.d.ts.map +1 -0
  41. package/dist/browser/login.js +36 -5
  42. package/dist/browser/login.js.map +1 -1
  43. package/dist/browser/manifestInterceptor.d.ts +102 -49
  44. package/dist/browser/manifestInterceptor.d.ts.map +1 -0
  45. package/dist/browser/manifestInterceptor.js +219 -237
  46. package/dist/browser/manifestInterceptor.js.map +1 -1
  47. package/dist/browser/pageStaleness.d.ts +30 -0
  48. package/dist/browser/pageStaleness.d.ts.map +1 -0
  49. package/dist/browser/pageStaleness.js +76 -0
  50. package/dist/browser/pageStaleness.js.map +1 -0
  51. package/dist/browser/precaching.d.ts +95 -3
  52. package/dist/browser/precaching.d.ts.map +1 -0
  53. package/dist/browser/precaching.js +499 -65
  54. package/dist/browser/precaching.js.map +1 -1
  55. package/dist/browser/tabNetworkObserver.d.ts +49 -0
  56. package/dist/browser/tabNetworkObserver.d.ts.map +1 -0
  57. package/dist/browser/tabNetworkObserver.js +144 -0
  58. package/dist/browser/tabNetworkObserver.js.map +1 -0
  59. package/dist/browser/tuning/cache.d.ts +61 -0
  60. package/dist/browser/tuning/cache.d.ts.map +1 -0
  61. package/dist/browser/tuning/cache.js +62 -0
  62. package/dist/browser/tuning/cache.js.map +1 -0
  63. package/dist/browser/tuning/comcastPolymer.d.ts +3 -2
  64. package/dist/browser/tuning/comcastPolymer.d.ts.map +1 -0
  65. package/dist/browser/tuning/comcastPolymer.js +79 -102
  66. package/dist/browser/tuning/comcastPolymer.js.map +1 -1
  67. package/dist/browser/tuning/cox.d.ts +1 -0
  68. package/dist/browser/tuning/cox.d.ts.map +1 -0
  69. package/dist/browser/tuning/directv.d.ts +1 -0
  70. package/dist/browser/tuning/directv.d.ts.map +1 -0
  71. package/dist/browser/tuning/directv.js +52 -46
  72. package/dist/browser/tuning/directv.js.map +1 -1
  73. package/dist/browser/tuning/fox.d.ts +1 -0
  74. package/dist/browser/tuning/fox.d.ts.map +1 -0
  75. package/dist/browser/tuning/fox.js +13 -12
  76. package/dist/browser/tuning/fox.js.map +1 -1
  77. package/dist/browser/tuning/gridSearch.d.ts +68 -0
  78. package/dist/browser/tuning/gridSearch.d.ts.map +1 -0
  79. package/dist/browser/tuning/gridSearch.js +85 -0
  80. package/dist/browser/tuning/gridSearch.js.map +1 -0
  81. package/dist/browser/tuning/hbo.d.ts +1 -0
  82. package/dist/browser/tuning/hbo.d.ts.map +1 -0
  83. package/dist/browser/tuning/hbo.js +73 -45
  84. package/dist/browser/tuning/hbo.js.map +1 -1
  85. package/dist/browser/tuning/hulu.d.ts +1 -0
  86. package/dist/browser/tuning/hulu.d.ts.map +1 -0
  87. package/dist/browser/tuning/hulu.js +128 -173
  88. package/dist/browser/tuning/hulu.js.map +1 -1
  89. package/dist/browser/tuning/shared.d.ts +75 -5
  90. package/dist/browser/tuning/shared.d.ts.map +1 -0
  91. package/dist/browser/tuning/shared.js +216 -6
  92. package/dist/browser/tuning/shared.js.map +1 -1
  93. package/dist/browser/tuning/sling.d.ts +1 -0
  94. package/dist/browser/tuning/sling.d.ts.map +1 -0
  95. package/dist/browser/tuning/sling.js +105 -126
  96. package/dist/browser/tuning/sling.js.map +1 -1
  97. package/dist/browser/tuning/spectrum.d.ts +1 -0
  98. package/dist/browser/tuning/spectrum.d.ts.map +1 -0
  99. package/dist/browser/tuning/spectrum.js +80 -125
  100. package/dist/browser/tuning/spectrum.js.map +1 -1
  101. package/dist/browser/tuning/thumbnailRow.d.ts +1 -0
  102. package/dist/browser/tuning/thumbnailRow.d.ts.map +1 -0
  103. package/dist/browser/tuning/thumbnailRow.js +8 -2
  104. package/dist/browser/tuning/thumbnailRow.js.map +1 -1
  105. package/dist/browser/tuning/tileClick.d.ts +1 -0
  106. package/dist/browser/tuning/tileClick.d.ts.map +1 -0
  107. package/dist/browser/tuning/tileClick.js +3 -2
  108. package/dist/browser/tuning/tileClick.js.map +1 -1
  109. package/dist/browser/tuning/xfinity.d.ts +1 -0
  110. package/dist/browser/tuning/xfinity.d.ts.map +1 -0
  111. package/dist/browser/tuning/youtubeTv.d.ts +1 -0
  112. package/dist/browser/tuning/youtubeTv.d.ts.map +1 -0
  113. package/dist/browser/tuning/youtubeTv.js +74 -127
  114. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  115. package/dist/browser/video.d.ts +54 -14
  116. package/dist/browser/video.d.ts.map +1 -0
  117. package/dist/browser/video.js +296 -138
  118. package/dist/browser/video.js.map +1 -1
  119. package/dist/channels/index.d.ts +1 -0
  120. package/dist/channels/index.d.ts.map +1 -0
  121. package/dist/channels/index.js +12 -9
  122. package/dist/channels/index.js.map +1 -1
  123. package/dist/config/channelForm.d.ts +15 -1
  124. package/dist/config/channelForm.d.ts.map +1 -0
  125. package/dist/config/channelForm.js +28 -12
  126. package/dist/config/channelForm.js.map +1 -1
  127. package/dist/config/consistencyProbe.d.ts +1 -0
  128. package/dist/config/consistencyProbe.d.ts.map +1 -0
  129. package/dist/config/consistencyProbe.js +27 -21
  130. package/dist/config/consistencyProbe.js.map +1 -1
  131. package/dist/config/health.d.ts +41 -8
  132. package/dist/config/health.d.ts.map +1 -0
  133. package/dist/config/health.js +189 -38
  134. package/dist/config/health.js.map +1 -1
  135. package/dist/config/index.d.ts +55 -3
  136. package/dist/config/index.d.ts.map +1 -0
  137. package/dist/config/index.js +320 -69
  138. package/dist/config/index.js.map +1 -1
  139. package/dist/config/paths.d.ts +10 -9
  140. package/dist/config/paths.d.ts.map +1 -0
  141. package/dist/config/paths.js +11 -11
  142. package/dist/config/paths.js.map +1 -1
  143. package/dist/config/persistence.context.d.ts +1 -0
  144. package/dist/config/persistence.context.d.ts.map +1 -0
  145. package/dist/config/persistence.d.ts +13 -10
  146. package/dist/config/persistence.d.ts.map +1 -0
  147. package/dist/config/persistence.js +40 -21
  148. package/dist/config/persistence.js.map +1 -1
  149. package/dist/config/presets.d.ts +1 -0
  150. package/dist/config/presets.d.ts.map +1 -0
  151. package/dist/config/profiles.d.ts +22 -15
  152. package/dist/config/profiles.d.ts.map +1 -0
  153. package/dist/config/profiles.js +81 -47
  154. package/dist/config/profiles.js.map +1 -1
  155. package/dist/config/providerLineups.d.ts +47 -0
  156. package/dist/config/providerLineups.d.ts.map +1 -0
  157. package/dist/config/providerLineups.js +137 -0
  158. package/dist/config/providerLineups.js.map +1 -0
  159. package/dist/config/reactivity.d.ts +84 -0
  160. package/dist/config/reactivity.d.ts.map +1 -0
  161. package/dist/config/reactivity.js +226 -0
  162. package/dist/config/reactivity.js.map +1 -0
  163. package/dist/config/servicePacks.d.ts +18 -2
  164. package/dist/config/servicePacks.d.ts.map +1 -0
  165. package/dist/config/servicePacks.js +53 -11
  166. package/dist/config/servicePacks.js.map +1 -1
  167. package/dist/config/services.d.ts +21 -15
  168. package/dist/config/services.d.ts.map +1 -0
  169. package/dist/config/services.js +35 -24
  170. package/dist/config/services.js.map +1 -1
  171. package/dist/config/sites.d.ts +6 -4
  172. package/dist/config/sites.d.ts.map +1 -0
  173. package/dist/config/sites.js +15 -11
  174. package/dist/config/sites.js.map +1 -1
  175. package/dist/config/userChannels.d.ts +129 -30
  176. package/dist/config/userChannels.d.ts.map +1 -0
  177. package/dist/config/userChannels.js +333 -68
  178. package/dist/config/userChannels.js.map +1 -1
  179. package/dist/config/userConfig.d.ts +14 -9
  180. package/dist/config/userConfig.d.ts.map +1 -0
  181. package/dist/config/userConfig.js +87 -25
  182. package/dist/config/userConfig.js.map +1 -1
  183. package/dist/config/userProfiles.d.ts +10 -6
  184. package/dist/config/userProfiles.d.ts.map +1 -0
  185. package/dist/config/userProfiles.js +64 -39
  186. package/dist/config/userProfiles.js.map +1 -1
  187. package/dist/hdhr/channelMap.d.ts +1 -0
  188. package/dist/hdhr/channelMap.d.ts.map +1 -0
  189. package/dist/hdhr/deviceId.d.ts +1 -0
  190. package/dist/hdhr/deviceId.d.ts.map +1 -0
  191. package/dist/hdhr/discover.d.ts +1 -0
  192. package/dist/hdhr/discover.d.ts.map +1 -0
  193. package/dist/hdhr/discover.js +48 -47
  194. package/dist/hdhr/discover.js.map +1 -1
  195. package/dist/hdhr/getHandlers.d.ts +29 -0
  196. package/dist/hdhr/getHandlers.d.ts.map +1 -0
  197. package/dist/hdhr/getHandlers.js +196 -0
  198. package/dist/hdhr/getHandlers.js.map +1 -0
  199. package/dist/hdhr/identity.d.ts +36 -0
  200. package/dist/hdhr/identity.d.ts.map +1 -0
  201. package/dist/hdhr/identity.js +51 -0
  202. package/dist/hdhr/identity.js.map +1 -0
  203. package/dist/hdhr/index.d.ts +22 -4
  204. package/dist/hdhr/index.d.ts.map +1 -0
  205. package/dist/hdhr/index.js +229 -54
  206. package/dist/hdhr/index.js.map +1 -1
  207. package/dist/hdhr/protocol.d.ts +75 -0
  208. package/dist/hdhr/protocol.d.ts.map +1 -0
  209. package/dist/hdhr/protocol.js +264 -0
  210. package/dist/hdhr/protocol.js.map +1 -0
  211. package/dist/hdhr/tunerState.d.ts +24 -0
  212. package/dist/hdhr/tunerState.d.ts.map +1 -0
  213. package/dist/hdhr/tunerState.js +67 -0
  214. package/dist/hdhr/tunerState.js.map +1 -0
  215. package/dist/hdhr/udp.d.ts +43 -0
  216. package/dist/hdhr/udp.d.ts.map +1 -0
  217. package/dist/hdhr/udp.js +277 -0
  218. package/dist/hdhr/udp.js.map +1 -0
  219. package/dist/identity.d.ts +1 -0
  220. package/dist/identity.d.ts.map +1 -0
  221. package/dist/identity.js +13 -11
  222. package/dist/identity.js.map +1 -1
  223. package/dist/index.d.ts +1 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +11 -12
  226. package/dist/index.js.map +1 -1
  227. package/dist/native/codecInference.d.ts +1 -0
  228. package/dist/native/codecInference.d.ts.map +1 -0
  229. package/dist/native/codecInference.js +50 -5
  230. package/dist/native/codecInference.js.map +1 -1
  231. package/dist/native/decrypt.d.ts +6 -2
  232. package/dist/native/decrypt.d.ts.map +1 -0
  233. package/dist/native/decrypt.js +15 -8
  234. package/dist/native/decrypt.js.map +1 -1
  235. package/dist/native/index.d.ts +40 -17
  236. package/dist/native/index.d.ts.map +1 -0
  237. package/dist/native/index.js +281 -120
  238. package/dist/native/index.js.map +1 -1
  239. package/dist/native/probe.d.ts +114 -18
  240. package/dist/native/probe.d.ts.map +1 -0
  241. package/dist/native/probe.js +452 -115
  242. package/dist/native/probe.js.map +1 -1
  243. package/dist/native/proxy.d.ts +57 -5
  244. package/dist/native/proxy.d.ts.map +1 -0
  245. package/dist/native/proxy.js +604 -170
  246. package/dist/native/proxy.js.map +1 -1
  247. package/dist/native/tokenExpiry.d.ts +1 -0
  248. package/dist/native/tokenExpiry.d.ts.map +1 -0
  249. package/dist/native/tokenExpiry.js +1 -1
  250. package/dist/routes/assets.d.ts +1 -0
  251. package/dist/routes/assets.d.ts.map +1 -0
  252. package/dist/routes/assets.js +4 -2
  253. package/dist/routes/assets.js.map +1 -1
  254. package/dist/routes/auth.d.ts +1 -0
  255. package/dist/routes/auth.d.ts.map +1 -0
  256. package/dist/routes/auth.js +0 -1
  257. package/dist/routes/auth.js.map +1 -1
  258. package/dist/routes/cdp.d.ts +5 -5
  259. package/dist/routes/cdp.d.ts.map +1 -0
  260. package/dist/routes/cdp.js +59 -20
  261. package/dist/routes/cdp.js.map +1 -1
  262. package/dist/routes/channels.d.ts +1 -0
  263. package/dist/routes/channels.d.ts.map +1 -0
  264. package/dist/routes/channels.js +2 -1
  265. package/dist/routes/channels.js.map +1 -1
  266. package/dist/routes/clientActions.d.ts +98 -0
  267. package/dist/routes/clientActions.d.ts.map +1 -0
  268. package/dist/routes/clientActions.js +113 -0
  269. package/dist/routes/clientActions.js.map +1 -0
  270. package/dist/routes/components.d.ts +5 -3
  271. package/dist/routes/components.d.ts.map +1 -0
  272. package/dist/routes/components.js +36 -39
  273. package/dist/routes/components.js.map +1 -1
  274. package/dist/routes/config/channels/endpoints/browse.d.ts +1 -0
  275. package/dist/routes/config/channels/endpoints/browse.d.ts.map +1 -0
  276. package/dist/routes/config/channels/endpoints/browse.js +23 -10
  277. package/dist/routes/config/channels/endpoints/browse.js.map +1 -1
  278. package/dist/routes/config/channels/endpoints/bulk.d.ts +1 -0
  279. package/dist/routes/config/channels/endpoints/bulk.d.ts.map +1 -0
  280. package/dist/routes/config/channels/endpoints/bulk.js +5 -3
  281. package/dist/routes/config/channels/endpoints/bulk.js.map +1 -1
  282. package/dist/routes/config/channels/endpoints/crud.d.ts +1 -0
  283. package/dist/routes/config/channels/endpoints/crud.d.ts.map +1 -0
  284. package/dist/routes/config/channels/endpoints/crud.js +85 -93
  285. package/dist/routes/config/channels/endpoints/crud.js.map +1 -1
  286. package/dist/routes/config/channels/endpoints/importExport.d.ts +1 -0
  287. package/dist/routes/config/channels/endpoints/importExport.d.ts.map +1 -0
  288. package/dist/routes/config/channels/endpoints/importExport.js +6 -3
  289. package/dist/routes/config/channels/endpoints/importExport.js.map +1 -1
  290. package/dist/routes/config/channels/endpoints/predefined.d.ts +1 -0
  291. package/dist/routes/config/channels/endpoints/predefined.d.ts.map +1 -0
  292. package/dist/routes/config/channels/endpoints/prefs.d.ts +1 -0
  293. package/dist/routes/config/channels/endpoints/prefs.d.ts.map +1 -0
  294. package/dist/routes/config/channels/endpoints/prefs.js +2 -1
  295. package/dist/routes/config/channels/endpoints/prefs.js.map +1 -1
  296. package/dist/routes/config/channels/endpoints/service.d.ts +2 -1
  297. package/dist/routes/config/channels/endpoints/service.d.ts.map +1 -0
  298. package/dist/routes/config/channels/endpoints/service.js +3 -1
  299. package/dist/routes/config/channels/endpoints/service.js.map +1 -1
  300. package/dist/routes/config/channels/endpoints/tags.d.ts +1 -0
  301. package/dist/routes/config/channels/endpoints/tags.d.ts.map +1 -0
  302. package/dist/routes/config/channels/endpoints/tags.js +13 -7
  303. package/dist/routes/config/channels/endpoints/tags.js.map +1 -1
  304. package/dist/routes/config/channels/healthBridge.d.ts +24 -0
  305. package/dist/routes/config/channels/healthBridge.d.ts.map +1 -0
  306. package/dist/routes/config/channels/healthBridge.js +71 -0
  307. package/dist/routes/config/channels/healthBridge.js.map +1 -0
  308. package/dist/routes/config/channels/http/handler.d.ts +1 -0
  309. package/dist/routes/config/channels/http/handler.d.ts.map +1 -0
  310. package/dist/routes/config/channels/http/playlistHint.d.ts +2 -1
  311. package/dist/routes/config/channels/http/playlistHint.d.ts.map +1 -0
  312. package/dist/routes/config/channels/http/playlistHint.js +16 -2
  313. package/dist/routes/config/channels/http/playlistHint.js.map +1 -1
  314. package/dist/routes/config/channels/http/serviceWarning.d.ts +4 -2
  315. package/dist/routes/config/channels/http/serviceWarning.d.ts.map +1 -0
  316. package/dist/routes/config/channels/http/serviceWarning.js +3 -2
  317. package/dist/routes/config/channels/http/serviceWarning.js.map +1 -1
  318. package/dist/routes/config/channels/index.d.ts +1 -0
  319. package/dist/routes/config/channels/index.d.ts.map +1 -0
  320. package/dist/routes/config/channels/setup.d.ts +1 -0
  321. package/dist/routes/config/channels/setup.d.ts.map +1 -0
  322. package/dist/routes/config/channels/table.d.ts +3 -3
  323. package/dist/routes/config/channels/table.d.ts.map +1 -0
  324. package/dist/routes/config/channels/table.js +148 -107
  325. package/dist/routes/config/channels/table.js.map +1 -1
  326. package/dist/routes/config/http/envelope.d.ts +1 -0
  327. package/dist/routes/config/http/envelope.d.ts.map +1 -0
  328. package/dist/routes/config/index.d.ts +35 -3
  329. package/dist/routes/config/index.d.ts.map +1 -0
  330. package/dist/routes/config/index.js +51 -2
  331. package/dist/routes/config/index.js.map +1 -1
  332. package/dist/routes/config/services.d.ts +5 -4
  333. package/dist/routes/config/services.d.ts.map +1 -0
  334. package/dist/routes/config/services.js +57 -43
  335. package/dist/routes/config/services.js.map +1 -1
  336. package/dist/routes/config/settings.d.ts +1 -0
  337. package/dist/routes/config/settings.d.ts.map +1 -0
  338. package/dist/routes/config/settings.js +98 -49
  339. package/dist/routes/config/settings.js.map +1 -1
  340. package/dist/routes/debug.d.ts +1 -0
  341. package/dist/routes/debug.d.ts.map +1 -0
  342. package/dist/routes/debug.js +277 -139
  343. package/dist/routes/debug.js.map +1 -1
  344. package/dist/routes/health.d.ts +39 -1
  345. package/dist/routes/health.d.ts.map +1 -0
  346. package/dist/routes/health.js +33 -27
  347. package/dist/routes/health.js.map +1 -1
  348. package/dist/routes/hls.d.ts +1 -0
  349. package/dist/routes/hls.d.ts.map +1 -0
  350. package/dist/routes/icons.d.ts +1 -0
  351. package/dist/routes/icons.d.ts.map +1 -0
  352. package/dist/routes/icons.js +1 -1
  353. package/dist/routes/index.d.ts +1 -0
  354. package/dist/routes/index.d.ts.map +1 -0
  355. package/dist/routes/logs.d.ts +1 -0
  356. package/dist/routes/logs.d.ts.map +1 -0
  357. package/dist/routes/logs.js +14 -4
  358. package/dist/routes/logs.js.map +1 -1
  359. package/dist/routes/mpegts.d.ts +1 -0
  360. package/dist/routes/mpegts.d.ts.map +1 -0
  361. package/dist/routes/play.d.ts +1 -0
  362. package/dist/routes/play.d.ts.map +1 -0
  363. package/dist/routes/playlist.d.ts +1 -0
  364. package/dist/routes/playlist.d.ts.map +1 -0
  365. package/dist/routes/playlist.js +7 -2
  366. package/dist/routes/playlist.js.map +1 -1
  367. package/dist/routes/root/content.d.ts +8 -5
  368. package/dist/routes/root/content.d.ts.map +1 -0
  369. package/dist/routes/root/content.js +29 -26
  370. package/dist/routes/root/content.js.map +1 -1
  371. package/dist/routes/root/index.d.ts +2 -1
  372. package/dist/routes/root/index.d.ts.map +1 -0
  373. package/dist/routes/root/index.js +26 -21
  374. package/dist/routes/root/index.js.map +1 -1
  375. package/dist/routes/root/scripts/channels.d.ts +6 -0
  376. package/dist/routes/root/scripts/channels.d.ts.map +1 -0
  377. package/dist/routes/root/scripts/channels.js +197 -118
  378. package/dist/routes/root/scripts/channels.js.map +1 -1
  379. package/dist/routes/root/scripts/clientEscape.d.ts +22 -0
  380. package/dist/routes/root/scripts/clientEscape.d.ts.map +1 -0
  381. package/dist/routes/root/scripts/clientEscape.js +41 -0
  382. package/dist/routes/root/scripts/clientEscape.js.map +1 -0
  383. package/dist/routes/root/scripts/clientUrl.d.ts +23 -0
  384. package/dist/routes/root/scripts/clientUrl.d.ts.map +1 -0
  385. package/dist/routes/root/scripts/clientUrl.js +44 -0
  386. package/dist/routes/root/scripts/clientUrl.js.map +1 -0
  387. package/dist/routes/root/scripts/config.d.ts +6 -0
  388. package/dist/routes/root/scripts/config.d.ts.map +1 -0
  389. package/dist/routes/root/scripts/config.js +110 -24
  390. package/dist/routes/root/scripts/config.js.map +1 -1
  391. package/dist/routes/root/scripts/index.d.ts +1 -0
  392. package/dist/routes/root/scripts/index.d.ts.map +1 -0
  393. package/dist/routes/root/scripts/shared.d.ts +1 -0
  394. package/dist/routes/root/scripts/shared.d.ts.map +1 -0
  395. package/dist/routes/root/scripts/shared.js +112 -26
  396. package/dist/routes/root/scripts/shared.js.map +1 -1
  397. package/dist/routes/root/scripts/status.d.ts +1 -0
  398. package/dist/routes/root/scripts/status.d.ts.map +1 -0
  399. package/dist/routes/root/scripts/status.handlers.d.ts +23 -33
  400. package/dist/routes/root/scripts/status.handlers.d.ts.map +1 -0
  401. package/dist/routes/root/scripts/status.handlers.js +46 -92
  402. package/dist/routes/root/scripts/status.handlers.js.map +1 -1
  403. package/dist/routes/root/scripts/status.js +21 -8
  404. package/dist/routes/root/scripts/status.js.map +1 -1
  405. package/dist/routes/root/styles.d.ts +1 -0
  406. package/dist/routes/root/styles.d.ts.map +1 -0
  407. package/dist/routes/root/styles.js +7 -4
  408. package/dist/routes/root/styles.js.map +1 -1
  409. package/dist/routes/services.d.ts +13 -1
  410. package/dist/routes/services.d.ts.map +1 -0
  411. package/dist/routes/services.js +81 -68
  412. package/dist/routes/services.js.map +1 -1
  413. package/dist/routes/sse.d.ts +1 -0
  414. package/dist/routes/sse.d.ts.map +1 -0
  415. package/dist/routes/sse.js +1 -1
  416. package/dist/routes/sse.js.map +1 -1
  417. package/dist/routes/streams.d.ts +2 -1
  418. package/dist/routes/streams.d.ts.map +1 -0
  419. package/dist/routes/streams.js +6 -4
  420. package/dist/routes/streams.js.map +1 -1
  421. package/dist/routes/theme.d.ts +3 -2
  422. package/dist/routes/theme.d.ts.map +1 -0
  423. package/dist/routes/theme.js +6 -5
  424. package/dist/routes/theme.js.map +1 -1
  425. package/dist/routes/ui.d.ts +3 -1
  426. package/dist/routes/ui.d.ts.map +1 -0
  427. package/dist/routes/ui.js +16 -4
  428. package/dist/routes/ui.js.map +1 -1
  429. package/dist/routes/upgrade.d.ts +1 -0
  430. package/dist/routes/upgrade.d.ts.map +1 -0
  431. package/dist/routes/upgrade.js +6 -2
  432. package/dist/routes/upgrade.js.map +1 -1
  433. package/dist/service/commands.context.d.ts +1 -0
  434. package/dist/service/commands.context.d.ts.map +1 -0
  435. package/dist/service/commands.context.js +4 -3
  436. package/dist/service/commands.context.js.map +1 -1
  437. package/dist/service/commands.d.ts +1 -0
  438. package/dist/service/commands.d.ts.map +1 -0
  439. package/dist/service/commands.js +10 -13
  440. package/dist/service/commands.js.map +1 -1
  441. package/dist/service/generators.context.d.ts +1 -0
  442. package/dist/service/generators.context.d.ts.map +1 -0
  443. package/dist/service/generators.context.js +1 -1
  444. package/dist/service/generators.context.js.map +1 -1
  445. package/dist/service/generators.d.ts +4 -3
  446. package/dist/service/generators.d.ts.map +1 -0
  447. package/dist/service/generators.js +111 -31
  448. package/dist/service/generators.js.map +1 -1
  449. package/dist/service/index.d.ts +1 -0
  450. package/dist/service/index.d.ts.map +1 -0
  451. package/dist/streaming/captureLock.d.ts +44 -0
  452. package/dist/streaming/captureLock.d.ts.map +1 -0
  453. package/dist/streaming/captureLock.js +95 -0
  454. package/dist/streaming/captureLock.js.map +1 -0
  455. package/dist/streaming/captureSession.d.ts +31 -0
  456. package/dist/streaming/captureSession.d.ts.map +1 -0
  457. package/dist/streaming/captureSession.js +54 -0
  458. package/dist/streaming/captureSession.js.map +1 -0
  459. package/dist/streaming/clients.d.ts +1 -0
  460. package/dist/streaming/clients.d.ts.map +1 -0
  461. package/dist/streaming/codec.d.ts +1 -0
  462. package/dist/streaming/codec.d.ts.map +1 -0
  463. package/dist/streaming/fmp4Segmenter.d.ts +29 -2
  464. package/dist/streaming/fmp4Segmenter.d.ts.map +1 -0
  465. package/dist/streaming/fmp4Segmenter.js +79 -26
  466. package/dist/streaming/fmp4Segmenter.js.map +1 -1
  467. package/dist/streaming/hls.d.ts +18 -7
  468. package/dist/streaming/hls.d.ts.map +1 -0
  469. package/dist/streaming/hls.js +220 -120
  470. package/dist/streaming/hls.js.map +1 -1
  471. package/dist/streaming/hlsResume.d.ts +1 -0
  472. package/dist/streaming/hlsResume.d.ts.map +1 -0
  473. package/dist/streaming/hlsResume.js +1 -1
  474. package/dist/streaming/hlsResume.js.map +1 -1
  475. package/dist/streaming/hlsSegments.d.ts +59 -2
  476. package/dist/streaming/hlsSegments.d.ts.map +1 -0
  477. package/dist/streaming/hlsSegments.js +147 -17
  478. package/dist/streaming/hlsSegments.js.map +1 -1
  479. package/dist/streaming/lifecycle.d.ts +4 -1
  480. package/dist/streaming/lifecycle.d.ts.map +1 -0
  481. package/dist/streaming/lifecycle.js +65 -85
  482. package/dist/streaming/lifecycle.js.map +1 -1
  483. package/dist/streaming/monitor.d.ts +6 -4
  484. package/dist/streaming/monitor.d.ts.map +1 -0
  485. package/dist/streaming/monitor.js +343 -145
  486. package/dist/streaming/monitor.js.map +1 -1
  487. package/dist/streaming/mp4Parser.d.ts +5 -4
  488. package/dist/streaming/mp4Parser.d.ts.map +1 -0
  489. package/dist/streaming/mp4Parser.js +36 -13
  490. package/dist/streaming/mp4Parser.js.map +1 -1
  491. package/dist/streaming/mpegts.d.ts +16 -0
  492. package/dist/streaming/mpegts.d.ts.map +1 -0
  493. package/dist/streaming/mpegts.js +61 -17
  494. package/dist/streaming/mpegts.js.map +1 -1
  495. package/dist/streaming/playlistBuilder.d.ts +1 -0
  496. package/dist/streaming/playlistBuilder.d.ts.map +1 -0
  497. package/dist/streaming/preroll.d.ts +32 -5
  498. package/dist/streaming/preroll.d.ts.map +1 -0
  499. package/dist/streaming/preroll.js +70 -32
  500. package/dist/streaming/preroll.js.map +1 -1
  501. package/dist/streaming/pretune.d.ts +26 -1
  502. package/dist/streaming/pretune.d.ts.map +1 -0
  503. package/dist/streaming/pretune.js +22 -24
  504. package/dist/streaming/pretune.js.map +1 -1
  505. package/dist/streaming/pretuneTimers.d.ts +24 -0
  506. package/dist/streaming/pretuneTimers.d.ts.map +1 -0
  507. package/dist/streaming/pretuneTimers.js +56 -0
  508. package/dist/streaming/pretuneTimers.js.map +1 -0
  509. package/dist/streaming/recovery.d.ts +139 -5
  510. package/dist/streaming/recovery.d.ts.map +1 -0
  511. package/dist/streaming/recovery.js +160 -16
  512. package/dist/streaming/recovery.js.map +1 -1
  513. package/dist/streaming/registry.d.ts +27 -9
  514. package/dist/streaming/registry.d.ts.map +1 -0
  515. package/dist/streaming/registry.js +21 -3
  516. package/dist/streaming/registry.js.map +1 -1
  517. package/dist/streaming/setup.d.ts +157 -29
  518. package/dist/streaming/setup.d.ts.map +1 -0
  519. package/dist/streaming/setup.js +1034 -458
  520. package/dist/streaming/setup.js.map +1 -1
  521. package/dist/streaming/showInfo.d.ts +21 -1
  522. package/dist/streaming/showInfo.d.ts.map +1 -0
  523. package/dist/streaming/showInfo.js +31 -16
  524. package/dist/streaming/showInfo.js.map +1 -1
  525. package/dist/streaming/statusEmitter.d.ts +10 -10
  526. package/dist/streaming/statusEmitter.d.ts.map +1 -0
  527. package/dist/streaming/statusEmitter.js +5 -8
  528. package/dist/streaming/statusEmitter.js.map +1 -1
  529. package/dist/types/channels.d.ts +16 -4
  530. package/dist/types/channels.d.ts.map +1 -0
  531. package/dist/types/channels.js +4 -2
  532. package/dist/types/channels.js.map +1 -1
  533. package/dist/types/config.d.ts +16 -5
  534. package/dist/types/config.d.ts.map +1 -0
  535. package/dist/types/index.d.ts +3 -2
  536. package/dist/types/index.d.ts.map +1 -0
  537. package/dist/types/profiles.d.ts +6 -4
  538. package/dist/types/profiles.d.ts.map +1 -0
  539. package/dist/types/selection.d.ts +31 -3
  540. package/dist/types/selection.d.ts.map +1 -0
  541. package/dist/types/selection.js +4 -2
  542. package/dist/types/selection.js.map +1 -1
  543. package/dist/types/shared.d.ts +1 -0
  544. package/dist/types/shared.d.ts.map +1 -0
  545. package/dist/types/streaming.d.ts +8 -0
  546. package/dist/types/streaming.d.ts.map +1 -0
  547. package/dist/upgrade/commands.context.d.ts +1 -0
  548. package/dist/upgrade/commands.context.d.ts.map +1 -0
  549. package/dist/upgrade/commands.context.js +14 -10
  550. package/dist/upgrade/commands.context.js.map +1 -1
  551. package/dist/upgrade/commands.d.ts +8 -15
  552. package/dist/upgrade/commands.d.ts.map +1 -0
  553. package/dist/upgrade/commands.js +27 -28
  554. package/dist/upgrade/commands.js.map +1 -1
  555. package/dist/upgrade/detection.context.d.ts +1 -0
  556. package/dist/upgrade/detection.context.d.ts.map +1 -0
  557. package/dist/upgrade/detection.context.js +4 -1
  558. package/dist/upgrade/detection.context.js.map +1 -1
  559. package/dist/upgrade/detection.d.ts +9 -7
  560. package/dist/upgrade/detection.d.ts.map +1 -0
  561. package/dist/upgrade/detection.js +23 -54
  562. package/dist/upgrade/detection.js.map +1 -1
  563. package/dist/upgrade/index.d.ts +2 -0
  564. package/dist/upgrade/index.d.ts.map +1 -0
  565. package/dist/upgrade/index.js +1 -0
  566. package/dist/upgrade/index.js.map +1 -1
  567. package/dist/upgrade/lifecycle.context.d.ts +20 -0
  568. package/dist/upgrade/lifecycle.context.d.ts.map +1 -0
  569. package/dist/upgrade/lifecycle.context.js +47 -0
  570. package/dist/upgrade/lifecycle.context.js.map +1 -0
  571. package/dist/upgrade/lifecycle.d.ts +72 -0
  572. package/dist/upgrade/lifecycle.d.ts.map +1 -0
  573. package/dist/upgrade/lifecycle.js +175 -0
  574. package/dist/upgrade/lifecycle.js.map +1 -0
  575. package/dist/upgrade/pathHandle.d.ts +30 -0
  576. package/dist/upgrade/pathHandle.d.ts.map +1 -0
  577. package/dist/upgrade/pathHandle.js +102 -0
  578. package/dist/upgrade/pathHandle.js.map +1 -0
  579. package/dist/utils/bootSession.context.d.ts +16 -0
  580. package/dist/utils/bootSession.context.d.ts.map +1 -0
  581. package/dist/utils/bootSession.context.js +60 -0
  582. package/dist/utils/bootSession.context.js.map +1 -0
  583. package/dist/utils/bootSession.d.ts +17 -0
  584. package/dist/utils/bootSession.d.ts.map +1 -0
  585. package/dist/utils/bootSession.js +20 -0
  586. package/dist/utils/bootSession.js.map +1 -0
  587. package/dist/utils/chromeFetch.d.ts +1 -0
  588. package/dist/utils/chromeFetch.d.ts.map +1 -0
  589. package/dist/utils/cliOutput.d.ts +1 -0
  590. package/dist/utils/cliOutput.d.ts.map +1 -0
  591. package/dist/utils/clock.d.ts +5 -4
  592. package/dist/utils/clock.d.ts.map +1 -0
  593. package/dist/utils/clock.js +19 -16
  594. package/dist/utils/clock.js.map +1 -1
  595. package/dist/utils/debugFilter.d.ts +9 -1
  596. package/dist/utils/debugFilter.d.ts.map +1 -0
  597. package/dist/utils/debugFilter.js +60 -33
  598. package/dist/utils/debugFilter.js.map +1 -1
  599. package/dist/utils/delay.d.ts +48 -15
  600. package/dist/utils/delay.d.ts.map +1 -0
  601. package/dist/utils/delay.js +73 -20
  602. package/dist/utils/delay.js.map +1 -1
  603. package/dist/utils/errors.d.ts +32 -0
  604. package/dist/utils/errors.d.ts.map +1 -0
  605. package/dist/utils/errors.js +45 -4
  606. package/dist/utils/errors.js.map +1 -1
  607. package/dist/utils/evaluate.d.ts +1 -0
  608. package/dist/utils/evaluate.d.ts.map +1 -0
  609. package/dist/utils/evaluate.js +29 -23
  610. package/dist/utils/evaluate.js.map +1 -1
  611. package/dist/utils/ffmpeg.context.d.ts +1 -0
  612. package/dist/utils/ffmpeg.context.d.ts.map +1 -0
  613. package/dist/utils/ffmpeg.context.js.map +1 -1
  614. package/dist/utils/ffmpeg.d.ts +29 -7
  615. package/dist/utils/ffmpeg.d.ts.map +1 -0
  616. package/dist/utils/ffmpeg.js +32 -14
  617. package/dist/utils/ffmpeg.js.map +1 -1
  618. package/dist/utils/fileLogger.d.ts +3 -1
  619. package/dist/utils/fileLogger.d.ts.map +1 -0
  620. package/dist/utils/fileLogger.js +64 -29
  621. package/dist/utils/fileLogger.js.map +1 -1
  622. package/dist/utils/format.d.ts +14 -1
  623. package/dist/utils/format.d.ts.map +1 -0
  624. package/dist/utils/format.js +19 -5
  625. package/dist/utils/format.js.map +1 -1
  626. package/dist/utils/index.d.ts +4 -0
  627. package/dist/utils/index.d.ts.map +1 -0
  628. package/dist/utils/index.js +3 -0
  629. package/dist/utils/index.js.map +1 -1
  630. package/dist/utils/logEmitter.d.ts +1 -0
  631. package/dist/utils/logEmitter.d.ts.map +1 -0
  632. package/dist/utils/logger.d.ts +1 -0
  633. package/dist/utils/logger.d.ts.map +1 -0
  634. package/dist/utils/logger.js +10 -6
  635. package/dist/utils/logger.js.map +1 -1
  636. package/dist/utils/m3u.d.ts +3 -2
  637. package/dist/utils/m3u.d.ts.map +1 -0
  638. package/dist/utils/m3u.js +4 -3
  639. package/dist/utils/m3u.js.map +1 -1
  640. package/dist/utils/markup.d.ts +13 -1
  641. package/dist/utils/markup.d.ts.map +1 -0
  642. package/dist/utils/markup.js +28 -4
  643. package/dist/utils/markup.js.map +1 -1
  644. package/dist/utils/memo.d.ts +3 -2
  645. package/dist/utils/memo.d.ts.map +1 -0
  646. package/dist/utils/memo.js +3 -3
  647. package/dist/utils/morganStream.d.ts +1 -0
  648. package/dist/utils/morganStream.d.ts.map +1 -0
  649. package/dist/utils/network.d.ts +1 -0
  650. package/dist/utils/network.d.ts.map +1 -0
  651. package/dist/utils/network.js +2 -2
  652. package/dist/utils/pid.d.ts +3 -25
  653. package/dist/utils/pid.d.ts.map +1 -0
  654. package/dist/utils/pid.js +10 -49
  655. package/dist/utils/pid.js.map +1 -1
  656. package/dist/utils/platform.d.ts +3 -1
  657. package/dist/utils/platform.d.ts.map +1 -0
  658. package/dist/utils/platform.js +2 -1
  659. package/dist/utils/platform.js.map +1 -1
  660. package/dist/utils/processInspector.context.d.ts +8 -0
  661. package/dist/utils/processInspector.context.d.ts.map +1 -0
  662. package/dist/utils/processInspector.context.js +106 -0
  663. package/dist/utils/processInspector.context.js.map +1 -0
  664. package/dist/utils/processInspector.d.ts +55 -0
  665. package/dist/utils/processInspector.d.ts.map +1 -0
  666. package/dist/utils/processInspector.js +127 -0
  667. package/dist/utils/processInspector.js.map +1 -0
  668. package/dist/utils/retry.d.ts +25 -2
  669. package/dist/utils/retry.d.ts.map +1 -0
  670. package/dist/utils/retry.js +33 -6
  671. package/dist/utils/retry.js.map +1 -1
  672. package/dist/utils/runtimeIdentity.context.d.ts +7 -0
  673. package/dist/utils/runtimeIdentity.context.d.ts.map +1 -0
  674. package/dist/utils/runtimeIdentity.context.js +43 -0
  675. package/dist/utils/runtimeIdentity.context.js.map +1 -0
  676. package/dist/utils/runtimeIdentity.d.ts +98 -0
  677. package/dist/utils/runtimeIdentity.d.ts.map +1 -0
  678. package/dist/utils/runtimeIdentity.js +181 -0
  679. package/dist/utils/runtimeIdentity.js.map +1 -0
  680. package/dist/utils/sanitize.d.ts +1 -0
  681. package/dist/utils/sanitize.d.ts.map +1 -0
  682. package/dist/utils/streamContext.d.ts +2 -1
  683. package/dist/utils/streamContext.d.ts.map +1 -0
  684. package/dist/utils/streamContext.js +1 -1
  685. package/dist/utils/timing.d.ts +2 -1
  686. package/dist/utils/timing.d.ts.map +1 -0
  687. package/dist/utils/timing.js +0 -5
  688. package/dist/utils/timing.js.map +1 -1
  689. package/dist/utils/version.d.ts +1 -0
  690. package/dist/utils/version.d.ts.map +1 -0
  691. package/dist/utils/version.js +47 -13
  692. package/dist/utils/version.js.map +1 -1
  693. package/package.json +26 -20
@@ -0,0 +1,209 @@
1
+ import { consentOverlayPresent } from "./consent.js";
2
+ import { waitWithTimeout } from "../utils/index.js";
3
+ /* When a channel discovery walk returns zero channels, the page it walked is still open - and what is on that page is evidence. This module classifies that
4
+ * still-open page as a provider authentication wall, a consent overlay, or unknown, so the discovery-outcome policy in precaching.ts can persist the needs-sign-in
5
+ * domain state on positive evidence rather than guessing from redirects or URL shapes.
6
+ *
7
+ * The module follows the pure-decision-core / thin-impure-adapter split (the browserSupervisor / launchGovernor precedent): decideBlockedPage is a pure function
8
+ * over collected signals, and classifyBlockedPage is the thin adapter that gathers those signals from the live page. The signal gathering itself composes
9
+ * consentOverlayPresent from consent.ts (never duplicated) plus one in-page collector (collectSignInContainers) that reports candidate sign-in containers.
10
+ *
11
+ * Decision order: (a) provider-declared indicators, (b) consent overlay, (c) the generic container-scoped sign-in shape, (d) unknown. Consent is checked before the
12
+ * generic shape because a CMP banner can mask a wall behind it - we cannot see through the mask, so consent is the more actionable signal. The discovery walk runs
13
+ * its own consent-overlay poll (see consent.ts), which dismisses the banner proactively, so a consentOverlay classification here means that poll could not clear it
14
+ * - the banner is the standing obstacle, and dismissing it manually is the actionable next step.
15
+ *
16
+ * classifyBlockedPage never throws: classification is best-effort advisory evidence, so any internal failure (the page closed or navigated mid-probe, an evaluate
17
+ * error) degrades to the unknown classification rather than propagating into the discovery path.
18
+ */
19
+ // Ancestor depth bound for the container search in collectSignInContainers. Mirrors consent.ts's embed-gate ancestor bound - deep enough to find the form-like
20
+ // wrapper around an input on a real page, shallow enough that the search can never escalate to a page-level container.
21
+ const CONTAINER_SEARCH_DEPTH = 6;
22
+ // Cap on the container text carried back across the evaluate boundary. Sign-in phrasing sits next to the inputs it describes, so a bounded snippet is enough; the
23
+ // cap keeps a pathological container from shipping an entire page of text into Node.
24
+ const CONTAINER_TEXT_LIMIT = 500;
25
+ // Source for the sign-in phrasing that qualifies a candidate container as an authentication wall. Kept narrow and account-flavored so newsletter, search, and other
26
+ // benign text-entry forms never match. The gerund arm ("entering your email") covers walls whose form copy phrases the instruction inside a terms-of-use sentence
27
+ // ("By entering your email and clicking Continue..."), the shape the Fox One wall uses. Held as a source string (rather than a RegExp) to match the consent.ts
28
+ // convention for patterns whose natural home is the page.evaluate boundary, although the decision core applies it Node-side.
29
+ const SIGN_IN_PHRASING_SOURCE = "\\b(sign[ -]?in|log[ -]?in|sign[ -]?on|enter(ing)? your e-?mail|create an? (free )?account)\\b";
30
+ // The compiled sign-in phrasing matcher used by the pure decision core.
31
+ const SIGN_IN_PHRASING_RE = new RegExp(SIGN_IN_PHRASING_SOURCE, "i");
32
+ // Upper bound in milliseconds on the blocked-page classification. classifyBlockedPage bounds its own signal gathering with this budget, so it is never-throwing AND
33
+ // never-hanging: a hung renderer cannot stall a caller's failure path, and no caller needs a timeout wrapper of its own. Four seconds accommodates the DOM probes on
34
+ // a responsive page while keeping the added window negligible inside the callers' own time budgets (the tune's playback-initialization race, the precache cycle).
35
+ const BLOCKED_PAGE_CLASSIFY_TIMEOUT = 4000;
36
+ /**
37
+ * In-page collector for candidate sign-in containers. For every password, email, or text input on the page, it resolves the input's candidate container - the
38
+ * enclosing form when one exists, otherwise the nearest ancestor within a bounded depth that carries a submit affordance - and reports the container's structure.
39
+ * The body and document element are never candidates, which (together with the depth bound) is what makes the shape rule container-scoped: a newsletter form in the
40
+ * footer and a "Sign In" link in the nav can never merge into one record.
41
+ *
42
+ * 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
43
+ * global. Exported so unit tests can run it against a synthetic DOM.
44
+ * @param args - The depth bound for the ancestor search and the text cap per record.
45
+ * @returns One record per qualifying input's container. Containers are reported per seeding input, without deduplication - the decision core only asks whether any
46
+ * record qualifies.
47
+ */
48
+ export function collectSignInContainers(args) {
49
+ const records = [];
50
+ for (const input of Array.from(document.querySelectorAll("input"))) {
51
+ // Only password, email, and text inputs can seed a sign-in shape. A type-less input defaults to text per the HTML spec.
52
+ const type = (input.getAttribute("type") ?? "text").toLowerCase();
53
+ if (!["email", "password", "text"].includes(type)) {
54
+ continue;
55
+ }
56
+ // Skip hidden inputs (and inputs inside hidden subtrees). Autofill honeypots are commonly hidden password or text inputs, and a hidden control is not part of
57
+ // the wall a viewer would see.
58
+ if (input.hasAttribute("hidden") || (input.closest("[hidden]") !== null)) {
59
+ continue;
60
+ }
61
+ // Resolve the candidate container: the enclosing form wins; otherwise walk up a bounded number of ancestors looking for one that carries a submit affordance.
62
+ let container = input.closest("form");
63
+ if (!container) {
64
+ let node = input.parentElement;
65
+ for (let depth = 0; node && (depth < args.maxDepth); depth++) {
66
+ if ((node === document.body) || (node === document.documentElement)) {
67
+ break;
68
+ }
69
+ if (node.querySelector("button, input[type=\"submit\"], [role=\"button\"]") !== null) {
70
+ container = node;
71
+ break;
72
+ }
73
+ node = node.parentElement;
74
+ }
75
+ }
76
+ if (!container || (container === document.body) || (container === document.documentElement)) {
77
+ continue;
78
+ }
79
+ /* Compose the container's text from its descendant text nodes joined with single spaces. Raw textContent concatenates adjacent elements without separators (a
80
+ * heading followed by a button reads "Enter Your EmailContinue"), which would defeat the decision core's word-boundary phrasing match. The numeric whatToShow
81
+ * value is NodeFilter.SHOW_TEXT, named locally so the collector stays self-contained across the evaluate boundary without relying on the NodeFilter global.
82
+ */
83
+ const SHOW_TEXT = 4;
84
+ const parts = [];
85
+ const walker = document.createTreeWalker(container, SHOW_TEXT);
86
+ while (walker.nextNode()) {
87
+ parts.push(walker.currentNode.textContent ?? "");
88
+ }
89
+ const text = parts.join(" ").replace(/\s+/g, " ").trim().slice(0, args.textLimit);
90
+ records.push({
91
+ hasPasswordInput: container.querySelector("input[type=\"password\"]") !== null,
92
+ hasSubmitAffordance: container.querySelector("button, input[type=\"submit\"], [role=\"button\"]") !== null,
93
+ hasTextEntry: (type === "email") || (type === "text"),
94
+ text
95
+ });
96
+ }
97
+ return records;
98
+ }
99
+ /**
100
+ * Extracts the hostname from a URL, or null when the URL does not parse. Pure helper for the host-indicator match and the evidence composition.
101
+ */
102
+ function hostnameOf(url) {
103
+ try {
104
+ return new URL(url).hostname;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Reduces a URL to its host and path for evidence strings. Sign-in redirects carry per-session tokens (login challenges, device identifiers, API keys) in the
112
+ * query string - noise with no diagnostic value that does not belong in a log users share when asking for help. Falls back to the raw string when the URL does
113
+ * not parse, since evidence must always name where discovery landed.
114
+ */
115
+ function displayUrlOf(url) {
116
+ try {
117
+ const parsed = new URL(url);
118
+ return parsed.host + parsed.pathname;
119
+ }
120
+ catch {
121
+ return url;
122
+ }
123
+ }
124
+ /**
125
+ * Matches a hostname against a provider-declared host pattern using cookie-domain semantics: an exact match, or any subdomain of the pattern.
126
+ */
127
+ const hostMatchesPattern = (hostname, pattern) => (hostname === pattern) || hostname.endsWith("." + pattern);
128
+ /**
129
+ * The pure decision core: classifies a blocked page from its collected signals. Decision order is (a) provider indicators, (b) consent overlay, (c) the generic
130
+ * container-scoped sign-in shape, (d) unknown - see the module comment for the (b)-before-(c) rationale. The landed-URL-differs signal strengthens authWall
131
+ * evidence but never suffices alone: with no indicator, no consent overlay, and no qualifying container, a redirect classifies as unknown.
132
+ * @param signals - The collected page signals.
133
+ * @returns The classification.
134
+ */
135
+ export function decideBlockedPage(signals) {
136
+ // (a) Provider-declared indicators are authoritative: the provider named its own wall, so no shape inference is needed.
137
+ if (signals.indicatorHostMatched || signals.indicatorSelectorMatched) {
138
+ const detail = signals.indicatorHostMatched ? "the landed URL matches the provider's auth wall host" : "a provider auth wall selector matched";
139
+ return { evidence: detail + " at " + displayUrlOf(signals.landedUrl), kind: "authWall" };
140
+ }
141
+ // (b) A consent overlay is present. It may be masking a wall behind it, but we cannot see through the mask - report the actionable signal we can see.
142
+ if (signals.consentOverlayPresent) {
143
+ return { kind: "consentOverlay" };
144
+ }
145
+ // (c) The generic shape rule, container-scoped: a password input qualifies its container outright; an email or text entry qualifies only alongside a submit
146
+ // affordance and sign-in phrasing in that container's own text.
147
+ const match = signals.containers.find((container) => container.hasPasswordInput ||
148
+ (container.hasTextEntry && container.hasSubmitAffordance && SIGN_IN_PHRASING_RE.test(container.text)));
149
+ if (match) {
150
+ const landedHost = hostnameOf(signals.landedUrl);
151
+ const requestedHost = hostnameOf(signals.requestedUrl);
152
+ const redirectNote = (landedHost !== null) && (requestedHost !== null) && (landedHost !== requestedHost) ?
153
+ " instead of the requested " + displayUrlOf(signals.requestedUrl) : "";
154
+ return { evidence: "a sign-in form is present at " + displayUrlOf(signals.landedUrl) + redirectNote, kind: "authWall" };
155
+ }
156
+ // (d) Nothing recognizable - including the URL-change-only case, which never suffices on its own.
157
+ return { kind: "unknown" };
158
+ }
159
+ /**
160
+ * Classifies a still-open page whose discovery walk returned zero channels. Gathers signals lazily in decision order - each probe is skipped once an earlier signal
161
+ * already decides the outcome - and hands them to the pure decision core. The gathering is bounded by BLOCKED_PAGE_CLASSIFY_TIMEOUT internally, so the classifier is
162
+ * both never-throwing AND never-hanging: every caller gets an advisory result within the budget with no wrapper of its own.
163
+ * @param page - The still-open discovery page.
164
+ * @param options - The provider's optional auth wall indicators and the originally requested URL.
165
+ * @returns The page's classification.
166
+ */
167
+ export async function classifyBlockedPage(page, options) {
168
+ /* The signal gathering, in its own never-throwing chain: any internal failure (the page closed or navigated mid-probe, an evaluate error) degrades to the unknown
169
+ * classification. Because this chain never rejects, a probe that outruns the budget below and settles late - against a page that has since closed - resolves
170
+ * harmlessly to unknown rather than surfacing an unhandled rejection after the race has already been decided by the timeout.
171
+ */
172
+ const gather = async () => {
173
+ try {
174
+ const landedUrl = page.url();
175
+ const landedHost = hostnameOf(landedUrl);
176
+ const indicatorHostMatched = (landedHost !== null) && (options.indicators?.hosts ?? []).some((pattern) => hostMatchesPattern(landedHost, pattern));
177
+ // Probe the provider's DOM selectors only when the host indicator has not already decided.
178
+ let indicatorSelectorMatched = false;
179
+ if (!indicatorHostMatched) {
180
+ for (const selector of options.indicators?.selectors ?? []) {
181
+ // eslint-disable-next-line no-await-in-loop
182
+ if ((await page.$(selector)) !== null) {
183
+ indicatorSelectorMatched = true;
184
+ break;
185
+ }
186
+ }
187
+ }
188
+ const indicatorMatched = indicatorHostMatched || indicatorSelectorMatched;
189
+ const consentPresent = indicatorMatched ? false : await consentOverlayPresent(page);
190
+ const containers = (indicatorMatched || consentPresent) ? [] :
191
+ await page.evaluate(collectSignInContainers, { maxDepth: CONTAINER_SEARCH_DEPTH, textLimit: CONTAINER_TEXT_LIMIT });
192
+ return decideBlockedPage({ consentOverlayPresent: consentPresent, containers, indicatorHostMatched, indicatorSelectorMatched, landedUrl,
193
+ requestedUrl: options.requestedUrl });
194
+ }
195
+ catch {
196
+ // The page closed or navigated mid-probe, or an evaluate failed. Classification is advisory evidence - an unreadable page is simply unknown.
197
+ return { kind: "unknown" };
198
+ }
199
+ };
200
+ // Bound the gathering so a hung renderer cannot stall the caller: on a lapse the rejection lands here and becomes unknown, the same outcome a slow-but-empty
201
+ // page would produce.
202
+ try {
203
+ return await waitWithTimeout(gather(), BLOCKED_PAGE_CLASSIFY_TIMEOUT);
204
+ }
205
+ catch {
206
+ return { kind: "unknown" };
207
+ }
208
+ }
209
+ //# sourceMappingURL=blockedPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockedPage.js","sourceRoot":"","sources":["../../src/browser/blockedPage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { LaunchGovernorPolicy } from "./launchGovernor.ts";
2
+ import type { Browser } from "puppeteer-core";
3
+ import type { Nullable } from "../types/index.ts";
4
+ /**
5
+ * The browser lifecycle. The Browser reference lives inside the `ready` variant, so "is it ready" cannot desync from "do we have a browser" the way a separate
6
+ * boolean flag could, and illegal states (ready-and-launching) are unrepresentable. `degraded` is the governor's OPEN state (cooling, not serving); `trialing` is
7
+ * its HALF-OPEN state (one launch in flight after the cooldown elapsed). `closing` is a teardown of a still-running Chrome draining to completion, and its `until`
8
+ * is the conservative bound that requests rejected mid-drain carry as their retry horizon.
9
+ */
10
+ export type BrowserLifecycle = {
11
+ readonly kind: "absent";
12
+ } | {
13
+ readonly kind: "launching";
14
+ readonly promise: Promise<Browser>;
15
+ } | {
16
+ readonly kind: "ready";
17
+ readonly browser: Browser;
18
+ readonly launchTime: number;
19
+ } | {
20
+ readonly kind: "degraded";
21
+ readonly reason: string;
22
+ readonly until: number;
23
+ } | {
24
+ readonly kind: "trialing";
25
+ readonly promise: Promise<Browser>;
26
+ } | {
27
+ readonly kind: "closing";
28
+ readonly teardown: Promise<void>;
29
+ readonly until: number;
30
+ };
31
+ /**
32
+ * The injected dependencies. `launch` performs the real, gated launch - it must resolve only with a capture-ready browser and reject otherwise (the adapter runs
33
+ * the readiness gate inside it). `now` is the time source (realClock.now in production, a fake in tests). `policy` bounds the governor; it is a getter, read fresh
34
+ * at each governor decision, so the adapter can source the bounds from live configuration and an operator's change takes effect without reconstructing the
35
+ * supervisor. `onStateChange` is an optional observer the adapter uses to log transitions and raise the loud degraded alarm; the supervisor itself stays log-free.
36
+ */
37
+ export interface BrowserSupervisorPorts {
38
+ readonly close: (browser: Browser) => Promise<void>;
39
+ readonly launch: () => Promise<Browser>;
40
+ readonly now: () => number;
41
+ readonly onStateChange?: (next: BrowserLifecycle, previous: BrowserLifecycle) => void;
42
+ readonly policy: () => LaunchGovernorPolicy;
43
+ }
44
+ /**
45
+ * The supervisor surface. acquire() is the lazy, gated launcher (the getCurrentBrowser core); current()/currentLaunchTime() are non-launching reads; the note*
46
+ * methods feed lifecycle events; noteSustainedHealth() drives the health-gated governor reset; inspect() exposes the state for the adapter and tests.
47
+ */
48
+ export interface BrowserSupervisor {
49
+ readonly acquire: () => Promise<Browser>;
50
+ readonly current: () => Nullable<Browser>;
51
+ readonly currentLaunchTime: () => Nullable<number>;
52
+ readonly inspect: () => BrowserLifecycle;
53
+ readonly noteReadinessLost: () => void;
54
+ readonly noteSustainedHealth: () => boolean;
55
+ readonly noteTeardownBegun: (teardown: Promise<void>, drainBoundMs: number) => void;
56
+ }
57
+ /**
58
+ * Error thrown by acquire() while the governor is cooling (degraded). Carries the timestamp until which launches are blocked so the adapter can surface a
59
+ * Retry-After and a 503-class back-off rather than spawning Chrome. Distinct from a launch failure (which rejects with the underlying launch error).
60
+ */
61
+ export declare class BrowserUnavailableError extends Error {
62
+ readonly retryAfter: number;
63
+ constructor(retryAfter: number);
64
+ }
65
+ /**
66
+ * Thrown by acquire() when a launch in flight was superseded by a readiness-loss (a disconnect or an intentional close) before it completed. The browser it
67
+ * produced has been closed; the caller should retry, which will launch fresh or hit the governor's gate. This keeps an abandoned launch from publishing a browser
68
+ * the supervisor was told to discard.
69
+ */
70
+ export declare class BrowserSupersededError extends Error {
71
+ constructor();
72
+ }
73
+ /**
74
+ * Creates a browser supervisor over the injected ports. The returned object owns the lifecycle and governor state for the process lifetime; the adapter holds one
75
+ * instance and routes all browser access through it.
76
+ * @param ports - The injected launch, clock, policy, and optional transition observer.
77
+ * @returns The supervisor surface.
78
+ */
79
+ export declare function createBrowserSupervisor(ports: BrowserSupervisorPorts): BrowserSupervisor;
80
+ //# sourceMappingURL=browserSupervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserSupervisor.d.ts","sourceRoot":"","sources":["../../src/browser/browserSupervisor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAuB,MAAM,qBAAqB,CAAC;AAErF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAalD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IAIrC,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,oBAAoB,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAIhC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAGzC,QAAQ,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAG1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IAGnD,QAAQ,CAAC,OAAO,EAAE,MAAM,gBAAgB,CAAC;IAIzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAIvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,OAAO,CAAC;IAK5C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACrF;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAEhD,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,UAAU,EAAE,MAAM;CAO/B;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;;CAQhD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAoNxF"}
@@ -0,0 +1,186 @@
1
+ import { canAttemptLaunch, createLaunchGovernorState, noteLaunchFailure, noteLaunchSuccess, noteReadinessLost, noteSustainedHealth } from "./launchGovernor.js";
2
+ /**
3
+ * Error thrown by acquire() while the governor is cooling (degraded). Carries the timestamp until which launches are blocked so the adapter can surface a
4
+ * Retry-After and a 503-class back-off rather than spawning Chrome. Distinct from a launch failure (which rejects with the underlying launch error).
5
+ */
6
+ export class BrowserUnavailableError extends Error {
7
+ retryAfter;
8
+ constructor(retryAfter) {
9
+ super("The browser is temporarily unavailable while its capture system recovers.");
10
+ this.name = "BrowserUnavailableError";
11
+ this.retryAfter = retryAfter;
12
+ }
13
+ }
14
+ /**
15
+ * Thrown by acquire() when a launch in flight was superseded by a readiness-loss (a disconnect or an intentional close) before it completed. The browser it
16
+ * produced has been closed; the caller should retry, which will launch fresh or hit the governor's gate. This keeps an abandoned launch from publishing a browser
17
+ * the supervisor was told to discard.
18
+ */
19
+ export class BrowserSupersededError extends Error {
20
+ constructor() {
21
+ super("The browser launch was superseded before it completed.");
22
+ this.name = "BrowserSupersededError";
23
+ }
24
+ }
25
+ /**
26
+ * Creates a browser supervisor over the injected ports. The returned object owns the lifecycle and governor state for the process lifetime; the adapter holds one
27
+ * instance and routes all browser access through it.
28
+ * @param ports - The injected launch, clock, policy, and optional transition observer.
29
+ * @returns The supervisor surface.
30
+ */
31
+ export function createBrowserSupervisor(ports) {
32
+ const governor = createLaunchGovernorState();
33
+ let state = { kind: "absent" };
34
+ // Monotonic launch epoch. Incremented whenever readiness is lost so an in-flight launch can detect it was superseded and refuse to publish a browser the
35
+ // supervisor was told to abandon (the stale-launch race). Each launch captures the epoch at its start and checks it before mutating state.
36
+ let generation = 0;
37
+ // Single transition chokepoint so every state change flows through one place and notifies the observer. The observer is best-effort - it never affects the
38
+ // transition - so a throwing logger cannot corrupt the lifecycle.
39
+ function transition(next) {
40
+ const previous = state;
41
+ state = next;
42
+ ports.onStateChange?.(next, previous);
43
+ }
44
+ // Drives one launch attempt to completion, transitioning to ready on success or to degraded/absent on failure, and feeding the governor either way. Returns the
45
+ // browser on success and rejects with the underlying error on failure. The state is moved to launching/trialing by the caller before this resolves. Whether the
46
+ // attempt is the post-cooldown trial arrives as a parameter rather than being read back from the state at settle time: the lifecycle may have moved on by then,
47
+ // and being a trial is a fact about the attempt itself.
48
+ async function runLaunch(launchGeneration, isTrial) {
49
+ let browser;
50
+ try {
51
+ browser = await ports.launch();
52
+ }
53
+ catch (error) {
54
+ // Record the failure and move the state only if this launch is still the current one. A readiness-loss during the launch supersedes it (a newer epoch owns
55
+ // the state), and a superseded launch must not count a governor failure or move the state - the caller's request will retry.
56
+ if (launchGeneration === generation) {
57
+ const outcome = noteLaunchFailure(governor, ports.now(), ports.policy(), isTrial);
58
+ // A trip moves us to degraded (cooling, no launches until the cooldown elapses); below the threshold we return to absent so the next request relaunches
59
+ // immediately - the common transient costs no cooldown.
60
+ if (outcome.tripped && (outcome.cooldownUntil !== null)) {
61
+ transition({ kind: "degraded", reason: "Browser launch failed and the relaunch governor tripped.", until: outcome.cooldownUntil });
62
+ }
63
+ else {
64
+ transition({ kind: "absent" });
65
+ }
66
+ }
67
+ throw error;
68
+ }
69
+ // The launch succeeded. If a readiness-loss superseded it while it was in flight, this browser was abandoned: close it (best effort) so it does not leak a
70
+ // Chrome process, and signal the caller to retry rather than clobbering the current state with a browser that should never have been published.
71
+ if (launchGeneration !== generation) {
72
+ try {
73
+ await ports.close(browser);
74
+ }
75
+ catch {
76
+ // Best effort: a failed orphan close is the adapter's concern to log; the supervisor still reports supersession.
77
+ }
78
+ throw new BrowserSupersededError();
79
+ }
80
+ noteLaunchSuccess(governor, ports.now());
81
+ transition({ browser, kind: "ready", launchTime: ports.now() });
82
+ return browser;
83
+ }
84
+ /* Begins a launch in the given phase (launching for a normal acquire, trialing for a post-cooldown trial) and publishes the in-flight promise into the state so
85
+ * concurrent acquire() callers join it rather than starting a second Chrome. The body deliberately has no await: it starts runLaunch (which suspends at the
86
+ * launch port) and publishes the launching/trialing state synchronously, before returning, so single-flight holds. It is async only to satisfy the
87
+ * promise-returning-function convention; the synchronous publish is what matters for correctness. The phase this begins in is also what tells the attempt
88
+ * whether it is the trial, so the governor can judge its failure accordingly.
89
+ */
90
+ async function beginLaunch(kind) {
91
+ const promise = runLaunch(generation, kind === "trialing");
92
+ transition({ kind, promise });
93
+ return promise;
94
+ }
95
+ async function acquire() {
96
+ switch (state.kind) {
97
+ case "ready": {
98
+ return state.browser;
99
+ }
100
+ // Join the launch already in flight rather than starting a second one - the single-flight guarantee.
101
+ case "launching":
102
+ case "trialing": {
103
+ return state.promise;
104
+ }
105
+ // Cooling: the cooldown gates the relaunch, decoupled from request arrival. If it has elapsed, run one trial (HALF-OPEN); otherwise reject fast without
106
+ // spawning Chrome (the loop bound).
107
+ case "degraded": {
108
+ if (canAttemptLaunch(governor, ports.now())) {
109
+ return beginLaunch("trialing");
110
+ }
111
+ throw new BrowserUnavailableError(state.until);
112
+ }
113
+ // Draining: the retiring Chrome still holds the profile lock, so launching now would spawn a second one against it. Reject on the same retryable class the
114
+ // cooldown uses, carrying the drain's bound as the retry horizon, and let the caller come back once the process is gone.
115
+ case "closing": {
116
+ throw new BrowserUnavailableError(state.until);
117
+ }
118
+ case "absent": {
119
+ // canAttemptLaunch is true from absent (no cooldown is set), but we consult it for symmetry and future-proofing.
120
+ if (canAttemptLaunch(governor, ports.now())) {
121
+ return beginLaunch("launching");
122
+ }
123
+ throw new BrowserUnavailableError(ports.now());
124
+ }
125
+ default: {
126
+ return assertNever(state);
127
+ }
128
+ }
129
+ }
130
+ function current() {
131
+ return (state.kind === "ready") ? state.browser : null;
132
+ }
133
+ function currentLaunchTime() {
134
+ return (state.kind === "ready") ? state.launchTime : null;
135
+ }
136
+ function handleReadinessLost() {
137
+ // Advance the epoch first so any launch already in flight is superseded and cannot publish its browser over this readiness-loss.
138
+ generation++;
139
+ noteReadinessLost(governor);
140
+ // Only meaningful from ready/launching/trialing; from absent/degraded/closing it is a harmless no-op that keeps the call site simple. Excluding closing is what
141
+ // keeps a drain intact: that state ends when its teardown settles, not when a caller reports the readiness it has already given up.
142
+ if ((state.kind === "ready") || (state.kind === "launching") || (state.kind === "trialing")) {
143
+ transition({ kind: "absent" });
144
+ }
145
+ }
146
+ /* Enters the closing state for a teardown the adapter has begun on the retired session's still-running Chrome, and holds there for the whole drain: acquire
147
+ * rejects retryable rather than launching a second Chrome against the profile lock the exiting one still holds.
148
+ *
149
+ * The method is self-sufficient rather than order-dependent - it advances the epoch and clears the governor's readiness anchor itself - so a teardown published
150
+ * without a preceding readiness-loss still supersedes an in-flight launch. In the adapter's real order readiness is relinquished first, which makes both
151
+ * operations redundant repeats here; that is harmless, and cheaper than a contract that only holds when the calls arrive in one particular order.
152
+ */
153
+ function handleTeardownBegun(teardown, drainBoundMs) {
154
+ generation++;
155
+ noteReadinessLost(governor);
156
+ const closing = { kind: "closing", teardown, until: ports.now() + drainBoundMs };
157
+ transition(closing);
158
+ /* Leave closing when this teardown settles, and only while this exact episode is still the current state. Comparing by identity rather than by kind means a
159
+ * state reached after the drain - including a second closing episode - cannot be knocked back to absent by an earlier drain settling late. A rejected teardown
160
+ * exits the same way: a failed close still ends the session, and any Chrome that survived it is reaped by the stale-process sweep at the next launch.
161
+ */
162
+ const exit = () => {
163
+ if (state === closing) {
164
+ transition({ kind: "absent" });
165
+ }
166
+ };
167
+ void teardown.then(exit, exit);
168
+ }
169
+ function noteSustainedHealthTick() {
170
+ if (state.kind !== "ready") {
171
+ return false;
172
+ }
173
+ return noteSustainedHealth(governor, ports.now(), ports.policy());
174
+ }
175
+ return { acquire, current, currentLaunchTime, inspect: () => state, noteReadinessLost: handleReadinessLost, noteSustainedHealth: noteSustainedHealthTick,
176
+ noteTeardownBegun: handleTeardownBegun };
177
+ }
178
+ /**
179
+ * Exhaustiveness guard for the lifecycle switch: referencing a `never` makes the compiler flag any unhandled variant if the union grows.
180
+ * @param value - The unreachable value.
181
+ * @returns Never returns.
182
+ */
183
+ function assertNever(value) {
184
+ throw new Error("Unhandled browser lifecycle state: " + JSON.stringify(value));
185
+ }
186
+ //# sourceMappingURL=browserSupervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserSupervisor.js","sourceRoot":"","sources":["../../src/browser/browserSupervisor.ts"],"names":[],"mappings":"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"}
@@ -35,3 +35,4 @@ export declare function resizeAndMinimizeWindow(page: Page): Promise<void>;
35
35
  * @param page - The Puppeteer page object.
36
36
  */
37
37
  export declare function unminimizeWindow(page: Page): Promise<void>;
38
+ //# sourceMappingURL=cdp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp.d.ts","sourceRoot":"","sources":["../../src/browser/cdp.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAuBvD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC/D,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAwCxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGvE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhE"}
@@ -5,8 +5,8 @@ import { getEffectiveViewport } from "../config/presets.js";
5
5
  /* The Chrome DevTools Protocol (CDP) provides low-level access to Chrome's internal state and capabilities. While Puppeteer abstracts most common operations, some
6
6
  * features require direct CDP access:
7
7
  *
8
- * - Window management: Setting window size, position, and state (minimized, maximized, fullscreen). Puppeteer's viewport API controls the content area, but we
9
- * need CDP to control the entire window including browser chrome.
8
+ * - Window management: setting window size and normal/minimized state. Puppeteer's viewport API controls the content area, but we need CDP to control the
9
+ * entire window including browser chrome.
10
10
  *
11
11
  * - Browser-level operations: Operations that affect the browser rather than a specific page, like getting the window ID for a page's target.
12
12
  *
@@ -107,9 +107,10 @@ export async function resizeAndMinimizeWindow(page) {
107
107
  const viewport = getEffectiveViewport(CONFIG);
108
108
  const targetHeight = viewport.height + uiSize.height;
109
109
  const targetWidth = viewport.width + uiSize.width;
110
- // Resize with verification. Each attempt restores the window to "normal" state (idempotent) and sets the target dimensions, then reads back the actual
111
- // bounds to confirm. On macOS, NSWindow state transitions are asynchronous - Chrome may acknowledge the "normal" state CDP command before the OS window
112
- // manager finishes the transition, causing a subsequent dimension-setting call to be silently ignored. The readback detects this and retries.
110
+ // Resize with verification. Each attempt restores the window to "normal" state - safe to repeat on every retry attempt - and sets the target dimensions,
111
+ // then reads back the actual bounds to confirm. On macOS, NSWindow state transitions are asynchronous - Chrome may acknowledge the "normal" state CDP
112
+ // command before the OS window manager finishes the transition, causing a subsequent dimension-setting call to be silently ignored. The readback detects
113
+ // this and retries.
113
114
  for (let attempt = 0; attempt < 3; attempt++) {
114
115
  // Ensure the window is in "normal" state. Setting bounds on a maximized window is ignored, so we must restore it first. On retries, this re-sends the
115
116
  // normal state in case the previous transition hadn't completed.
@@ -1 +1 @@
1
- {"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../src/browser/cdp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../src/browser/cdp.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,SAAgE;IAGhE,oHAAoH;IACpH,IAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QAEH,sJAAsJ;QACtJ,0EAA0E;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9C,2JAA2J;QAC3J,sGAAsG;QACtG,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAA0B,CAAC;QAC/F,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QAEvC,2IAA2I;QAC3I,IAAG,CAAC,QAAQ,EAAE,CAAC;YAEb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,iEAAiE;QACjE,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAEnC,oJAAoJ;QACpJ,+IAA+I;QAC/I,IAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAEpE,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU;IAEtD,4CAA4C;IAC5C,IAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEnB,OAAO;IACT,CAAC;IAED,2JAA2J;IAC3J,0IAA0I;IAC1I,IAAI,MAAM,GAAqB,gBAAgB,EAAE,CAAC;IAElD,IAAG,CAAC,MAAM,EAAE,CAAC;QAEX,IAAI,CAAC;YAEH,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,GAAW,EAAE;gBAElD,OAAO;oBAEL,qIAAqI;oBACrI,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;oBAE/C,oHAAoH;oBACpH,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;iBAC7C,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAM,MAAM,EAAE,CAAC;YAEf,sJAAsJ;YACtJ,oBAAoB;YACpB,OAAO;QACT,CAAC;IACH,CAAC;IAED,8JAA8J;IAC9J,+JAA+J;IAC/J,qGAAqG;IACrG,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAErD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAElD,yJAAyJ;QACzJ,sJAAsJ;QACtJ,yJAAyJ;QACzJ,oBAAoB;QACpB,KAAI,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAE5C,sJAAsJ;YACtJ,iEAAiE;YACjE,4CAA4C;YAC5C,MAAM,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAE5C,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;gBACjC,QAAQ;aACT,CAAC,CAAC;YAEH,2HAA2H;YAC3H,4CAA4C;YAC5C,MAAM,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAE5C,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;gBACpD,QAAQ;aACT,CAAC,CAAC;YAEH,qIAAqI;YACrI,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE3E,IAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,WAAW,CAAC,EAAE,CAAC;gBAEpF,MAAM;YACR,CAAC;YAED,2HAA2H;YAC3H,IAAG,OAAO,GAAG,CAAC,EAAE,CAAC;gBAEf,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,gGAAgG,EAC7H,OAAO,GAAG,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;gBAE/F,4CAA4C;gBAC5C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBAEN,GAAG,CAAC,IAAI,CAAC,8EAA8E,EACrF,OAAO,GAAG,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;QAED,6JAA6J;QAC7J,+GAA+G;QAE/G,uJAAuJ;QACvJ,kGAAkG;QAClG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,MAAM,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAE5C,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;YACpC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAU;IAE/C,4CAA4C;IAC5C,IAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEnB,OAAO;IACT,CAAC;IAED,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAErD,gDAAgD;QAChD,MAAM,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAE5C,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;YACjC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}