@wasmsoft/fantastic 1.0.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 (456) hide show
  1. package/README.md +65 -0
  2. package/bin/run.js +27 -0
  3. package/bin/supervisor.js +65 -0
  4. package/dist/acquire/central-url.d.ts +9 -0
  5. package/dist/acquire/central-url.d.ts.map +1 -0
  6. package/dist/acquire/central-url.js +74 -0
  7. package/dist/acquire/central-url.js.map +1 -0
  8. package/dist/acquire/code.d.ts +21 -0
  9. package/dist/acquire/code.d.ts.map +1 -0
  10. package/dist/acquire/code.js +66 -0
  11. package/dist/acquire/code.js.map +1 -0
  12. package/dist/acquire/compatibility.d.ts +18 -0
  13. package/dist/acquire/compatibility.d.ts.map +1 -0
  14. package/dist/acquire/compatibility.js +36 -0
  15. package/dist/acquire/compatibility.js.map +1 -0
  16. package/dist/acquire/fetch.d.ts +26 -0
  17. package/dist/acquire/fetch.d.ts.map +1 -0
  18. package/dist/acquire/fetch.js +72 -0
  19. package/dist/acquire/fetch.js.map +1 -0
  20. package/dist/acquire/latest.d.ts +24 -0
  21. package/dist/acquire/latest.d.ts.map +1 -0
  22. package/dist/acquire/latest.js +95 -0
  23. package/dist/acquire/latest.js.map +1 -0
  24. package/dist/backup/archive.d.ts +26 -0
  25. package/dist/backup/archive.d.ts.map +1 -0
  26. package/dist/backup/archive.js +123 -0
  27. package/dist/backup/archive.js.map +1 -0
  28. package/dist/backup/restore.d.ts +46 -0
  29. package/dist/backup/restore.d.ts.map +1 -0
  30. package/dist/backup/restore.js +164 -0
  31. package/dist/backup/restore.js.map +1 -0
  32. package/dist/base-command.d.ts +54 -0
  33. package/dist/base-command.d.ts.map +1 -0
  34. package/dist/base-command.js +120 -0
  35. package/dist/base-command.js.map +1 -0
  36. package/dist/bundle-format/index.d.ts +6 -0
  37. package/dist/bundle-format/index.d.ts.map +1 -0
  38. package/dist/bundle-format/index.js +36 -0
  39. package/dist/bundle-format/index.js.map +1 -0
  40. package/dist/commands/activate.d.ts +15 -0
  41. package/dist/commands/activate.d.ts.map +1 -0
  42. package/dist/commands/activate.js +139 -0
  43. package/dist/commands/activate.js.map +1 -0
  44. package/dist/commands/backup.d.ts +11 -0
  45. package/dist/commands/backup.d.ts.map +1 -0
  46. package/dist/commands/backup.js +75 -0
  47. package/dist/commands/backup.js.map +1 -0
  48. package/dist/commands/config/get.d.ts +10 -0
  49. package/dist/commands/config/get.d.ts.map +1 -0
  50. package/dist/commands/config/get.js +33 -0
  51. package/dist/commands/config/get.js.map +1 -0
  52. package/dist/commands/config/list.d.ts +7 -0
  53. package/dist/commands/config/list.d.ts.map +1 -0
  54. package/dist/commands/config/list.js +43 -0
  55. package/dist/commands/config/list.js.map +1 -0
  56. package/dist/commands/config/set.d.ts +11 -0
  57. package/dist/commands/config/set.d.ts.map +1 -0
  58. package/dist/commands/config/set.js +56 -0
  59. package/dist/commands/config/set.js.map +1 -0
  60. package/dist/commands/db/migrate.d.ts +10 -0
  61. package/dist/commands/db/migrate.d.ts.map +1 -0
  62. package/dist/commands/db/migrate.js +67 -0
  63. package/dist/commands/db/migrate.js.map +1 -0
  64. package/dist/commands/dev.d.ts +19 -0
  65. package/dist/commands/dev.d.ts.map +1 -0
  66. package/dist/commands/dev.js +149 -0
  67. package/dist/commands/dev.js.map +1 -0
  68. package/dist/commands/doctor.d.ts +11 -0
  69. package/dist/commands/doctor.d.ts.map +1 -0
  70. package/dist/commands/doctor.js +75 -0
  71. package/dist/commands/doctor.js.map +1 -0
  72. package/dist/commands/health.d.ts +12 -0
  73. package/dist/commands/health.d.ts.map +1 -0
  74. package/dist/commands/health.js +109 -0
  75. package/dist/commands/health.js.map +1 -0
  76. package/dist/commands/install.d.ts +60 -0
  77. package/dist/commands/install.d.ts.map +1 -0
  78. package/dist/commands/install.js +486 -0
  79. package/dist/commands/install.js.map +1 -0
  80. package/dist/commands/iptv/snapshot.d.ts +10 -0
  81. package/dist/commands/iptv/snapshot.d.ts.map +1 -0
  82. package/dist/commands/iptv/snapshot.js +55 -0
  83. package/dist/commands/iptv/snapshot.js.map +1 -0
  84. package/dist/commands/library/drives.d.ts +7 -0
  85. package/dist/commands/library/drives.d.ts.map +1 -0
  86. package/dist/commands/library/drives.js +71 -0
  87. package/dist/commands/library/drives.js.map +1 -0
  88. package/dist/commands/library/relink.d.ts +10 -0
  89. package/dist/commands/library/relink.d.ts.map +1 -0
  90. package/dist/commands/library/relink.js +72 -0
  91. package/dist/commands/library/relink.js.map +1 -0
  92. package/dist/commands/library/scan.d.ts +16 -0
  93. package/dist/commands/library/scan.d.ts.map +1 -0
  94. package/dist/commands/library/scan.js +87 -0
  95. package/dist/commands/library/scan.js.map +1 -0
  96. package/dist/commands/library/sections.d.ts +7 -0
  97. package/dist/commands/library/sections.d.ts.map +1 -0
  98. package/dist/commands/library/sections.js +33 -0
  99. package/dist/commands/library/sections.js.map +1 -0
  100. package/dist/commands/library/status.d.ts +7 -0
  101. package/dist/commands/library/status.d.ts.map +1 -0
  102. package/dist/commands/library/status.js +37 -0
  103. package/dist/commands/library/status.js.map +1 -0
  104. package/dist/commands/list.d.ts +7 -0
  105. package/dist/commands/list.d.ts.map +1 -0
  106. package/dist/commands/list.js +73 -0
  107. package/dist/commands/list.js.map +1 -0
  108. package/dist/commands/live/channels.d.ts +10 -0
  109. package/dist/commands/live/channels.d.ts.map +1 -0
  110. package/dist/commands/live/channels.js +55 -0
  111. package/dist/commands/live/channels.js.map +1 -0
  112. package/dist/commands/live/test.d.ts +15 -0
  113. package/dist/commands/live/test.d.ts.map +1 -0
  114. package/dist/commands/live/test.js +116 -0
  115. package/dist/commands/live/test.js.map +1 -0
  116. package/dist/commands/logs.d.ts +16 -0
  117. package/dist/commands/logs.d.ts.map +1 -0
  118. package/dist/commands/logs.js +77 -0
  119. package/dist/commands/logs.js.map +1 -0
  120. package/dist/commands/migrate-cli.d.ts +11 -0
  121. package/dist/commands/migrate-cli.d.ts.map +1 -0
  122. package/dist/commands/migrate-cli.js +116 -0
  123. package/dist/commands/migrate-cli.js.map +1 -0
  124. package/dist/commands/owner/reset.d.ts +7 -0
  125. package/dist/commands/owner/reset.d.ts.map +1 -0
  126. package/dist/commands/owner/reset.js +74 -0
  127. package/dist/commands/owner/reset.js.map +1 -0
  128. package/dist/commands/restart.d.ts +11 -0
  129. package/dist/commands/restart.d.ts.map +1 -0
  130. package/dist/commands/restart.js +53 -0
  131. package/dist/commands/restart.js.map +1 -0
  132. package/dist/commands/restore.d.ts +17 -0
  133. package/dist/commands/restore.d.ts.map +1 -0
  134. package/dist/commands/restore.js +148 -0
  135. package/dist/commands/restore.js.map +1 -0
  136. package/dist/commands/self-update.d.ts +10 -0
  137. package/dist/commands/self-update.d.ts.map +1 -0
  138. package/dist/commands/self-update.js +98 -0
  139. package/dist/commands/self-update.js.map +1 -0
  140. package/dist/commands/setup.d.ts +19 -0
  141. package/dist/commands/setup.d.ts.map +1 -0
  142. package/dist/commands/setup.js +111 -0
  143. package/dist/commands/setup.js.map +1 -0
  144. package/dist/commands/shell.d.ts +118 -0
  145. package/dist/commands/shell.d.ts.map +1 -0
  146. package/dist/commands/shell.js +415 -0
  147. package/dist/commands/shell.js.map +1 -0
  148. package/dist/commands/start.d.ts +12 -0
  149. package/dist/commands/start.d.ts.map +1 -0
  150. package/dist/commands/start.js +108 -0
  151. package/dist/commands/start.js.map +1 -0
  152. package/dist/commands/status.d.ts +8 -0
  153. package/dist/commands/status.d.ts.map +1 -0
  154. package/dist/commands/status.js +115 -0
  155. package/dist/commands/status.js.map +1 -0
  156. package/dist/commands/stop.d.ts +11 -0
  157. package/dist/commands/stop.d.ts.map +1 -0
  158. package/dist/commands/stop.js +45 -0
  159. package/dist/commands/stop.js.map +1 -0
  160. package/dist/commands/stream/cancel.d.ts +13 -0
  161. package/dist/commands/stream/cancel.d.ts.map +1 -0
  162. package/dist/commands/stream/cancel.js +31 -0
  163. package/dist/commands/stream/cancel.js.map +1 -0
  164. package/dist/commands/stream/encoders.d.ts +7 -0
  165. package/dist/commands/stream/encoders.d.ts.map +1 -0
  166. package/dist/commands/stream/encoders.js +42 -0
  167. package/dist/commands/stream/encoders.js.map +1 -0
  168. package/dist/commands/stream/queue.d.ts +7 -0
  169. package/dist/commands/stream/queue.d.ts.map +1 -0
  170. package/dist/commands/stream/queue.js +52 -0
  171. package/dist/commands/stream/queue.js.map +1 -0
  172. package/dist/commands/stream/sessions.d.ts +7 -0
  173. package/dist/commands/stream/sessions.d.ts.map +1 -0
  174. package/dist/commands/stream/sessions.js +44 -0
  175. package/dist/commands/stream/sessions.js.map +1 -0
  176. package/dist/commands/uninstall.d.ts +23 -0
  177. package/dist/commands/uninstall.d.ts.map +1 -0
  178. package/dist/commands/uninstall.js +290 -0
  179. package/dist/commands/uninstall.js.map +1 -0
  180. package/dist/commands/update.d.ts +21 -0
  181. package/dist/commands/update.d.ts.map +1 -0
  182. package/dist/commands/update.js +290 -0
  183. package/dist/commands/update.js.map +1 -0
  184. package/dist/commands/watch.d.ts +10 -0
  185. package/dist/commands/watch.d.ts.map +1 -0
  186. package/dist/commands/watch.js +38 -0
  187. package/dist/commands/watch.js.map +1 -0
  188. package/dist/config/local-config.d.ts +22 -0
  189. package/dist/config/local-config.d.ts.map +1 -0
  190. package/dist/config/local-config.js +79 -0
  191. package/dist/config/local-config.js.map +1 -0
  192. package/dist/core-scripts/run.d.ts +22 -0
  193. package/dist/core-scripts/run.d.ts.map +1 -0
  194. package/dist/core-scripts/run.js +65 -0
  195. package/dist/core-scripts/run.js.map +1 -0
  196. package/dist/doctor/check.types.d.ts +51 -0
  197. package/dist/doctor/check.types.d.ts.map +1 -0
  198. package/dist/doctor/check.types.js +14 -0
  199. package/dist/doctor/check.types.js.map +1 -0
  200. package/dist/doctor/checks/core.check.d.ts +11 -0
  201. package/dist/doctor/checks/core.check.d.ts.map +1 -0
  202. package/dist/doctor/checks/core.check.js +104 -0
  203. package/dist/doctor/checks/core.check.js.map +1 -0
  204. package/dist/doctor/checks/data.check.d.ts +11 -0
  205. package/dist/doctor/checks/data.check.d.ts.map +1 -0
  206. package/dist/doctor/checks/data.check.js +70 -0
  207. package/dist/doctor/checks/data.check.js.map +1 -0
  208. package/dist/doctor/checks/environment.check.d.ts +6 -0
  209. package/dist/doctor/checks/environment.check.d.ts.map +1 -0
  210. package/dist/doctor/checks/environment.check.js +70 -0
  211. package/dist/doctor/checks/environment.check.js.map +1 -0
  212. package/dist/doctor/checks/integrity.check.d.ts +4 -0
  213. package/dist/doctor/checks/integrity.check.d.ts.map +1 -0
  214. package/dist/doctor/checks/integrity.check.js +89 -0
  215. package/dist/doctor/checks/integrity.check.js.map +1 -0
  216. package/dist/doctor/checks/isolation.check.d.ts +49 -0
  217. package/dist/doctor/checks/isolation.check.d.ts.map +1 -0
  218. package/dist/doctor/checks/isolation.check.js +220 -0
  219. package/dist/doctor/checks/isolation.check.js.map +1 -0
  220. package/dist/doctor/checks/licence.check.d.ts +8 -0
  221. package/dist/doctor/checks/licence.check.d.ts.map +1 -0
  222. package/dist/doctor/checks/licence.check.js +172 -0
  223. package/dist/doctor/checks/licence.check.js.map +1 -0
  224. package/dist/doctor/checks/ports.check.d.ts +4 -0
  225. package/dist/doctor/checks/ports.check.d.ts.map +1 -0
  226. package/dist/doctor/checks/ports.check.js +52 -0
  227. package/dist/doctor/checks/ports.check.js.map +1 -0
  228. package/dist/doctor/checks/supervisor.check.d.ts +19 -0
  229. package/dist/doctor/checks/supervisor.check.d.ts.map +1 -0
  230. package/dist/doctor/checks/supervisor.check.js +152 -0
  231. package/dist/doctor/checks/supervisor.check.js.map +1 -0
  232. package/dist/doctor/checks/tooling.check.d.ts +3 -0
  233. package/dist/doctor/checks/tooling.check.d.ts.map +1 -0
  234. package/dist/doctor/checks/tooling.check.js +43 -0
  235. package/dist/doctor/checks/tooling.check.js.map +1 -0
  236. package/dist/doctor/registry.d.ts +15 -0
  237. package/dist/doctor/registry.d.ts.map +1 -0
  238. package/dist/doctor/registry.js +53 -0
  239. package/dist/doctor/registry.js.map +1 -0
  240. package/dist/exit-codes.d.ts +18 -0
  241. package/dist/exit-codes.d.ts.map +1 -0
  242. package/dist/exit-codes.js +23 -0
  243. package/dist/exit-codes.js.map +1 -0
  244. package/dist/index.d.ts +2 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +16 -0
  247. package/dist/index.js.map +1 -0
  248. package/dist/logs/sink.d.ts +11 -0
  249. package/dist/logs/sink.d.ts.map +1 -0
  250. package/dist/logs/sink.js +73 -0
  251. package/dist/logs/sink.js.map +1 -0
  252. package/dist/logs/tail.d.ts +17 -0
  253. package/dist/logs/tail.d.ts.map +1 -0
  254. package/dist/logs/tail.js +98 -0
  255. package/dist/logs/tail.js.map +1 -0
  256. package/dist/packaging/boot-task.d.ts +56 -0
  257. package/dist/packaging/boot-task.d.ts.map +1 -0
  258. package/dist/packaging/boot-task.js +151 -0
  259. package/dist/packaging/boot-task.js.map +1 -0
  260. package/dist/packaging/install.d.ts +154 -0
  261. package/dist/packaging/install.d.ts.map +1 -0
  262. package/dist/packaging/install.js +381 -0
  263. package/dist/packaging/install.js.map +1 -0
  264. package/dist/packaging/layout.d.ts +153 -0
  265. package/dist/packaging/layout.d.ts.map +1 -0
  266. package/dist/packaging/layout.js +168 -0
  267. package/dist/packaging/layout.js.map +1 -0
  268. package/dist/packaging/machine-path.d.ts +52 -0
  269. package/dist/packaging/machine-path.d.ts.map +1 -0
  270. package/dist/packaging/machine-path.js +237 -0
  271. package/dist/packaging/machine-path.js.map +1 -0
  272. package/dist/packaging/manifest.d.ts +37 -0
  273. package/dist/packaging/manifest.d.ts.map +1 -0
  274. package/dist/packaging/manifest.js +115 -0
  275. package/dist/packaging/manifest.js.map +1 -0
  276. package/dist/packaging/shims.d.ts +31 -0
  277. package/dist/packaging/shims.d.ts.map +1 -0
  278. package/dist/packaging/shims.js +165 -0
  279. package/dist/packaging/shims.js.map +1 -0
  280. package/dist/probes/internal-paths.d.ts +35 -0
  281. package/dist/probes/internal-paths.d.ts.map +1 -0
  282. package/dist/probes/internal-paths.js +58 -0
  283. package/dist/probes/internal-paths.js.map +1 -0
  284. package/dist/probes/internal.client.d.ts +54 -0
  285. package/dist/probes/internal.client.d.ts.map +1 -0
  286. package/dist/probes/internal.client.js +123 -0
  287. package/dist/probes/internal.client.js.map +1 -0
  288. package/dist/probes/port.probe.d.ts +21 -0
  289. package/dist/probes/port.probe.d.ts.map +1 -0
  290. package/dist/probes/port.probe.js +42 -0
  291. package/dist/probes/port.probe.js.map +1 -0
  292. package/dist/probes/service.probe.d.ts +29 -0
  293. package/dist/probes/service.probe.d.ts.map +1 -0
  294. package/dist/probes/service.probe.js +65 -0
  295. package/dist/probes/service.probe.js.map +1 -0
  296. package/dist/profiles/appliance.profile.d.ts +20 -0
  297. package/dist/profiles/appliance.profile.d.ts.map +1 -0
  298. package/dist/profiles/appliance.profile.js +137 -0
  299. package/dist/profiles/appliance.profile.js.map +1 -0
  300. package/dist/profiles/dev.profile.d.ts +22 -0
  301. package/dist/profiles/dev.profile.d.ts.map +1 -0
  302. package/dist/profiles/dev.profile.js +104 -0
  303. package/dist/profiles/dev.profile.js.map +1 -0
  304. package/dist/profiles/resolve.d.ts +37 -0
  305. package/dist/profiles/resolve.d.ts.map +1 -0
  306. package/dist/profiles/resolve.js +198 -0
  307. package/dist/profiles/resolve.js.map +1 -0
  308. package/dist/profiles/types.d.ts +57 -0
  309. package/dist/profiles/types.d.ts.map +1 -0
  310. package/dist/profiles/types.js +15 -0
  311. package/dist/profiles/types.js.map +1 -0
  312. package/dist/registry/local-registry.d.ts +79 -0
  313. package/dist/registry/local-registry.d.ts.map +1 -0
  314. package/dist/registry/local-registry.js +252 -0
  315. package/dist/registry/local-registry.js.map +1 -0
  316. package/dist/render/banner.d.ts +13 -0
  317. package/dist/render/banner.d.ts.map +1 -0
  318. package/dist/render/banner.js +83 -0
  319. package/dist/render/banner.js.map +1 -0
  320. package/dist/render/boot.render.d.ts +123 -0
  321. package/dist/render/boot.render.d.ts.map +1 -0
  322. package/dist/render/boot.render.js +288 -0
  323. package/dist/render/boot.render.js.map +1 -0
  324. package/dist/render/brand.d.ts +16 -0
  325. package/dist/render/brand.d.ts.map +1 -0
  326. package/dist/render/brand.js +22 -0
  327. package/dist/render/brand.js.map +1 -0
  328. package/dist/render/doctor.render.d.ts +12 -0
  329. package/dist/render/doctor.render.d.ts.map +1 -0
  330. package/dist/render/doctor.render.js +95 -0
  331. package/dist/render/doctor.render.js.map +1 -0
  332. package/dist/render/json.d.ts +29 -0
  333. package/dist/render/json.d.ts.map +1 -0
  334. package/dist/render/json.js +19 -0
  335. package/dist/render/json.js.map +1 -0
  336. package/dist/render/licence.render.d.ts +10 -0
  337. package/dist/render/licence.render.d.ts.map +1 -0
  338. package/dist/render/licence.render.js +167 -0
  339. package/dist/render/licence.render.js.map +1 -0
  340. package/dist/render/status.render.d.ts +6 -0
  341. package/dist/render/status.render.d.ts.map +1 -0
  342. package/dist/render/status.render.js +52 -0
  343. package/dist/render/status.render.js.map +1 -0
  344. package/dist/render/theme.d.ts +66 -0
  345. package/dist/render/theme.d.ts.map +1 -0
  346. package/dist/render/theme.js +89 -0
  347. package/dist/render/theme.js.map +1 -0
  348. package/dist/runtime-guard.d.ts +19 -0
  349. package/dist/runtime-guard.d.ts.map +1 -0
  350. package/dist/runtime-guard.js +57 -0
  351. package/dist/runtime-guard.js.map +1 -0
  352. package/dist/shell/input-mode.d.ts +25 -0
  353. package/dist/shell/input-mode.d.ts.map +1 -0
  354. package/dist/shell/input-mode.js +17 -0
  355. package/dist/shell/input-mode.js.map +1 -0
  356. package/dist/shell/parse-line.d.ts +6 -0
  357. package/dist/shell/parse-line.d.ts.map +1 -0
  358. package/dist/shell/parse-line.js +62 -0
  359. package/dist/shell/parse-line.js.map +1 -0
  360. package/dist/shell/suggestions.d.ts +14 -0
  361. package/dist/shell/suggestions.d.ts.map +1 -0
  362. package/dist/shell/suggestions.js +35 -0
  363. package/dist/shell/suggestions.js.map +1 -0
  364. package/dist/supervisor/dependencies.d.ts +2 -0
  365. package/dist/supervisor/dependencies.d.ts.map +1 -0
  366. package/dist/supervisor/dependencies.js +38 -0
  367. package/dist/supervisor/dependencies.js.map +1 -0
  368. package/dist/supervisor/entry.d.ts +36 -0
  369. package/dist/supervisor/entry.d.ts.map +1 -0
  370. package/dist/supervisor/entry.js +171 -0
  371. package/dist/supervisor/entry.js.map +1 -0
  372. package/dist/supervisor/inspect.d.ts +17 -0
  373. package/dist/supervisor/inspect.d.ts.map +1 -0
  374. package/dist/supervisor/inspect.js +39 -0
  375. package/dist/supervisor/inspect.js.map +1 -0
  376. package/dist/supervisor/invocation.d.ts +27 -0
  377. package/dist/supervisor/invocation.d.ts.map +1 -0
  378. package/dist/supervisor/invocation.js +33 -0
  379. package/dist/supervisor/invocation.js.map +1 -0
  380. package/dist/supervisor/monitor.d.ts +63 -0
  381. package/dist/supervisor/monitor.d.ts.map +1 -0
  382. package/dist/supervisor/monitor.js +141 -0
  383. package/dist/supervisor/monitor.js.map +1 -0
  384. package/dist/supervisor/orchestrator.d.ts +52 -0
  385. package/dist/supervisor/orchestrator.d.ts.map +1 -0
  386. package/dist/supervisor/orchestrator.js +154 -0
  387. package/dist/supervisor/orchestrator.js.map +1 -0
  388. package/dist/supervisor/pidfile.d.ts +21 -0
  389. package/dist/supervisor/pidfile.d.ts.map +1 -0
  390. package/dist/supervisor/pidfile.js +39 -0
  391. package/dist/supervisor/pidfile.js.map +1 -0
  392. package/dist/supervisor/process-identity.d.ts +19 -0
  393. package/dist/supervisor/process-identity.d.ts.map +1 -0
  394. package/dist/supervisor/process-identity.js +51 -0
  395. package/dist/supervisor/process-identity.js.map +1 -0
  396. package/dist/supervisor/readiness.d.ts +17 -0
  397. package/dist/supervisor/readiness.d.ts.map +1 -0
  398. package/dist/supervisor/readiness.js +52 -0
  399. package/dist/supervisor/readiness.js.map +1 -0
  400. package/dist/supervisor/restart-consumer.d.ts +37 -0
  401. package/dist/supervisor/restart-consumer.d.ts.map +1 -0
  402. package/dist/supervisor/restart-consumer.js +119 -0
  403. package/dist/supervisor/restart-consumer.js.map +1 -0
  404. package/dist/supervisor/runner.d.ts +2 -0
  405. package/dist/supervisor/runner.d.ts.map +1 -0
  406. package/dist/supervisor/runner.js +118 -0
  407. package/dist/supervisor/runner.js.map +1 -0
  408. package/dist/supervisor/schedule-timer.d.ts +38 -0
  409. package/dist/supervisor/schedule-timer.d.ts.map +1 -0
  410. package/dist/supervisor/schedule-timer.js +148 -0
  411. package/dist/supervisor/schedule-timer.js.map +1 -0
  412. package/dist/supervisor/spawn.d.ts +18 -0
  413. package/dist/supervisor/spawn.d.ts.map +1 -0
  414. package/dist/supervisor/spawn.js +119 -0
  415. package/dist/supervisor/spawn.js.map +1 -0
  416. package/dist/supervisor/state-files.d.ts +33 -0
  417. package/dist/supervisor/state-files.d.ts.map +1 -0
  418. package/dist/supervisor/state-files.js +110 -0
  419. package/dist/supervisor/state-files.js.map +1 -0
  420. package/dist/supervisor/tree-kill.d.ts +14 -0
  421. package/dist/supervisor/tree-kill.d.ts.map +1 -0
  422. package/dist/supervisor/tree-kill.js +82 -0
  423. package/dist/supervisor/tree-kill.js.map +1 -0
  424. package/dist/ui/health-panel.d.ts +8 -0
  425. package/dist/ui/health-panel.d.ts.map +1 -0
  426. package/dist/ui/health-panel.js +91 -0
  427. package/dist/ui/health-panel.js.map +1 -0
  428. package/dist/updating/apply.d.ts +50 -0
  429. package/dist/updating/apply.d.ts.map +1 -0
  430. package/dist/updating/apply.js +172 -0
  431. package/dist/updating/apply.js.map +1 -0
  432. package/dist/updating/download.d.ts +44 -0
  433. package/dist/updating/download.d.ts.map +1 -0
  434. package/dist/updating/download.js +144 -0
  435. package/dist/updating/download.js.map +1 -0
  436. package/dist/updating/rollback.d.ts +33 -0
  437. package/dist/updating/rollback.d.ts.map +1 -0
  438. package/dist/updating/rollback.js +54 -0
  439. package/dist/updating/rollback.js.map +1 -0
  440. package/dist/updating/self.d.ts +16 -0
  441. package/dist/updating/self.d.ts.map +1 -0
  442. package/dist/updating/self.js +50 -0
  443. package/dist/updating/self.js.map +1 -0
  444. package/dist/updating/verify.d.ts +25 -0
  445. package/dist/updating/verify.d.ts.map +1 -0
  446. package/dist/updating/verify.js +51 -0
  447. package/dist/updating/verify.js.map +1 -0
  448. package/dist/updating/versions.d.ts +31 -0
  449. package/dist/updating/versions.d.ts.map +1 -0
  450. package/dist/updating/versions.js +78 -0
  451. package/dist/updating/versions.js.map +1 -0
  452. package/dist/version.d.ts +4 -0
  453. package/dist/version.d.ts.map +1 -0
  454. package/dist/version.js +29 -0
  455. package/dist/version.js.map +1 -0
  456. package/package.json +106 -0
@@ -0,0 +1,172 @@
1
+ import { createWriteStream, existsSync, mkdirSync, renameSync, rmSync } from "node:fs";
2
+ import { dirname, join, relative, resolve, sep } from "node:path";
3
+ import { pipeline } from "node:stream/promises";
4
+ import yauzl from "yauzl";
5
+ import { BUNDLE_DIRS } from "../packaging/layout.js";
6
+ // AR: تركيب حزمة تحديث — **بالتبديل بالاسم لا بالنسخ**.
7
+ //
8
+ // خطة P5.4 تقول «النسخة الاحتياطية بـ‎archive.ts‎ القائم، لا تكتب منطق نسخ جديدًا»، و
9
+ // ‎archive.ts‎ عند القراءة **يؤرشف بيانات العميل**: لقطة قاعدة و‎data/‎ و‎config.json‎ —
10
+ // لا شجرة بناء. أرشفةُ ثلاثة عشر ألف ملفٍّ من ‎core/‎ في زِب قبل كل تحديث تكلّف دقائق على
11
+ // قرص جهاز، والتراجعُ منها يكلّف مثلها في اللحظة التي يكون فيها النظام مطفأً.
12
+ //
13
+ // البديل المستعمل: **إعادة تسمية المجلد القائم** إلى ‎core.prev-0.20.0‎ ثم فكّ الجديد
14
+ // مكانه. إعادة التسمية عملية واحدة على نفس القسم مهما كان عدد الملفّات، والتراجع إعادةُ
15
+ // تسميةٍ معاكسة — أي أن **التراجع أسرع من الفشل الذي استدعاه**. والنسخة القديمة تبقى
16
+ // كاملةً على القرص لا مضغوطةً في أرشيفٍ يحتاج فكًّا في أسوأ وقت.
17
+ //
18
+ // EN: Installing an update bundle — **by renaming, not by copying**.
19
+ //
20
+ // The P5.4 card says "back up with the existing `archive.ts`, do not write new copy logic", and
21
+ // `archive.ts`, when read, **archives customer data**: a database snapshot, `data/` and
22
+ // `config.json` — not a build tree. Zipping thirteen thousand files out of `core/` before every
23
+ // update costs minutes on an appliance disk, and rolling back from it costs the same again at
24
+ // the moment the system is down.
25
+ //
26
+ // The alternative used: **rename the existing directory** to `core.prev-0.20.0` and extract the
27
+ // new one in its place. A rename is one operation on the same volume however many files there
28
+ // are, and rollback is the reverse rename — so **the rollback is faster than the failure that
29
+ // called for it**. The old tree stays whole on disk rather than compressed into an archive that
30
+ // needs unpacking at the worst possible moment.
31
+ /**
32
+ * AR: أين يُركَّب كل مكوّن. **‎assets‎ غائب عمدًا**: تخطيط الحزمة في ‎layout.ts‎ لا يعرّف له
33
+ * مجلدًا، وتخمينُ مسارٍ يعني فكّ آلاف الملفّات في مكانٍ لا يقرؤه شيء — تحديثٌ يُعلَن
34
+ * ناجحًا ولا يغيّر شيئًا. يُرفَض برسالة صريحة حتى يُعرَّف موضعه.
35
+ * EN: Where each component installs. **`assets` is deliberately absent**: the bundle layout in
36
+ * `layout.ts` defines no directory for it, and guessing a path means unpacking thousands of
37
+ * files somewhere nothing reads — an update reported as successful that changes nothing. It is
38
+ * refused with a clear message until its location is defined.
39
+ */
40
+ export const COMPONENT_TARGET = {
41
+ core: BUNDLE_DIRS.core,
42
+ live: BUNDLE_DIRS.live,
43
+ interface: BUNDLE_DIRS.interfaceRoot,
44
+ };
45
+ export function targetFor(root, component) {
46
+ const directory = COMPONENT_TARGET[component];
47
+ return directory ? join(root, directory) : undefined;
48
+ }
49
+ /**
50
+ * AR: يزيح الشجرة القائمة جانبًا ويعيد مقبضًا يتيح التراجع.
51
+ *
52
+ * **إعادة التسمية على ويندوز تفشل أحيانًا بلا سبب دائم**: مضادّ فيروسات أو مفهرس يمسك
53
+ * ملفًّا لأجزاء من الثانية بعد إيقاف الخدمة. محاولةٌ واحدة كانت ستُفشل تحديثًا سليمًا،
54
+ * فتُعاد المحاولة قليلًا قبل الاستسلام.
55
+ * EN: Moves the existing tree aside and returns a handle that makes rollback possible.
56
+ *
57
+ * **Renaming on Windows fails intermittently for no lasting reason**: an antivirus or the
58
+ * indexer holds a file for fractions of a second after the service stops. A single attempt
59
+ * would fail a perfectly good update, so it retries briefly before giving up.
60
+ */
61
+ export async function swapAside(root, component, currentVersion) {
62
+ const target = targetFor(root, component);
63
+ if (!target)
64
+ throw new Error(`لا موضع تثبيت معروف للمكوّن ${component}.`);
65
+ const previous = `${target}.prev-${currentVersion}`;
66
+ // بقايا تحديثٍ سابق انقطع: تُزال، وإلّا فشلت إعادة التسمية على وجهةٍ موجودة.
67
+ if (existsSync(previous))
68
+ rmSync(previous, { recursive: true, force: true });
69
+ if (existsSync(target))
70
+ await renameWithRetry(target, previous);
71
+ return { component, target, previous };
72
+ }
73
+ /**
74
+ * AR: يفكّ الحزمة في موضع المكوّن.
75
+ *
76
+ * **يرفض أي مدخل يخرج من الوجهة.** أسماء المدخلات داخل الزِب يكتبها من صنعها، و
77
+ * ‎..\..\runtime\node.exe‎ اسمُ مدخلٍ صالح تمامًا — فبدون هذا الحارس تستطيع حزمةٌ موقَّعة
78
+ * أن تكتب خارج مجلدها. التوقيع يثبت أن الحزمة منّا، ولا يثبت أن من بناها لم يخطئ.
79
+ * EN: Unpacks the bundle into the component's place.
80
+ *
81
+ * **Refuses any entry that escapes the destination.** Entry names inside a zip are written by
82
+ * whoever made it, and `..\..\runtime\node.exe` is a perfectly valid one — so without this
83
+ * guard a signed bundle could write outside its directory. The signature proves the bundle is
84
+ * ours; it does not prove whoever built it made no mistake.
85
+ */
86
+ export async function extractInto(archive, destination) {
87
+ mkdirSync(destination, { recursive: true });
88
+ const zip = await openZip(archive);
89
+ let written = 0;
90
+ await new Promise((done, fail) => {
91
+ zip.on("entry", (entry) => {
92
+ if (entry.fileName.endsWith("/")) {
93
+ zip.readEntry();
94
+ return;
95
+ }
96
+ const path = safeJoin(destination, entry.fileName);
97
+ if (!path) {
98
+ fail(new Error(`مدخل خارج وجهة الفكّ: ${entry.fileName}`));
99
+ return;
100
+ }
101
+ zip.openReadStream(entry, (error, stream) => {
102
+ if (error || !stream) {
103
+ fail(error ?? new Error(`تعذّرت قراءة ${entry.fileName}`));
104
+ return;
105
+ }
106
+ mkdirSync(dirname(path), { recursive: true });
107
+ pipeline(stream, createWriteStream(path))
108
+ .then(() => {
109
+ written += 1;
110
+ zip.readEntry();
111
+ })
112
+ .catch(fail);
113
+ });
114
+ });
115
+ zip.on("end", () => done());
116
+ zip.on("error", fail);
117
+ zip.readEntry();
118
+ });
119
+ zip.close();
120
+ // AR: زِبٌّ سليم بلا ملفّات ليس نجاحًا. حزمةٌ فارغة تمرّ من التوقيع والبصمة معًا — كلاهما
121
+ // يصف بايتاتها بصدق — وتترك المكوّن مجلدًا فارغًا، فتُقلع الخدمة على لا شيء.
122
+ // EN: A valid zip with no files is not a success. An empty bundle passes both the signature and
123
+ // the digest — each describes its bytes truthfully — and leaves the component an empty
124
+ // directory, so the service boots on nothing.
125
+ if (written === 0)
126
+ throw new Error("الحزمة لا تحوي ملفّات.");
127
+ return written;
128
+ }
129
+ /** يتراجع: يحذف الجديد ويعيد القديم إلى مكانه. */
130
+ export async function undoSwap(handle) {
131
+ if (existsSync(handle.target))
132
+ rmSync(handle.target, { recursive: true, force: true });
133
+ if (existsSync(handle.previous))
134
+ await renameWithRetry(handle.previous, handle.target);
135
+ }
136
+ /** يثبّت النجاح: تُزال الشجرة السابقة. تُنادى **بعد** فحص الصحة لا قبله. */
137
+ export function discardPrevious(handle) {
138
+ if (existsSync(handle.previous))
139
+ rmSync(handle.previous, { recursive: true, force: true });
140
+ }
141
+ async function renameWithRetry(from, to, attempts = 5) {
142
+ for (let attempt = 1; attempt <= attempts; attempt += 1) {
143
+ try {
144
+ renameSync(from, to);
145
+ return;
146
+ }
147
+ catch (error) {
148
+ if (attempt === attempts)
149
+ throw error;
150
+ await new Promise((done) => setTimeout(done, 200 * attempt));
151
+ }
152
+ }
153
+ }
154
+ function openZip(file) {
155
+ return new Promise((done, fail) => {
156
+ yauzl.open(file, { lazyEntries: true, autoClose: false }, (error, zip) => {
157
+ if (error || !zip)
158
+ fail(error ?? new Error("تعذّر فتح الحزمة."));
159
+ else
160
+ done(zip);
161
+ });
162
+ });
163
+ }
164
+ /** يبني مسارًا داخل الوجهة، أو ‎undefined‎ إن خرج منها. */
165
+ function safeJoin(destination, entryName) {
166
+ const path = resolve(destination, entryName);
167
+ const step = relative(destination, path);
168
+ if (!step || step.startsWith("..") || step.startsWith(sep))
169
+ return undefined;
170
+ return path;
171
+ }
172
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/updating/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export type DownloadProgress = {
2
+ receivedBytes: number;
3
+ totalBytes: number;
4
+ percent: number;
5
+ };
6
+ export type DownloadOptions = {
7
+ url: string;
8
+ destination: string;
9
+ /** الحجم المتوقَّع كما أعلنه البيان الموقَّع — يُستعمل للنسبة فقط، والتحقّق بالبصمة. */
10
+ expectedBytes: number;
11
+ onProgress?: (progress: DownloadProgress) => void;
12
+ };
13
+ export type DownloadResult = {
14
+ ok: true;
15
+ bytes: number;
16
+ } | {
17
+ ok: false;
18
+ reason: string;
19
+ unreachable: boolean;
20
+ };
21
+ /**
22
+ * AR: ينزّل إلى ملفّ مؤقّت، مستأنفًا ما كُتب منه إن وُجد.
23
+ *
24
+ * **لا شيء في التثبيت يُلمَس هنا.** الوجهة مجلد مؤقّت، والملفّ الناقص يبقى بين المحاولات
25
+ * عمدًا — هو رأس مال الاستئناف. ويُحذَف عند فشلٍ نهائيّ لئلّا يبقى نصفُ حزمةٍ يُستأنف
26
+ * يومًا فوق إصدارٍ آخر.
27
+ *
28
+ * و**الرمز الموقَّع في الرابط ينتهي بعد ربع ساعة** (P5.3): تنزيلٌ أطول من ذلك يُقابَل
29
+ * بـ‎403‎ عند محاولة الاستئناف. لذلك يُميَّز الرفض عن الانقطاع هنا أيضًا — الرفض يوقف
30
+ * المحاولات، والانقطاع يعيدها.
31
+ *
32
+ * EN: Downloads to a temporary file, resuming whatever was already written.
33
+ *
34
+ * **Nothing in the installation is touched here.** The destination is a temporary directory,
35
+ * and a partial file survives between attempts deliberately — it is the capital resumption is
36
+ * built on. It is removed on final failure so half a bundle is not resumed one day on top of a
37
+ * different release.
38
+ *
39
+ * And **the signed token in the URL expires after fifteen minutes** (P5.3): a download longer
40
+ * than that meets a `403` when it tries to resume. So refusal is separated from interruption
41
+ * here too — refusal stops the attempts, interruption repeats them.
42
+ */
43
+ export declare function downloadBundle(options: DownloadOptions): Promise<DownloadResult>;
44
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/updating/download.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiGtF"}
@@ -0,0 +1,144 @@
1
+ import { createWriteStream, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
2
+ import { Readable } from "node:stream";
3
+ import { pipeline } from "node:stream/promises";
4
+ import { dirname } from "node:path";
5
+ // AR: تنزيل حزمة التحديث، باستئناف وتقدّم.
6
+ //
7
+ // **الاستئناف ليس رفاهية.** الوصلة التي تخدم استراحةً على طريق صحراوي تنقطع، ونصف
8
+ // غيغابايت يُعاد من الصفر في كل مرّة قد لا يكتمل أبدًا — فيصير التحديث ميزةً موجودة على
9
+ // الورق ومستحيلة عند من يحتاجها. المركز يدعم ‎Range‎ (P5.3)، وهذا الطرف يستعمله.
10
+ //
11
+ // EN: Downloading the update bundle, with resume and progress.
12
+ //
13
+ // **Resuming is not a luxury.** The link serving a rest-house on a desert road drops, and half
14
+ // a gigabyte restarted from zero every time may never finish — making updates a feature that
15
+ // exists on paper and is impossible for whoever needs it. The centre supports `Range` (P5.3),
16
+ // and this side uses it.
17
+ const TIMEOUT_MS = 60_000;
18
+ const ATTEMPTS = 4;
19
+ /**
20
+ * AR: ينزّل إلى ملفّ مؤقّت، مستأنفًا ما كُتب منه إن وُجد.
21
+ *
22
+ * **لا شيء في التثبيت يُلمَس هنا.** الوجهة مجلد مؤقّت، والملفّ الناقص يبقى بين المحاولات
23
+ * عمدًا — هو رأس مال الاستئناف. ويُحذَف عند فشلٍ نهائيّ لئلّا يبقى نصفُ حزمةٍ يُستأنف
24
+ * يومًا فوق إصدارٍ آخر.
25
+ *
26
+ * و**الرمز الموقَّع في الرابط ينتهي بعد ربع ساعة** (P5.3): تنزيلٌ أطول من ذلك يُقابَل
27
+ * بـ‎403‎ عند محاولة الاستئناف. لذلك يُميَّز الرفض عن الانقطاع هنا أيضًا — الرفض يوقف
28
+ * المحاولات، والانقطاع يعيدها.
29
+ *
30
+ * EN: Downloads to a temporary file, resuming whatever was already written.
31
+ *
32
+ * **Nothing in the installation is touched here.** The destination is a temporary directory,
33
+ * and a partial file survives between attempts deliberately — it is the capital resumption is
34
+ * built on. It is removed on final failure so half a bundle is not resumed one day on top of a
35
+ * different release.
36
+ *
37
+ * And **the signed token in the URL expires after fifteen minutes** (P5.3): a download longer
38
+ * than that meets a `403` when it tries to resume. So refusal is separated from interruption
39
+ * here too — refusal stops the attempts, interruption repeats them.
40
+ */
41
+ export async function downloadBundle(options) {
42
+ const { url, destination, expectedBytes, onProgress } = options;
43
+ mkdirSync(dirname(destination), { recursive: true });
44
+ let lastReason = "التنزيل لم يبدأ.";
45
+ for (let attempt = 1; attempt <= ATTEMPTS; attempt += 1) {
46
+ const alreadyHave = existsSync(destination) ? statSync(destination).size : 0;
47
+ // اكتمل من محاولة سابقة: لا نطلب نطاقًا فارغًا (يردّ المركز ‎416‎ وهو محقّ).
48
+ if (expectedBytes > 0 && alreadyHave >= expectedBytes) {
49
+ onProgress?.({ receivedBytes: alreadyHave, totalBytes: expectedBytes, percent: 100 });
50
+ return { ok: true, bytes: alreadyHave };
51
+ }
52
+ try {
53
+ const response = await fetch(url, {
54
+ headers: alreadyHave > 0 ? { Range: `bytes=${alreadyHave}-` } : {},
55
+ signal: AbortSignal.timeout(TIMEOUT_MS),
56
+ });
57
+ // AR: **رفضٌ صريح يوقف المحاولات.** ‎403‎ يعني رمزًا انتهى أو إصدارًا سُحب، و‎410‎ يعني
58
+ // أن المركز قرّر ألّا يُعطى هذا الإصدار بعد الآن. إعادةُ المحاولة عليها حلقةٌ تنتهي
59
+ // بنفس الجواب وقد أضاعت دقائق العميل.
60
+ // EN: **An explicit refusal stops the attempts.** A `403` means an expired token or a revoked
61
+ // release, a `410` means the centre decided this release is no longer to be given out.
62
+ // Retrying either is a loop ending in the same answer, having spent the customer's
63
+ // minutes.
64
+ if (response.status === 403 || response.status === 410 || response.status === 404) {
65
+ cleanup(destination);
66
+ return {
67
+ ok: false,
68
+ reason: await refusalMessage(response),
69
+ unreachable: false,
70
+ };
71
+ }
72
+ if (!response.ok && response.status !== 206) {
73
+ lastReason = `الخادم ردّ بـ${response.status}.`;
74
+ continue;
75
+ }
76
+ // AR: **‎200‎ على طلبٍ بنطاق يعني أن الخادم تجاهل الاستئناف** ويرسل من البداية. الكتابة
77
+ // في الوضع الملحِق عندها تنتج ملفًّا مضاعفًا تفشل بصمته — فنبدأ من الصفر بدلًا منه.
78
+ // EN: **A `200` to a ranged request means the server ignored the resume** and is sending from
79
+ // the start. Appending then produces a doubled file whose digest fails — so we start over
80
+ // instead.
81
+ const resuming = alreadyHave > 0 && response.status === 206;
82
+ if (alreadyHave > 0 && !resuming)
83
+ cleanup(destination);
84
+ const startAt = resuming ? alreadyHave : 0;
85
+ const total = expectedBytes > 0 ? expectedBytes : startAt + contentLength(response);
86
+ if (!response.body) {
87
+ lastReason = "الخادم لم يرسل محتوى.";
88
+ continue;
89
+ }
90
+ let received = startAt;
91
+ const source = Readable.fromWeb(response.body);
92
+ source.on("data", (chunk) => {
93
+ received += chunk.length;
94
+ onProgress?.({
95
+ receivedBytes: received,
96
+ totalBytes: total,
97
+ percent: total > 0 ? Math.min(100, Math.round((received / total) * 100)) : 0,
98
+ });
99
+ });
100
+ await pipeline(source, createWriteStream(destination, { flags: resuming ? "a" : "w" }));
101
+ const finalSize = statSync(destination).size;
102
+ // AR: حجمٌ ناقص بعد دفقٍ انتهى بلا خطأ = اتصالٌ قُطع بهدوء. **يُعاد لا يُقبَل**: ملفّ
103
+ // ناقص يفشل تحقّقه لاحقًا برسالة «البصمة لا تطابق» تتّهم المركز بلا ذنب.
104
+ // EN: A short file after a stream that ended without error = a connection cut quietly.
105
+ // **Retried, not accepted**: a truncated file fails verification later with a "digest
106
+ // mismatch" that blames the centre for nothing.
107
+ if (expectedBytes > 0 && finalSize < expectedBytes) {
108
+ lastReason = `وصل ${finalSize} من ${expectedBytes} بايت.`;
109
+ continue;
110
+ }
111
+ return { ok: true, bytes: finalSize };
112
+ }
113
+ catch (error) {
114
+ lastReason = error instanceof Error ? error.message : String(error);
115
+ }
116
+ if (attempt < ATTEMPTS) {
117
+ await new Promise((done) => setTimeout(done, 1000 * 2 ** (attempt - 1)));
118
+ }
119
+ }
120
+ cleanup(destination);
121
+ return { ok: false, reason: lastReason, unreachable: true };
122
+ }
123
+ function contentLength(response) {
124
+ const raw = response.headers.get("content-length");
125
+ const value = raw ? Number(raw) : 0;
126
+ return Number.isFinite(value) ? value : 0;
127
+ }
128
+ /** يقرأ رسالة المركز العربية الجاهزة من غلاف D4، أو يصف الحالة حين لا غلاف. */
129
+ async function refusalMessage(response) {
130
+ try {
131
+ const body = (await response.json());
132
+ if (body.error?.message)
133
+ return body.error.message;
134
+ }
135
+ catch {
136
+ // ردٌّ ليس JSON: نصف الحالة بدل أن نخترع سببًا.
137
+ }
138
+ return `الخادم رفض التنزيل (${response.status}).`;
139
+ }
140
+ function cleanup(path) {
141
+ if (existsSync(path))
142
+ unlinkSync(path);
143
+ }
144
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/updating/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,2CAA2C;AAC3C,EAAE;AACF,sFAAsF;AACtF,4FAA4F;AAC5F,qFAAqF;AACrF,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,mGAAmG;AACnG,iGAAiG;AACjG,kGAAkG;AAClG,6BAA6B;AAE7B,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC;AAoBnB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEhE,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,IAAI,UAAU,GAAG,kBAAkB,CAAC;IAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7E,6EAA6E;QAC7E,IAAI,aAAa,GAAG,CAAC,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;YACtD,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YACtF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;aACxC,CAAC,CAAC;YAEH,wFAAwF;YACxF,wFAAwF;YACxF,0CAA0C;YAC1C,8FAA8F;YAC9F,2FAA2F;YAC3F,uFAAuF;YACvF,eAAe;YACf,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClF,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC;oBACtC,WAAW,EAAE,KAAK;iBACnB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5C,UAAU,GAAG,gBAAgB,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAChD,SAAS;YACX,CAAC;YAED,wFAAwF;YACxF,wFAAwF;YACxF,8FAA8F;YAC9F,8FAA8F;YAC9F,eAAe;YACf,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;YAC5D,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAEvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAEpF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,UAAU,GAAG,uBAAuB,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,GAAG,OAAO,CAAC;YACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAA8C,CAAC,CAAC;YAEzF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAClC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,UAAU,EAAE,CAAC;oBACX,aAAa,EAAE,QAAQ;oBACvB,UAAU,EAAE,KAAK;oBACjB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC7E,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAExF,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;YAE7C,sFAAsF;YACtF,6EAA6E;YAC7E,uFAAuF;YACvF,0FAA0F;YAC1F,oDAAoD;YACpD,IAAI,aAAa,GAAG,CAAC,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC;gBACnD,UAAU,GAAG,OAAO,SAAS,OAAO,aAAa,QAAQ,CAAC;gBAC1D,SAAS;YACX,CAAC;YAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,CAAC;IACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,QAAkB;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqC,CAAC;QACzE,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,OAAO,uBAAuB,QAAQ,CAAC,MAAM,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Profile } from "../profiles/types.js";
2
+ import { type SwapHandle } from "./apply.js";
3
+ export type RollbackReport = {
4
+ /** هل عادت الشجرة القديمة إلى مكانها؟ */
5
+ restored: boolean;
6
+ /** هل أقلعت الخدمات بعد العودة؟ */
7
+ running: boolean;
8
+ /** ما تعذّر، إن تعذّر شيء. يُعرَض للفنيّ: هنا يبدأ التدخّل اليدويّ. */
9
+ problem?: string;
10
+ };
11
+ /**
12
+ * AR: يعيد النظام إلى ما كان عليه: يوقف ما أُقلع، ويرجع الشجرة، ثم يشغّل.
13
+ *
14
+ * **يُوقِف أوّلًا حتى لو ظنّ المنادي أن شيئًا لم يُقلع.** فشلُ فحص الصحة يعني أن الخدمة
15
+ * **أُقلعت** بالحزمة الجديدة ولم تجب — أي أن عمليةً حيّة تمسك ملفّات الشجرة الجديدة،
16
+ * وإعادةُ التسمية فوقها تفشل على ويندوز. الإيقاف قبل التراجع هو ما يجعل التراجع ممكنًا.
17
+ *
18
+ * **ويعيد تقريرًا ولا يرمي.** هذه آخر شبكة أمان في المسار: استثناءٌ يخرج منها يترك المالك
19
+ * بأثر مكدّس بدل جملةٍ تقول له ما حال نظامه الآن.
20
+ *
21
+ * EN: Returns the system to what it was: stops whatever started, restores the tree, then starts.
22
+ *
23
+ * **It stops first even when the caller believes nothing started.** A failed health check means
24
+ * the service **did** start on the new bundle and did not answer — so a live process is holding
25
+ * the new tree's files, and renaming over it fails on Windows. Stopping before rolling back is
26
+ * what makes the rollback possible.
27
+ *
28
+ * **And it returns a report rather than throwing.** This is the last safety net on the path: an
29
+ * exception escaping it leaves the owner with a stack trace instead of a sentence telling them
30
+ * what state their system is in now.
31
+ */
32
+ export declare function rollback(profile: Profile, handle: SwapHandle): Promise<RollbackReport>;
33
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgBvD,MAAM,MAAM,cAAc,GAAG;IAC3B,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CA6B5F"}
@@ -0,0 +1,54 @@
1
+ import { startServices, stopServices } from "../supervisor/orchestrator.js";
2
+ import { undoSwap } from "./apply.js";
3
+ /**
4
+ * AR: يعيد النظام إلى ما كان عليه: يوقف ما أُقلع، ويرجع الشجرة، ثم يشغّل.
5
+ *
6
+ * **يُوقِف أوّلًا حتى لو ظنّ المنادي أن شيئًا لم يُقلع.** فشلُ فحص الصحة يعني أن الخدمة
7
+ * **أُقلعت** بالحزمة الجديدة ولم تجب — أي أن عمليةً حيّة تمسك ملفّات الشجرة الجديدة،
8
+ * وإعادةُ التسمية فوقها تفشل على ويندوز. الإيقاف قبل التراجع هو ما يجعل التراجع ممكنًا.
9
+ *
10
+ * **ويعيد تقريرًا ولا يرمي.** هذه آخر شبكة أمان في المسار: استثناءٌ يخرج منها يترك المالك
11
+ * بأثر مكدّس بدل جملةٍ تقول له ما حال نظامه الآن.
12
+ *
13
+ * EN: Returns the system to what it was: stops whatever started, restores the tree, then starts.
14
+ *
15
+ * **It stops first even when the caller believes nothing started.** A failed health check means
16
+ * the service **did** start on the new bundle and did not answer — so a live process is holding
17
+ * the new tree's files, and renaming over it fails on Windows. Stopping before rolling back is
18
+ * what makes the rollback possible.
19
+ *
20
+ * **And it returns a report rather than throwing.** This is the last safety net on the path: an
21
+ * exception escaping it leaves the owner with a stack trace instead of a sentence telling them
22
+ * what state their system is in now.
23
+ */
24
+ export async function rollback(profile, handle) {
25
+ try {
26
+ await stopServices(profile);
27
+ }
28
+ catch {
29
+ // الإيقاف الفاشل لا يمنع المحاولة: قد لا تكون هناك عملية أصلًا.
30
+ }
31
+ try {
32
+ await undoSwap(handle);
33
+ }
34
+ catch (error) {
35
+ return {
36
+ restored: false,
37
+ running: false,
38
+ problem: `تعذّرت إعادة النسخة السابقة من ${handle.previous}: ` +
39
+ `${error instanceof Error ? error.message : error}`,
40
+ };
41
+ }
42
+ try {
43
+ const started = await startServices(profile);
44
+ return { restored: true, running: started.ok };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ restored: true,
49
+ running: false,
50
+ problem: error instanceof Error ? error.message : String(error),
51
+ };
52
+ }
53
+ }
54
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAyBvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,MAAkB;IACjE,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,OAAO,EACL,kCAAkC,MAAM,CAAC,QAAQ,IAAI;gBACrD,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;SACtD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare const PACKAGE_NAME = "@wasmsoft/fantastic";
2
+ export interface PublishedVersion {
3
+ version: string;
4
+ /** هل المنشور أحدث ممّا هو مثبَّت؟ */
5
+ newer: boolean;
6
+ }
7
+ /**
8
+ * AR: يعيد ‎undefined‎ عند أيّ تعذّر — شبكةٌ مقطوعة، سِجلٌّ صامت، ردٌّ لا يُفهَم. **والصمت هنا
9
+ * جوابٌ صحيح**: جهازٌ في استراحةٍ بلا إنترنت يجب أن يعمل بكل أوامره، وسؤالٌ عن تحديثٍ فشل
10
+ * ليس عطلًا يستحقّ رسالة حمراء.
11
+ * EN: Returns `undefined` on any failure — a cut network, a silent registry, an answer that makes no
12
+ * sense. **And silence is a correct answer here**: an appliance in a rest-house with no internet
13
+ * must run every command, and a failed update check is not a fault deserving a red message.
14
+ */
15
+ export declare function latestPublished(): Promise<PublishedVersion | undefined>;
16
+ //# sourceMappingURL=self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../src/updating/self.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAKlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAiB7E"}
@@ -0,0 +1,50 @@
1
+ import { VERSION } from "../version.js";
2
+ import { compareVersions } from "../acquire/compatibility.js";
3
+ // AR: سؤال السِّجلّ العام عن أحدث إصدارٍ من الواجهة نفسها (٠٢٦/US4).
4
+ //
5
+ // **مصدرٌ واحد للسؤال، ومستهلكان**: أمر ‎self-update‎، والإعلان العابر الذي يظهر مرّةً في
6
+ // ‎doctor‎. ونسختان من نفس النداء كانتا ستفترقان في المهلة أو في قراءة الردّ.
7
+ //
8
+ // **والمهلة قصيرة عمدًا.** هذا نداءٌ إضافيّ لا يطلبه المستخدم، وسِجلٌّ بطيء أو شبكةٌ صامتة
9
+ // يجب ألّا يعلّقا أمرًا جاء ليقول حالة نظام. ثانيتان تكفيان لسؤالٍ ناجح، وما زاد عليهما لا
10
+ // يستحقّ انتظار الفنّي.
11
+ // EN: Asking the public registry for the CLI's own newest version (026/US4).
12
+ //
13
+ // **One source for the question, two consumers**: the `self-update` command, and the passing
14
+ // notice shown once by `doctor`. Two copies of the same call would drift in their timeout or in
15
+ // how they read the answer.
16
+ //
17
+ // **And the timeout is deliberately short.** This is an extra call the user never asked for, and
18
+ // a slow registry or a silent network must not hang a command that came to report a system's
19
+ // state. Two seconds suffice for a successful ask, and anything beyond is not worth a
20
+ // technician's waiting.
21
+ export const PACKAGE_NAME = "@wasmsoft/fantastic";
22
+ const REGISTRY = "https://registry.npmjs.org";
23
+ const TIMEOUT_MS = 2_000;
24
+ /**
25
+ * AR: يعيد ‎undefined‎ عند أيّ تعذّر — شبكةٌ مقطوعة، سِجلٌّ صامت، ردٌّ لا يُفهَم. **والصمت هنا
26
+ * جوابٌ صحيح**: جهازٌ في استراحةٍ بلا إنترنت يجب أن يعمل بكل أوامره، وسؤالٌ عن تحديثٍ فشل
27
+ * ليس عطلًا يستحقّ رسالة حمراء.
28
+ * EN: Returns `undefined` on any failure — a cut network, a silent registry, an answer that makes no
29
+ * sense. **And silence is a correct answer here**: an appliance in a rest-house with no internet
30
+ * must run every command, and a failed update check is not a fault deserving a red message.
31
+ */
32
+ export async function latestPublished() {
33
+ try {
34
+ const response = await fetch(`${REGISTRY}/${encodeURIComponent(PACKAGE_NAME)}/latest`, {
35
+ signal: AbortSignal.timeout(TIMEOUT_MS),
36
+ headers: { accept: "application/vnd.npm.install-v1+json" },
37
+ });
38
+ if (!response.ok)
39
+ return undefined;
40
+ const payload = (await response.json());
41
+ const version = payload.version?.trim();
42
+ if (!version)
43
+ return undefined;
44
+ return { version, newer: compareVersions(version, VERSION) > 0 };
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ //# sourceMappingURL=self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self.js","sourceRoot":"","sources":["../../src/updating/self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,qEAAqE;AACrE,EAAE;AACF,8FAA8F;AAC9F,kFAAkF;AAClF,EAAE;AACF,+FAA+F;AAC/F,+FAA+F;AAC/F,4BAA4B;AAC5B,6EAA6E;AAC7E,EAAE;AACF,iGAAiG;AACjG,oGAAoG;AACpG,gCAAgC;AAChC,EAAE;AACF,qGAAqG;AACrG,iGAAiG;AACjG,0FAA0F;AAC1F,4BAA4B;AAE5B,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAC9C,MAAM,UAAU,GAAG,KAAK,CAAC;AAQzB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,IAAI,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE;YACrF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;YACvC,OAAO,EAAE,EAAE,MAAM,EAAE,qCAAqC,EAAE;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAEnC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ export type ChecksumOutcome = {
2
+ ok: true;
3
+ } | {
4
+ ok: false;
5
+ message: string;
6
+ expected: string;
7
+ actual: string;
8
+ };
9
+ /**
10
+ * AR: يقارن بصمة الملفّ المنزَّل بالبصمة الموثوقة.
11
+ *
12
+ * ويُفحَص الحجم أوّلًا لأنه يفرّق سببين بعلاجين: ملفٌّ **أقصر** يعني اتصالًا قُطع، وعلاجُه
13
+ * إعادةُ التنزيل؛ وملفٌّ بالحجم الصحيح ببصمة مختلفة يعني **تبديلًا أو تلفًا**، وعلاجه
14
+ * ليس إعادة المحاولة. رسالةٌ واحدة لكليهما تُرسل الفنيّ في الاتجاه الخطأ نصف الوقت.
15
+ * EN: Compares the downloaded file's digest against the trusted one.
16
+ *
17
+ * Size is checked first because it separates two causes with two remedies: a **shorter** file
18
+ * means a cut connection and the remedy is downloading again; a file of the right size with a
19
+ * different digest means **substitution or corruption**, and retrying is not the remedy. One
20
+ * message for both sends the technician the wrong way half the time.
21
+ */
22
+ export declare function verifyChecksum(file: string, expectedSha256: string, expectedBytes: number): Promise<ChecksumOutcome>;
23
+ /** يحسب البصمة بالبثّ. نصف غيغابايت في ذاكرة جهاز الاستراحة يقتله. */
24
+ export declare function sha256Of(file: string): Promise<string>;
25
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/updating/verify.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CA6B1B;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStD"}