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
@@ -1,4 +1,4 @@
1
- import type { DomainConfig, ProfilesValidationResult, SiteProfile, UserProfilesLoadResult } from "../types/index.js";
1
+ import type { DomainConfig, ProfilesValidationResult, SiteProfile, UserProfilesLoadResult } from "../types/index.ts";
2
2
  /**
3
3
  * Normalizes legacy field names in a set of profiles. Renames any fields listed in LEGACY_PROFILE_FLAGS to their current names in-place. When a profile already
4
4
  * contains the current field name, the current value is preserved and the legacy field is deleted without overwriting.
@@ -27,11 +27,13 @@ export declare function getUserProfiles(): Record<string, SiteProfile>;
27
27
  */
28
28
  export declare function getUserDomains(): Record<string, DomainConfig>;
29
29
  /**
30
- * Compound data type for the profiles file store. Carries both profile definitions and domain mappings.
30
+ * Compound data type for the profiles file store. Carries profile definitions, domain mappings, and the framework-managed schema metadata.
31
31
  */
32
32
  interface ProfilesFileData {
33
33
  domains: Record<string, DomainConfig>;
34
+ migrationsApplied: string[];
34
35
  profiles: Record<string, SiteProfile>;
36
+ schemaVersion: number;
35
37
  }
36
38
  /**
37
39
  * Reads the current profiles from disk without acquiring the serialization lock. Returns the parsed profiles and domains with parse status. Use this for
@@ -15,7 +15,7 @@ import { getProfilesFilePath } from "./paths.js";
15
15
  * - "profiles": Custom site profile definitions (each must extend a built-in profile)
16
16
  * - "domains": Domain-to-profile mappings (can reference built-in or user profiles)
17
17
  *
18
- * User profiles cannot extend other user profiles — only built-in profiles. This prevents cascading breakage when a referenced user profile is deleted.
18
+ * User profiles cannot extend other user profiles - only built-in profiles. This prevents cascading breakage when a referenced user profile is deleted.
19
19
  */
20
20
  // Legacy profile flag names that have been renamed. Keys are the old names, values are the current names. Used by initializeUserProfiles() and service pack import to
21
21
  // silently normalize persisted and imported profiles at the boundary where external data enters the system.
@@ -103,25 +103,56 @@ export function getUserProfiles() {
103
103
  export function getUserDomains() {
104
104
  return { ...loadedUserDomains };
105
105
  }
106
+ /* Transactional store for profiles.json. The store uses a compound type that carries both profiles and domain mappings, plus schema metadata managed by the
107
+ * file store framework. The parse function uses extractObjectMap() to validate sub-objects. The beforeWrite hook conditionally includes/excludes top-level
108
+ * keys based on emptiness, and always emits the framework's schema metadata.
109
+ */
110
+ /* Current schema version for profiles.json. Migrations are declared in profilesMigrations below; the framework runs them in order from the file's stored
111
+ * version up to this constant, stamps the new version after each, and records the audit trail in migrationsApplied.
112
+ *
113
+ * Version history:
114
+ * 1 - Original. Profile flag "noVideo" still present on user profiles.
115
+ * 2 - Renames profile flag "noVideo" -> "staticCapture" via normalizeLegacyProfileFlags.
116
+ */
117
+ const CURRENT_PROFILES_SCHEMA_VERSION = 2;
106
118
  /**
107
- * Parses raw profiles.json content into the compound data type.
119
+ * Parses raw profiles.json content into the compound data type. Extracts profiles, domains, and framework metadata (schemaVersion, migrationsApplied).
108
120
  * @param raw - The raw JSON string from the file.
109
121
  * @returns The parsed compound data.
110
122
  */
111
123
  function parseProfilesFile(raw) {
112
124
  const parsed = JSON.parse(raw);
125
+ // Files predating the schemaVersion field are treated as version 1. The migration runner upgrades them to the current version.
126
+ let schemaVersion = 1;
127
+ if ((typeof parsed["schemaVersion"] === "number") && Number.isFinite(parsed["schemaVersion"]) && (parsed["schemaVersion"] >= 1)) {
128
+ schemaVersion = Math.floor(parsed["schemaVersion"]);
129
+ }
130
+ const migrationsApplied = [];
131
+ if (Array.isArray(parsed["migrationsApplied"])) {
132
+ for (const entry of parsed["migrationsApplied"]) {
133
+ if (typeof entry === "string") {
134
+ migrationsApplied.push(entry);
135
+ }
136
+ }
137
+ }
113
138
  return {
114
- domains: extractObjectMap(parsed.domains),
115
- profiles: extractObjectMap(parsed.profiles)
139
+ domains: extractObjectMap(parsed["domains"]),
140
+ migrationsApplied,
141
+ profiles: extractObjectMap(parsed["profiles"]),
142
+ schemaVersion
116
143
  };
117
144
  }
118
145
  /**
119
- * Prepares profiles data for writing to disk. Conditionally includes top-level keys only when they have entries.
146
+ * Prepares profiles data for writing to disk. Always emits the framework's schema metadata; conditionally includes profile and domain top-level keys only
147
+ * when they have entries.
120
148
  * @param data - The compound profiles data.
121
149
  * @returns The serializable output.
122
150
  */
123
151
  function prepareProfilesForWrite(data) {
124
- const file = {};
152
+ const file = { schemaVersion: data.schemaVersion };
153
+ if (data.migrationsApplied.length > 0) {
154
+ file.migrationsApplied = data.migrationsApplied;
155
+ }
125
156
  if (Object.keys(data.domains).length > 0) {
126
157
  file.domains = data.domains;
127
158
  }
@@ -130,13 +161,36 @@ function prepareProfilesForWrite(data) {
130
161
  }
131
162
  return file;
132
163
  }
164
+ /* Declarative schema migrations. The file store framework runs these in order from the file's stored schemaVersion up to CURRENT_PROFILES_SCHEMA_VERSION,
165
+ * stamping the new version and recording the description in migrationsApplied after each application. Apply functions mutate the data in place.
166
+ */
167
+ const profilesMigrations = {
168
+ 2: {
169
+ apply: (data) => {
170
+ // Rename legacy noVideo flag to staticCapture across all stored profiles. Service pack import has its own normalization at the import boundary; this
171
+ // migration handles the persisted file.
172
+ normalizeLegacyProfileFlags(data.profiles);
173
+ },
174
+ description: "Rename legacy noVideo profile flag to staticCapture"
175
+ }
176
+ };
133
177
  // Transactional store instance for profiles.json.
134
178
  const profilesStore = createFileStore({
135
179
  beforeWrite: prepareProfilesForWrite,
136
- defaultValue: () => ({ domains: {}, profiles: {} }),
180
+ currentSchemaVersion: CURRENT_PROFILES_SCHEMA_VERSION,
181
+ defaultValue: () => ({
182
+ domains: {},
183
+ migrationsApplied: [],
184
+ profiles: {},
185
+ schemaVersion: CURRENT_PROFILES_SCHEMA_VERSION
186
+ }),
187
+ getSchemaVersion: (data) => data.schemaVersion,
137
188
  label: "profiles",
189
+ migrations: profilesMigrations,
138
190
  parse: parseProfilesFile,
139
- path: getProfilesFilePath
191
+ path: getProfilesFilePath,
192
+ recordMigration: (data, description) => { data.migrationsApplied.push(description); },
193
+ setSchemaVersion: (data, version) => { data.schemaVersion = version; }
140
194
  });
141
195
  /**
142
196
  * Reads the current profiles from disk without acquiring the serialization lock. Returns the parsed profiles and domains with parse status. Use this for
@@ -149,7 +203,8 @@ export async function readProfiles() {
149
203
  domains: result.data.domains,
150
204
  parseError: result.parseError,
151
205
  parseErrorMessage: result.parseErrorMessage,
152
- profiles: result.data.profiles
206
+ profiles: result.data.profiles,
207
+ recoveredFromBackup: result.recoveredFromBackup
153
208
  };
154
209
  }
155
210
  /**
@@ -206,26 +261,17 @@ export async function deleteUserDomain(domain) {
206
261
  * Initializes user profiles by loading them from the file. Called once at server startup before profile validation and channel loading.
207
262
  */
208
263
  export async function initializeUserProfiles() {
264
+ // Read the file. Schema migrations (noVideo -> staticCapture rename) run automatically inside the file store framework via the declarative
265
+ // profilesMigrations registry; ensureMigrated (called by the release boot coordinator at startup) persists any upgrades to disk before this function runs.
209
266
  const result = await readProfiles();
210
267
  loadedUserProfiles = result.profiles;
211
268
  loadedUserDomains = result.domains;
212
269
  userProfilesParseError = result.parseError;
213
270
  userProfilesParseErrorMessage = result.parseErrorMessage;
214
- // Normalize legacy profile field names at the persistence boundary. If any fields were renamed, persist the updated file so the migration only runs once.
215
- // The save is wrapped in its own try/catch so a write failure (disk full, permission error, parse error) is logged as a migration warning rather than
216
- // propagated to startup. The normalized in-memory profiles are used regardless...the migration is best-effort persistence.
217
- if (normalizeLegacyProfileFlags(loadedUserProfiles)) {
218
- try {
219
- await mutateProfiles((data) => {
220
- normalizeLegacyProfileFlags(data.profiles);
221
- });
222
- LOG.info("Migrated legacy profile flags in user profiles file.");
223
- }
224
- catch (saveError) {
225
- LOG.warn("Failed to persist migrated profile flags: %s. Migration will retry on next startup.", (saveError instanceof Error) ? saveError.message : String(saveError));
226
- }
271
+ if (result.recoveredFromBackup) {
272
+ LOG.info("User profiles were recovered from backup after a corrupt main file.");
227
273
  }
228
- // Check for non-printable characters in loaded profile and domain string values. These warnings are informational — loaded data is not modified.
274
+ // Check for non-printable characters in loaded profile and domain string values. These warnings are informational - loaded data is not modified.
229
275
  for (const [profileKey, profile] of Object.entries(loadedUserProfiles)) {
230
276
  for (const [field, value] of Object.entries(profile)) {
231
277
  if ((typeof value === "string") && containsNonPrintable(value)) {
@@ -243,7 +289,7 @@ export async function initializeUserProfiles() {
243
289
  const profileCount = Object.keys(loadedUserProfiles).length;
244
290
  const domainCount = Object.keys(loadedUserDomains).length;
245
291
  if ((profileCount > 0) || (domainCount > 0)) {
246
- LOG.info("Loaded %d user profile(s) and %d domain mapping(s).", profileCount, domainCount);
292
+ LOG.info("Loaded %d user profiles and %d domain mappings.", profileCount, domainCount);
247
293
  }
248
294
  }
249
295
  // Validation Functions.
@@ -284,7 +330,7 @@ export function validateProfileKey(key, isNew) {
284
330
  */
285
331
  export function validateProfile(key, profile) {
286
332
  const errors = [];
287
- // The extends field is required for user profiles — they must build on a built-in profile.
333
+ // The extends field is required for user profiles - they must build on a built-in profile.
288
334
  if (!profile.extends) {
289
335
  errors.push("Profile '" + key + "': extends is required. User profiles must extend a built-in profile.");
290
336
  return errors;
@@ -344,7 +390,7 @@ export function validateDomain(domain, config, availableProfiles) {
344
390
  // Reject domains that collide with built-in domain mappings. User domains that shadow built-in domains cause the built-in service to disappear from the system,
345
391
  // affecting all channels on that domain. Users should set the profile field on individual channels to use a custom profile on a built-in domain instead.
346
392
  const conciseDomain = extractDomain("https://" + domain);
347
- const collidesWithBuiltin = DOMAIN_CONFIG[domain] ?? DOMAIN_CONFIG[conciseDomain];
393
+ const collidesWithBuiltin = (DOMAIN_CONFIG[domain]) ?? (DOMAIN_CONFIG[conciseDomain]);
348
394
  if (collidesWithBuiltin) {
349
395
  const builtinService = collidesWithBuiltin.service ?? conciseDomain;
350
396
  errors.push("Domain '" + domain + "' is already mapped to built-in service '" + builtinService +
@@ -1 +1 @@
1
- {"version":3,"file":"userProfiles.js","sourceRoot":"","sources":["../../src/config/userProfiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"userProfiles.js","sourceRoot":"","sources":["../../src/config/userProfiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhG,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;GASG;AAEH,sKAAsK;AACtK,4GAA4G;AAC5G,MAAM,oBAAoB,GAA2B,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AAElF,8IAA8I;AAC9I,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,sBAAsB;IACnJ,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB;CACzG,CAAC,CAAC;AAEH,gJAAgJ;AAChJ,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAE,MAAM,EAAE,cAAc,EAAE,WAAW,CAAE,CAAC,CAAC;AAE5E,kGAAkG;AAClG,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,CAAE,CAAC,CAAC;AAEvI,wEAAwE;AACxE,MAAM,mCAAmC,GAAG,IAAI,GAAG,CAAC,CAAE,cAAc,EAAE,WAAW,CAAE,CAAC,CAAC;AAGrF;;;;;GAKG;AACH,SAAS,gBAAgB,CAAI,GAAY;IAEvC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAEtE,KAAI,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAE3E,IAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE5E,MAAM,CAAC,GAAG,CAAC,GAAG,KAAU,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAqC;IAE/E,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAI,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAE7C,KAAI,MAAM,CAAE,OAAO,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAEvE,IAAG,OAAO,IAAI,OAAO,EAAE,CAAC;gBAEtB,0JAA0J;gBAC1J,IAAG,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;oBAExB,OAAmC,CAAC,OAAO,CAAC,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;gBAChG,CAAC;gBAED,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACzC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uGAAuG;AACvG,IAAI,kBAAkB,GAAgC,EAAE,CAAC;AACzD,IAAI,iBAAiB,GAAiC,EAAE,CAAC;AACzD,IAAI,sBAAsB,GAAG,KAAK,CAAC;AACnC,IAAI,6BAAiD,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IAEnC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B;IAE1C,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAE7B,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAE5B,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAa1C;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,GAAW;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAE1D,+HAA+H;IAC/H,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,IAAG,CAAC,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAE/H,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,IAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;QAE9C,KAAI,MAAM,KAAK,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAE/C,IAAG,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAE7B,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QAEL,OAAO,EAAE,gBAAgB,CAAe,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,iBAAiB;QACjB,QAAQ,EAAE,gBAAgB,CAAc,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3D,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,IAAsB;IAErD,MAAM,IAAI,GAA+E,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAE/H,IAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAErC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;IAClD,CAAC;IAED,IAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAExC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAEzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,kBAAkB,GAAgD;IAEtE,CAAC,EAAE;QAED,KAAK,EAAE,CAAC,IAAsB,EAAQ,EAAE;YAEtC,qJAAqJ;YACrJ,wCAAwC;YACxC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,WAAW,EAAE,qDAAqD;KACnE;CACF,CAAC;AAEF,kDAAkD;AAClD,MAAM,aAAa,GAAG,eAAe,CAAmB;IAEtD,WAAW,EAAE,uBAAuB;IACpC,oBAAoB,EAAE,+BAA+B;IACrD,YAAY,EAAE,GAAqB,EAAE,CAAC,CAAC;QAErC,OAAO,EAAE,EAAE;QACX,iBAAiB,EAAE,EAAE;QACrB,QAAQ,EAAE,EAAE;QACZ,aAAa,EAAE,+BAA+B;KAC/C,CAAC;IACF,gBAAgB,EAAE,CAAC,IAAsB,EAAU,EAAE,CAAC,IAAI,CAAC,aAAa;IACxE,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,kBAAkB;IAC9B,KAAK,EAAE,iBAAiB;IACxB,IAAI,EAAE,mBAAmB;IACzB,eAAe,EAAE,CAAC,IAAsB,EAAE,WAAmB,EAAQ,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrH,gBAAgB,EAAE,CAAC,IAAsB,EAAE,OAAe,EAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;CACvG,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAEhC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAE1C,OAAO;QAEL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC9B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;KAChD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAoC;IAEvE,IAAI,SAAuC,CAAC;IAE5C,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,IAAsB,EAAE,EAAE;QAEpD,EAAE,CAAC,IAAI,CAAC,CAAC;QACT,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,IAAG,SAAS,EAAE,CAAC;QAEb,kBAAkB,GAAG,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC/C,iBAAiB,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QAC7C,sBAAsB,GAAG,KAAK,CAAC;QAC/B,6BAA6B,GAAG,SAAS,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAEjD,MAAM,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;QAE5B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAE3C,0DAA0D;QAC1D,KAAI,MAAM,CAAE,MAAM,EAAE,MAAM,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAE7D,IAAG,MAAM,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBAE1B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IAEnD,MAAM,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;QAE5B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAE1C,2IAA2I;IAC3I,2JAA2J;IAC3J,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IAEpC,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC;IAC3C,6BAA6B,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEzD,IAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAE9B,GAAG,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IAClF,CAAC;IAED,iJAAiJ;IACjJ,KAAI,MAAM,CAAE,UAAU,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAExE,KAAI,MAAM,CAAE,KAAK,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAEtD,IAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE9D,GAAG,CAAC,IAAI,CAAC,kGAAkG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAI,MAAM,CAAE,MAAM,EAAE,MAAM,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAElE,KAAI,MAAM,CAAE,KAAK,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAErD,IAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE9D,GAAG,CAAC,IAAI,CAAC,wGAAwG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACpI,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;IAE1D,IAAG,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAE3C,GAAG,CAAC,IAAI,CAAC,iDAAiD,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,wBAAwB;AAExB;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAc;IAE5D,IAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAE/B,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAED,8JAA8J;IAC9J,mCAAmC;IACnC,IAAG,CAAC,uCAAuC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEtD,OAAO,8GAA8G,CAAC;IACxH,CAAC;IAED,IAAG,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAEnB,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAED,sCAAsC;IACtC,IAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAExB,OAAO,eAAe,GAAG,GAAG,GAAG,+DAA+D,CAAC;IACjG,CAAC;IAED,kDAAkD;IAClD,IAAG,KAAK,IAAI,CAAC,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC;QAExC,OAAO,8CAA8C,CAAC;IACxD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,OAAoB;IAE/D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,2FAA2F;IAC3F,IAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEpB,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,uEAAuE,CAAC,CAAC;QAEzG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+JAA+J;IAC/J,4FAA4F;IAC5F,IAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,uDAAuD,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpH,CAAC;SAAM,IAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAE7C,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,0DAA0D;YACnH,uDAAuD,CAAC,CAAC;IAC7D,CAAC;IAED,uDAAuD;IACvD,IAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEnD,IAAG,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAEjC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,8CAA8C,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;QACpG,CAAC;aAAM,IAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAE5C,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,eAAe,GAAG,QAAQ,GAAG,wEAAwE;gBACnI,6CAA6C,CAAC,CAAC;QACnD,CAAC;QAED,uEAAuE;QACvE,IAAG,mCAAmC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;YAEhG,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,+CAA+C,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,iKAAiK;IACjK,iFAAiF;IACjF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,CAAE,CAAC,CAAC;IAEvG,KAAI,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAExC,IAAG,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAEhE,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,wBAAwB,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAoB,EAAE,iBAA8B;IAEjG,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,2CAA2C;IAC3C,IAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAErC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAEnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6FAA6F;IAC7F,IAAG,CAAC,mGAAmG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAErH,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,6BAA6B,CAAC,CAAC;IACnE,CAAC;IAED,gKAAgK;IAChK,yJAAyJ;IACzJ,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;IACzD,MAAM,mBAAmB,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAEtF,IAAG,mBAAmB,EAAE,CAAC;QAEvB,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,IAAI,aAAa,CAAC;QAEpE,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,2CAA2C,GAAG,cAAc;YAC5F,qFAAqF,CAAC,CAAC;IAC3F,CAAC;IAED,2DAA2D;IAC3D,IAAG,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAEtI,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,gDAAgD,CAAC,CAAC;IACtF,CAAC;IAED,2DAA2D;IAC3D,IAAG,MAAM,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,sCAAsC,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpG,CAAC;IAED,0CAA0C;IAC1C,IAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAE9G,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,wCAAwC,CAAC,CAAC;IAC9E,CAAC;IAED,6CAA6C;IAC7C,IAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAEvH,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,2CAA2C,CAAC,CAAC;IACjF,CAAC;IAED,wDAAwD;IACxD,IAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAEjC,IAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAE5E,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,yCAAyC,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YAEN,IAAI,CAAC;gBAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAExC,IAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;oBAEnE,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,8CAA8C,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBAEP,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,iCAAiC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,IAAG,MAAM,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAE9C,IAAG,CAAC,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC;YACrG,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC,EAAE,CAAC;YAEtC,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,qDAAqD,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAG,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAErC,IAAG,CAAC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7H,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC;YAE7B,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,6CAA6C,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAa;IAEpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAgC,EAAE,CAAC;IACtD,MAAM,YAAY,GAAiC,EAAE,CAAC;IAEtD,IAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAExE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,kEAAkE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnI,CAAC;IAED,MAAM,MAAM,GAAG,IAAwB,CAAC;IAExC,qBAAqB;IACrB,IAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAEnB,IAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAE3E,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YAEN,KAAI,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAE9D,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAEhD,IAAG,QAAQ,EAAE,CAAC;oBAEZ,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC;oBAElD,SAAS;gBACX,CAAC;gBAED,4BAA4B;gBAC5B,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAEpD,IAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAE5B,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;oBAE9B,SAAS;gBACX,CAAC;gBAED,aAAa,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,4JAA4J;IAC5J,YAAY;IACZ,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;QAChC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;KACnC,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAElB,IAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAEzE,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YAEN,KAAI,MAAM,CAAE,MAAM,EAAE,MAAM,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAE/D,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;gBAEvE,IAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAE3B,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;oBAE7B,SAAS;gBACX,CAAC;gBAED,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAChG,CAAC"}
@@ -2,7 +2,7 @@
2
2
  *
3
3
  * channelMap.ts: Channel key to channel number mapping for HDHomeRun emulation.
4
4
  */
5
- import { getAllChannels } from "../config/userChannels.js";
5
+ import { getAllChannels, getEffectiveHdhrEnabled } from "../config/userChannels.js";
6
6
  /* HDHomeRun devices use numeric channel numbers (GuideNumber) for each channel. Plex requires these for EPG (electronic program guide) matching. PrismCast uses
7
7
  * string keys (e.g., "cnn", "nbc") for channels, so we need a mapping layer.
8
8
  *
@@ -27,7 +27,7 @@ export function buildChannelMap() {
27
27
  const explicitNumbers = new Set();
28
28
  for (const [key, channel] of Object.entries(channels)) {
29
29
  // Skip channels excluded from the HDHR lineup.
30
- if (channel.hdhrEnabled === false) {
30
+ if (!getEffectiveHdhrEnabled(channel)) {
31
31
  continue;
32
32
  }
33
33
  if ((channel.channelNumber !== undefined) && (channel.channelNumber > 0)) {
@@ -40,16 +40,13 @@ export function buildChannelMap() {
40
40
  });
41
41
  }
42
42
  }
43
- // Auto-assign numbers to channels without explicit channelNumber. Sort keys alphabetically for deterministic assignment.
44
- const unassignedKeys = Object.keys(channels)
45
- .filter((key) => {
46
- const channel = channels[key];
47
- return (channel.hdhrEnabled !== false) && ((channel.channelNumber === undefined) || (channel.channelNumber <= 0));
48
- })
49
- .sort();
43
+ // Auto-assign numbers to channels without explicit channelNumber. Iterate entries (not just keys) so the channel reference stays narrowed; sort by key
44
+ // alphabetically for deterministic assignment.
45
+ const unassignedEntries = Object.entries(channels)
46
+ .filter(([, channel]) => getEffectiveHdhrEnabled(channel) && ((channel.channelNumber === undefined) || (channel.channelNumber <= 0)))
47
+ .sort(([a], [b]) => a.localeCompare(b));
50
48
  let nextNumber = AUTO_ASSIGN_START;
51
- for (const key of unassignedKeys) {
52
- const channel = channels[key];
49
+ for (const [key, channel] of unassignedEntries) {
53
50
  // Skip numbers already claimed by explicit assignments.
54
51
  while (explicitNumbers.has(nextNumber)) {
55
52
  nextNumber++;
@@ -1 +1 @@
1
- {"version":3,"file":"channelMap.js","sourceRoot":"","sources":["../../src/hdhr/channelMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAoB/B;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAE7B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,+EAA+E;IAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAI,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEvD,+CAA+C;QAC/C,IAAG,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAEjC,SAAS;QACX,CAAC;QAED,IAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;YAExE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBAEX,GAAG;gBACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;gBACzB,MAAM,EAAE,OAAO,CAAC,aAAa;gBAC7B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yHAAyH;IACzH,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,UAAU,GAAG,iBAAiB,CAAC;IAEnC,KAAI,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,wDAAwD;QACxD,OAAM,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAEtC,UAAU,EAAE,CAAC;QACf,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YAEX,GAAG;YACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;YACzB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IAEzD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IAE1D,OAAO,KAAK,EAAE,GAAG,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"channelMap.js","sourceRoot":"","sources":["../../src/hdhr/channelMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpF;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAoB/B;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAE7B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,+EAA+E;IAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAI,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEvD,+CAA+C;QAC/C,IAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YAErC,SAAS;QACX,CAAC;QAED,IAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;YAExE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBAEX,GAAG;gBACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;gBACzB,MAAM,EAAE,OAAO,CAAC,aAAa;gBAC7B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uJAAuJ;IACvJ,+CAA+C;IAC/C,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAE,AAAD,EAAG,OAAO,CAAE,EAAE,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;SACtI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,IAAI,UAAU,GAAG,iBAAiB,CAAC;IAEnC,KAAI,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,iBAAiB,EAAE,CAAC;QAEhD,wDAAwD;QACxD,OAAM,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAEtC,UAAU,EAAE,CAAC;QACf,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YAEX,GAAG;YACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;YACzB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IAEzD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IAE1D,OAAO,KAAK,EAAE,GAAG,CAAC;AACpB,CAAC"}
@@ -25,13 +25,14 @@ const DEVICEID_LOOKUP = [
25
25
  */
26
26
  function computeChecksum(nibbles) {
27
27
  let checksum = 0;
28
- for (let i = 0; i < 8; i++) {
29
- // Even positions use the lookup table, odd positions use the raw nibble value.
28
+ for (const [i, nibble] of nibbles.entries()) {
29
+ // Even positions use the lookup table, odd positions use the raw nibble value. Both lookups stay within-bounds by construction (nibble in [0, 15] and the
30
+ // lookup table has 16 entries); ?? 0 satisfies TypeScript without changing behavior.
30
31
  if ((i % 2) === 0) {
31
- checksum ^= DEVICEID_LOOKUP[nibbles[i]];
32
+ checksum ^= DEVICEID_LOOKUP[nibble] ?? 0;
32
33
  }
33
34
  else {
34
- checksum ^= nibbles[i];
35
+ checksum ^= nibble;
35
36
  }
36
37
  }
37
38
  return checksum;
@@ -60,12 +61,12 @@ export function generateDeviceId() {
60
61
  // using computeChecksum(), because padding with zeros would include LOOKUP[0] for position 6 and skew the result.
61
62
  const nibbles = Array.from(prefix, (ch) => parseInt(ch, 16));
62
63
  let partialChecksum = 0;
63
- for (let i = 0; i < 6; i++) {
64
+ for (const [i, nibble] of nibbles.entries()) {
64
65
  if ((i % 2) === 0) {
65
- partialChecksum ^= DEVICEID_LOOKUP[nibbles[i]];
66
+ partialChecksum ^= DEVICEID_LOOKUP[nibble] ?? 0;
66
67
  }
67
68
  else {
68
- partialChecksum ^= nibbles[i];
69
+ partialChecksum ^= nibble;
69
70
  }
70
71
  }
71
72
  // Find the final byte (2 nibbles) that makes the total checksum zero. Position 6 is even (lookup table), position 7 is odd (raw). We try all 256 values. A
@@ -73,12 +74,12 @@ export function generateDeviceId() {
73
74
  for (let finalByte = 0; finalByte < 256; finalByte++) {
74
75
  const highNibble = (finalByte >> 4) & 0xF;
75
76
  const lowNibble = finalByte & 0xF;
76
- const finalChecksum = partialChecksum ^ DEVICEID_LOOKUP[highNibble] ^ lowNibble;
77
+ const finalChecksum = partialChecksum ^ (DEVICEID_LOOKUP[highNibble] ?? 0) ^ lowNibble;
77
78
  if (finalChecksum === 0) {
78
79
  return prefix + finalByte.toString(16).padStart(2, "0");
79
80
  }
80
81
  }
81
- // This is unreachable — a solution always exists within the 256 candidates. Fall back to a known-valid ID as a safety net.
82
+ // This is unreachable - a solution always exists within the 256 candidates. Fall back to a known-valid ID as a safety net.
82
83
  return "1000000f";
83
84
  }
84
85
  //# sourceMappingURL=deviceId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deviceId.js","sourceRoot":"","sources":["../../src/hdhr/deviceId.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deviceId.js","sourceRoot":"","sources":["../../src/hdhr/deviceId.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import { getPackageVersion } from "../utils/index.js";
11
11
  function resolveHostname(req) {
12
12
  // Check X-Forwarded-Host first (reverse proxy scenarios), then fall back to the Host header.
13
13
  const forwardedHost = req.get("x-forwarded-host");
14
- const hostHeader = forwardedHost ? forwardedHost.split(",")[0].trim() : req.get("host");
14
+ const hostHeader = forwardedHost ? (forwardedHost.split(",")[0] ?? "").trim() : req.get("host");
15
15
  if (hostHeader) {
16
16
  // Strip port from host header if present (e.g., "192.168.1.100:5004" -> "192.168.1.100").
17
17
  const bracketIndex = hostHeader.indexOf("]");
@@ -118,13 +118,12 @@ export function setupHdhrEndpoints(app) {
118
118
  const tunerCount = CONFIG.streaming.maxConcurrentStreams;
119
119
  const tuners = [];
120
120
  // Build active tuner entries from currently running streams.
121
- for (let i = 0; i < streams.length; i++) {
122
- const stream = streams[i];
121
+ for (const [i, stream] of streams.entries()) {
123
122
  const channelEntry = channelByKey.get(stream.info.storeKey);
124
123
  // Build the tuner entry. Active tuners include channel info and signal stats. Signal values are hardcoded at 100 since PrismCast streams are network-based and
125
- // either working or not — there is no analog signal quality to report. Channel info is merged conditionally: prefer the channel map for VctNumber (numeric
124
+ // either working or not - there is no analog signal quality to report. Channel info is merged conditionally: prefer the channel map for VctNumber (numeric
126
125
  // channel) and VctName (display name), fall back to stream.channelName for VctName if the channel was removed from the map after the stream started. Client
127
- // address is normalized to strip IPv6-mapped IPv4 prefixes (::ffff:192.168.1.1 → 192.168.1.1).
126
+ // address is normalized to strip IPv6-mapped IPv4 prefixes (::ffff:192.168.1.1 -> 192.168.1.1).
128
127
  const tuner = {
129
128
  Frequency: 0,
130
129
  Resource: "tuner" + String(i),
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/hdhr/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/hdhr/discover.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,11 @@ import { formatError } from "../utils/errors.js";
10
10
  import { mutateConfig } from "../config/userConfig.js";
11
11
  import { setupHdhrEndpoints } from "./discover.js";
12
12
  /* When HDHomeRun emulation is enabled, PrismCast runs a separate Express server that responds to HDHomeRun API requests from Plex. This server is intentionally
13
- * lightweight — it only serves device discovery and lineup metadata. All actual video streaming flows through PrismCast's main HTTP server via the HLS URLs in
13
+ * lightweight - it only serves device discovery and lineup metadata. All actual video streaming flows through PrismCast's main HTTP server via the HLS URLs in
14
14
  * the lineup response.
15
15
  *
16
16
  * The HDHR server runs on a configurable port (default 5004) independently of the main server. If the port is unavailable, the HDHR feature is disabled
17
- * gracefully without affecting the main server. Plex does not auto-detect emulated tuners — users must manually enter the address (IP:port) in Plex's DVR setup.
17
+ * gracefully without affecting the main server. Plex does not auto-detect emulated tuners - users must manually enter the address (IP:port) in Plex's DVR setup.
18
18
  */
19
19
  // The HDHR HTTP server instance, used for graceful shutdown.
20
20
  let hdhrServer = null;
@@ -51,14 +51,10 @@ export async function startHdhrServer() {
51
51
  setupHdhrEndpoints(app);
52
52
  // Start listening on the configured port. Handle EADDRINUSE gracefully.
53
53
  try {
54
- hdhrServer = await new Promise((resolve, reject) => {
55
- const server = app.listen(CONFIG.hdhr.port, CONFIG.server.host, () => {
56
- resolve(server);
57
- });
58
- server.on("error", (error) => {
59
- reject(error);
60
- });
61
- });
54
+ const { promise, resolve, reject } = Promise.withResolvers();
55
+ const server = app.listen(CONFIG.hdhr.port, CONFIG.server.host, () => { resolve(server); });
56
+ server.on("error", (error) => { reject(error); });
57
+ hdhrServer = await promise;
62
58
  LOG.info("HDHomeRun emulation is now listening on %s:%s (DeviceID: %s).", CONFIG.server.host, CONFIG.hdhr.port, CONFIG.hdhr.deviceId.toUpperCase());
63
59
  }
64
60
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hdhr/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hdhr/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;GAMG;AAEH,6DAA6D;AAC7D,IAAI,UAAU,GAAqB,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IAEnC,IAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAExB,OAAO;IACT,CAAC;IAED,2JAA2J;IAC3J,0EAA0E;IAC1E,IAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEpE,IAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAExB,GAAG,CAAC,IAAI,CAAC,wEAAwE,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QAE1C,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAElF,2EAA2E;QAC3E,IAAI,CAAC;YAEH,MAAM,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;gBAE5B,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YAEd,GAAG,CAAC,IAAI,CAAC,uFAAuF,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACxH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAE7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,wEAAwE;IACxE,IAAI,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAU,CAAC;QACrE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,UAAU,GAAG,MAAM,OAAO,CAAC;QAE3B,GAAG,CAAC,IAAI,CAAC,+DAA+D,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACtJ,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,MAAM,UAAU,GAAG,KAA8B,CAAC;QAElD,IAAG,UAAU,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAEpC,GAAG,CAAC,IAAI,CAAC,oHAAoH,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnJ,CAAC;aAAM,CAAC;YAEN,GAAG,CAAC,IAAI,CAAC,wEAAwE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACzG,CAAC;QAED,OAAO;IACT,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAE5B,IAAG,UAAU,EAAE,CAAC;QAEd,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -6,10 +6,10 @@ import { CONFIG_METADATA, DEFAULTS, getNestedValue } from "./config/userConfig.j
6
6
  import { LOG, formatError, getPackageVersion, initDebugFilter, setDebugLogging } from "./utils/index.js";
7
7
  import { canCleanupChrome, isGracefulShutdown, killStaleChrome } from "./browser/index.js";
8
8
  import { clearServerPid, startServer } from "./app.js";
9
+ import { getDebugEnv, initializeDataDir } from "./config/paths.js";
9
10
  import { flushLogBufferSync } from "./utils/fileLogger.js";
10
11
  import { handleServiceCommand } from "./service/index.js";
11
12
  import { handleUpgradeCommand } from "./upgrade/index.js";
12
- import { initializeDataDir } from "./config/paths.js";
13
13
  import path from "node:path";
14
14
  /* These handlers catch unhandled promise rejections and uncaught exceptions to prevent the process from crashing. For a livestreaming server, process stability is
15
15
  * critical - a single unhandled error should not terminate all active streams. The handlers log the error and allow the process to continue. Individual stream
@@ -99,7 +99,7 @@ function printEnvironmentVariables() {
99
99
  console.log("All settings can also be configured via the web UI at /config or config.json.");
100
100
  console.log("Priority: CLI flags > environment variables > config.json > defaults.");
101
101
  for (const category of categoryOrder) {
102
- const settings = CONFIG_METADATA[category.key];
102
+ const settings = CONFIG_METADATA[category.key] ?? [];
103
103
  // Filter to settings that have an environment variable.
104
104
  const envSettings = settings.filter((s) => s.envVar !== null);
105
105
  if (envSettings.length === 0) {
@@ -198,21 +198,21 @@ function parseArgs() {
198
198
  process.exit(0);
199
199
  }
200
200
  if ((arg === "-p") || (arg === "--port")) {
201
- const parsed = parseInt(args[++i]);
201
+ const parsed = parseInt(args[++i] ?? "");
202
202
  if (!isNaN(parsed)) {
203
203
  port = parsed;
204
204
  }
205
205
  }
206
206
  if (arg === "--data-dir") {
207
- dataDir = args[++i];
207
+ dataDir = args[++i] ?? "";
208
208
  requireAbsolutePath("--data-dir", dataDir);
209
209
  }
210
210
  if (arg === "--chrome-data-dir") {
211
- chromeDataDir = args[++i];
211
+ chromeDataDir = args[++i] ?? "";
212
212
  requireAbsolutePath("--chrome-data-dir", chromeDataDir);
213
213
  }
214
214
  if (arg === "--log-file") {
215
- logFile = args[++i];
215
+ logFile = args[++i] ?? "";
216
216
  requireAbsolutePath("--log-file", logFile);
217
217
  }
218
218
  if ((arg === "-v") || (arg === "--version")) {
@@ -267,26 +267,26 @@ else {
267
267
  }
268
268
  // Enable debug logging before starting the server so debug messages during startup are captured. The PRISMCAST_DEBUG environment variable takes precedence over
269
269
  // the --debug CLI flag, allowing fine-grained category selection.
270
- const debugEnv = process.env.PRISMCAST_DEBUG;
270
+ const debugEnv = getDebugEnv();
271
271
  if (debugEnv) {
272
272
  initDebugFilter(debugEnv);
273
273
  }
274
274
  else if (parsedArgs.debugLogging) {
275
275
  setDebugLogging(true);
276
276
  }
277
- /* Safety net for server exit paths. When the process exits — whether via process.exit(1) from a fatal startup error, an unrecoverable exception, or any other
278
- * termination — we ensure Chrome processes are cleaned up and buffered log entries are flushed to disk. Without this, fatal exits during startup (e.g., capture
277
+ /* Safety net for server exit paths. When the process exits - whether via process.exit(1) from a fatal startup error, an unrecoverable exception, or any other
278
+ * termination - we ensure Chrome processes are cleaned up and buffered log entries are flushed to disk. Without this, fatal exits during startup (e.g., capture
279
279
  * probe timeout) silently orphan Chrome processes and lose diagnostic messages that are still in the file logger's write buffer.
280
280
  *
281
281
  * The 'exit' event runs synchronously, so only synchronous operations are safe here. killStaleChrome() uses process.kill() for signaling and Atomics.wait()
282
282
  * for polling, and flushLogBufferSync() writes directly to the filesystem. The graceful shutdown path (SIGTERM/SIGINT) handles cleanup via async closeBrowser()
283
- * and shutdownFileLogger() — this handler is a fallback for paths that bypass graceful shutdown.
283
+ * and shutdownFileLogger() - this handler is a fallback for paths that bypass graceful shutdown.
284
284
  *
285
- * This is registered only in the server branch — not for service subcommands like `prismcast service status`. Running killStaleChrome() from a service
285
+ * This is registered only in the server branch - not for service subcommands like `prismcast service status`. Running killStaleChrome() from a service
286
286
  * subcommand would kill Chrome belonging to the running PrismCast server instance.
287
287
  */
288
288
  process.on("exit", () => {
289
- // Flush logs first — this is the critical operation. The error messages from a failed startup are sitting in the write buffer and must reach disk before the
289
+ // Flush logs first - this is the critical operation. The error messages from a failed startup are sitting in the write buffer and must reach disk before the
290
290
  // process terminates. Chrome will die when its pipes break since the parent is exiting; killing it explicitly is belt-and-suspenders.
291
291
  flushLogBufferSync();
292
292
  try {