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,127 @@
1
+ import { createDefaultProcessInspectorContext } from "./processInspector.context.js";
2
+ /**
3
+ * Returns a snapshot of every visible process. Callers filter the result for the processes they care about.
4
+ * @param ctx - The process inspector context. Defaults to real I/O wiring.
5
+ * @returns The current process table.
6
+ */
7
+ export function listProcesses(ctx = createDefaultProcessInspectorContext()) {
8
+ return ctx.enumerate();
9
+ }
10
+ /**
11
+ * Parses a single /proc/<pid>/cmdline payload. The on-disk format separates argv entries with NUL bytes and may or may not include a trailing NUL. Empty
12
+ * payloads (kernel threads, zombie processes) yield an empty command line - callers decide whether to drop those entries.
13
+ * @param raw - The /proc/<pid>/cmdline payload.
14
+ * @returns The decoded command line.
15
+ */
16
+ export function parseLinuxProcCmdline(raw) {
17
+ // Drop a trailing NUL if present so the join does not produce a phantom blank arg.
18
+ const trimmed = raw.endsWith("\0") ? raw.slice(0, -1) : raw;
19
+ return trimmed.split("\0").join(" ");
20
+ }
21
+ /**
22
+ * Parses the ppid (field 4) from a /proc/<pid>/stat payload. The format embeds the executable name in parentheses at field 2; that name can contain
23
+ * whitespace and parentheses itself, so we anchor on the last closing paren before splitting. After the closing paren, the first field is field 3 (state) and
24
+ * the second is field 4 (ppid).
25
+ * @param raw - The /proc/<pid>/stat payload.
26
+ * @returns The parent process ID, or null when the payload is malformed.
27
+ */
28
+ export function parseLinuxProcStat(raw) {
29
+ const rparen = raw.lastIndexOf(")");
30
+ if (rparen === -1) {
31
+ return null;
32
+ }
33
+ const fields = raw.slice(rparen + 1).trim().split(/\s+/);
34
+ // We want field 4 (ppid), which lands at index 1 in the post-paren split: index 0 is state (field 3), index 1 is ppid (field 4).
35
+ if (fields.length < 2) {
36
+ return null;
37
+ }
38
+ const ppid = parseInt(fields[1] ?? "", 10);
39
+ return Number.isNaN(ppid) ? null : ppid;
40
+ }
41
+ /**
42
+ * Parses the output of `ps -axww -o pid=,ppid=,command=` (or equivalent shape). Each non-empty line begins with leading whitespace, then the PID and PPID as
43
+ * integers, then whitespace, then the full command. Lines that do not match this shape are silently dropped.
44
+ * @param raw - The raw ps output.
45
+ * @returns The parsed process table.
46
+ */
47
+ export function parseMacOsPsOutput(raw) {
48
+ const results = [];
49
+ for (const line of raw.split("\n")) {
50
+ const trimmed = line.trim();
51
+ if (trimmed === "") {
52
+ continue;
53
+ }
54
+ // Three captures: pid, ppid, and the rest. The command line is the rest of the line verbatim (may contain spaces).
55
+ const match = /^(\d+)\s+(\d+)\s+(.+)$/.exec(trimmed);
56
+ if (match === null) {
57
+ continue;
58
+ }
59
+ const pid = parseInt(match[1] ?? "", 10);
60
+ const ppid = parseInt(match[2] ?? "", 10);
61
+ const commandLine = match[3] ?? "";
62
+ if (Number.isNaN(pid) || Number.isNaN(ppid)) {
63
+ continue;
64
+ }
65
+ results.push({ commandLine, pid, ppid });
66
+ }
67
+ return results;
68
+ }
69
+ /**
70
+ * Parses the output of PowerShell's `Get-CimInstance Win32_Process | Format-List ProcessId,ParentProcessId,CommandLine` (or equivalent shape). The format
71
+ * places each property on its own line as "Name : Value", with blank lines separating records. CommandLine may be blank (system processes) or contain
72
+ * embedded colons - we split on the first " : " separator only.
73
+ * @param raw - The raw Format-List output.
74
+ * @returns The parsed process table.
75
+ */
76
+ export function parseWindowsFormatListOutput(raw) {
77
+ const results = [];
78
+ let currentPid = null;
79
+ let currentPpid = null;
80
+ let currentCommandLine = null;
81
+ // A record is only committed once both pid and ppid have been seen, since ownership decisions depend on both being present and trustworthy. A missing
82
+ // command line is tolerated and recorded as an empty string.
83
+ const flush = () => {
84
+ if ((currentPid !== null) && (currentPpid !== null)) {
85
+ results.push({ commandLine: currentCommandLine ?? "", pid: currentPid, ppid: currentPpid });
86
+ }
87
+ currentPid = null;
88
+ currentPpid = null;
89
+ currentCommandLine = null;
90
+ };
91
+ for (const line of raw.split(/\r?\n/)) {
92
+ if (line.trim() === "") {
93
+ flush();
94
+ continue;
95
+ }
96
+ // Format-List output is "Name : Value" with the colon surrounded by spaces. We split on the first " : " so values containing colons survive intact.
97
+ const sep = line.indexOf(" : ");
98
+ if (sep === -1) {
99
+ continue;
100
+ }
101
+ const key = line.slice(0, sep).trim();
102
+ const value = line.slice(sep + 3);
103
+ switch (key) {
104
+ case "ProcessId": {
105
+ const parsed = parseInt(value.trim(), 10);
106
+ currentPid = Number.isNaN(parsed) ? null : parsed;
107
+ break;
108
+ }
109
+ case "ParentProcessId": {
110
+ const parsed = parseInt(value.trim(), 10);
111
+ currentPpid = Number.isNaN(parsed) ? null : parsed;
112
+ break;
113
+ }
114
+ case "CommandLine": {
115
+ currentCommandLine = value;
116
+ break;
117
+ }
118
+ default: {
119
+ // Other Format-List keys (Name, Path, ...) are ignored. Tolerating extra fields keeps the parser robust to upstream additions.
120
+ }
121
+ }
122
+ }
123
+ // Flush the trailing record if the output did not end with a blank line.
124
+ flush();
125
+ return results;
126
+ }
127
+ //# sourceMappingURL=processInspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processInspector.js","sourceRoot":"","sources":["../../src/utils/processInspector.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AA+BrF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAA+B,oCAAoC,EAAE;IAEjG,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAE/C,mFAAmF;IACnF,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE5D,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAE5C,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAG,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAEjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzD,iIAAiI;IACjI,IAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAErB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAE5C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAI,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAG,OAAO,KAAK,EAAE,EAAE,CAAC;YAElB,SAAS;QACX,CAAC;QAED,mHAAmH;QACnH,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,IAAG,KAAK,KAAK,IAAI,EAAE,CAAC;YAElB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAE3C,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,GAAW;IAEtD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,IAAI,UAAU,GAAqB,IAAI,CAAC;IACxC,IAAI,WAAW,GAAqB,IAAI,CAAC;IACzC,IAAI,kBAAkB,GAAqB,IAAI,CAAC;IAEhD,sJAAsJ;IACtJ,6DAA6D;IAC7D,MAAM,KAAK,GAAG,GAAS,EAAE;QAEvB,IAAG,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;YAEnD,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,kBAAkB,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,UAAU,GAAG,IAAI,CAAC;QAClB,WAAW,GAAG,IAAI,CAAC;QACnB,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC,CAAC;IAEF,KAAI,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAErC,IAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAEtB,KAAK,EAAE,CAAC;YAER,SAAS;QACX,CAAC;QAED,oJAAoJ;QACpJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAEd,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAElC,QAAO,GAAG,EAAE,CAAC;YAEX,KAAK,WAAW,CAAC,CAAC,CAAC;gBAEjB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAE1C,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAElD,MAAM;YACR,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBAEvB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAE1C,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAEnD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBAEnB,kBAAkB,GAAG,KAAK,CAAC;gBAE3B,MAAM;YACR,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBAER,+HAA+H;YACjI,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,KAAK,EAAE,CAAC;IAER,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type Clock } from "./clock.ts";
1
+ import type { Clock } from "./clock.ts";
2
2
  /**
3
3
  * Options for retryOperation. Groups all parameters into a single object to avoid positional parameter sprawl and make the function extensible.
4
4
  */
@@ -17,7 +17,30 @@ export interface RetryOptions<T> {
17
17
  * Implements a generic retry mechanism with exponential backoff and jitter. This function attempts an operation multiple times, waiting progressively longer between
18
18
  * attempts to avoid overwhelming failing services. The exponential backoff with jitter prevents thundering herd problems where many clients retry simultaneously.
19
19
  * @param options - Retry configuration including the operation, attempt limits, timeouts, and optional backoff tuning.
20
- * @returns The result of the operation if successful.
20
+ * @returns The result of the operation if successful, or undefined when earlySuccessCheck reports the operation already succeeded after a timeout-shaped error.
21
21
  * @throws The last error encountered if all attempts fail.
22
22
  */
23
23
  export declare function retryOperation<T>(options: RetryOptions<T>): Promise<T | undefined>;
24
+ /**
25
+ * The timing fields maxRetryDuration reads from a retry configuration. A narrow subset of RetryOptions so the estimator depends only on what its closed form
26
+ * needs, never on the operation, clock, or callbacks.
27
+ */
28
+ export interface RetryDurationTiming {
29
+ backoffJitter?: number;
30
+ maxAttempts: number;
31
+ maxBackoffDelay?: number;
32
+ timeoutMs: number;
33
+ }
34
+ /**
35
+ * Computes the worst-case wall-clock duration of a retryOperation run: every attempt consuming its full per-attempt timeout, plus one backoff sleep per retry
36
+ * after the first, each taken at its ceiling (the backoff cap plus the full jitter). The estimate reads the same default constants the loop reads, so it cannot
37
+ * drift from the loop's arithmetic. The loop seeds each backoff at one second and doubles, capped at maxBackoffDelay, so every gap is at or below
38
+ * maxBackoffDelay + backoffJitter; taking that ceiling for each gap makes the result an upper bound - a leak bound for a caller sizing a window that must outlive
39
+ * the retries, never an under-count. The closed form holds only for configurations whose operation carries no unbounded callback: earlySuccessCheck runs awaited
40
+ * on the timeout path and can add time beyond the per-attempt timeout, so a caller relying on the bound must pass a configuration without one.
41
+ *
42
+ * @param timing - The attempt count, per-attempt timeout, and optional backoff tuning.
43
+ * @returns The worst-case duration in milliseconds.
44
+ */
45
+ export declare function maxRetryDuration(timing: RetryDurationTiming): number;
46
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYxC;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAG7B,aAAa,CAAC,EAAE,MAAM,CAAC;IAKvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAGd,WAAW,EAAE,MAAM,CAAC;IAIpB,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAG3C,WAAW,EAAE,MAAM,CAAC;IAGpB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAI5B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAG5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CA0ExF;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAGlC,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,WAAW,EAAE,MAAM,CAAC;IAGpB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CASpE"}
@@ -1,21 +1,27 @@
1
1
  /* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
2
2
  *
3
3
  * retry.ts: Retry logic with exponential backoff for PrismCast. Time-dependent operations route through a Clock (see clock.ts) so tests can deterministically
4
- * control sleeps and timeout races without depending on real-time delays - the function's nested raceWithTimeout/Promise.race/finally/await delay chain is
5
- * exactly the shape Node's synchronous mock.timers.tick cannot drain.
4
+ * control sleeps and per-attempt bounds without depending on real-time delays - the function's nested waitWithTimeout/finally/await delay chain is exactly the
5
+ * shape Node's synchronous mock.timers.tick cannot drain.
6
6
  */
7
- import { realClock } from "./clock.js";
8
7
  import { formatError, isSessionClosedError } from "./errors.js";
9
8
  import { LOG } from "./logger.js";
9
+ import { realClock } from "./clock.js";
10
+ // Default maximum jitter added to each backoff sleep in milliseconds. Prevents synchronized retries across concurrent operations. Read by both retryOperation's
11
+ // destructuring default and maxRetryDuration, so the worst-case estimate cannot drift from the loop that produces the sleeps.
12
+ const DEFAULT_BACKOFF_JITTER = 1000;
13
+ // Default cap on each backoff sleep in milliseconds. Bounds the exponential growth so a long retry chain never sleeps unboundedly. Read by both retryOperation's
14
+ // destructuring default and maxRetryDuration, so the worst-case estimate cannot drift from the loop that produces the sleeps.
15
+ const DEFAULT_MAX_BACKOFF_DELAY = 3000;
10
16
  /**
11
17
  * Implements a generic retry mechanism with exponential backoff and jitter. This function attempts an operation multiple times, waiting progressively longer between
12
18
  * attempts to avoid overwhelming failing services. The exponential backoff with jitter prevents thundering herd problems where many clients retry simultaneously.
13
19
  * @param options - Retry configuration including the operation, attempt limits, timeouts, and optional backoff tuning.
14
- * @returns The result of the operation if successful.
20
+ * @returns The result of the operation if successful, or undefined when earlySuccessCheck reports the operation already succeeded after a timeout-shaped error.
15
21
  * @throws The last error encountered if all attempts fail.
16
22
  */
17
23
  export async function retryOperation(options) {
18
- const { backoffJitter = 1000, clock = realClock, description, earlySuccessCheck, maxAttempts, maxBackoffDelay = 3000, operation, shouldAbort, timeoutMs } = options;
24
+ const { backoffJitter = DEFAULT_BACKOFF_JITTER, clock = realClock, description, earlySuccessCheck, maxAttempts, maxBackoffDelay = DEFAULT_MAX_BACKOFF_DELAY, operation, shouldAbort, timeoutMs } = options;
19
25
  let lastError = null;
20
26
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
21
27
  // Check if we should abort before starting this attempt. This catches cases where the page was closed during the backoff delay between retries.
@@ -27,7 +33,7 @@ export async function retryOperation(options) {
27
33
  }
28
34
  try {
29
35
  // eslint-disable-next-line no-await-in-loop
30
- return await clock.raceWithTimeout(operation(), timeoutMs);
36
+ return await clock.waitWithTimeout(operation(), timeoutMs);
31
37
  }
32
38
  catch (error) {
33
39
  lastError = error;
@@ -54,6 +60,7 @@ export async function retryOperation(options) {
54
60
  LOG.warn("Attempt %s failed for %s: %s.", attempt, description, formatError(error));
55
61
  // Between retry attempts, wait with exponential backoff plus random jitter.
56
62
  if (attempt < maxAttempts) {
63
+ // The progression seeds at one second (1000ms) and doubles each attempt - 1s, 2s, 4s, ... - capped at maxBackoffDelay so growth never exceeds the ceiling.
57
64
  const baseDelay = Math.min(1000 * (2 ** (attempt - 1)), maxBackoffDelay);
58
65
  const jitter = Math.random() * backoffJitter;
59
66
  // eslint-disable-next-line no-await-in-loop
@@ -61,6 +68,26 @@ export async function retryOperation(options) {
61
68
  }
62
69
  }
63
70
  }
71
+ // When maxAttempts < 1 the loop body never runs and lastError is still its initial null; throwing it here is the intentional, predictable failure mode for an
72
+ // out-of-contract maxAttempts.
64
73
  throw lastError;
65
74
  }
75
+ /**
76
+ * Computes the worst-case wall-clock duration of a retryOperation run: every attempt consuming its full per-attempt timeout, plus one backoff sleep per retry
77
+ * after the first, each taken at its ceiling (the backoff cap plus the full jitter). The estimate reads the same default constants the loop reads, so it cannot
78
+ * drift from the loop's arithmetic. The loop seeds each backoff at one second and doubles, capped at maxBackoffDelay, so every gap is at or below
79
+ * maxBackoffDelay + backoffJitter; taking that ceiling for each gap makes the result an upper bound - a leak bound for a caller sizing a window that must outlive
80
+ * the retries, never an under-count. The closed form holds only for configurations whose operation carries no unbounded callback: earlySuccessCheck runs awaited
81
+ * on the timeout path and can add time beyond the per-attempt timeout, so a caller relying on the bound must pass a configuration without one.
82
+ *
83
+ * @param timing - The attempt count, per-attempt timeout, and optional backoff tuning.
84
+ * @returns The worst-case duration in milliseconds.
85
+ */
86
+ export function maxRetryDuration(timing) {
87
+ const { backoffJitter = DEFAULT_BACKOFF_JITTER, maxAttempts, maxBackoffDelay = DEFAULT_MAX_BACKOFF_DELAY, timeoutMs } = timing;
88
+ // One backoff sleep sits between consecutive attempts, so a run of N attempts has N-1 gaps. Clamped at zero so an out-of-contract attempt count below one never
89
+ // produces a negative gap count.
90
+ const gaps = Math.max(0, maxAttempts - 1);
91
+ return (maxAttempts * timeoutMs) + (gaps * (maxBackoffDelay + backoffJitter));
92
+ }
66
93
  //# sourceMappingURL=retry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AA4ClC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,OAAwB;IAE9D,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEpK,IAAI,SAAS,GAAY,IAAI,CAAC;IAE9B,KAAI,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QAEvD,gJAAgJ;QAChJ,IAAG,WAAW,EAAE,EAAE,EAAE,CAAC;YAEnB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,IAAG,OAAO,GAAG,CAAC,EAAE,CAAC;YAEf,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,iCAAiC,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC;YAEH,4CAA4C;YAC5C,OAAO,MAAM,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YAEd,SAAS,GAAG,KAAK,CAAC;YAElB,8HAA8H;YAC9H,IAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE/B,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,2CAA2C,EAAE,WAAW,CAAC,CAAC;gBAE7E,MAAM,KAAK,CAAC;YACd,CAAC;YAED,6JAA6J;YAC7J,gKAAgK;YAChK,IAAG,iBAAiB,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAEjE,IAAI,CAAC;oBAEH,4CAA4C;oBAC5C,MAAM,aAAa,GAAG,MAAM,iBAAiB,EAAE,CAAC;oBAEhD,IAAG,aAAa,EAAE,CAAC;wBAEjB,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,OAAM,WAAW,EAAE,CAAC;oBAEpB,yDAAyD;gBAC3D,CAAC;YACH,CAAC;YAED,oIAAoI;YACpI,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpF,4EAA4E;YAC5E,IAAG,OAAO,GAAG,WAAW,EAAE,CAAC;gBAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC;gBAE7C,4CAA4C;gBAC5C,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { RuntimeIdentityContext } from "./runtimeIdentity.ts";
2
+ /**
3
+ * Builds the default RuntimeIdentityContext from real runtime I/O.
4
+ * @returns A RuntimeIdentityContext populated from the live process.
5
+ */
6
+ export declare function createDefaultRuntimeIdentityContext(): RuntimeIdentityContext;
7
+ //# sourceMappingURL=runtimeIdentity.context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeIdentity.context.d.ts","sourceRoot":"","sources":["../../src/utils/runtimeIdentity.context.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAWnE;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,sBAAsB,CAQ5E"}
@@ -0,0 +1,43 @@
1
+ import { getBootSessionId } from "./bootSession.js";
2
+ import { isProcessRunning } from "./pid.js";
3
+ import { listProcesses } from "./processInspector.js";
4
+ /* The product-identity token searched for in a process's command line. This mirrors the package name / SERVICE_NAME identity; it lives as a local constant
5
+ * because the runtime-identity context must remain free of sideways imports into identity.ts. Matching is case-insensitive so launcher casing differences (e.g.
6
+ * the macOS app bundle versus the lowercase binary) do not cause a false negative.
7
+ */
8
+ const PRISMCAST_COMMAND_TOKEN = "prismcast";
9
+ /**
10
+ * Builds the default RuntimeIdentityContext from real runtime I/O.
11
+ * @returns A RuntimeIdentityContext populated from the live process.
12
+ */
13
+ export function createDefaultRuntimeIdentityContext() {
14
+ return {
15
+ getBootSessionId: () => getBootSessionId(),
16
+ isPidOurProcess: (pid) => resolvePidIdentity(pid),
17
+ isProcessRunning
18
+ };
19
+ }
20
+ /**
21
+ * Resolves whether the live process at the given PID is genuinely a PrismCast instance by enumerating the OS process table and matching the product token in the
22
+ * row's command line. Returns true when the row's command line contains the token, false when it contains a non-empty command line without the token, and null
23
+ * when identity cannot be determined - the process table is empty (unsupported platform or enumeration failure), the PID is absent from it, or the matching
24
+ * row reports an empty command line (kernel threads, hidden command lines). The null cases all map upstream to the conservative held-live verdict.
25
+ * @param pid - The PID to identify.
26
+ * @returns True for a confirmed PrismCast process, false for a confirmed different process, null when identity cannot be determined.
27
+ */
28
+ function resolvePidIdentity(pid) {
29
+ const processes = listProcesses();
30
+ const match = processes.find((entry) => entry.pid === pid);
31
+ // The PID is absent from the snapshot (it exited between the liveness check and this enumeration, or the platform returned an empty table). We cannot prove the
32
+ // process is unrelated, so identity is indeterminate.
33
+ if (match === undefined) {
34
+ return null;
35
+ }
36
+ const commandLine = match.commandLine.trim();
37
+ // An empty command line (kernel thread, process that hid its argv) gives us nothing to match against, so identity remains indeterminate.
38
+ if (commandLine === "") {
39
+ return null;
40
+ }
41
+ return commandLine.toLowerCase().includes(PRISMCAST_COMMAND_TOKEN);
42
+ }
43
+ //# sourceMappingURL=runtimeIdentity.context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeIdentity.context.js","sourceRoot":"","sources":["../../src/utils/runtimeIdentity.context.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;GAGG;AACH,MAAM,uBAAuB,GAAG,WAAW,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,mCAAmC;IAEjD,OAAO;QAEL,gBAAgB,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE;QAC1C,eAAe,EAAE,CAAC,GAAW,EAAqB,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC;QAC5E,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,GAAW;IAErC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAE3D,gKAAgK;IAChK,sDAAsD;IACtD,IAAG,KAAK,KAAK,SAAS,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAE7C,yIAAyI;IACzI,IAAG,WAAW,KAAK,EAAE,EAAE,CAAC;QAEtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { Nullable } from "../types/index.ts";
2
+ /**
3
+ * The structured identity record persisted to disk.
4
+ */
5
+ export interface IdentityRecord {
6
+ readonly bootId: string;
7
+ readonly pid: number;
8
+ readonly startedAt: string;
9
+ readonly version: string;
10
+ }
11
+ /**
12
+ * Discriminated union representing the on-disk state at a given path. Every branch is exhaustive at compile time, so callers must handle each variant
13
+ * explicitly and the type system catches any new state added in the future.
14
+ */
15
+ export type IdentityState = {
16
+ kind: "free";
17
+ } | {
18
+ kind: "held-live";
19
+ record: IdentityRecord;
20
+ } | {
21
+ kind: "stale-different-boot";
22
+ record: IdentityRecord;
23
+ } | {
24
+ kind: "stale-dead-pid";
25
+ record: IdentityRecord;
26
+ } | {
27
+ kind: "stale-malformed";
28
+ raw: string;
29
+ };
30
+ /**
31
+ * Outcome of a claim attempt. ok: true means we now own the slot; ok: false means another live instance holds it and we should not start.
32
+ */
33
+ export type ClaimResult = {
34
+ ok: true;
35
+ record: IdentityRecord;
36
+ } | {
37
+ ok: false;
38
+ conflict: IdentityRecord;
39
+ };
40
+ /**
41
+ * The runtime capability set inspect/claim consume. Production wires the defaults from real I/O via createDefaultRuntimeIdentityContext; tests pass a context
42
+ * literal to drive each state-machine branch deterministically.
43
+ */
44
+ export interface RuntimeIdentityContext {
45
+ readonly getBootSessionId: () => string;
46
+ readonly isPidOurProcess: (pid: number) => Nullable<boolean>;
47
+ readonly isProcessRunning: (pid: number) => boolean;
48
+ }
49
+ /**
50
+ * Inspects the identity file at the given path and reports the current state. Reads the file, parses the record, and combines boot session match with PID
51
+ * liveness and process-identity verification to classify which branch of the state machine applies. Never mutates disk state.
52
+ * @param filePath - The absolute path to the identity file.
53
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
54
+ * @returns The current state.
55
+ */
56
+ export declare function inspect(filePath: string, ctx?: RuntimeIdentityContext): IdentityState;
57
+ /**
58
+ * Attempts to claim the identity slot at the given path for the current process. If the slot is free or in any "stale-*" state, the record is overwritten
59
+ * with our identity and { ok: true } is returned. If the slot is held-live by another process, no write occurs and { ok: false } is returned with the
60
+ * conflicting holder's record so the caller can surface a precise diagnostic.
61
+ * @param filePath - The absolute path to the identity file.
62
+ * @param metadata - Caller-supplied metadata (the version string at minimum) that ends up in the persisted record.
63
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
64
+ * @returns The claim result.
65
+ */
66
+ export declare function claim(filePath: string, metadata: {
67
+ version: string;
68
+ }, ctx?: RuntimeIdentityContext): ClaimResult;
69
+ /**
70
+ * Releases the identity slot by removing the file at the given path - but only if the file's record identifies the current process. The PID-match check
71
+ * inside makes ownership structural: a rejected duplicate startup's exit handler sees a held-live record belonging to a different PID and leaves the file
72
+ * alone, while the legitimate holder sees its own PID and cleans up. Safe to call more than once: a missing file is not an error. Release is purely hygiene -
73
+ * a process that fails to release on death has its file recovered transparently on the next startup via the stale-different-boot or stale-dead-pid branches.
74
+ * @param filePath - The absolute path to the identity file.
75
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
76
+ */
77
+ export declare function release(filePath: string, ctx?: RuntimeIdentityContext): void;
78
+ /**
79
+ * Unconditionally removes the identity file at the given path. Intended for an explicit user-invoked reset or recovery flow where the caller has deliberately
80
+ * asked to clear stale state without the safety check that release() provides. Prefer release() for normal lifecycle cleanup.
81
+ * @param filePath - The absolute path to the identity file.
82
+ */
83
+ export declare function forceRelease(filePath: string): void;
84
+ /**
85
+ * Serializes a record to its on-disk representation. The first line is the bare PID for backwards compatibility with shell tooling; subsequent lines are
86
+ * key=value pairs in deterministic order. The trailing newline keeps the file well-formed for POSIX text-file tools.
87
+ * @param record - The identity record to serialize.
88
+ * @returns The serialized payload.
89
+ */
90
+ export declare function serializeRecord(record: IdentityRecord): string;
91
+ /**
92
+ * Parses the on-disk representation of an identity record. Returns null when the payload cannot be interpreted as a complete record (missing or non-integer
93
+ * pid, missing bootId). Unknown key=value pairs are silently ignored so future fields can be added without breaking older readers.
94
+ * @param raw - The raw file contents.
95
+ * @returns The parsed record, or null when the payload is unusable.
96
+ */
97
+ export declare function parseRecord(raw: string): Nullable<IdentityRecord>;
98
+ //# sourceMappingURL=runtimeIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeIdentity.d.ts","sourceRoot":"","sources":["../../src/utils/runtimeIdentity.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKlD;;GAEG;AACH,MAAM,WAAW,cAAc;IAG7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAGrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAG3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,WAAW,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IAGrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAQxC,QAAQ,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;IAG7D,QAAQ,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACrD;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,sBAA8D,GAAG,aAAa,CAgD5H;AAED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,GAAE,sBAA8D,GAAG,WAAW,CAoBvJ;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,sBAA8D,GAAG,IAAI,CAWnH;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAM9D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CA6FjE"}
@@ -0,0 +1,181 @@
1
+ import { clearPidFile } from "./pid.js";
2
+ import { createDefaultRuntimeIdentityContext } from "./runtimeIdentity.context.js";
3
+ import fs from "node:fs";
4
+ /**
5
+ * Inspects the identity file at the given path and reports the current state. Reads the file, parses the record, and combines boot session match with PID
6
+ * liveness and process-identity verification to classify which branch of the state machine applies. Never mutates disk state.
7
+ * @param filePath - The absolute path to the identity file.
8
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
9
+ * @returns The current state.
10
+ */
11
+ export function inspect(filePath, ctx = createDefaultRuntimeIdentityContext()) {
12
+ let raw;
13
+ try {
14
+ raw = fs.readFileSync(filePath, "utf-8");
15
+ }
16
+ catch (error) {
17
+ // ENOENT is the canonical "no file" case: the slot is free.
18
+ if (error.code === "ENOENT") {
19
+ return { kind: "free" };
20
+ }
21
+ // Any other read error (EACCES, EIO, ...) is reported as malformed-with-empty-raw so callers fall through to the overwrite path rather than crashing on
22
+ // transient I/O.
23
+ return { kind: "stale-malformed", raw: "" };
24
+ }
25
+ const record = parseRecord(raw);
26
+ if (record === null) {
27
+ return { kind: "stale-malformed", raw };
28
+ }
29
+ if (record.bootId !== ctx.getBootSessionId()) {
30
+ return { kind: "stale-different-boot", record };
31
+ }
32
+ if (!ctx.isProcessRunning(record.pid)) {
33
+ return { kind: "stale-dead-pid", record };
34
+ }
35
+ // The PID is alive and the boot session matches, but within a single boot the kernel can reassign a freed PID to an unrelated process after PrismCast was
36
+ // SIGKILLed. We confirm process identity through the processInspector port: a verdict of false means the process table positively identified a non-PrismCast
37
+ // command line at this PID, so the original writer is gone and the slot is stale. A verdict of true (confirmed PrismCast) or null (cannot determine) both
38
+ // keep the held-live verdict - we only downgrade on positive proof of a different process. We classify the recycled case as stale-dead-pid rather than a
39
+ // new branch because the operational meaning is identical - the writing process is gone - and callers already overwrite that state.
40
+ if (ctx.isPidOurProcess(record.pid) === false) {
41
+ return { kind: "stale-dead-pid", record };
42
+ }
43
+ return { kind: "held-live", record };
44
+ }
45
+ /**
46
+ * Attempts to claim the identity slot at the given path for the current process. If the slot is free or in any "stale-*" state, the record is overwritten
47
+ * with our identity and { ok: true } is returned. If the slot is held-live by another process, no write occurs and { ok: false } is returned with the
48
+ * conflicting holder's record so the caller can surface a precise diagnostic.
49
+ * @param filePath - The absolute path to the identity file.
50
+ * @param metadata - Caller-supplied metadata (the version string at minimum) that ends up in the persisted record.
51
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
52
+ * @returns The claim result.
53
+ */
54
+ export function claim(filePath, metadata, ctx = createDefaultRuntimeIdentityContext()) {
55
+ const state = inspect(filePath, ctx);
56
+ if (state.kind === "held-live") {
57
+ return { conflict: state.record, ok: false };
58
+ }
59
+ const record = {
60
+ bootId: ctx.getBootSessionId(),
61
+ pid: process.pid,
62
+ startedAt: new Date().toISOString(),
63
+ version: metadata.version
64
+ };
65
+ writeRecord(filePath, record);
66
+ return { ok: true, record };
67
+ }
68
+ /**
69
+ * Releases the identity slot by removing the file at the given path - but only if the file's record identifies the current process. The PID-match check
70
+ * inside makes ownership structural: a rejected duplicate startup's exit handler sees a held-live record belonging to a different PID and leaves the file
71
+ * alone, while the legitimate holder sees its own PID and cleans up. Safe to call more than once: a missing file is not an error. Release is purely hygiene -
72
+ * a process that fails to release on death has its file recovered transparently on the next startup via the stale-different-boot or stale-dead-pid branches.
73
+ * @param filePath - The absolute path to the identity file.
74
+ * @param ctx - The runtime identity context. Defaults to real I/O wiring.
75
+ */
76
+ export function release(filePath, ctx = createDefaultRuntimeIdentityContext()) {
77
+ const state = inspect(filePath, ctx);
78
+ // Only remove the file when it identifies us. Any other state (free, stale, or held-live by another process) means it is not ours to remove.
79
+ if ((state.kind !== "held-live") || (state.record.pid !== process.pid)) {
80
+ return;
81
+ }
82
+ clearPidFile(filePath, "identity");
83
+ }
84
+ /**
85
+ * Unconditionally removes the identity file at the given path. Intended for an explicit user-invoked reset or recovery flow where the caller has deliberately
86
+ * asked to clear stale state without the safety check that release() provides. Prefer release() for normal lifecycle cleanup.
87
+ * @param filePath - The absolute path to the identity file.
88
+ */
89
+ export function forceRelease(filePath) {
90
+ clearPidFile(filePath, "identity");
91
+ }
92
+ /**
93
+ * Serializes a record to its on-disk representation. The first line is the bare PID for backwards compatibility with shell tooling; subsequent lines are
94
+ * key=value pairs in deterministic order. The trailing newline keeps the file well-formed for POSIX text-file tools.
95
+ * @param record - The identity record to serialize.
96
+ * @returns The serialized payload.
97
+ */
98
+ export function serializeRecord(record) {
99
+ return String(record.pid) + "\n" +
100
+ "bootId=" + record.bootId + "\n" +
101
+ "startedAt=" + record.startedAt + "\n" +
102
+ "version=" + record.version + "\n";
103
+ }
104
+ /**
105
+ * Parses the on-disk representation of an identity record. Returns null when the payload cannot be interpreted as a complete record (missing or non-integer
106
+ * pid, missing bootId). Unknown key=value pairs are silently ignored so future fields can be added without breaking older readers.
107
+ * @param raw - The raw file contents.
108
+ * @returns The parsed record, or null when the payload is unusable.
109
+ */
110
+ export function parseRecord(raw) {
111
+ const lines = raw.split("\n");
112
+ // String.prototype.split always returns at least one element, so this guard can never actually fire - it is belt-and-suspenders defense that documents the
113
+ // empty-payload intent and keeps the array-access below structurally safe even if the split contract were ever to change.
114
+ if (lines.length === 0) {
115
+ return null;
116
+ }
117
+ const firstLine = lines[0];
118
+ if (firstLine === undefined) {
119
+ return null;
120
+ }
121
+ const pid = parseInt(firstLine.trim(), 10);
122
+ if (Number.isNaN(pid)) {
123
+ return null;
124
+ }
125
+ let bootId = null;
126
+ let startedAt = "";
127
+ let version = "";
128
+ for (let i = 1; i < lines.length; i++) {
129
+ const line = lines[i];
130
+ if (line === undefined) {
131
+ continue;
132
+ }
133
+ const trimmed = line.trim();
134
+ if (trimmed === "") {
135
+ continue;
136
+ }
137
+ const eq = trimmed.indexOf("=");
138
+ if (eq === -1) {
139
+ continue;
140
+ }
141
+ const key = trimmed.slice(0, eq);
142
+ const value = trimmed.slice(eq + 1);
143
+ switch (key) {
144
+ case "bootId": {
145
+ bootId = value;
146
+ break;
147
+ }
148
+ case "startedAt": {
149
+ startedAt = value;
150
+ break;
151
+ }
152
+ case "version": {
153
+ version = value;
154
+ break;
155
+ }
156
+ default: {
157
+ // Unknown keys are silently ignored to support forward compatibility - older readers must tolerate fields added in newer writers.
158
+ }
159
+ }
160
+ }
161
+ // bootId is the only required metadata field. A file without one was written by a pre-runtimeIdentity PrismCast (or by an external tool) and is treated as
162
+ // malformed for state-machine purposes.
163
+ if (bootId === null) {
164
+ return null;
165
+ }
166
+ return { bootId, pid, startedAt, version };
167
+ }
168
+ /**
169
+ * Persists a record to disk via atomic write (write-temp + rename). On POSIX rename is atomic within a filesystem; on Windows the rename is best-effort but
170
+ * the partial-write window remains negligible. A torn write would parse as malformed, which the state machine recovers from on the next inspect - so atomicity
171
+ * here is hygiene, not something callers depend on for correctness.
172
+ * @param filePath - The absolute path to the identity file.
173
+ * @param record - The record to persist.
174
+ */
175
+ function writeRecord(filePath, record) {
176
+ const payload = serializeRecord(record);
177
+ const tempPath = filePath + ".tmp";
178
+ fs.writeFileSync(tempPath, payload, "utf-8");
179
+ fs.renameSync(tempPath, filePath);
180
+ }
181
+ //# sourceMappingURL=runtimeIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeIdentity.js","sourceRoot":"","sources":["../../src/utils/runtimeIdentity.ts"],"names":[],"mappings":"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"}
@@ -12,3 +12,4 @@ export declare function sanitizeString(value: string): string;
12
12
  * @returns True if the string contains at least one non-printable character.
13
13
  */
14
14
  export declare function containsNonPrintable(value: string): boolean;
15
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO3D"}