@underpostnet/cyberia 3.2.90 → 3.3.73

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 (490) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +16 -0
  3. package/.github/workflows/coverall.cyberia.ci.yml +107 -0
  4. package/.github/workflows/cyberia-client.cd.yml +6 -18
  5. package/.github/workflows/cyberia-server.cd.yml +6 -18
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +6 -78
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +42 -21
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +2 -9
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +47 -0
  22. package/CHANGELOG.md +581 -2417
  23. package/CLI-HELP.md +416 -127
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +4 -4
  27. package/README.md +21 -1
  28. package/bin/build.js +70 -43
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +372 -135
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +372 -135
  33. package/compose.env +16 -0
  34. package/conf.js +93 -4
  35. package/deploy/cyberia-client/deploy.sh +47 -0
  36. package/deploy/cyberia-client/package.sh +18 -0
  37. package/deploy/cyberia-client/state.sh +14 -0
  38. package/deploy/cyberia-server/deploy.sh +47 -0
  39. package/deploy/cyberia-server/package.sh +18 -0
  40. package/deploy/cyberia-server/state.sh +14 -0
  41. package/deploy/dd-cyberia/deploy.sh +22 -0
  42. package/deploy/dd-cyberia/init.sh +55 -0
  43. package/deploy/dd-cyberia/package.sh +17 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +116 -0
  46. package/deploy/lib/github-actions-logging.sh +594 -0
  47. package/deploy/lib/host.sh +185 -0
  48. package/deploy/lib/state.sh +62 -0
  49. package/deploy/pwa-microservices-template/deploy.sh +45 -0
  50. package/deploy/release/deploy.sh +32 -0
  51. package/deployment.yaml +7 -2
  52. package/docker-compose.yml +31 -37
  53. package/examples/static-page/README.md +19 -19
  54. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  55. package/hardhat/hardhat.config.js +1 -6
  56. package/hardhat/package-lock.json +104 -43
  57. package/hardhat/package.json +3 -3
  58. package/manifests/alertmanager/deployment.yaml +81 -0
  59. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  60. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
  61. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
  62. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  63. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  64. package/manifests/grafana/deployment.yaml +26 -7
  65. package/manifests/grafana/kustomization.yaml +1 -0
  66. package/manifests/grafana/service.yaml +6 -1
  67. package/manifests/mariadb/pv.yaml +1 -0
  68. package/manifests/mongodb/statefulset.yaml +9 -2
  69. package/manifests/mysql/pv-pvc.yaml +14 -1
  70. package/manifests/postgresql/pv.yaml +12 -1
  71. package/manifests/postgresql/pvc.yaml +1 -0
  72. package/manifests/prometheus/deployment.yaml +18 -22
  73. package/package.json +83 -10
  74. package/scripts/audit-selinux.sh +64 -0
  75. package/scripts/event-monitor.sh +56 -0
  76. package/scripts/gpu-diag.sh +0 -0
  77. package/scripts/ip-info.sh +0 -0
  78. package/scripts/k3s-node-setup.sh +30 -14
  79. package/scripts/kubeadm-node-setup.sh +40 -31
  80. package/scripts/lxd-vm-setup.sh +0 -0
  81. package/scripts/maas-nat-firewalld.sh +0 -0
  82. package/scripts/maas-setup.sh +8 -8
  83. package/scripts/nat-iptables.sh +2 -0
  84. package/scripts/rhel-grpc-setup.sh +0 -0
  85. package/scripts/rocky-kickstart.sh +25 -9
  86. package/scripts/selinux-normalize.sh +907 -0
  87. package/scripts/shutdown-machine.sh +843 -0
  88. package/scripts/test-monitor.sh +3 -3
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  99. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  100. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  101. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  102. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  103. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  104. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  105. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  106. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  107. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  108. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  109. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  110. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  111. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  112. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  113. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
  114. package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
  115. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  116. package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
  117. package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
  118. package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
  119. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  120. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
  121. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  122. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  123. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  124. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  125. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  126. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  127. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  128. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  129. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  130. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  131. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  132. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  133. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  134. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  135. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
  136. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  137. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  138. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  139. package/src/api/default/default.controller.js +1 -1
  140. package/src/api/default/default.router.js +1 -1
  141. package/src/api/default/default.service.js +2 -2
  142. package/src/api/document/document.controller.js +1 -1
  143. package/src/api/document/document.router.js +1 -1
  144. package/src/api/document/document.service.js +2 -2
  145. package/src/api/file/file.controller.js +1 -1
  146. package/src/api/file/file.router.js +1 -1
  147. package/src/api/file/file.service.js +2 -2
  148. package/src/api/instance/instance.controller.js +1 -1
  149. package/src/api/instance/instance.router.js +1 -1
  150. package/src/api/instance/instance.service.js +2 -2
  151. package/src/api/ipfs/ipfs.controller.js +1 -1
  152. package/src/api/ipfs/ipfs.router.js +2 -2
  153. package/src/api/ipfs/ipfs.service.js +2 -2
  154. package/src/api/object-layer/object-layer.controller.js +1 -1
  155. package/src/api/object-layer/object-layer.model.js +204 -3
  156. package/src/api/object-layer/object-layer.router.js +2 -2
  157. package/src/api/object-layer/object-layer.service.js +4 -17
  158. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  159. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  160. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  161. package/src/api/test/test.controller.js +1 -1
  162. package/src/api/test/test.service.js +1 -1
  163. package/src/api/user/guest.service.js +3 -3
  164. package/src/api/user/user.controller.js +1 -1
  165. package/src/api/user/user.router.js +2 -2
  166. package/src/api/user/user.service.js +4 -4
  167. package/src/api.js +5 -9
  168. package/src/cli/app.js +391 -0
  169. package/src/cli/baremetal.js +30 -36
  170. package/src/cli/client.js +306 -0
  171. package/src/cli/cloud-init.js +3 -3
  172. package/src/cli/cluster.js +242 -135
  173. package/src/cli/db.js +126 -67
  174. package/src/cli/deploy.js +158 -60
  175. package/src/cli/docker-compose.js +5 -5
  176. package/src/cli/domains.js +184 -0
  177. package/src/cli/dotenv-store.js +143 -0
  178. package/src/cli/event.js +2281 -0
  179. package/src/cli/fs.js +3 -3
  180. package/src/cli/host.js +672 -0
  181. package/src/cli/image.js +4 -7
  182. package/src/cli/index.js +426 -134
  183. package/src/cli/ipfs.js +34 -30
  184. package/src/cli/kickstart.js +1 -1
  185. package/src/cli/kubectl.js +218 -41
  186. package/src/cli/lxd.js +3 -3
  187. package/src/cli/monitor.js +1359 -26
  188. package/src/cli/package.js +90 -0
  189. package/src/cli/release.js +73 -34
  190. package/src/cli/repository.js +564 -367
  191. package/src/cli/run.js +362 -654
  192. package/src/cli/secrets.js +2158 -964
  193. package/src/cli/ssh.js +651 -331
  194. package/src/cli/state.js +394 -0
  195. package/src/cli/static.js +2 -2
  196. package/src/cli/system.js +26 -13
  197. package/src/cli/test.js +199 -125
  198. package/src/cli/vultr.js +623 -0
  199. package/src/cli/wireguard.js +2930 -0
  200. package/src/client/components/core/CalendarCore.js +53 -96
  201. package/src/client/components/core/Docs.js +258 -211
  202. package/src/client/components/core/FileExplorer.js +0 -21
  203. package/src/client/components/core/PanelForm.js +4 -4
  204. package/src/client/components/core/Repository.js +56 -0
  205. package/src/client/components/core/Translate.js +7 -0
  206. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  207. package/src/client/components/core/Wallet.js +0 -11
  208. package/src/client/components/core/Worker.js +7 -1
  209. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  210. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
  211. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
  212. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
  213. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  214. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  215. package/src/client/components/default/AppShellDefault.js +1 -1
  216. package/src/client/components/default/SettingsDefault.js +2 -2
  217. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  218. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  219. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  220. package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
  221. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  222. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
  223. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  224. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  225. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  226. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  227. package/src/client/public/default/android-chrome-144x144.png +0 -0
  228. package/src/client/public/default/android-chrome-192x192.png +0 -0
  229. package/src/client/public/default/android-chrome-256x256.png +0 -0
  230. package/src/client/public/default/android-chrome-36x36.png +0 -0
  231. package/src/client/public/default/android-chrome-384x384.png +0 -0
  232. package/src/client/public/default/android-chrome-48x48.png +0 -0
  233. package/src/client/public/default/android-chrome-512x512.png +0 -0
  234. package/src/client/public/default/android-chrome-72x72.png +0 -0
  235. package/src/client/public/default/android-chrome-96x96.png +0 -0
  236. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  237. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  238. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  239. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  240. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  241. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  242. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  243. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  244. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  245. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  246. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  247. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  248. package/src/client/public/default/apple-touch-icon.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  264. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  265. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  266. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  267. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  268. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  269. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  270. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  271. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  272. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  273. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  274. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  275. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  276. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  277. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  278. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  279. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  280. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  281. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  282. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  283. package/src/client/public/default/assets/background/white.jpg +0 -0
  284. package/src/client/public/default/browserconfig.xml +1 -1
  285. package/src/client/public/default/favicon-16x16.png +0 -0
  286. package/src/client/public/default/favicon-32x32.png +0 -0
  287. package/src/client/public/default/favicon-48x48.png +0 -0
  288. package/src/client/public/default/favicon.ico +0 -0
  289. package/src/client/public/default/manifest.webmanifest +5 -5
  290. package/src/client/public/default/mstile-144x144.png +0 -0
  291. package/src/client/public/default/mstile-150x150.png +0 -0
  292. package/src/client/public/default/mstile-310x150.png +0 -0
  293. package/src/client/public/default/mstile-310x310.png +0 -0
  294. package/src/client/public/default/mstile-70x70.png +0 -0
  295. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  296. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  297. package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
  298. package/src/client/services/object-layer/object-layer.management.js +4 -4
  299. package/src/client/ssr/RootDocument.js +1 -1
  300. package/src/client/ssr/body/404.js +1 -1
  301. package/src/client/ssr/body/500.js +1 -1
  302. package/src/client/ssr/body/CacheControl.js +1 -1
  303. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  304. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  305. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  306. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  307. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  308. package/src/client/ssr/head/Css.js +1 -1
  309. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  310. package/src/client/ssr/head/DefaultScripts.js +1 -1
  311. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  312. package/src/client/ssr/head/Microdata.js +1 -1
  313. package/src/client/ssr/head/Production.js +1 -1
  314. package/src/client/ssr/head/Pwa.js +1 -1
  315. package/src/client/ssr/head/PwaItemledger.js +1 -1
  316. package/src/client/ssr/head/Seo.js +1 -1
  317. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  318. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  319. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  320. package/src/client/ssr/views/Cyberia404.js +7 -5
  321. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  322. package/src/client/ssr/views/Maintenance.js +1 -1
  323. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  324. package/src/client/ssr/views/Test.js +1 -1
  325. package/src/client/sw/core.sw.js +20 -14
  326. package/src/client-builder/client-build-docs.js +61 -46
  327. package/src/client-builder/client-build-live.js +2 -2
  328. package/src/client-builder/client-build.js +58 -44
  329. package/src/client-builder/client-dev-server.js +3 -3
  330. package/src/client-builder/client-icons.js +2 -2
  331. package/src/client-builder/ssr.js +3 -3
  332. package/src/client.build.js +3 -6
  333. package/src/client.dev.js +3 -6
  334. package/src/db/DataBaseProvider.js +186 -3
  335. package/src/db/mariadb/MariaDB.js +3 -2
  336. package/src/db/mongo/MongoBootstrap.js +273 -101
  337. package/src/db/mongo/MongooseDB.js +11 -8
  338. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  339. package/src/grpc/cyberia/grpc-server.js +1 -1
  340. package/src/index.js +103 -23
  341. package/src/mailer/EmailRender.js +2 -2
  342. package/src/mailer/MailerInterceptor.js +87 -0
  343. package/src/mailer/MailerProvider.js +50 -6
  344. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  345. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  346. package/src/projects/cyberia/catalog-cyberia.js +54 -6
  347. package/src/projects/cyberia/gemini-client.js +1 -1
  348. package/src/projects/cyberia/generate-saga.js +15 -24
  349. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  350. package/src/projects/cyberia/instance-data.js +22 -3
  351. package/src/projects/cyberia/ipfs-client.js +4 -4
  352. package/src/projects/cyberia/map-preview-generator.js +1 -1
  353. package/src/projects/cyberia/object-layer.js +12 -22
  354. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  355. package/src/projects/underpost/catalog-underpost.js +13 -2
  356. package/src/proxy.js +4 -7
  357. package/src/runtime/cyberia-client/Dockerfile +9 -4
  358. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  359. package/src/runtime/cyberia-server/Dockerfile +9 -4
  360. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  361. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  362. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  363. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  364. package/src/runtime/engine-cyberia/compose.env +16 -0
  365. package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
  366. package/src/runtime/express/Express.js +32 -27
  367. package/src/runtime/lampp/Lampp.js +22 -70
  368. package/src/runtime/nginx/Nginx.js +1 -1
  369. package/src/runtime/wp/Wp.js +16 -48
  370. package/src/server/{catalog.js → build/catalog.js} +15 -5
  371. package/src/server/build/coverage.js +117 -0
  372. package/src/server/build/execution.js +402 -0
  373. package/src/server/build/package.js +465 -0
  374. package/src/server/build/testing.js +528 -0
  375. package/src/server/{dns.js → network/dns.js} +241 -14
  376. package/src/server/network/forward-proxy.js +541 -0
  377. package/src/server/{middlewares.js → network/middlewares.js} +59 -4
  378. package/src/server/network/node-capability.js +98 -0
  379. package/src/server/{peer.js → network/peer.js} +3 -3
  380. package/src/server/{proxy.js → network/proxy.js} +7 -13
  381. package/src/server/network/router.js +356 -0
  382. package/src/server/{tls.js → network/tls.js} +2 -2
  383. package/src/server/network/underpost-compression.js +186 -0
  384. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
  385. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
  386. package/src/server/{cri.js → ops/cri.js} +2 -2
  387. package/src/server/ops/cron.js +949 -0
  388. package/src/server/ops/event-notification.js +284 -0
  389. package/src/server/{logger.js → ops/logger.js} +108 -23
  390. package/src/server/ops/monitoring.js +1724 -0
  391. package/src/server/ops/systemd.js +259 -0
  392. package/src/server/{conf.js → runtime/conf.js} +521 -520
  393. package/src/server/runtime/config-scope.js +215 -0
  394. package/src/server/runtime/environment.js +149 -0
  395. package/src/server/{process.js → runtime/process.js} +153 -13
  396. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  397. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  398. package/src/server/{start.js → runtime/start.js} +128 -39
  399. package/src/server/{auth.js → security/auth.js} +7 -8
  400. package/src/server/security/container-storage.js +382 -0
  401. package/src/server/{crypto.js → security/crypto.js} +1 -1
  402. package/src/server/security/selinux.js +185 -0
  403. package/src/server/{backup.js → storage/backup.js} +17 -8
  404. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  405. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  406. package/src/server/storage/repository.js +68 -0
  407. package/src/server.js +4 -7
  408. package/src/ws/IoInterface.js +1 -1
  409. package/src/ws/IoServer.js +1 -1
  410. package/src/ws/core/core.ws.connection.js +1 -1
  411. package/src/ws/core/core.ws.emit.js +1 -1
  412. package/src/ws/core/core.ws.server.js +1 -1
  413. package/src/ws/default/default.ws.connection.js +1 -1
  414. package/src/ws/default/default.ws.emit.js +1 -1
  415. package/src/ws/default/default.ws.server.js +1 -1
  416. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  417. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  418. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  419. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  420. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  421. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
  422. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  423. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  424. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  425. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  426. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  427. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  428. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  429. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  430. package/test/integration/infra/1-security/selinux.test.js +69 -0
  431. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  432. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  433. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  434. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  435. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  436. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  437. package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
  438. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  439. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  440. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  441. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  442. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  443. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  444. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
  445. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
  446. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  447. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  448. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  449. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  450. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  451. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  452. package/test/support/shell-harness.js +73 -0
  453. package/test/unit/build-template.test.js +97 -0
  454. package/test/unit/build-workflow-offline.test.js +132 -0
  455. package/test/unit/catalog.test.js +71 -0
  456. package/test/unit/client-build-docs.test.js +334 -0
  457. package/test/unit/conf-loading.test.js +303 -0
  458. package/test/unit/conf-resolution.test.js +979 -0
  459. package/test/unit/coverage-artifact.test.js +130 -0
  460. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  461. package/test/unit/deploy-env-resolution.test.js +38 -0
  462. package/test/unit/deploy-log-table.test.js +447 -0
  463. package/test/unit/execution-profiles.test.js +219 -0
  464. package/test/unit/fleet-sync-source.test.js +149 -0
  465. package/test/unit/logger-redaction.test.js +112 -0
  466. package/test/unit/package.test.js +403 -0
  467. package/test/unit/prepare-host.test.js +299 -0
  468. package/test/unit/process-environment.test.js +18 -0
  469. package/test/unit/propagation-message.test.js +78 -0
  470. package/test/unit/redeploy-plan.test.js +24 -0
  471. package/test/unit/release-bump.test.js +474 -0
  472. package/test/unit/ssh-output-redaction.test.js +28 -0
  473. package/test/unit/start-options.test.js +46 -0
  474. package/test/unit/test-tiers.test.js +193 -0
  475. package/vitest.config.js +58 -0
  476. package/.nycrc +0 -9
  477. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  478. package/manifests/mongodb/pv-pvc.yaml +0 -59
  479. package/scripts/link-local-underpost-cli.sh +0 -6
  480. package/src/api/user/user.build.js +0 -16
  481. package/src/cli/env.js +0 -177
  482. package/src/client/components/core/Blockchain.js +0 -41
  483. package/src/client/components/core/Blog.js +0 -9
  484. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  485. package/src/client/public/default/assets/background/dark.jpg +0 -0
  486. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  487. package/src/client/public/default/assets/background/white0.jpg +0 -0
  488. package/src/client/public/doc/favicon.ico +0 -0
  489. package/src/client/public/doc/sitemap +0 -148
  490. package/src/server/cron.js +0 -476
@@ -0,0 +1,98 @@
1
+ /**
2
+ * What each node role is allowed to do, as one table the rest of the platform reads.
3
+ *
4
+ * The roles are the three the topology already defines — `hub`, `control`, `worker` — and this
5
+ * module adds no fourth. What it adds is a single answer to a question that was previously spread
6
+ * across the commands that happened to ask it: `wireguard` knew HAProxy is hub-only, `event` knew
7
+ * the dispatcher is control-only, and the sync steps knew cron publication is control-only, but
8
+ * nothing stated the boundary those three agree on.
9
+ *
10
+ * The distinction the table exists to hold is between a Kubernetes **node** and a Kubernetes
11
+ * **administrator**. A worker runs the kubelet and joins the cluster; that is node runtime, and it
12
+ * is not permission to administer the cluster it belongs to. Being managed by the host domain is
13
+ * not permission either — `underpost host` is node-level operational configuration, and every role
14
+ * has it.
15
+ *
16
+ * @module src/server/network/node-capability.js
17
+ * @namespace NodeCapability
18
+ */
19
+
20
+ /**
21
+ * @constant NODE_CAPABILITIES
22
+ * @description Capabilities held by each role, derived from the operations the repository
23
+ * actually gates: HAProxy and the forward proxy refuse to configure themselves off the hub, the
24
+ * dispatcher refuses to install off a control node, and the sync sequence publishes CronJobs from
25
+ * the control node alone.
26
+ * @memberof NodeCapability
27
+ */
28
+ const NODE_CAPABILITIES = Object.freeze({
29
+ hub: Object.freeze([
30
+ 'host-configuration',
31
+ 'wireguard-hub',
32
+ 'haproxy',
33
+ 'forward-proxy',
34
+ 'edge-routing',
35
+ 'node-metrics',
36
+ ]),
37
+ control: Object.freeze([
38
+ 'host-configuration',
39
+ 'wireguard-spoke',
40
+ 'kubernetes-node',
41
+ 'kubernetes-administration',
42
+ 'cluster-secret-administration',
43
+ 'cron-publication',
44
+ 'event-service',
45
+ 'node-metrics',
46
+ ]),
47
+ worker: Object.freeze(['host-configuration', 'wireguard-spoke', 'kubernetes-node', 'node-metrics']),
48
+ });
49
+
50
+ /** The roles the topology defines. Ordered hub-first, as every fleet listing is. */
51
+ const NODE_ROLES = Object.freeze(Object.keys(NODE_CAPABILITIES));
52
+
53
+ /**
54
+ * Capabilities that reach the Kubernetes API with cluster-wide authority.
55
+ *
56
+ * Named apart from the rest because they are the ones a role must never acquire by side effect:
57
+ * possessing `kubectl`, joining the cluster, or carrying the host environment are each a reason
58
+ * someone might assume these follow, and none of them is.
59
+ * @memberof NodeCapability
60
+ */
61
+ const CLUSTER_ADMIN_CAPABILITIES = Object.freeze([
62
+ 'kubernetes-administration',
63
+ 'cluster-secret-administration',
64
+ 'cron-publication',
65
+ ]);
66
+
67
+ /**
68
+ * Whether a role holds a capability.
69
+ * @param {string} role - `hub`, `control` or `worker`.
70
+ * @param {string} capability - Capability name.
71
+ * @returns {boolean} True when the role holds it.
72
+ * @memberof NodeCapability
73
+ */
74
+ const roleHasCapability = (role, capability) => (NODE_CAPABILITIES[role] || []).includes(capability);
75
+
76
+ /**
77
+ * Refuses an operation the role does not hold the capability for.
78
+ *
79
+ * Fail-closed on an unknown role as well as an unheld capability: a node whose document names a
80
+ * role this table does not define has no capabilities, rather than the union of the ones it might
81
+ * have meant.
82
+ * @param {object} params - Assertion context.
83
+ * @param {string} params.role - Role of the node the operation would run on.
84
+ * @param {string} params.capability - Capability the operation requires.
85
+ * @param {string} params.operation - Operation being attempted, named in the refusal.
86
+ * @throws {Error} When the role does not hold the capability.
87
+ * @memberof NodeCapability
88
+ */
89
+ const assertRoleCapability = ({ role, capability, operation }) => {
90
+ if (roleHasCapability(role, capability)) return;
91
+ const held = NODE_CAPABILITIES[role];
92
+ throw new Error(
93
+ `[capability] ${operation} requires '${capability}', which the '${role || '(unset)'}' role does not hold; ` +
94
+ (held ? `it holds ${held.join(', ')}` : `known roles are ${NODE_ROLES.join(', ')}`),
95
+ );
96
+ };
97
+
98
+ export { CLUSTER_ADMIN_CAPABILITIES, NODE_CAPABILITIES, NODE_ROLES, assertRoleCapability, roleHasCapability };
@@ -3,14 +3,14 @@
3
3
  * Initializes and configures the PeerJS server instance, typically running
4
4
  * alongside a main Node.js application.
5
5
  *
6
- * @module src/server/peer.js
6
+ * @module src/server/network/peer.js
7
7
  * @namespace Peer
8
8
  */
9
9
 
10
10
  import { PeerServer } from 'peer';
11
11
  import dotenv from 'dotenv';
12
- import { loggerFactory } from './logger.js';
13
- import Underpost from '../index.js';
12
+ import { loggerFactory } from '../ops/logger.js';
13
+ import Underpost from '../../index.js';
14
14
 
15
15
  /**
16
16
  * Logger instance for this module, utilizing the framework's factory.
@@ -1,26 +1,20 @@
1
1
  /**
2
2
  * Manages the creation and configuration of the reverse proxy server,
3
3
  * including handling HTTP/HTTPS listeners and routing based on host configuration.
4
- * @module src/server/proxy.js
4
+ * @module src/server/network/proxy.js
5
5
  * @namespace ProxyService
6
6
  */
7
7
  'use strict';
8
8
 
9
9
  import express from 'express';
10
10
  import { createProxyMiddleware } from 'http-proxy-middleware';
11
- import { loggerFactory, loggerMiddleware } from './logger.js';
12
- import {
13
- buildPortProxyRouter,
14
- buildProxyRouter,
15
- etcHostFactory,
16
- getTlsHosts,
17
- isDevProxyContext,
18
- isTlsDevProxy,
19
- } from './conf.js';
20
-
21
- import { shellExec } from './process.js';
11
+ import { loggerFactory, loggerMiddleware } from '../ops/logger.js';
12
+ import { etcHostFactory, getTlsHosts, isDevProxyContext, isTlsDevProxy } from '../runtime/conf.js';
13
+ import { buildPortProxyRouter, buildProxyRouter } from './router.js';
14
+
15
+ import { shellExec } from '../runtime/process.js';
22
16
  import fs from 'fs-extra';
23
- import Underpost from '../index.js';
17
+ import Underpost from '../../index.js';
24
18
 
25
19
  const logger = loggerFactory(import.meta);
26
20
 
@@ -0,0 +1,356 @@
1
+ /**
2
+ * The deploy route registry, and the routers built from it.
3
+ *
4
+ * Two levels of "route" meet here, which is why they share a module:
5
+ *
6
+ * - `engine-private/deploy/dd.routes` lists the deploy ids this engine serves.
7
+ * It is the cluster's route table at the deploy level, and every command that
8
+ * accepts the `dd` meta id expands it through this file.
9
+ * - The proxy routers map `<host><path>` to the local port a runtime bound, and
10
+ * are derived from each deploy's `conf.server.json`.
11
+ *
12
+ * Keeping both here means the file path is written once and the port arithmetic
13
+ * lives beside the list it is computed for.
14
+ *
15
+ * @module src/server/network/router.js
16
+ * @namespace ServerRouter
17
+ */
18
+
19
+ import fs from 'fs-extra';
20
+ import { newInstance, orderArrayFromAttrInt, range } from '../../client/components/core/CommonJs.js';
21
+ import { loggerFactory } from '../ops/logger.js';
22
+ import { Config, DEFAULT_DEPLOY_ID, isDevProxyContext, isTlsDevProxy, loadConfServerJson } from '../runtime/conf.js';
23
+
24
+ const logger = loggerFactory(import.meta);
25
+
26
+ /**
27
+ * @constant DEPLOY_ROUTES_PATH
28
+ * @description The deploy route table: a comma separated list of the deploy ids
29
+ * this engine serves.
30
+ * @memberof ServerRouter
31
+ */
32
+ const DEPLOY_ROUTES_PATH = './engine-private/deploy/dd.routes';
33
+
34
+ /**
35
+ * @method deployRoutesExists
36
+ * @description Whether the route table is present.
37
+ * @returns {boolean} True when the engine has a route table.
38
+ * @memberof ServerRouter
39
+ */
40
+ const deployRoutesExists = () => fs.existsSync(DEPLOY_ROUTES_PATH);
41
+
42
+ /**
43
+ * @method readDeployRoutes
44
+ * @description The deploy ids in the route table, trimmed and without empties.
45
+ * @returns {string[]} Deploy ids, empty when no table exists.
46
+ * @memberof ServerRouter
47
+ */
48
+ const readDeployRoutes = () =>
49
+ deployRoutesExists() ? parseDeployRoutes(fs.readFileSync(DEPLOY_ROUTES_PATH, 'utf8')) : [];
50
+
51
+ /**
52
+ * @method parseDeployRoutes
53
+ * @description Parses route table contents. Kept separate from the read so the
54
+ * parsing is testable without a checkout.
55
+ * @param {string} [contents] - Raw route table contents.
56
+ * @returns {string[]} Deploy ids, trimmed, empties dropped.
57
+ * @memberof ServerRouter
58
+ */
59
+ const parseDeployRoutes = (contents = '') =>
60
+ `${contents || ''}`
61
+ .split(',')
62
+ .map((id) => id.trim())
63
+ .filter(Boolean);
64
+
65
+ /**
66
+ * @method registerDeployRoute
67
+ * @description Appends a deploy id to the route table, creating it when absent.
68
+ *
69
+ * Idempotent: a deploy already routed is left alone rather than listed twice,
70
+ * which would make every `dd` fan-out build and deploy it twice.
71
+ * @param {string} deployId - Deploy id to route.
72
+ * @returns {string[]} The resulting route table.
73
+ * @memberof ServerRouter
74
+ */
75
+ const registerDeployRoute = (deployId) => {
76
+ const id = `${deployId || ''}`.trim();
77
+ if (!id) return readDeployRoutes();
78
+ const routes = readDeployRoutes();
79
+ if (routes.includes(id)) return routes;
80
+ routes.push(id);
81
+ fs.outputFileSync(DEPLOY_ROUTES_PATH, routes.join(','), 'utf8');
82
+ return routes;
83
+ };
84
+
85
+ /**
86
+ * @method resolveDeployList
87
+ * @description Resolves the concrete deploy ids a run should iterate over.
88
+ *
89
+ * The meta deploy id `dd` fans out to the route table; when no table exists
90
+ * (e.g. the private repository is not checked out) it falls back to
91
+ * {@link ServerConfBuilder.DEFAULT_DEPLOY_ID}. Any other value is parsed as a
92
+ * comma separated list.
93
+ * @param {string} deployId - A deploy id, a comma separated list, or the `dd` meta id.
94
+ * @returns {string[]} Ordered list of concrete deploy ids.
95
+ * @memberof ServerRouter
96
+ */
97
+ const resolveDeployList = (deployId) => {
98
+ if (deployId !== 'dd') return parseDeployRoutes(deployId);
99
+ const routes = readDeployRoutes();
100
+ return routes.length > 0 ? routes : parseDeployRoutes(DEFAULT_DEPLOY_ID);
101
+ };
102
+
103
+ /**
104
+ * @method buildProxyRouter
105
+ * @description Builds the proxy router.
106
+ * @memberof ServerRouter
107
+ */
108
+ const buildProxyRouter = () => {
109
+ const confServer = newInstance(Config.default.server);
110
+ let currentPort = parseInt(process.env.PORT) + 1;
111
+ const proxyRouter = {};
112
+ for (const host of Object.keys(confServer)) {
113
+ for (const path of Object.keys(confServer[host])) {
114
+ if (confServer[host][path].singleReplica) continue;
115
+
116
+ if (isDevProxyContext()) confServer[host][path].proxy = [isTlsDevProxy() ? 443 : 80];
117
+
118
+ confServer[host][path].port = newInstance(currentPort);
119
+ for (const port of confServer[host][path].proxy) {
120
+ if (!(port in proxyRouter)) proxyRouter[port] = {};
121
+ proxyRouter[port][`${host}${path}`] = {
122
+ // target: `http://${host}:${confServer[host][path].port}${path}`,
123
+ target: `http://localhost:${confServer[host][path].port}`,
124
+ // target: `http://127.0.0.1:${confServer[host][path].port}`,
125
+ proxy: confServer[host][path].proxy,
126
+ redirect: confServer[host][path].redirect,
127
+ host,
128
+ path,
129
+ };
130
+ }
131
+ currentPort++;
132
+ if (confServer[host][path].peer) {
133
+ const peerPath = path === '/' ? `/peer` : `${path}/peer`;
134
+ confServer[host][peerPath] = newInstance(confServer[host][path]);
135
+ confServer[host][peerPath].port = newInstance(currentPort);
136
+ for (const port of confServer[host][path].proxy) {
137
+ if (!(port in proxyRouter)) proxyRouter[port] = {};
138
+ proxyRouter[port][`${host}${peerPath}`] = {
139
+ // target: `http://${host}:${confServer[host][peerPath].port}${peerPath}`,
140
+ target: `http://localhost:${confServer[host][peerPath].port}`,
141
+ // target: `http://127.0.0.1:${confServer[host][peerPath].port}`,
142
+ proxy: confServer[host][peerPath].proxy,
143
+ host,
144
+ path: peerPath,
145
+ };
146
+ }
147
+ currentPort++;
148
+ }
149
+ }
150
+ }
151
+
152
+ return proxyRouter;
153
+ };
154
+
155
+ /**
156
+ * @method pathPortAssignmentFactory
157
+ * @description Creates the path port assignment.
158
+ * @param {string} deployId - The deploy ID.
159
+ * @param {object} router - The router.
160
+ * @param {object} confServer - The server configuration.
161
+ * @memberof ServerRouter
162
+ */
163
+ const pathPortAssignmentFactory = async (deployId, router, confServer) => {
164
+ const pathPortAssignmentData = {};
165
+ for (const host of Object.keys(confServer)) {
166
+ const pathPortAssignment = [];
167
+ for (const path of Object.keys(confServer[host])) {
168
+ const { peer } = confServer[host][path];
169
+ if (!router[`${host}${path === '/' ? '' : path}`]) continue;
170
+ const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
171
+ // logger.info('', { host, port, path });
172
+ pathPortAssignment.push({
173
+ port,
174
+ path,
175
+ });
176
+
177
+ if (peer) {
178
+ // logger.info('', { host, port: port + 1, path: '/peer' });
179
+ pathPortAssignment.push({
180
+ port: port + 1,
181
+ path: `${path === '/' ? '' : path}/peer`,
182
+ });
183
+ }
184
+ }
185
+ pathPortAssignmentData[host] = pathPortAssignment;
186
+ }
187
+ if (fs.existsSync(`./engine-private/replica`)) {
188
+ const singleReplicas = await fs.readdir(`./engine-private/replica`);
189
+ for (let replica of singleReplicas) {
190
+ if (replica.startsWith(deployId)) {
191
+ const replicaServerConf = loadConfServerJson(`./engine-private/replica/${replica}/conf.server.json`);
192
+ for (const host of Object.keys(replicaServerConf)) {
193
+ const pathPortAssignment = [];
194
+ for (const path of Object.keys(replicaServerConf[host])) {
195
+ const { peer } = replicaServerConf[host][path];
196
+ if (!router[`${host}${path === '/' ? '' : path}`]) continue;
197
+ const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
198
+ // logger.info('', { host, port, path });
199
+ pathPortAssignment.push({
200
+ port,
201
+ path,
202
+ });
203
+
204
+ if (peer) {
205
+ // logger.info('', { host, port: port + 1, path: '/peer' });
206
+ pathPortAssignment.push({
207
+ port: port + 1,
208
+ path: `${path === '/' ? '' : path}/peer`,
209
+ });
210
+ }
211
+ }
212
+ pathPortAssignmentData[host] = pathPortAssignmentData[host].concat(pathPortAssignment);
213
+ }
214
+ }
215
+ }
216
+ }
217
+ return pathPortAssignmentData;
218
+ };
219
+
220
+ /**
221
+ * @method deployRangePortFactory
222
+ * @description Creates the deploy range port factory.
223
+ * @param {object} router - The router.
224
+ * @returns {object} - The deploy range port factory.
225
+ * @memberof ServerRouter
226
+ */
227
+ const deployRangePortFactory = (router) => {
228
+ const ports = Object.values(router).map((p) => parseInt(p.split(':')[2]));
229
+ const fromPort = Math.min(...ports);
230
+ const toPort = Math.max(...ports);
231
+ return { ports, fromPort, toPort };
232
+ };
233
+
234
+ /**
235
+ * @method buildKindPorts
236
+ * @description Builds the kind ports.
237
+ * @param {number} from - The from port.
238
+ * @param {number} to - The to port.
239
+ * @returns {string} - The kind ports.
240
+ * @memberof ServerRouter
241
+ */
242
+ const buildKindPorts = (from, to) =>
243
+ range(parseInt(from), parseInt(to))
244
+ .map(
245
+ (port) => ` - name: 'tcp-${port}'
246
+ protocol: TCP
247
+ port: ${port}
248
+ targetPort: ${port}
249
+ - name: 'udp-${port}'
250
+ protocol: UDP
251
+ port: ${port}
252
+ targetPort: ${port}
253
+ `,
254
+ )
255
+ .join('\n');
256
+
257
+ /**
258
+ * @method buildPortProxyRouter
259
+ * @description Builds the port proxy router.
260
+ * @param {object} options - The options.
261
+ * @param {number} [options.port=4000] - The port.
262
+ * @param {object} options.proxyRouter - The proxy router.
263
+ * @param {object} [options.hosts] - The hosts.
264
+ * @param {boolean} [options.orderByPathLength=false] - Whether to order by path length.
265
+ * @param {boolean} [options.devProxyContext=false] - Whether to use dev proxy context.
266
+ * @returns {object} - The port proxy router.
267
+ * @memberof ServerRouter
268
+ */
269
+ const buildPortProxyRouter = (
270
+ options = { port: 4000, proxyRouter, hosts, orderByPathLength: false, devProxyContext: false },
271
+ ) => {
272
+ let { port, proxyRouter, hosts, orderByPathLength } = options;
273
+ hosts = hosts || proxyRouter[port] || {};
274
+
275
+ const router = {};
276
+ // build router
277
+ Object.keys(hosts).map((hostKey) => {
278
+ let { host, path, target, proxy, peer } = hosts[hostKey];
279
+
280
+ if (!proxy.includes(port)) {
281
+ logger.warn('Proxy port not set on conf', { port, host, path, proxy, target });
282
+ if (process.env.NODE_ENV === 'production') {
283
+ logger.warn('Omitting host', { host, path, target });
284
+ return;
285
+ }
286
+ }
287
+ // ${process.env.NODE_ENV === 'development' && !isDevProxyContext() ? `:${port}` : ''}
288
+ const absoluteHost = [80, 443].includes(port)
289
+ ? `${host}${path === '/' ? '' : path}`
290
+ : `${host}:${port}${path === '/' ? '' : path}`;
291
+
292
+ if (absoluteHost in router)
293
+ logger.warn('Overwrite: Absolute host already exists on router', { absoluteHost, target });
294
+
295
+ if (options.devProxyContext === true) {
296
+ const appDevPort = parseInt(target.split(':')[2]) - process.env.DEV_PROXY_PORT_OFFSET;
297
+ router[absoluteHost] = `http://localhost:${appDevPort}`;
298
+ } else router[absoluteHost] = target;
299
+ }); // order router
300
+
301
+ if (Object.keys(router).length === 0) return router;
302
+
303
+ const devApiConfPath = `./engine-private/conf/${process.argv[3]}/conf.server.dev.${process.argv[4]}-dev-api.json`;
304
+ if (options.devProxyContext === true && process.env.NODE_ENV === 'development' && fs.existsSync(devApiConfPath)) {
305
+ const confDevApiServer = JSON.parse(fs.readFileSync(devApiConfPath, 'utf8'));
306
+ let devApiHosts = [];
307
+ let origins = [];
308
+ for (const _host of Object.keys(confDevApiServer))
309
+ for (const _path of Object.keys(confDevApiServer[_host])) {
310
+ if (confDevApiServer[_host][_path].origins && confDevApiServer[_host][_path].origins.length) {
311
+ origins.push(...confDevApiServer[_host][_path].origins);
312
+ if (_path !== 'peer' && devApiHosts.length === 0)
313
+ devApiHosts.push(
314
+ `${_host}${[80, 443].includes(port) && isDevProxyContext() ? '' : `:${port}`}${_path == '/' ? '' : _path}`,
315
+ );
316
+ }
317
+ }
318
+ origins = Array.from(new Set(origins));
319
+ console.log({
320
+ origins,
321
+ devApiHosts,
322
+ });
323
+ for (const devApiHost of devApiHosts) {
324
+ if (devApiHost in router) {
325
+ const target = router[devApiHost];
326
+ delete router[devApiHost];
327
+ router[`${devApiHost}/${process.env.BASE_API}`] = target;
328
+ router[`${devApiHost}/socket.io`] = target;
329
+ for (const origin of origins) router[devApiHost] = origin;
330
+ }
331
+ }
332
+ }
333
+
334
+ if (orderByPathLength === true) {
335
+ const reOrderRouter = {};
336
+ for (const absoluteHostKey of orderArrayFromAttrInt(Object.keys(router), 'length'))
337
+ reOrderRouter[absoluteHostKey] = router[absoluteHostKey];
338
+ return reOrderRouter;
339
+ }
340
+
341
+ return router;
342
+ };
343
+
344
+ export {
345
+ DEPLOY_ROUTES_PATH,
346
+ buildKindPorts,
347
+ buildPortProxyRouter,
348
+ buildProxyRouter,
349
+ deployRangePortFactory,
350
+ deployRoutesExists,
351
+ parseDeployRoutes,
352
+ pathPortAssignmentFactory,
353
+ readDeployRoutes,
354
+ registerDeployRoute,
355
+ resolveDeployList,
356
+ };
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Transport Layer Security (TLS) / SSL utilities and HTTPS server creation and management.
3
- * @module src/server/tls.js
3
+ * @module src/server/network/tls.js
4
4
  * @namespace UnderpostTLS
5
5
  */
6
6
 
7
7
  import fs from 'fs-extra';
8
8
  import https from 'https';
9
9
  import path from 'path';
10
- import { loggerFactory } from './logger.js';
10
+ import { loggerFactory } from '../ops/logger.js';
11
11
 
12
12
  const logger = loggerFactory(import.meta);
13
13