prismcast 1.9.0 → 1.10.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 (360) hide show
  1. package/dist/app.d.ts +1 -1
  2. package/dist/app.js +27 -9
  3. package/dist/app.js.map +1 -1
  4. package/dist/browser/cdp.js +7 -7
  5. package/dist/browser/cdp.js.map +1 -1
  6. package/dist/browser/channelSelection.d.ts +41 -11
  7. package/dist/browser/channelSelection.js +75 -24
  8. package/dist/browser/channelSelection.js.map +1 -1
  9. package/dist/browser/display.d.ts +1 -1
  10. package/dist/browser/index.d.ts +8 -8
  11. package/dist/browser/index.js +42 -43
  12. package/dist/browser/index.js.map +1 -1
  13. package/dist/browser/login.d.ts +2 -2
  14. package/dist/browser/login.js +1 -1
  15. package/dist/browser/manifestInterceptor.d.ts +77 -0
  16. package/dist/browser/manifestInterceptor.js +323 -0
  17. package/dist/browser/manifestInterceptor.js.map +1 -0
  18. package/dist/browser/precaching.js +4 -4
  19. package/dist/browser/tuning/comcastPolymer.d.ts +1 -1
  20. package/dist/browser/tuning/cox.d.ts +1 -1
  21. package/dist/browser/tuning/directv.d.ts +1 -1
  22. package/dist/browser/tuning/directv.js +61 -62
  23. package/dist/browser/tuning/directv.js.map +1 -1
  24. package/dist/browser/tuning/fox.d.ts +1 -1
  25. package/dist/browser/tuning/fox.js +171 -14
  26. package/dist/browser/tuning/fox.js.map +1 -1
  27. package/dist/browser/tuning/hbo.d.ts +1 -1
  28. package/dist/browser/tuning/hbo.js +6 -6
  29. package/dist/browser/tuning/hbo.js.map +1 -1
  30. package/dist/browser/tuning/hulu.d.ts +1 -1
  31. package/dist/browser/tuning/hulu.js +117 -110
  32. package/dist/browser/tuning/hulu.js.map +1 -1
  33. package/dist/browser/tuning/shared.d.ts +3 -3
  34. package/dist/browser/tuning/shared.js +5 -5
  35. package/dist/browser/tuning/sling.d.ts +1 -1
  36. package/dist/browser/tuning/sling.js +28 -28
  37. package/dist/browser/tuning/sling.js.map +1 -1
  38. package/dist/browser/tuning/spectrum.d.ts +1 -1
  39. package/dist/browser/tuning/spectrum.js +21 -22
  40. package/dist/browser/tuning/spectrum.js.map +1 -1
  41. package/dist/browser/tuning/thumbnailRow.d.ts +1 -1
  42. package/dist/browser/tuning/thumbnailRow.js +1 -1
  43. package/dist/browser/tuning/tileClick.d.ts +1 -1
  44. package/dist/browser/tuning/tileClick.js +5 -5
  45. package/dist/browser/tuning/xfinity.d.ts +1 -1
  46. package/dist/browser/tuning/youtubeTv.d.ts +1 -1
  47. package/dist/browser/tuning/youtubeTv.js +17 -18
  48. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  49. package/dist/browser/video.d.ts +20 -6
  50. package/dist/browser/video.js +30 -38
  51. package/dist/browser/video.js.map +1 -1
  52. package/dist/channels/index.d.ts +1 -2
  53. package/dist/channels/index.js +73 -40
  54. package/dist/channels/index.js.map +1 -1
  55. package/dist/config/channelForm.d.ts +58 -0
  56. package/dist/config/channelForm.js +129 -0
  57. package/dist/config/channelForm.js.map +1 -0
  58. package/dist/config/consistencyProbe.d.ts +7 -0
  59. package/dist/config/consistencyProbe.js +143 -0
  60. package/dist/config/consistencyProbe.js.map +1 -0
  61. package/dist/config/health.d.ts +4 -3
  62. package/dist/config/health.js +75 -62
  63. package/dist/config/health.js.map +1 -1
  64. package/dist/config/index.d.ts +1 -1
  65. package/dist/config/index.js +19 -12
  66. package/dist/config/index.js.map +1 -1
  67. package/dist/config/paths.d.ts +9 -3
  68. package/dist/config/paths.js +12 -4
  69. package/dist/config/paths.js.map +1 -1
  70. package/dist/config/persistence.context.d.ts +8 -0
  71. package/dist/config/persistence.context.js +30 -0
  72. package/dist/config/persistence.context.js.map +1 -0
  73. package/dist/config/persistence.d.ts +110 -12
  74. package/dist/config/persistence.js +351 -32
  75. package/dist/config/persistence.js.map +1 -1
  76. package/dist/config/presets.d.ts +14 -4
  77. package/dist/config/presets.js +84 -75
  78. package/dist/config/presets.js.map +1 -1
  79. package/dist/config/profiles.d.ts +2 -2
  80. package/dist/config/profiles.js +7 -9
  81. package/dist/config/profiles.js.map +1 -1
  82. package/dist/config/servicePacks.d.ts +2 -2
  83. package/dist/config/servicePacks.js +28 -28
  84. package/dist/config/servicePacks.js.map +1 -1
  85. package/dist/config/services.d.ts +62 -36
  86. package/dist/config/services.js +150 -136
  87. package/dist/config/services.js.map +1 -1
  88. package/dist/config/sites.d.ts +3 -3
  89. package/dist/config/sites.js +16 -16
  90. package/dist/config/sites.js.map +1 -1
  91. package/dist/config/userChannels.d.ts +500 -41
  92. package/dist/config/userChannels.js +1201 -312
  93. package/dist/config/userChannels.js.map +1 -1
  94. package/dist/config/userConfig.d.ts +103 -10
  95. package/dist/config/userConfig.js +277 -117
  96. package/dist/config/userConfig.js.map +1 -1
  97. package/dist/config/userProfiles.d.ts +4 -2
  98. package/dist/config/userProfiles.js +72 -26
  99. package/dist/config/userProfiles.js.map +1 -1
  100. package/dist/hdhr/channelMap.js +8 -11
  101. package/dist/hdhr/channelMap.js.map +1 -1
  102. package/dist/hdhr/deviceId.js +10 -9
  103. package/dist/hdhr/deviceId.js.map +1 -1
  104. package/dist/hdhr/discover.js +4 -5
  105. package/dist/hdhr/discover.js.map +1 -1
  106. package/dist/hdhr/index.js +6 -10
  107. package/dist/hdhr/index.js.map +1 -1
  108. package/dist/index.js +12 -12
  109. package/dist/index.js.map +1 -1
  110. package/dist/native/codecInference.d.ts +44 -0
  111. package/dist/native/codecInference.js +327 -0
  112. package/dist/native/codecInference.js.map +1 -0
  113. package/dist/native/decrypt.d.ts +1 -1
  114. package/dist/native/index.d.ts +5 -5
  115. package/dist/native/index.js +42 -64
  116. package/dist/native/index.js.map +1 -1
  117. package/dist/native/probe.d.ts +27 -9
  118. package/dist/native/probe.js +158 -67
  119. package/dist/native/probe.js.map +1 -1
  120. package/dist/native/proxy.d.ts +4 -2
  121. package/dist/native/proxy.js +52 -49
  122. package/dist/native/proxy.js.map +1 -1
  123. package/dist/native/tokenExpiry.d.ts +22 -0
  124. package/dist/native/tokenExpiry.js +153 -0
  125. package/dist/native/tokenExpiry.js.map +1 -0
  126. package/dist/routes/auth.js +6 -10
  127. package/dist/routes/auth.js.map +1 -1
  128. package/dist/routes/components.js +2 -2
  129. package/dist/routes/components.js.map +1 -1
  130. package/dist/routes/config/channels/endpoints/browse.d.ts +6 -0
  131. package/dist/routes/config/channels/endpoints/browse.js +195 -0
  132. package/dist/routes/config/channels/endpoints/browse.js.map +1 -0
  133. package/dist/routes/config/channels/endpoints/bulk.d.ts +6 -0
  134. package/dist/routes/config/channels/endpoints/bulk.js +128 -0
  135. package/dist/routes/config/channels/endpoints/bulk.js.map +1 -0
  136. package/dist/routes/config/channels/endpoints/crud.d.ts +6 -0
  137. package/dist/routes/config/channels/endpoints/crud.js +504 -0
  138. package/dist/routes/config/channels/endpoints/crud.js.map +1 -0
  139. package/dist/routes/config/channels/endpoints/importExport.d.ts +6 -0
  140. package/dist/routes/config/channels/endpoints/importExport.js +131 -0
  141. package/dist/routes/config/channels/endpoints/importExport.js.map +1 -0
  142. package/dist/routes/config/channels/endpoints/predefined.d.ts +6 -0
  143. package/dist/routes/config/channels/endpoints/predefined.js +78 -0
  144. package/dist/routes/config/channels/endpoints/predefined.js.map +1 -0
  145. package/dist/routes/config/channels/endpoints/prefs.d.ts +6 -0
  146. package/dist/routes/config/channels/endpoints/prefs.js +58 -0
  147. package/dist/routes/config/channels/endpoints/prefs.js.map +1 -0
  148. package/dist/routes/config/channels/endpoints/service.d.ts +6 -0
  149. package/dist/routes/config/channels/endpoints/service.js +149 -0
  150. package/dist/routes/config/channels/endpoints/service.js.map +1 -0
  151. package/dist/routes/config/channels/endpoints/tags.d.ts +6 -0
  152. package/dist/routes/config/channels/endpoints/tags.js +185 -0
  153. package/dist/routes/config/channels/endpoints/tags.js.map +1 -0
  154. package/dist/routes/config/channels/http/handler.d.ts +10 -0
  155. package/dist/routes/config/channels/http/handler.js +20 -0
  156. package/dist/routes/config/channels/http/handler.js.map +1 -0
  157. package/dist/routes/config/channels/http/playlistHint.d.ts +25 -0
  158. package/dist/routes/config/channels/http/playlistHint.js +40 -0
  159. package/dist/routes/config/channels/http/playlistHint.js.map +1 -0
  160. package/dist/routes/config/channels/http/serviceWarning.d.ts +10 -0
  161. package/dist/routes/config/channels/http/serviceWarning.js +28 -0
  162. package/dist/routes/config/channels/http/serviceWarning.js.map +1 -0
  163. package/dist/routes/config/channels/index.d.ts +3 -3
  164. package/dist/routes/config/channels/index.js +1 -1
  165. package/dist/routes/config/channels/index.js.map +1 -1
  166. package/dist/routes/config/channels/{routes.d.ts → setup.d.ts} +1 -1
  167. package/dist/routes/config/channels/setup.js +23 -0
  168. package/dist/routes/config/channels/setup.js.map +1 -0
  169. package/dist/routes/config/channels/table.d.ts +9 -9
  170. package/dist/routes/config/channels/table.js +124 -76
  171. package/dist/routes/config/channels/table.js.map +1 -1
  172. package/dist/routes/config/http/envelope.d.ts +111 -0
  173. package/dist/routes/config/http/envelope.js +103 -0
  174. package/dist/routes/config/http/envelope.js.map +1 -0
  175. package/dist/routes/config/index.d.ts +9 -9
  176. package/dist/routes/config/index.js +2 -2
  177. package/dist/routes/config/index.js.map +1 -1
  178. package/dist/routes/config/services.js +69 -68
  179. package/dist/routes/config/services.js.map +1 -1
  180. package/dist/routes/config/settings.d.ts +1 -1
  181. package/dist/routes/config/settings.js +45 -38
  182. package/dist/routes/config/settings.js.map +1 -1
  183. package/dist/routes/debug.js +12 -11
  184. package/dist/routes/debug.js.map +1 -1
  185. package/dist/routes/icons.js +2 -2
  186. package/dist/routes/icons.js.map +1 -1
  187. package/dist/routes/logs.js +19 -30
  188. package/dist/routes/logs.js.map +1 -1
  189. package/dist/routes/mpegts.js +1 -1
  190. package/dist/routes/playlist.d.ts +1 -1
  191. package/dist/routes/playlist.js +37 -26
  192. package/dist/routes/playlist.js.map +1 -1
  193. package/dist/routes/root/content.js +27 -6
  194. package/dist/routes/root/content.js.map +1 -1
  195. package/dist/routes/root/index.js +2 -5
  196. package/dist/routes/root/index.js.map +1 -1
  197. package/dist/routes/root/scripts/channels.js +16 -16
  198. package/dist/routes/root/scripts/channels.js.map +1 -1
  199. package/dist/routes/root/scripts/config.js +59 -59
  200. package/dist/routes/root/scripts/config.js.map +1 -1
  201. package/dist/routes/root/scripts/index.d.ts +4 -4
  202. package/dist/routes/root/scripts/shared.js +24 -10
  203. package/dist/routes/root/scripts/shared.js.map +1 -1
  204. package/dist/routes/root/scripts/status.d.ts +4 -0
  205. package/dist/routes/root/scripts/status.handlers.d.ts +182 -0
  206. package/dist/routes/root/scripts/status.handlers.js +713 -0
  207. package/dist/routes/root/scripts/status.handlers.js.map +1 -0
  208. package/dist/routes/root/scripts/status.js +86 -488
  209. package/dist/routes/root/scripts/status.js.map +1 -1
  210. package/dist/routes/root/styles.js +5 -5
  211. package/dist/routes/services.js +18 -15
  212. package/dist/routes/services.js.map +1 -1
  213. package/dist/routes/sse.d.ts +16 -0
  214. package/dist/routes/sse.js +29 -0
  215. package/dist/routes/sse.js.map +1 -0
  216. package/dist/routes/streams.js +10 -23
  217. package/dist/routes/streams.js.map +1 -1
  218. package/dist/routes/ui.d.ts +2 -2
  219. package/dist/routes/upgrade.js +6 -7
  220. package/dist/routes/upgrade.js.map +1 -1
  221. package/dist/service/commands.context.d.ts +6 -0
  222. package/dist/service/commands.context.js +47 -0
  223. package/dist/service/commands.context.js.map +1 -0
  224. package/dist/service/commands.d.ts +53 -8
  225. package/dist/service/commands.js +171 -188
  226. package/dist/service/commands.js.map +1 -1
  227. package/dist/service/generators.context.d.ts +6 -0
  228. package/dist/service/generators.context.js +45 -0
  229. package/dist/service/generators.context.js.map +1 -0
  230. package/dist/service/generators.d.ts +56 -16
  231. package/dist/service/generators.js +499 -383
  232. package/dist/service/generators.js.map +1 -1
  233. package/dist/service/index.d.ts +2 -2
  234. package/dist/streaming/clients.d.ts +2 -2
  235. package/dist/streaming/clients.js +2 -2
  236. package/dist/streaming/codec.d.ts +2 -2
  237. package/dist/streaming/codec.js +0 -1
  238. package/dist/streaming/codec.js.map +1 -1
  239. package/dist/streaming/fmp4Segmenter.d.ts +2 -2
  240. package/dist/streaming/fmp4Segmenter.js +12 -12
  241. package/dist/streaming/hls.d.ts +3 -3
  242. package/dist/streaming/hls.js +81 -70
  243. package/dist/streaming/hls.js.map +1 -1
  244. package/dist/streaming/hlsResume.d.ts +3 -3
  245. package/dist/streaming/hlsResume.js +5 -5
  246. package/dist/streaming/hlsSegments.d.ts +5 -2
  247. package/dist/streaming/hlsSegments.js +14 -9
  248. package/dist/streaming/hlsSegments.js.map +1 -1
  249. package/dist/streaming/monitor.d.ts +12 -12
  250. package/dist/streaming/monitor.js +80 -54
  251. package/dist/streaming/monitor.js.map +1 -1
  252. package/dist/streaming/mp4Parser.d.ts +34 -4
  253. package/dist/streaming/mp4Parser.js +111 -29
  254. package/dist/streaming/mp4Parser.js.map +1 -1
  255. package/dist/streaming/mpegts.d.ts +1 -1
  256. package/dist/streaming/mpegts.js +13 -10
  257. package/dist/streaming/mpegts.js.map +1 -1
  258. package/dist/streaming/playlistBuilder.d.ts +1 -1
  259. package/dist/streaming/playlistBuilder.js +2 -2
  260. package/dist/streaming/preroll.d.ts +9 -9
  261. package/dist/streaming/preroll.js +39 -41
  262. package/dist/streaming/preroll.js.map +1 -1
  263. package/dist/streaming/pretune.js +4 -4
  264. package/dist/streaming/pretune.js.map +1 -1
  265. package/dist/streaming/recovery.d.ts +3 -3
  266. package/dist/streaming/recovery.js +4 -4
  267. package/dist/streaming/registry.d.ts +6 -6
  268. package/dist/streaming/setup.d.ts +9 -8
  269. package/dist/streaming/setup.js +97 -49
  270. package/dist/streaming/setup.js.map +1 -1
  271. package/dist/streaming/showInfo.d.ts +9 -3
  272. package/dist/streaming/showInfo.js +26 -18
  273. package/dist/streaming/showInfo.js.map +1 -1
  274. package/dist/streaming/statusEmitter.d.ts +4 -4
  275. package/dist/streaming/statusEmitter.js +2 -2
  276. package/dist/types/channels.d.ts +133 -34
  277. package/dist/types/channels.js +39 -1
  278. package/dist/types/channels.js.map +1 -1
  279. package/dist/types/config.d.ts +20 -1
  280. package/dist/types/index.d.ts +9 -8
  281. package/dist/types/index.js +1 -0
  282. package/dist/types/index.js.map +1 -1
  283. package/dist/types/profiles.d.ts +5 -4
  284. package/dist/types/selection.d.ts +48 -4
  285. package/dist/types/streaming.d.ts +1 -1
  286. package/dist/upgrade/commands.context.d.ts +6 -0
  287. package/dist/upgrade/commands.context.js +29 -0
  288. package/dist/upgrade/commands.context.js.map +1 -0
  289. package/dist/upgrade/commands.d.ts +29 -2
  290. package/dist/upgrade/commands.js +87 -134
  291. package/dist/upgrade/commands.js.map +1 -1
  292. package/dist/upgrade/detection.context.d.ts +6 -0
  293. package/dist/upgrade/detection.context.js +24 -0
  294. package/dist/upgrade/detection.context.js.map +1 -0
  295. package/dist/upgrade/detection.d.ts +140 -10
  296. package/dist/upgrade/detection.js +153 -66
  297. package/dist/upgrade/detection.js.map +1 -1
  298. package/dist/upgrade/index.d.ts +2 -2
  299. package/dist/utils/chromeFetch.d.ts +1 -1
  300. package/dist/utils/chromeFetch.js +1 -1
  301. package/dist/utils/clock.d.ts +14 -0
  302. package/dist/utils/clock.js +28 -0
  303. package/dist/utils/clock.js.map +1 -0
  304. package/dist/utils/debugFilter.d.ts +1 -1
  305. package/dist/utils/debugFilter.js +6 -4
  306. package/dist/utils/debugFilter.js.map +1 -1
  307. package/dist/utils/delay.d.ts +2 -3
  308. package/dist/utils/delay.js +10 -16
  309. package/dist/utils/delay.js.map +1 -1
  310. package/dist/utils/evaluate.js +12 -14
  311. package/dist/utils/evaluate.js.map +1 -1
  312. package/dist/utils/ffmpeg.context.d.ts +6 -0
  313. package/dist/utils/ffmpeg.context.js +31 -0
  314. package/dist/utils/ffmpeg.context.js.map +1 -0
  315. package/dist/utils/ffmpeg.d.ts +85 -29
  316. package/dist/utils/ffmpeg.js +126 -129
  317. package/dist/utils/ffmpeg.js.map +1 -1
  318. package/dist/utils/fileLogger.d.ts +18 -2
  319. package/dist/utils/fileLogger.js +58 -30
  320. package/dist/utils/fileLogger.js.map +1 -1
  321. package/dist/utils/format.d.ts +1 -1
  322. package/dist/utils/format.js +2 -2
  323. package/dist/utils/format.js.map +1 -1
  324. package/dist/utils/html.js +1 -3
  325. package/dist/utils/html.js.map +1 -1
  326. package/dist/utils/index.d.ts +21 -20
  327. package/dist/utils/index.js +1 -0
  328. package/dist/utils/index.js.map +1 -1
  329. package/dist/utils/logger.js +16 -20
  330. package/dist/utils/logger.js.map +1 -1
  331. package/dist/utils/m3u.d.ts +18 -3
  332. package/dist/utils/m3u.js +28 -14
  333. package/dist/utils/m3u.js.map +1 -1
  334. package/dist/utils/memo.d.ts +19 -0
  335. package/dist/utils/memo.js +53 -0
  336. package/dist/utils/memo.js.map +1 -0
  337. package/dist/utils/morganStream.js +2 -2
  338. package/dist/utils/morganStream.js.map +1 -1
  339. package/dist/utils/pid.d.ts +2 -2
  340. package/dist/utils/pid.js +2 -2
  341. package/dist/utils/platform.d.ts +1 -1
  342. package/dist/utils/platform.js +3 -3
  343. package/dist/utils/platform.js.map +1 -1
  344. package/dist/utils/retry.d.ts +2 -0
  345. package/dist/utils/retry.js +9 -7
  346. package/dist/utils/retry.js.map +1 -1
  347. package/dist/utils/sanitize.d.ts +2 -2
  348. package/dist/utils/sanitize.js +4 -4
  349. package/dist/utils/timing.d.ts +6 -3
  350. package/dist/utils/timing.js +10 -6
  351. package/dist/utils/timing.js.map +1 -1
  352. package/dist/utils/version.d.ts +3 -2
  353. package/dist/utils/version.js +14 -27
  354. package/dist/utils/version.js.map +1 -1
  355. package/package.json +13 -7
  356. package/dist/native/intercept.d.ts +0 -35
  357. package/dist/native/intercept.js +0 -181
  358. package/dist/native/intercept.js.map +0 -1
  359. package/dist/routes/config/channels/routes.js +0 -1505
  360. package/dist/routes/config/channels/routes.js.map +0 -1
@@ -41,20 +41,34 @@ export function generateSharedUtilitiesScript() {
41
41
  " if(ms > 0) { setTimeout(() => { dismissToast(toast); }, ms); }",
42
42
  " }",
43
43
  " window.showToast = showToast;",
44
+ /* Single source of truth for extracting a user-facing error message from a server error response. The envelope emits two shapes: { error: string } for
45
+ * top-level failures (validation, not-found, conflict, server error) and { errors: Record<field, message> } for form submissions that surface multiple
46
+ * field errors at once. Callers pass a fallback string for the rare case where neither field is present. Every client that handles a !success response
47
+ * flows through this helper so error-reading logic lives in one place instead of drifting per call site.
48
+ */
49
+ " window.extractErrorMessage = (response, fallback) => {",
50
+ " if(response && response.errors) {",
51
+ " const entries = Object.entries(response.errors);",
52
+ " if(entries.length > 0) {",
53
+ " return entries.map(([ field, message ]) => field + ': ' + message).join(', ');",
54
+ " }",
55
+ " }",
56
+ " return (response && (response.error || response.message)) || fallback;",
57
+ " };",
44
58
  // Dismiss a toast with slide-out animation.
45
59
  " function dismissToast(toast) {",
46
60
  " if(toast.classList.contains('toast-exit')) return;",
47
61
  " toast.classList.add('toast-exit');",
48
62
  " toast.addEventListener('animationend', () => { toast.remove(); });",
49
63
  " }",
50
- /* Client-side namespace SSOT for all dropdown operations — close, and before-close hook registration. Private state (the hook array and both functions)
64
+ /* Client-side namespace SSOT for all dropdown operations - close, and before-close hook registration. Private state (the hook array and both functions)
51
65
  * lives in module-scope closures so the scroll/resize listener references stay stable across open/close cycles. The namespace object exposes the two
52
66
  * operations as property references into those module-scope functions, which keeps both entries structurally symmetric and preserves identity for
53
67
  * addEventListener / removeEventListener. Consumers call dropdowns.close() to close all open menus and dropdowns.addHook(fn) to register a before-close
54
- * callback — for example, the inline tag editor registers a batch-save callback so pending changes flush on any close path (click outside, scroll,
68
+ * callback - for example, the inline tag editor registers a batch-save callback so pending changes flush on any close path (click outside, scroll,
55
69
  * resize, next toggle). Registration is de-duplicated so accidental double-registration is a no-op.
56
70
  *
57
- * This is the "closure-backed" variant of the client-side namespace pattern documented in CLAUDE.md. The channelTable namespace uses the this.*-backed
71
+ * This is the "closure-backed" variant of the client-side namespace pattern. The channelTable namespace uses the this.*-backed
58
72
  * variant because its methods are only ever called as methods, never as detached listener references; dropdowns cannot use that variant because close()
59
73
  * must survive being passed to addEventListener and later matched in removeEventListener.
60
74
  */
@@ -75,7 +89,7 @@ export function generateSharedUtilitiesScript() {
75
89
  " };",
76
90
  /* Safe localStorage wrappers. localStorage access can throw in private browsing mode or when storage quota is exceeded. Centralizing the try/catch here
77
91
  * means every call site treats localStorage as best-effort persistence without repeating the same try/catch at every site. Failures are silently ignored
78
- * because they are not actionable by the client — there is no way to recover quota or exit private browsing from JavaScript, and log noise from every
92
+ * because they are not actionable by the client - there is no way to recover quota or exit private browsing from JavaScript, and log noise from every
79
93
  * subtab switch or page load would dominate useful diagnostics. Callers that need to react to failure should use the raw localStorage API directly.
80
94
  */
81
95
  " window.safeStorageGet = (key) => {",
@@ -91,7 +105,7 @@ export function generateSharedUtilitiesScript() {
91
105
  " catch(e) {}",
92
106
  " };",
93
107
  /* Persist channel table display preferences to the server. Single source of truth for POSTs to /config/channels/display-prefs so every call site (sort,
94
- * column visibility, and any future preference) shares one fetch path and one error-handling decision. Fire-and-forget — the caller does not await the
108
+ * column visibility, and any future preference) shares one fetch path and one error-handling decision. Fire-and-forget - the caller does not await the
95
109
  * round-trip because the client state is already updated and the persist is a best-effort sync to the server.
96
110
  */
97
111
  " window.persistDisplayPrefs = (body) => {",
@@ -228,7 +242,7 @@ export function generateSharedUtilitiesScript() {
228
242
  " if(sib && (sib.style.display === 'none')) sib.style.display = 'inline';",
229
243
  " }",
230
244
  " };",
231
- // Service icon renderer with three modes, mirroring channelDisplayHtml. The icon source chain is: iconUrl (if specified) → Apple touch icon → favicon.
245
+ // Service icon renderer with three modes, mirroring channelDisplayHtml. The icon source chain is: iconUrl (if specified) -> Apple touch icon -> favicon.
232
246
  // Fallback URLs are stored in a data-fallbacks attribute and processed by the shared imgFallback handler.
233
247
  " window.serviceIconHtml = (domain, name, iconClass, textClass, mode, iconUrl) => {",
234
248
  " const m = mode || 'logo';",
@@ -419,7 +433,7 @@ export function generateSharedUtilitiesScript() {
419
433
  " window.channelTable = {",
420
434
  /* Cached column index map for _getSortValue. Built lazily on first access by scanning the table header row's data-sort-field attributes, then held for
421
435
  * the page lifetime with no invalidation path. This relies on a load-bearing invariant: the channel table header is rendered once by the server and
422
- * never rebuilt client-side — only CSS visibility classes are toggled by toggleColumn, never DOM structure. Do not introduce dynamic thead mutation
436
+ * never rebuilt client-side - only CSS visibility classes are toggled by toggleColumn, never DOM structure. Do not introduce dynamic thead mutation
423
437
  * without also adding an explicit cache invalidation (e.g., set _colIndexCache = null after rewriting the header row).
424
438
  */
425
439
  " _colIndexCache: null,",
@@ -497,7 +511,7 @@ export function generateSharedUtilitiesScript() {
497
511
  " if(tcount) tcount.textContent = tc.count + ' of ' + tc.total;",
498
512
  " }",
499
513
  " }",
500
- // Apply channel logos from a logo map (key → URL). Sets data-logo attributes on matching rows so processLogos() can render the images.
514
+ // Apply channel logos from a logo map (key -> URL). Sets data-logo attributes on matching rows so processLogos() can render the images.
501
515
  " if(patch.logos) {",
502
516
  " for(const [ key, logoUrl ] of Object.entries(patch.logos)) {",
503
517
  " const logoRow = document.getElementById('display-row-' + key);",
@@ -549,13 +563,13 @@ export function generateSharedUtilitiesScript() {
549
563
  " document.getElementById('edit-row-' + key)?.remove();",
550
564
  " },",
551
565
  /* Apply the service filter to all channel rows. Hides rows whose service tags aren't enabled and filters service dropdown options for multi-service channels.
552
- * Uses a persistent _allOptions array on each select to remember all server-rendered options across filter applications — the server marks disabled options
566
+ * Uses a persistent _allOptions array on each select to remember all server-rendered options across filter applications - the server marks disabled options
553
567
  * with the hidden attribute, but Safari ignores hidden on option elements, so we rebuild the select with only enabled options each time. Selection restore
554
568
  * priority: (1) saved server choice (HTML selected attribute), (2) previous visual selection, (3) first option.
555
569
  *
556
570
  * Cache lifecycle: _allOptions is attached to the DOM select element itself, so its lifetime is tied to that element. Row replacement via insertRow() drops
557
571
  * the old row (and its select) and inserts fresh server-rendered HTML, which transparently resets the cache with whatever option set the server just sent.
558
- * This invariant is load-bearing — do not refactor insertRow() into an in-place row update without also adding an explicit cache invalidation path here.
572
+ * This invariant is load-bearing - do not refactor insertRow() into an in-place row update without also adding an explicit cache invalidation path here.
559
573
  */
560
574
  " filter(enabledTags) {",
561
575
  " const rows = document.querySelectorAll('tr[data-provider-tags]');",
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/shared.ts"],"names":[],"mappings":"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"}
@@ -1 +1,5 @@
1
+ /**
2
+ * Generates the inline <script> block that drives the status display. Returns a complete <script>...</script> string ready to embed in the page wrapper.
3
+ * @returns The script string.
4
+ */
1
5
  export declare function generateStatusScript(): string;
@@ -0,0 +1,182 @@
1
+ /**
2
+ * The shape of a single stream as carried over the SSE wire and stored in the client state. This is the script-side projection - only the fields the renderers
3
+ * and handlers actually read are declared. The server-side StreamListItem and statusEmitter payloads are richer; the script consumes a subset.
4
+ */
5
+ export interface StreamSummary {
6
+ readonly captureCodec?: string;
7
+ readonly channel?: string | null;
8
+ readonly clientCount: number;
9
+ readonly clients: readonly {
10
+ readonly count: number;
11
+ readonly type: string;
12
+ }[];
13
+ readonly duration: number;
14
+ readonly escalationLevel?: number;
15
+ readonly hardwareAccelerated?: boolean;
16
+ readonly health: "buffering" | "error" | "healthy" | "recovering" | "stalled";
17
+ readonly id: number | string;
18
+ readonly lastIssueTime?: string;
19
+ readonly lastIssueType?: string;
20
+ readonly logoUrl?: string;
21
+ readonly memoryBytes: number;
22
+ readonly nativeBandwidth?: number;
23
+ readonly nativeResolution?: string;
24
+ readonly pageReloadsInWindow: number;
25
+ readonly recoveryAttempts: number;
26
+ readonly serviceName?: string;
27
+ readonly showName?: string;
28
+ readonly startTime: string;
29
+ readonly streamingMode?: "capture" | "native";
30
+ readonly url: string;
31
+ }
32
+ /**
33
+ * The shape of the system-status payload (snapshot.system and systemStatusChanged events). Subset of the server-side HealthStatus; only what updateSystemStatus
34
+ * reads.
35
+ */
36
+ export interface SystemSummary {
37
+ readonly browser: {
38
+ readonly connected: boolean;
39
+ };
40
+ readonly streams: {
41
+ readonly active: number;
42
+ readonly limit: number;
43
+ };
44
+ }
45
+ /**
46
+ * The shape of the snapshot SSE payload. snapshot is the only event that delivers the full state in one message; subsequent events are deltas.
47
+ */
48
+ export interface SnapshotPayload {
49
+ readonly health?: HealthSnapshot;
50
+ readonly streams: readonly StreamSummary[];
51
+ readonly system: SystemSummary;
52
+ }
53
+ /**
54
+ * The shape of the streamRemoved SSE payload. Just the id.
55
+ */
56
+ export interface StreamRemovedPayload {
57
+ readonly id: number | string;
58
+ }
59
+ /**
60
+ * The shape of the healthChanged SSE payload. Carries the per-channel update plus the domain that owns the auth context.
61
+ */
62
+ export interface HealthChangedPayload {
63
+ readonly channelKey: string;
64
+ readonly domain?: string;
65
+ readonly status: "failed" | "success";
66
+ readonly timestamp: number;
67
+ }
68
+ /**
69
+ * Health snapshot delivered inside the snapshot event. Channels and domains are independent maps keyed by their respective identifiers.
70
+ */
71
+ export interface HealthSnapshot {
72
+ readonly channels: Readonly<Record<string, {
73
+ readonly domain?: string;
74
+ readonly status: "failed" | "success";
75
+ readonly timestamp: number;
76
+ }>>;
77
+ readonly domains: Readonly<Record<string, number>>;
78
+ }
79
+ /**
80
+ * Mutable client state. The IIFE shell constructs one of these at startup; every handler reads and writes it via ctx.state. Handlers mutate ctx.state fields
81
+ * directly; mutation methods would add no value over field assignment.
82
+ */
83
+ export interface ClientState {
84
+ expandedStreams: Record<string, boolean>;
85
+ hiddenSince: number;
86
+ lastStatusEventTime: number;
87
+ popoverRenderPending: boolean;
88
+ streamData: Record<string, StreamSummary>;
89
+ systemData: SystemSummary | null;
90
+ tableRenderPending: boolean;
91
+ }
92
+ /**
93
+ * Readonly handle to sibling-script window.* APIs. Resolved at IIFE construction time; tests pass stub literals. updateRestartDialogStatus is read via a getter
94
+ * in the IIFE so the streamRemoved handler picks up later registration from config.ts (the script that defines it loads after status.ts in the page).
95
+ */
96
+ export interface ClientExternals {
97
+ readonly channelDisplayHtml: (logoUrl: string | undefined, name: string, logoClass: string, textClass: string) => string;
98
+ readonly channelTable: {
99
+ readonly applyPatch: (patch: unknown) => void;
100
+ };
101
+ readonly copyToClipboard: (text: string, message: string) => void;
102
+ readonly dropdowns: {
103
+ readonly close: () => void;
104
+ };
105
+ readonly updateRestartDialogStatus: (() => void) | undefined;
106
+ }
107
+ /**
108
+ * The runtime-input port every handler consumes. document is the DOM; state is the mutable record; externals are the sibling-script window.* APIs. Decision
109
+ * logic is a pure function of this shape - production wires it inside the IIFE (constructed by generateStatusScript), tests pass a context literal.
110
+ */
111
+ export interface HandlerContext {
112
+ readonly document: Document;
113
+ readonly externals: ClientExternals;
114
+ readonly state: ClientState;
115
+ }
116
+ /**
117
+ * Builds an empty client state. The IIFE calls this at startup; tests call it for fixtures. Defaults to "no streams, no system data, watchdog timestamps zeroed,
118
+ * rAF gates open." lastStatusEventTime is zeroed here; the IIFE reseeds it to Date.now() right before opening the EventSource so the staleness watchdog has a
119
+ * meaningful baseline. Tests that exercise the watchdog seed it explicitly.
120
+ */
121
+ export declare function createInitialState(): ClientState;
122
+ /**
123
+ * The script-side constant registry. generateStatusScript() emits each entry as `const NAME = <JSON.stringify(value)>;`. Naming is the IIFE-side identifier
124
+ * (matches the closure references inside the function bodies below). Adding a new constant means appending here and using its name in handler bodies; nothing
125
+ * else changes.
126
+ */
127
+ export declare const HANDLER_CONSTANTS: readonly {
128
+ readonly name: string;
129
+ readonly value: unknown;
130
+ }[];
131
+ declare function formatDuration(seconds: number): string;
132
+ declare function formatBytes(bytes: number): string;
133
+ declare function formatTime(isoString: string): string;
134
+ declare function formatTimeAgo(ts: number): string;
135
+ declare function getDomain(url: string): string;
136
+ declare function getRecoveringLabel(level: number): string;
137
+ declare function getHealthBadge(health: string, level: number): string;
138
+ declare function formatLastIssue(s: StreamSummary): string;
139
+ declare function formatAutoRecovery(s: StreamSummary): string;
140
+ declare function formatClients(s: StreamSummary): string;
141
+ declare function renderHealthCellContent(s: StreamSummary): string;
142
+ declare function renderDetailCodec(s: StreamSummary): string;
143
+ declare function renderDetailStarted(s: StreamSummary): string;
144
+ declare function updateSystemStatus(ctx: HandlerContext): void;
145
+ declare function buildStreamPopoverContent(menu: Element, ctx: HandlerContext): void;
146
+ declare function updateStreamPopover(ctx: HandlerContext): void;
147
+ declare function scheduleTableRender(ctx: HandlerContext): void;
148
+ declare function schedulePopoverRender(ctx: HandlerContext): void;
149
+ declare function renderStreamsTable(ctx: HandlerContext): void;
150
+ declare function updateStreamRow(s: StreamSummary, ctx: HandlerContext): void;
151
+ declare function toggleStreamDetails(id: number | string, ctx: HandlerContext): void;
152
+ declare function updateDurations(ctx: HandlerContext): void;
153
+ declare function updateChannelHealth(channelKey: string, status: "failed" | "success", timestamp: number, domain: string | undefined, ctx: HandlerContext): void;
154
+ declare function updateDomainAuth(domain: string, timestamp: number, ctx: HandlerContext): void;
155
+ declare function applyHealthSnapshot(data: HealthSnapshot, ctx: HandlerContext): void;
156
+ declare function handleSnapshot(data: SnapshotPayload, ctx: HandlerContext): void;
157
+ declare function handleStreamAdded(data: StreamSummary, ctx: HandlerContext): void;
158
+ declare function handleStreamRemoved(data: StreamRemovedPayload, ctx: HandlerContext): void;
159
+ declare function handleStreamHealthChanged(data: StreamSummary, ctx: HandlerContext): void;
160
+ declare function handleSystemStatusChanged(data: SystemSummary, ctx: HandlerContext): void;
161
+ declare function handleHealthChanged(data: HealthChangedPayload, ctx: HandlerContext): void;
162
+ declare function handleChannelUpdate(data: unknown, ctx: HandlerContext): void;
163
+ declare function handleSseError(ctx: HandlerContext): void;
164
+ declare function toggleStreamPopover(ctx: HandlerContext): void;
165
+ declare function copyOverviewPlaylistUrl(ctx: HandlerContext): void;
166
+ declare function handleVisibilityChange(ctx: HandlerContext, reconnect: () => void): void;
167
+ declare function initIPadTooltips(ctx: HandlerContext): void;
168
+ /**
169
+ * The narrowly-typed function shape consumers of HANDLER_FUNCTIONS see. `(...args: never[]) => unknown` is the TS-idiomatic "any function" type that does not
170
+ * fall back to the unsafe Function global - it is contravariant on parameters so it accepts any specific signature, and unknown on return so callers narrow at
171
+ * the use site. The registry consumer (status.ts:generateStatusScript) only ever calls .toString() on each entry, so any function-shape works.
172
+ */
173
+ type EmittableFn = (...args: never[]) => unknown;
174
+ /**
175
+ * The script-side function registry. generateStatusScript() emits each entry's .toString() output in order. Order is hoisting-irrelevant for function
176
+ * declarations but reflects the logical groups: pure formatters, state-derived renderers, DOM mutators, render schedulers, SSE handlers, then trampolines and
177
+ * lifecycle helpers. Adding a new function means appending here and using its identifier in the IIFE; nothing else changes.
178
+ *
179
+ * The exported individual functions remain importable for tests; this registry is just the emission order for the script body.
180
+ */
181
+ export declare const HANDLER_FUNCTIONS: readonly EmittableFn[];
182
+ export { applyHealthSnapshot, buildStreamPopoverContent, copyOverviewPlaylistUrl, formatAutoRecovery, formatBytes, formatClients, formatDuration, formatLastIssue, formatTime, formatTimeAgo, getDomain, getHealthBadge, getRecoveringLabel, handleChannelUpdate, handleHealthChanged, handleSnapshot, handleSseError, handleStreamAdded, handleStreamHealthChanged, handleStreamRemoved, handleSystemStatusChanged, handleVisibilityChange, initIPadTooltips, renderDetailCodec, renderDetailStarted, renderHealthCellContent, renderStreamsTable, schedulePopoverRender, scheduleTableRender, toggleStreamDetails, toggleStreamPopover, updateChannelHealth, updateDomainAuth, updateDurations, updateStreamPopover, updateStreamRow, updateSystemStatus };