cyberia 3.1.3 → 3.2.9

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 (377) hide show
  1. package/.env.example +0 -2
  2. package/.github/workflows/engine-cyberia.cd.yml +10 -8
  3. package/.github/workflows/engine-cyberia.ci.yml +12 -29
  4. package/.github/workflows/ghpkg.ci.yml +4 -4
  5. package/.github/workflows/npmpkg.ci.yml +28 -11
  6. package/.github/workflows/publish.ci.yml +21 -2
  7. package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -5
  8. package/.github/workflows/pwa-microservices-template-test.ci.yml +3 -3
  9. package/.github/workflows/release.cd.yml +14 -10
  10. package/CHANGELOG.md +783 -1
  11. package/CLI-HELP.md +95 -18
  12. package/Dockerfile +0 -2
  13. package/README.md +290 -220
  14. package/bin/build.js +24 -7
  15. package/bin/cyberia.js +2838 -252
  16. package/bin/deploy.js +747 -125
  17. package/bin/file.js +9 -0
  18. package/bin/index.js +2838 -252
  19. package/bin/vs.js +1 -1
  20. package/conf.js +99 -65
  21. package/deployment.yaml +18 -164
  22. package/hardhat/hardhat.config.js +13 -13
  23. package/hardhat/ignition/modules/ObjectLayerToken.js +1 -1
  24. package/hardhat/package-lock.json +2559 -5864
  25. package/hardhat/package.json +14 -23
  26. package/hardhat/scripts/deployObjectLayerToken.js +1 -1
  27. package/hardhat/test/ObjectLayerToken.js +4 -2
  28. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  29. package/hardhat/types/ethers-contracts/common.ts +92 -0
  30. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  31. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  32. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  33. package/hardhat/types/ethers-contracts/index.ts +6 -0
  34. package/jsconfig.json +1 -1
  35. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +6 -5
  36. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +6 -5
  37. package/manifests/deployment/dd-cyberia-development/deployment.yaml +18 -164
  38. package/manifests/deployment/dd-cyberia-development/proxy.yaml +7 -79
  39. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  40. package/manifests/deployment/dd-test-development/deployment.yaml +112 -28
  41. package/manifests/deployment/dd-test-development/proxy.yaml +46 -1
  42. package/manifests/deployment/playwright/deployment.yaml +1 -1
  43. package/nodemon.json +1 -1
  44. package/package.json +39 -24
  45. package/proxy.yaml +7 -79
  46. package/scripts/k3s-node-setup.sh +2 -2
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/scripts/rhel-grpc-setup.sh +56 -0
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +58 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +23 -14
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  52. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +148 -20
  53. package/src/api/core/core.controller.js +10 -10
  54. package/src/api/core/core.service.js +10 -10
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.service.js +8 -8
  57. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  58. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  59. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  60. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  61. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  62. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  63. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  65. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  66. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  67. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  68. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  69. package/src/api/cyberia-instance/cyberia-fallback-world.js +178 -0
  70. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  71. package/src/api/cyberia-instance/cyberia-instance.model.js +87 -0
  72. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  73. package/src/api/cyberia-instance/cyberia-instance.service.js +156 -0
  74. package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
  75. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  77. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +574 -0
  78. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +231 -0
  79. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
  81. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  82. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  83. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  84. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  85. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  86. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  87. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  88. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  89. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  90. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  93. package/src/api/default/default.controller.js +10 -10
  94. package/src/api/default/default.service.js +10 -10
  95. package/src/api/document/document.controller.js +12 -12
  96. package/src/api/document/document.model.js +10 -16
  97. package/src/api/file/file.controller.js +8 -8
  98. package/src/api/file/file.model.js +10 -10
  99. package/src/api/file/file.ref.json +18 -0
  100. package/src/api/file/file.service.js +36 -36
  101. package/src/api/instance/instance.controller.js +10 -10
  102. package/src/api/instance/instance.model.js +4 -10
  103. package/src/api/instance/instance.service.js +10 -10
  104. package/src/api/ipfs/ipfs.controller.js +15 -36
  105. package/src/api/ipfs/ipfs.model.js +47 -47
  106. package/src/api/ipfs/ipfs.router.js +8 -13
  107. package/src/api/ipfs/ipfs.service.js +67 -129
  108. package/src/api/object-layer/object-layer.controller.js +12 -12
  109. package/src/api/object-layer/object-layer.model.js +4 -17
  110. package/src/api/object-layer/object-layer.router.js +30 -0
  111. package/src/api/object-layer/object-layer.service.js +126 -43
  112. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  113. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  114. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  115. package/src/api/test/test.controller.js +8 -8
  116. package/src/api/test/test.service.js +8 -8
  117. package/src/api/user/guest.service.js +99 -0
  118. package/src/api/user/user.controller.js +6 -6
  119. package/src/api/user/user.model.js +8 -13
  120. package/src/api/user/user.service.js +11 -27
  121. package/src/cli/cluster.js +68 -21
  122. package/src/cli/db.js +753 -825
  123. package/src/cli/deploy.js +215 -125
  124. package/src/cli/env.js +29 -0
  125. package/src/cli/fs.js +82 -8
  126. package/src/cli/image.js +43 -1
  127. package/src/cli/index.js +74 -3
  128. package/src/cli/kubectl.js +211 -0
  129. package/src/cli/release.js +340 -0
  130. package/src/cli/repository.js +475 -74
  131. package/src/cli/run.js +582 -43
  132. package/src/cli/secrets.js +73 -0
  133. package/src/cli/ssh.js +1 -1
  134. package/src/cli/static.js +43 -115
  135. package/src/cli/test.js +3 -3
  136. package/src/client/Cryptokoyn.index.js +18 -22
  137. package/src/client/CyberiaPortal.index.js +19 -24
  138. package/src/client/Default.index.js +21 -34
  139. package/src/client/Itemledger.index.js +20 -27
  140. package/src/client/Underpost.index.js +19 -24
  141. package/src/client/components/core/404.js +4 -4
  142. package/src/client/components/core/500.js +4 -4
  143. package/src/client/components/core/Account.js +73 -60
  144. package/src/client/components/core/AgGrid.js +23 -33
  145. package/src/client/components/core/Alert.js +12 -13
  146. package/src/client/components/core/AppStore.js +69 -0
  147. package/src/client/components/core/Auth.js +35 -37
  148. package/src/client/components/core/Badge.js +7 -13
  149. package/src/client/components/core/BtnIcon.js +15 -17
  150. package/src/client/components/core/CalendarCore.js +43 -64
  151. package/src/client/components/core/Chat.js +13 -15
  152. package/src/client/components/core/ClientEvents.js +87 -0
  153. package/src/client/components/core/ColorPaletteElement.js +309 -0
  154. package/src/client/components/core/Content.js +17 -14
  155. package/src/client/components/core/Css.js +15 -71
  156. package/src/client/components/core/CssCore.js +12 -16
  157. package/src/client/components/core/D3Chart.js +4 -4
  158. package/src/client/components/core/Docs.js +64 -91
  159. package/src/client/components/core/DropDown.js +194 -96
  160. package/src/client/components/core/EventBus.js +92 -0
  161. package/src/client/components/core/EventsUI.js +14 -17
  162. package/src/client/components/core/FileExplorer.js +96 -228
  163. package/src/client/components/core/FullScreen.js +47 -75
  164. package/src/client/components/core/Input.js +24 -69
  165. package/src/client/components/core/Keyboard.js +26 -19
  166. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  167. package/src/client/components/core/LoadingAnimation.js +25 -31
  168. package/src/client/components/core/LogIn.js +43 -43
  169. package/src/client/components/core/LogOut.js +25 -16
  170. package/src/client/components/core/Modal.js +462 -179
  171. package/src/client/components/core/NotificationManager.js +14 -18
  172. package/src/client/components/core/Panel.js +54 -51
  173. package/src/client/components/core/PanelForm.js +44 -144
  174. package/src/client/components/core/Polyhedron.js +110 -214
  175. package/src/client/components/core/PublicProfile.js +39 -32
  176. package/src/client/components/core/Recover.js +48 -44
  177. package/src/client/components/core/Responsive.js +88 -32
  178. package/src/client/components/core/RichText.js +9 -18
  179. package/src/client/components/core/Router.js +24 -3
  180. package/src/client/components/core/SearchBox.js +37 -37
  181. package/src/client/components/core/SignUp.js +39 -30
  182. package/src/client/components/core/SocketIo.js +112 -30
  183. package/src/client/components/core/SocketIoHandler.js +75 -0
  184. package/src/client/components/core/Stream.js +143 -95
  185. package/src/client/components/core/ToggleSwitch.js +8 -20
  186. package/src/client/components/core/ToolTip.js +5 -17
  187. package/src/client/components/core/Translate.js +56 -59
  188. package/src/client/components/core/Validator.js +26 -16
  189. package/src/client/components/core/Wallet.js +15 -26
  190. package/src/client/components/core/Webhook.js +40 -7
  191. package/src/client/components/core/Worker.js +163 -27
  192. package/src/client/components/core/windowGetDimensions.js +7 -7
  193. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +59 -59
  194. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  195. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  196. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +9 -7
  197. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +8 -6
  198. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  199. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  200. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  201. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  202. package/src/client/components/cyberia/InstanceEngineCyberia.js +781 -0
  203. package/src/client/components/cyberia/MapEngineCyberia.js +1836 -2
  204. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  205. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1220 -99
  206. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +252 -316
  207. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +136 -103
  208. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  209. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +462 -32
  210. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  211. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +9 -7
  212. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +8 -6
  213. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  214. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  215. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  216. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  217. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  218. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -4
  219. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +91 -91
  220. package/src/client/components/default/AppStoreDefault.js +5 -0
  221. package/src/client/components/default/CssDefault.js +12 -12
  222. package/src/client/components/default/LogInDefault.js +9 -7
  223. package/src/client/components/default/LogOutDefault.js +8 -6
  224. package/src/client/components/default/RouterDefault.js +47 -0
  225. package/src/client/components/default/SettingsDefault.js +4 -4
  226. package/src/client/components/default/SignUpDefault.js +6 -4
  227. package/src/client/components/default/SocketIoDefault.js +3 -51
  228. package/src/client/components/default/TranslateDefault.js +3 -3
  229. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +59 -59
  230. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  231. package/src/client/components/itemledger/CssItemledger.js +15 -15
  232. package/src/client/components/itemledger/LogInItemledger.js +9 -7
  233. package/src/client/components/itemledger/LogOutItemledger.js +8 -6
  234. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  235. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  236. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  237. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  238. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  239. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +92 -92
  240. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  241. package/src/client/components/underpost/CssUnderpost.js +14 -14
  242. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  243. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  244. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  245. package/src/client/components/underpost/LogInUnderpost.js +9 -7
  246. package/src/client/components/underpost/LogOutUnderpost.js +8 -6
  247. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  248. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  249. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  250. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  251. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  252. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  253. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  254. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  255. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  257. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  258. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  259. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  260. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  261. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  262. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  263. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  264. package/src/client/services/core/core.service.js +35 -55
  265. package/src/client/services/crypto/crypto.service.js +8 -13
  266. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  267. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
  268. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  269. package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
  270. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  271. package/src/client/services/cyberia-instance/cyberia-instance.service.js +116 -0
  272. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
  273. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  274. package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
  275. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  276. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  277. package/src/client/services/default/default.management.js +159 -267
  278. package/src/client/services/default/default.service.js +10 -16
  279. package/src/client/services/document/document.service.js +14 -19
  280. package/src/client/services/file/file.service.js +8 -13
  281. package/src/client/services/instance/instance.management.js +6 -6
  282. package/src/client/services/instance/instance.service.js +10 -15
  283. package/src/client/services/ipfs/ipfs.service.js +14 -40
  284. package/src/client/services/object-layer/object-layer.management.js +14 -14
  285. package/src/client/services/object-layer/object-layer.service.js +39 -24
  286. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  287. package/src/client/services/test/test.service.js +8 -13
  288. package/src/client/services/user/guest.service.js +86 -0
  289. package/src/client/services/user/user.management.js +6 -6
  290. package/src/client/services/user/user.service.js +14 -20
  291. package/src/client/ssr/body/404.js +3 -3
  292. package/src/client/ssr/body/500.js +3 -3
  293. package/src/client/ssr/body/CacheControl.js +5 -2
  294. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  295. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  296. package/src/client/ssr/head/PwaItemledger.js +197 -60
  297. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  298. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  299. package/src/client/ssr/offline/Maintenance.js +12 -11
  300. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  301. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  302. package/src/client/ssr/pages/Test.js +2 -2
  303. package/src/client/sw/core.sw.js +212 -0
  304. package/src/grpc/cyberia/grpc-server.js +642 -0
  305. package/src/index.js +24 -1
  306. package/src/runtime/cyberia-client/Dockerfile +80 -0
  307. package/src/runtime/cyberia-server/Dockerfile +37 -0
  308. package/src/runtime/express/Dockerfile +5 -1
  309. package/src/runtime/express/Express.js +18 -1
  310. package/src/runtime/lampp/Dockerfile +17 -5
  311. package/src/runtime/lampp/Lampp.js +27 -4
  312. package/src/runtime/wp/Dockerfile +62 -0
  313. package/src/runtime/wp/Wp.js +639 -0
  314. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  315. package/src/server/auth.js +24 -1
  316. package/src/server/backup.js +37 -9
  317. package/src/server/client-build-docs.js +52 -46
  318. package/src/server/client-build.js +356 -82
  319. package/src/server/client-formatted.js +140 -57
  320. package/src/server/conf.js +29 -13
  321. package/src/server/cron.js +25 -23
  322. package/src/server/data-query.js +32 -20
  323. package/src/server/dns.js +24 -1
  324. package/src/server/ipfs-client.js +253 -89
  325. package/src/server/object-layer.js +150 -114
  326. package/src/server/peer.js +8 -0
  327. package/src/server/process.js +13 -27
  328. package/src/server/runtime.js +25 -1
  329. package/src/server/semantic-layer-generator-floor.js +319 -0
  330. package/src/server/semantic-layer-generator-resource.js +259 -0
  331. package/src/server/semantic-layer-generator-skin.js +1164 -0
  332. package/src/server/semantic-layer-generator.js +211 -542
  333. package/src/server/shape-generator.js +108 -0
  334. package/src/server/start.js +19 -5
  335. package/src/server/valkey.js +141 -235
  336. package/src/ws/IoInterface.js +1 -10
  337. package/src/ws/IoServer.js +14 -33
  338. package/src/ws/core/channels/core.ws.chat.js +65 -20
  339. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  340. package/src/ws/core/channels/core.ws.stream.js +90 -31
  341. package/src/ws/core/core.ws.connection.js +12 -33
  342. package/src/ws/core/core.ws.emit.js +10 -26
  343. package/src/ws/core/core.ws.server.js +25 -58
  344. package/src/ws/default/channels/default.ws.main.js +53 -12
  345. package/src/ws/default/default.ws.connection.js +26 -13
  346. package/src/ws/default/default.ws.server.js +30 -12
  347. package/tsconfig.docs.json +15 -0
  348. package/typedoc.dd-cyberia.json +29 -0
  349. package/typedoc.json +29 -0
  350. package/WHITE-PAPER.md +0 -1540
  351. package/hardhat/README.md +0 -531
  352. package/hardhat/WHITE-PAPER.md +0 -1540
  353. package/jsdoc.dd-cyberia.json +0 -59
  354. package/jsdoc.json +0 -59
  355. package/src/api/object-layer/README.md +0 -347
  356. package/src/client/components/core/ColorPalette.js +0 -5267
  357. package/src/client/components/core/JoyStick.js +0 -80
  358. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  359. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  360. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  361. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  362. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -58
  363. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  364. package/src/client/components/default/ElementsDefault.js +0 -38
  365. package/src/client/components/default/RoutesDefault.js +0 -49
  366. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  367. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  368. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  369. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  370. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  371. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  372. package/src/client/sw/default.sw.js +0 -127
  373. package/src/client/sw/template.sw.js +0 -84
  374. package/src/ws/core/management/core.ws.chat.js +0 -8
  375. package/src/ws/core/management/core.ws.mailer.js +0 -16
  376. package/src/ws/core/management/core.ws.stream.js +0 -8
  377. package/src/ws/default/management/default.ws.main.js +0 -8
@@ -34,7 +34,6 @@ const logger = loggerFactory(import.meta);
34
34
  * @property {Object<string, number[][][]>} frames - Map of direction names to arrays of frame matrices.
35
35
  * @property {Array<number[]>} colors - Global color palette shared across all frames.
36
36
  * @property {number} frame_duration - Duration of each frame in milliseconds.
37
- * @property {boolean} is_stateless - Whether the render layer is stateless (no animation state).
38
37
  * @memberof CyberiaObjectLayer
39
38
  */
40
39
 
@@ -414,21 +413,18 @@ export class ObjectLayerEngine {
414
413
  if (metadata && metadata.objectLayerRenderFramesData) {
415
414
  objectLayerRenderFramesData = {
416
415
  frame_duration: metadata.objectLayerRenderFramesData.frame_duration || 250,
417
- is_stateless: metadata.objectLayerRenderFramesData.is_stateless || false,
418
416
  frames: {},
419
417
  colors: [],
420
418
  };
421
419
  } else if (metadata && metadata.data && metadata.data.render) {
422
420
  objectLayerRenderFramesData = {
423
421
  frame_duration: metadata.data.render.frame_duration || 250,
424
- is_stateless: metadata.data.render.is_stateless || false,
425
422
  frames: {},
426
423
  colors: [],
427
424
  };
428
425
  } else {
429
426
  objectLayerRenderFramesData = {
430
427
  frame_duration: 250,
431
- is_stateless: false,
432
428
  frames: {},
433
429
  colors: [],
434
430
  };
@@ -559,7 +555,7 @@ export class ObjectLayerEngine {
559
555
  * @param {string} params.itemId - Unique item identifier.
560
556
  * @param {ObjectLayerRenderFramesData} params.objectLayerRenderFramesData
561
557
  * - The render frames data containing `frames`, `colors`,
562
- * `frame_duration` and `is_stateless`.
558
+ * and `frame_duration`.
563
559
  * @param {Object} [params.objectLayerData=null] - When provided, a
564
560
  * `metadata.json` file is written alongside the frame PNGs.
565
561
  * @param {number} [params.cellPixelDim=20] - Pixel size per grid cell.
@@ -623,7 +619,6 @@ export class ObjectLayerEngine {
623
619
  data: objectLayerData.data,
624
620
  objectLayerRenderFramesData: {
625
621
  frame_duration: objectLayerRenderFramesData.frame_duration,
626
- is_stateless: objectLayerRenderFramesData.is_stateless,
627
622
  },
628
623
  generated: true,
629
624
  generatorVersion: '1.0.0',
@@ -639,11 +634,12 @@ export class ObjectLayerEngine {
639
634
 
640
635
  /**
641
636
  * Creates new ObjectLayerRenderFrames and ObjectLayer documents in MongoDB from the
642
- * provided data, computes an initial SHA-256, and optionally generates the atlas sprite sheet.
637
+ * provided data, with cut-over consistency: all CIDs (atlas PNG, atlas metadata, data JSON)
638
+ * are computed and pinned to IPFS BEFORE the ObjectLayer document is created or updated in
639
+ * MongoDB, so the object layer is never visible in queries with empty CIDs.
643
640
  *
644
- * When `generateAtlas` is `true` (the default) the method delegates to
645
- * `AtlasSpriteSheetService.generate` and then recomputes the definitive SHA-256
646
- * (which now includes `data.render.cid`) and persists an IPFS CID.
641
+ * If an existing ObjectLayer with the same `data.item.id` is found, it is atomically
642
+ * replaced (findByIdAndUpdate) and the old ObjectLayerRenderFrames is cleaned up.
647
643
  *
648
644
  * @static
649
645
  * @param {Object} params - Parameters.
@@ -664,44 +660,95 @@ export class ObjectLayerEngine {
664
660
  }) {
665
661
  const { generateAtlas = true, atlasServiceContext = null } = createOptions;
666
662
 
667
- // 1. Persist ObjectLayerRenderFrames
663
+ // 1. Persist ObjectLayerRenderFrames (not queried by the viewer table)
668
664
  const objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
669
665
 
670
- // 2. Attach reference + compute temporary SHA-256
666
+ // 2. Set up references in memory
671
667
  objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
672
668
  if (!objectLayerData.data.render) objectLayerData.data.render = {};
673
- objectLayerData.data.render.cid = objectLayerData.data.render.cid || '';
674
- objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
669
+ objectLayerData.data.render.cid = '';
670
+ objectLayerData.data.render.metadataCid = '';
675
671
 
676
- // 3. Upsert ObjectLayer (handle duplicate sha256 gracefully)
672
+ // 3. Stage atlas + IPFS CIDs BEFORE creating/updating the ObjectLayer
673
+ if (generateAtlas && atlasServiceContext) {
674
+ const {
675
+ req,
676
+ res,
677
+ options,
678
+ AtlasSpriteSheetService,
679
+ IpfsClient: ipfsClient,
680
+ createPinRecord,
681
+ } = atlasServiceContext;
682
+
683
+ try {
684
+ const stagingOL = {
685
+ data: objectLayerData.data,
686
+ objectLayerRenderFramesId: objectLayerRenderFramesDoc,
687
+ };
688
+ const result = await AtlasSpriteSheetService.generate(
689
+ { objectLayer: stagingOL, auth: req ? req.auth : undefined },
690
+ res,
691
+ options,
692
+ { skipObjectLayerSave: true },
693
+ );
694
+ objectLayerData.data.render.cid = result.atlasCid;
695
+ objectLayerData.data.render.metadataCid = result.atlasMetadataCid;
696
+ objectLayerData.atlasSpriteSheetId = result.atlasDoc._id;
697
+ } catch (atlasError) {
698
+ logger.error('Failed to generate atlas during staging:', atlasError);
699
+ }
700
+
701
+ // Compute final SHA-256 (includes render CIDs)
702
+ objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
703
+
704
+ // Pin data JSON to IPFS
705
+ if (ipfsClient) {
706
+ try {
707
+ const itemId = objectLayerData.data.item.id;
708
+ const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
709
+ const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayerData.data, `${itemId}_data.json`, mfsPath);
710
+ if (ipfsResult) {
711
+ objectLayerData.cid = ipfsResult.cid;
712
+ if (createPinRecord) {
713
+ await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
714
+ }
715
+ }
716
+ } catch (ipfsError) {
717
+ logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
718
+ }
719
+ }
720
+ } else {
721
+ // No atlas generation - compute SHA-256 without render CIDs
722
+ objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
723
+ }
724
+
725
+ // 4. Atomic create/upsert - ObjectLayer is fully populated with all CIDs
677
726
  let objectLayer;
678
- const existingObjectLayer = await ObjectLayer.findOne({ sha256: objectLayerData.sha256 });
679
- if (existingObjectLayer) {
680
- logger.info(`ObjectLayer with sha256 ${objectLayerData.sha256} already exists, updating...`);
681
- objectLayer = await ObjectLayer.findByIdAndUpdate(existingObjectLayer._id, objectLayerData, {
727
+ const existingByItemId = await ObjectLayer.findOne({ 'data.item.id': objectLayerData.data.item.id });
728
+ if (existingByItemId) {
729
+ const oldRenderFramesId = existingByItemId.objectLayerRenderFramesId;
730
+ logger.info(
731
+ `ObjectLayer for item "${objectLayerData.data.item.id}" exists (${existingByItemId._id}), replacing atomically...`,
732
+ );
733
+ objectLayer = await ObjectLayer.findByIdAndUpdate(existingByItemId._id, objectLayerData, {
682
734
  returnDocument: 'after',
683
735
  }).populate('objectLayerRenderFramesId');
736
+ if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
737
+ await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
738
+ }
684
739
  } else {
685
740
  objectLayer = await (await ObjectLayer.create(objectLayerData)).populate('objectLayerRenderFramesId');
686
741
  logger.info(`ObjectLayer created successfully with id: ${objectLayer._id}`);
687
742
  }
688
743
 
689
- // 4. Optional atlas generation + final SHA-256 / IPFS CID
690
- if (generateAtlas && atlasServiceContext) {
691
- objectLayer = await ObjectLayerEngine._generateAtlasAndFinalize({
692
- objectLayer,
693
- ObjectLayer,
694
- atlasServiceContext,
695
- isNew: true,
696
- });
697
- }
698
-
699
744
  return { objectLayer, objectLayerRenderFramesDoc };
700
745
  }
701
746
 
702
747
  /**
703
748
  * Updates an existing ObjectLayer and its ObjectLayerRenderFrames from the provided data,
704
- * recomputes SHA-256, and optionally regenerates the atlas sprite sheet.
749
+ * with cut-over consistency: a new ObjectLayerRenderFrames is created, then atlas and all
750
+ * CIDs are staged BEFORE the live ObjectLayer is touched. The live document is updated
751
+ * atomically via findByIdAndUpdate only after all CIDs are computed.
705
752
  *
706
753
  * @static
707
754
  * @param {Object} params - Parameters.
@@ -724,27 +771,75 @@ export class ObjectLayerEngine {
724
771
  }) {
725
772
  const { generateAtlas = true, atlasServiceContext = null } = updateOptions;
726
773
 
727
- // 1. Update or create ObjectLayerRenderFrames
728
- let objectLayerRenderFramesDoc;
774
+ // 1. Load existing ObjectLayer to get old references
729
775
  const existingObjectLayer = await ObjectLayer.findById(objectLayerId);
730
- if (existingObjectLayer && existingObjectLayer.objectLayerRenderFramesId) {
731
- objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.findByIdAndUpdate(
732
- existingObjectLayer.objectLayerRenderFramesId,
733
- objectLayerRenderFramesData,
734
- { returnDocument: 'after' },
735
- );
736
- objectLayerData.objectLayerRenderFramesId = existingObjectLayer.objectLayerRenderFramesId;
737
- } else {
738
- objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
739
- objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
776
+ if (!existingObjectLayer) {
777
+ throw new Error('ObjectLayer not found for update');
740
778
  }
779
+ const oldRenderFramesId = existingObjectLayer.objectLayerRenderFramesId;
780
+
781
+ // 2. Create NEW RenderFrames (avoid mutating old doc mid-update)
782
+ const objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
783
+ objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
741
784
 
742
- // 2. Compute temporary SHA-256
785
+ // 3. Set up render CIDs
743
786
  if (!objectLayerData.data.render) objectLayerData.data.render = {};
744
- objectLayerData.data.render.cid = objectLayerData.data.render.cid || '';
745
- objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
787
+ objectLayerData.data.render.cid = '';
788
+ objectLayerData.data.render.metadataCid = '';
789
+
790
+ // 4. Stage atlas + IPFS CIDs BEFORE updating the ObjectLayer
791
+ if (generateAtlas && atlasServiceContext) {
792
+ const {
793
+ req,
794
+ res,
795
+ options,
796
+ AtlasSpriteSheetService,
797
+ IpfsClient: ipfsClient,
798
+ createPinRecord,
799
+ } = atlasServiceContext;
800
+
801
+ try {
802
+ const stagingOL = {
803
+ data: objectLayerData.data,
804
+ objectLayerRenderFramesId: objectLayerRenderFramesDoc,
805
+ };
806
+ const result = await AtlasSpriteSheetService.generate(
807
+ { objectLayer: stagingOL, auth: req ? req.auth : undefined },
808
+ res,
809
+ options,
810
+ { skipObjectLayerSave: true },
811
+ );
812
+ objectLayerData.data.render.cid = result.atlasCid;
813
+ objectLayerData.data.render.metadataCid = result.atlasMetadataCid;
814
+ objectLayerData.atlasSpriteSheetId = result.atlasDoc._id;
815
+ } catch (atlasError) {
816
+ logger.error('Failed to generate atlas during update staging:', atlasError);
817
+ }
818
+
819
+ // Compute final SHA-256 (includes render CIDs)
820
+ objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
746
821
 
747
- // 3. Persist ObjectLayer update
822
+ // Pin data JSON to IPFS
823
+ if (ipfsClient) {
824
+ try {
825
+ const itemId = objectLayerData.data.item.id;
826
+ const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
827
+ const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayerData.data, `${itemId}_data.json`, mfsPath);
828
+ if (ipfsResult) {
829
+ objectLayerData.cid = ipfsResult.cid;
830
+ if (createPinRecord) {
831
+ await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
832
+ }
833
+ }
834
+ } catch (ipfsError) {
835
+ logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
836
+ }
837
+ }
838
+ } else {
839
+ objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
840
+ }
841
+
842
+ // 5. Atomic update - ObjectLayer is fully populated with all CIDs
748
843
  let objectLayer;
749
844
  try {
750
845
  objectLayer = await ObjectLayer.findByIdAndUpdate(objectLayerId, objectLayerData, {
@@ -753,20 +848,15 @@ export class ObjectLayerEngine {
753
848
  if (!objectLayer) {
754
849
  throw new Error('ObjectLayer not found for update');
755
850
  }
756
- logger.info(`ObjectLayer updated successfully with id: ${objectLayerId}`);
851
+ logger.info(`ObjectLayer updated atomically with id: ${objectLayerId}`);
757
852
  } catch (error) {
758
853
  logger.error('Error updating ObjectLayer:', error);
759
854
  throw error;
760
855
  }
761
856
 
762
- // 4. Optional atlas generation + final SHA-256 / IPFS CID
763
- if (generateAtlas && atlasServiceContext) {
764
- objectLayer = await ObjectLayerEngine._generateAtlasAndFinalize({
765
- objectLayer,
766
- ObjectLayer,
767
- atlasServiceContext,
768
- isNew: false,
769
- });
857
+ // 6. Clean up old RenderFrames
858
+ if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
859
+ await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
770
860
  }
771
861
 
772
862
  return { objectLayer, objectLayerRenderFramesDoc };
@@ -783,26 +873,22 @@ export class ObjectLayerEngine {
783
873
  * @param {Object} params.objectLayer - The mongoose ObjectLayer document (must be populated).
784
874
  * @param {Object} [params.ipfsClient=null] - The IpfsClient module; when `null`, IPFS pinning is skipped.
785
875
  * @param {function} [params.createPinRecord=null] - The `createPinRecord` helper; when `null`, pin records are skipped.
786
- * @param {string} [params.userId] - Authenticated user ID for IPFS pin record creation.
787
876
  * @param {Object} [params.options] - Server options (host, path) forwarded to `createPinRecord`.
788
877
  * @returns {Promise<Object>} The saved ObjectLayer document.
789
878
  * @memberof CyberiaObjectLayer
790
879
  */
791
- static async computeAndSaveFinalSha256({ objectLayer, ipfsClient = null, createPinRecord = null, userId, options }) {
880
+ static async computeAndSaveFinalSha256({ objectLayer, ipfsClient = null, createPinRecord = null, options }) {
792
881
  const finalSha256 = ObjectLayerEngine.computeSha256(objectLayer.data);
793
882
 
794
883
  if (ipfsClient) {
795
884
  try {
796
885
  const itemId = objectLayer.data.item.id;
797
- const ipfsResult = await ipfsClient.addJsonToIpfs(
798
- objectLayer.data,
799
- `${itemId}_data.json`,
800
- `/object-layer/${itemId}/${itemId}_data.json`,
801
- );
886
+ const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
887
+ const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayer.data, `${itemId}_data.json`, mfsPath);
802
888
  if (ipfsResult) {
803
889
  objectLayer.cid = ipfsResult.cid;
804
- if (userId && createPinRecord) {
805
- await createPinRecord({ cid: ipfsResult.cid, userId, options });
890
+ if (createPinRecord) {
891
+ await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
806
892
  }
807
893
  }
808
894
  } catch (ipfsError) {
@@ -882,58 +968,8 @@ export class ObjectLayerEngine {
882
968
  );
883
969
  return { cid: `sha256:${sha256}`, sha256, source: 'sha256-fallback' };
884
970
  }
885
-
886
- /**
887
- * Internal helper that generates an atlas sprite sheet and then finalizes the SHA-256 / IPFS CID.
888
- * @static
889
- * @param {Object} params - Parameters.
890
- * @param {Object} params.objectLayer - The mongoose ObjectLayer document.
891
- * @param {Object} params.ObjectLayer - Mongoose ObjectLayer model (for re-reading).
892
- * @param {Object} params.atlasServiceContext - Context with `{ req, res, options, AtlasSpriteSheetService, IpfsClient, createPinRecord }`.
893
- * @param {boolean} params.isNew - Whether this is a newly created object layer (used for logging).
894
- * @returns {Promise<Object>} The finalized ObjectLayer document.
895
- * @memberof CyberiaObjectLayer
896
- * @private
897
- */
898
- static async _generateAtlasAndFinalize({ objectLayer, ObjectLayer, atlasServiceContext, isNew }) {
899
- const { req, res, options, AtlasSpriteSheetService, IpfsClient: ipfsClient, createPinRecord } = atlasServiceContext;
900
-
901
- // Generate atlas sprite sheet
902
- try {
903
- await AtlasSpriteSheetService.generate(
904
- { params: { id: objectLayer._id }, objectLayer, auth: req ? req.auth : undefined },
905
- res,
906
- options,
907
- );
908
- } catch (atlasError) {
909
- logger.error(`Failed to auto-${isNew ? 'generate' : 'update'} atlas for ObjectLayer:`, atlasError);
910
- }
911
-
912
- // Re-read the objectLayer so data.render.cid is up-to-date
913
- objectLayer = await ObjectLayer.findById(objectLayer._id).populate('objectLayerRenderFramesId');
914
-
915
- // Compute definitive SHA-256 and IPFS CID
916
- const userId = req && req.auth && req.auth.user ? req.auth.user._id : undefined;
917
- objectLayer = await ObjectLayerEngine.computeAndSaveFinalSha256({
918
- objectLayer,
919
- ipfsClient: ipfsClient || null,
920
- createPinRecord: createPinRecord || null,
921
- userId,
922
- options,
923
- });
924
-
925
- return objectLayer;
926
- }
927
971
  }
928
972
 
929
- /**
930
- * Mapping of item type names to numerical IDs.
931
- * @constant
932
- * @type {{floor: number, skin: number, weapon: number, skill: number, coin: number}}
933
- * @memberof CyberiaObjectLayer
934
- */
935
- export const itemTypes = { floor: 0, skin: 1, weapon: 2, skill: 3, coin: 4 };
936
-
937
973
  // ──────────────────────────────────────────────────────────────────────────
938
974
  // Backward-compatible named exports matching the original destructured imports.
939
975
  // ──────────────────────────────────────────────────────────────────────────
@@ -44,6 +44,14 @@ const logger = loggerFactory(import.meta);
44
44
  */
45
45
  const createPeerServer = async ({ port, origins, path }) => {
46
46
  logger.info('origins', origins);
47
+
48
+ // In development, allow the local client origin (peer runs on port+1 relative to the client)
49
+ if (process.env.NODE_ENV === 'development') {
50
+ const clientPort = port - 1;
51
+ const devOrigin = `http://localhost:${clientPort}`;
52
+ if (!origins.includes(devOrigin)) origins.push(devOrigin);
53
+ }
54
+
47
55
  /** @type {import('peer').IConfig} */
48
56
  const options = {
49
57
  port,
@@ -4,35 +4,30 @@
4
4
  * @module src/server/process.js
5
5
  * @namespace Process
6
6
  */
7
-
8
7
  // https://nodejs.org/api/process
9
-
10
8
  import shell from 'shelljs';
11
9
  import { loggerFactory } from './logger.js';
12
10
  import clipboard from 'clipboardy';
13
11
  import Underpost from '../index.js';
14
12
  import { getNpmRootPath } from './conf.js';
15
-
16
13
  const logger = loggerFactory(import.meta);
17
-
18
14
  /**
19
15
  * Gets the current working directory, replacing backslashes with forward slashes for consistency.
20
16
  * @memberof Process
21
17
  * @returns {string} The root directory path.
22
18
  */
23
19
  const getRootDirectory = () => process.cwd().replace(/\\/g, '/');
24
-
25
20
  /**
26
21
  * Controls and manages process-level events and signals.
27
22
  * @namespace ProcessController
28
23
  */
29
- const ProcessController = {
24
+ class ProcessController {
30
25
  /**
31
26
  * List of signals to listen for for graceful shutdown/handling.
32
27
  * @memberof ProcessController
33
28
  * @type {string[]}
34
29
  */
35
- SIG: [
30
+ static SIG = [
36
31
  'SIGPIPE',
37
32
  'SIGHUP',
38
33
  'SIGTERM',
@@ -45,29 +40,26 @@ const ProcessController = {
45
40
  'SIGFPE',
46
41
  'SIGSEGV',
47
42
  'SIGILL',
48
- ],
49
-
43
+ ];
50
44
  /**
51
45
  * Sets up listeners for various process signals defined in {@link ProcessController.SIG}.
52
46
  * Handles graceful exit on 'SIGINT' (Ctrl+C).
53
47
  * @memberof ProcessController
54
48
  * @returns {Array<process.Process>} An array of process listener handles.
55
49
  */
56
- onSigListen: function () {
57
- return this.SIG.map((sig) =>
50
+ static onSigListen() {
51
+ return ProcessController.SIG.map((sig) =>
58
52
  process.on(sig, (...args) => {
59
- this.logger.info(`process on ${sig}`, args);
53
+ ProcessController.logger.info(`process on ${sig}`, args);
60
54
  switch (sig) {
61
55
  case 'SIGINT':
62
56
  return process.exit();
63
-
64
57
  default:
65
58
  break;
66
59
  }
67
60
  }),
68
61
  );
69
- },
70
-
62
+ }
71
63
  /**
72
64
  * Initializes the ProcessController.
73
65
  * Sets up signal listeners, registers a listener for the 'exit' event, and cleans up temporary deployment environment variables.
@@ -75,16 +67,15 @@ const ProcessController = {
75
67
  * @param {Object} logger - The logger instance to use for internal logging.
76
68
  * @returns {void}
77
69
  */
78
- init: function (logger) {
79
- this.logger = logger;
70
+ static init(logger) {
71
+ ProcessController.logger = logger;
80
72
  process.on('exit', (...args) => {
81
- this.logger.info(`process on exit`, args);
73
+ ProcessController.logger.info(`process on exit`, args);
82
74
  });
83
- this.onSigListen();
75
+ ProcessController.onSigListen();
84
76
  Underpost.env.delete('await-deploy');
85
- },
86
- };
87
-
77
+ }
78
+ }
88
79
  /**
89
80
  * Executes a shell command using shelljs.
90
81
  * @memberof Process
@@ -105,7 +96,6 @@ const shellExec = (
105
96
  if (options.callback) return shell.exec(cmd, options, options.callback);
106
97
  return options.stdout ? shell.exec(cmd, options).stdout : shell.exec(cmd, options);
107
98
  };
108
-
109
99
  /**
110
100
  * Changes the current working directory using shelljs.
111
101
  * @memberof Process
@@ -118,7 +108,6 @@ const shellCd = (cd, options = { disableLog: false }) => {
118
108
  if (!options.disableLog) logger.info(`cd`, cd);
119
109
  return shell.cd(cd);
120
110
  };
121
-
122
111
  /**
123
112
  * Wraps a command to run it as a daemon process in a shell (keeping the process alive/terminal open).
124
113
  * @memberof Process
@@ -126,7 +115,6 @@ const shellCd = (cd, options = { disableLog: false }) => {
126
115
  * @returns {string} The shell command string for the daemon process.
127
116
  */
128
117
  const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
129
-
130
118
  /**
131
119
  * Retrieves the process ID (PID) of the most recently created gnome-terminal instance.
132
120
  * Note: This function is environment-specific (GNOME/Linux) and uses `pgrep -n`.
@@ -136,7 +124,6 @@ const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
136
124
  // list all terminals: pgrep gnome-terminal
137
125
  // list last terminal: pgrep -n gnome-terminal
138
126
  const getTerminalPid = () => JSON.parse(shellExec(`pgrep -n gnome-terminal`, { stdout: true, silent: true }));
139
-
140
127
  /**
141
128
  * Copies text content to the system clipboard using clipboardy.
142
129
  * Logs the copied content for confirmation.
@@ -148,5 +135,4 @@ function pbcopy(data) {
148
135
  clipboard.writeSync(data || '🦄');
149
136
  logger.info(`copied to clipboard`, clipboard.readSync());
150
137
  }
151
-
152
138
  export { ProcessController, getRootDirectory, shellExec, shellCd, pbcopy, getTerminalPid, daemonProcess };
@@ -11,6 +11,7 @@ import * as promClient from 'prom-client';
11
11
  import { loggerFactory } from './logger.js';
12
12
  import { newInstance } from '../client/components/core/CommonJs.js';
13
13
  import { Lampp } from '../runtime/lampp/Lampp.js';
14
+ import { WpService } from '../runtime/wp/Wp.js';
14
15
  import { getInstanceContext, readConfJson } from './conf.js';
15
16
 
16
17
  import ExpressService from '../runtime/express/Express.js';
@@ -71,6 +72,9 @@ const buildRuntime = async () => {
71
72
  valkey,
72
73
  apiBaseHost,
73
74
  useLocalSsl,
75
+ grpc,
76
+ repository,
77
+ wp,
74
78
  } = confServer[host][path];
75
79
 
76
80
  // Calculate context data
@@ -116,6 +120,7 @@ const buildRuntime = async () => {
116
120
  peer,
117
121
  valkey,
118
122
  apiBaseHost,
123
+ grpc,
119
124
  redirectTarget,
120
125
  rootHostPath,
121
126
  confSSR,
@@ -129,7 +134,7 @@ const buildRuntime = async () => {
129
134
 
130
135
  case 'lampp':
131
136
  {
132
- const { disabled } = await Lampp.createApp({
137
+ const { disabled } = Lampp.createApp({
133
138
  port,
134
139
  host,
135
140
  path,
@@ -143,6 +148,25 @@ const buildRuntime = async () => {
143
148
  await Underpost.start.listenPortController(Underpost.start.listenServerFactory(), port, runningData);
144
149
  }
145
150
  break;
151
+
152
+ case 'wp':
153
+ {
154
+ const { disabled } = WpService.createApp({
155
+ port,
156
+ host,
157
+ pathRoute: path,
158
+ repository,
159
+ db,
160
+ wp,
161
+ redirect,
162
+ redirectTarget,
163
+ resetRouter: currentPort === initPort,
164
+ });
165
+ if (disabled) continue;
166
+ await Underpost.start.listenPortController(Underpost.start.listenServerFactory(), port, runningData);
167
+ }
168
+ break;
169
+
146
170
  default:
147
171
  break;
148
172
  }