cyberia 3.2.5 → 3.2.12

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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -10,7 +10,7 @@
10
10
  * @namespace CyberiaObjectLayerService
11
11
  */
12
12
 
13
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
13
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
14
14
  import { loggerFactory } from '../../server/logger.js';
15
15
  import { ObjectLayerRenderFramesDto } from '../object-layer-render-frames/object-layer-render-frames.model.js';
16
16
  import { FileFactory } from '../file/file.service.js';
@@ -36,7 +36,7 @@ const logger = loggerFactory(import.meta);
36
36
  * @namespace CyberiaObjectLayerService.ObjectLayerService
37
37
  * @memberof CyberiaObjectLayerService
38
38
  */
39
- const ObjectLayerService = {
39
+ class ObjectLayerService {
40
40
  /**
41
41
  * POST handler for creating object layers and uploading frame images.
42
42
  *
@@ -59,7 +59,7 @@ const ObjectLayerService = {
59
59
  * @returns {Promise<Object>} The created object layer document or frame upload result.
60
60
  * @throws {Error} If file validation fails or required parameters are missing.
61
61
  */
62
- post: async (req, res, options) => {
62
+ static post = async (req, res, options) => {
63
63
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
64
64
 
65
65
  if (req.path.startsWith('/frame-image')) {
@@ -149,9 +149,9 @@ const ObjectLayerService = {
149
149
  fs.writeFileSync(`${publicFolder}/metadata.json`, metadataContent);
150
150
 
151
151
  // Build object layer data from the asset directory
152
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
152
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
153
153
  const ObjectLayerRenderFrames =
154
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
154
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
155
155
 
156
156
  const { objectLayerRenderFramesData, objectLayerData } =
157
157
  await ObjectLayerEngine.buildObjectLayerDataFromDirectory({
@@ -183,9 +183,9 @@ const ObjectLayerService = {
183
183
  }
184
184
 
185
185
  // create object layer from body – cut-over consistency: stage all CIDs before writing to DB
186
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
186
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
187
187
  const ObjectLayerRenderFrames =
188
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
188
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
189
189
 
190
190
  const bodyData = { ...req.body };
191
191
  if (!bodyData.data) bodyData.data = {};
@@ -245,7 +245,7 @@ const ObjectLayerService = {
245
245
  }
246
246
 
247
247
  return newObjectLayer;
248
- },
248
+ };
249
249
 
250
250
  /**
251
251
  * GET handler for retrieving object layers.
@@ -268,9 +268,9 @@ const ObjectLayerService = {
268
268
  * @returns {Promise<Object>} The requested object layer data, list, or frame counts.
269
269
  * @throws {Error} If the requested object layer is not found.
270
270
  */
271
- get: async (req, res, options) => {
271
+ static get = async (req, res, options) => {
272
272
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
273
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
273
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
274
274
 
275
275
  // GET /search-item-ids?q=<partial> - Fast partial match search on data.item.id
276
276
  if (req.path.startsWith('/search-item-ids')) {
@@ -360,8 +360,8 @@ const ObjectLayerService = {
360
360
  if (objectLayer.atlasSpriteSheetId) {
361
361
  try {
362
362
  const AtlasSpriteSheet =
363
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
364
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
363
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
364
+ const File = DataBaseProviderService.getModel("File", options);
365
365
 
366
366
  const atlasDoc = await AtlasSpriteSheet.findById(objectLayer.atlasSpriteSheetId);
367
367
 
@@ -432,7 +432,7 @@ const ObjectLayerService = {
432
432
  ObjectLayer.countDocuments(query), // { userId: req.auth.user._id }
433
433
  ]);
434
434
  return { data, total, page, totalPages: Math.ceil(total / limit) };
435
- },
435
+ };
436
436
 
437
437
  /**
438
438
  * Generates a WebP animation from PNG frame images for a specific direction of an object layer.
@@ -449,9 +449,9 @@ const ObjectLayerService = {
449
449
  * @returns {Promise<Buffer>} The generated WebP animation as a Buffer.
450
450
  * @throws {Error} If required parameters are missing, frames directory is not found, or img2webp fails.
451
451
  */
452
- generateWebp: async (req, res, options) => {
452
+ static generateWebp = async (req, res, options) => {
453
453
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
454
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
454
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
455
455
 
456
456
  // GET /generate-webp/:itemType/:itemId/:directionCode - Generate webp animation from PNG frames
457
457
  const itemType = req.params.itemType;
@@ -515,7 +515,10 @@ const ObjectLayerService = {
515
515
 
516
516
  logger.info(`Executing command: ${cmd}`);
517
517
 
518
- const result = shellExec(cmd, { silent: false });
518
+ // silentOnError so we can build a domain-specific Error with the
519
+ // captured stderr/stdout context (callers want a friendly message,
520
+ // not a generic ShellExecError).
521
+ const result = shellExec(cmd, { silent: false, silentOnError: true });
519
522
 
520
523
  if (result.code !== 0) {
521
524
  throw new Error(`img2webp command failed: ${result.stderr || result.stdout}`);
@@ -560,7 +563,7 @@ const ObjectLayerService = {
560
563
 
561
564
  throw error;
562
565
  }
563
- },
566
+ };
564
567
 
565
568
  /**
566
569
  * PUT handler for updating object layers, their frame images, and metadata.
@@ -584,9 +587,9 @@ const ObjectLayerService = {
584
587
  * @returns {Promise<Object>} The updated object layer document or frame upload result.
585
588
  * @throws {Error} If file validation fails, object layer is not found, or required parameters are missing.
586
589
  */
587
- put: async (req, res, options) => {
590
+ static put = async (req, res, options) => {
588
591
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
589
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
592
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
590
593
 
591
594
  // PUT /:id/frame-image/:itemType/:itemId/:directionCode - Update frame images for specific direction
592
595
  if (req.path.includes('/frame-image/')) {
@@ -686,7 +689,7 @@ const ObjectLayerService = {
686
689
  fs.writeFileSync(`${publicFolder}/metadata.json`, metadataContent);
687
690
 
688
691
  const ObjectLayerRenderFrames =
689
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
692
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
690
693
 
691
694
  // Build object layer data from the asset directory
692
695
  const { objectLayerRenderFramesData, objectLayerData } =
@@ -775,7 +778,7 @@ const ObjectLayerService = {
775
778
  }).populate('objectLayerRenderFramesId');
776
779
 
777
780
  return updatedObjectLayer;
778
- },
781
+ };
779
782
 
780
783
  /**
781
784
  * DELETE handler for removing object layers and all associated resources.
@@ -801,11 +804,11 @@ const ObjectLayerService = {
801
804
  * @returns {Promise<Object>} The deleted object layer document or bulk delete count.
802
805
  * @throws {Error} If the object layer is not found.
803
806
  */
804
- delete: async (req, res, options) => {
807
+ static delete = async (req, res, options) => {
805
808
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
806
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
809
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
807
810
  const ObjectLayerRenderFrames =
808
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
811
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
809
812
 
810
813
  if (req.params.id) {
811
814
  // Load the full object layer so we can access all references
@@ -890,7 +893,7 @@ const ObjectLayerService = {
890
893
  }
891
894
  return { deletedCount: allObjectLayers.length };
892
895
  }
893
- },
894
- };
896
+ };
897
+ }
895
898
 
896
899
  export { ObjectLayerService };
@@ -3,8 +3,8 @@ import { ObjectLayerRenderFramesService } from './object-layer-render-frames.ser
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const ObjectLayerRenderFramesController = {
7
- post: async (req, res, options) => {
6
+ class ObjectLayerRenderFramesController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await ObjectLayerRenderFramesService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const ObjectLayerRenderFramesController = {
18
18
  message: error.message,
19
19
  });
20
20
  }
21
- },
22
- get: async (req, res, options) => {
21
+ };
22
+ static get = async (req, res, options) => {
23
23
  try {
24
24
  const { page, limit } = req.query;
25
25
  const result = await ObjectLayerRenderFramesService.get(
@@ -38,8 +38,8 @@ const ObjectLayerRenderFramesController = {
38
38
  message: error.message,
39
39
  });
40
40
  }
41
- },
42
- put: async (req, res, options) => {
41
+ };
42
+ static put = async (req, res, options) => {
43
43
  try {
44
44
  const result = await ObjectLayerRenderFramesService.put(req, res, options);
45
45
  return res.status(200).json({
@@ -53,8 +53,8 @@ const ObjectLayerRenderFramesController = {
53
53
  message: error.message,
54
54
  });
55
55
  }
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  try {
59
59
  const result = await ObjectLayerRenderFramesService.delete(req, res, options);
60
60
  return res.status(200).json({
@@ -68,7 +68,7 @@ const ObjectLayerRenderFramesController = {
68
68
  message: error.message,
69
69
  });
70
70
  }
71
- },
72
- };
71
+ };
72
+ }
73
73
 
74
74
  export { ObjectLayerRenderFramesController };
@@ -3,9 +3,7 @@
3
3
  * @module src/api/object-layer-render-frames/object-layer-render-frames.model.js
4
4
  * @namespace CyberiaObjectLayerRenderFramesModel
5
5
  */
6
-
7
6
  import { Schema, model } from 'mongoose';
8
-
9
7
  /**
10
8
  * @typedef {Object} ObjectLayerRenderFramesDirections
11
9
  * @property {number[][][]} up_idle - Up idle animation frames
@@ -51,13 +49,11 @@ const ObjectLayerRenderFramesDirectionsSchema = new Schema(
51
49
  },
52
50
  { _id: false },
53
51
  );
54
-
55
52
  /**
56
53
  * @typedef {Object} ObjectLayerRenderFrames
57
54
  * @property {RenderFrames} frames - Animation frames for different states
58
55
  * @property {number[][]} colors - Color palette for rendering
59
56
  * @property {number} frame_duration - Duration of each frame in milliseconds
60
- * @property {boolean} is_stateless - Whether the render is stateless
61
57
  * @property {Date} createdAt - When the document was created
62
58
  * @property {Date} updatedAt - When the document was last updated
63
59
  * @memberof CyberiaObjectLayerRenderFramesModel
@@ -67,7 +63,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
67
63
  frames: { type: ObjectLayerRenderFramesDirectionsSchema, required: true },
68
64
  colors: { type: [[Number]], required: true },
69
65
  frame_duration: { type: Number, required: true, min: 0 },
70
- is_stateless: { type: Boolean, default: false },
71
66
  },
72
67
  {
73
68
  timestamps: true,
@@ -75,7 +70,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
75
70
  toObject: { virtuals: true },
76
71
  },
77
72
  );
78
-
79
73
  // Pre-save hook to ensure data consistency
80
74
  ObjectLayerRenderFramesSchema.pre('save', function () {
81
75
  // Ensure all required fields are present
@@ -83,21 +77,17 @@ ObjectLayerRenderFramesSchema.pre('save', function () {
83
77
  throw new Error('Missing required fields: frames, colors, or frame_duration');
84
78
  }
85
79
  });
86
-
87
80
  // Create and export the model
88
81
  const ObjectLayerRenderFramesModel = model('ObjectLayerRenderFrames', ObjectLayerRenderFramesSchema);
89
-
90
82
  const ProviderSchema = ObjectLayerRenderFramesSchema;
91
-
92
- const ObjectLayerRenderFramesDto = {
93
- select: {
83
+ class ObjectLayerRenderFramesDto {
84
+ static select = {
94
85
  get: () => {
95
- return { _id: 1, frame_duration: 1, is_stateless: 1 };
86
+ return { _id: 1, frame_duration: 1 };
96
87
  },
97
88
  getFull: () => {
98
- return { _id: 1, frames: 1, colors: 1, frame_duration: 1, is_stateless: 1 };
89
+ return { _id: 1, frames: 1, colors: 1, frame_duration: 1 };
99
90
  },
100
- },
101
- };
102
-
91
+ };
92
+ }
103
93
  export { ObjectLayerRenderFramesSchema, ObjectLayerRenderFramesModel, ProviderSchema, ObjectLayerRenderFramesDto };
@@ -4,24 +4,28 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const ObjectLayerRenderFramesRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
11
- router.post(`/`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
12
- router.get(
13
- `/:id`,
14
- // authMiddleware,
15
- async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options),
16
- );
17
- router.get(`/`, async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options));
18
- router.put(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
19
- router.put(`/`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
20
- router.delete(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
21
- router.delete(`/`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
22
- return router;
23
- };
7
+ class ObjectLayerRenderFramesRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
24
28
 
25
- const ApiRouter = ObjectLayerRenderFramesRouter;
29
+ const ApiRouter = (options) => ObjectLayerRenderFramesRouter.router(options);
26
30
 
27
31
  export { ApiRouter, ObjectLayerRenderFramesRouter };
@@ -1,18 +1,20 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
2
  import { loggerFactory } from '../../server/logger.js';
3
3
  import { DataQuery } from '../../server/data-query.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const ObjectLayerRenderFramesService = {
8
- post: async (req, res, options) => {
7
+ class ObjectLayerRenderFramesService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
10
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
10
+ const ObjectLayerRenderFrames =
11
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
11
12
  return await new ObjectLayerRenderFrames(req.body).save();
12
- },
13
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
14
15
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
15
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
16
+ const ObjectLayerRenderFrames =
17
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
16
18
  if (req.params.id) return await ObjectLayerRenderFrames.findById(req.params.id);
17
19
 
18
20
  // Parse query parameters using DataQuery helper
@@ -25,18 +27,20 @@ const ObjectLayerRenderFramesService = {
25
27
 
26
28
  const totalPages = Math.ceil(total / limit);
27
29
  return { data, total, page, totalPages };
28
- },
29
- put: async (req, res, options) => {
30
+ };
31
+ static put = async (req, res, options) => {
30
32
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
31
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
33
+ const ObjectLayerRenderFrames =
34
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
32
35
  return await ObjectLayerRenderFrames.findByIdAndUpdate(req.params.id, req.body);
33
- },
34
- delete: async (req, res, options) => {
36
+ };
37
+ static delete = async (req, res, options) => {
35
38
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
36
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
39
+ const ObjectLayerRenderFrames =
40
+ DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
37
41
  if (req.params.id) return await ObjectLayerRenderFrames.findByIdAndDelete(req.params.id);
38
42
  else return await ObjectLayerRenderFrames.deleteMany();
39
- },
40
- };
43
+ };
44
+ }
41
45
 
42
46
  export { ObjectLayerRenderFramesService };
@@ -3,8 +3,8 @@ import { TestService } from './test.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const TestController = {
7
- post: async (req, res, options) => {
6
+ class TestController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  return res.status(200).json({
10
10
  status: 'success',
@@ -17,8 +17,8 @@ const TestController = {
17
17
  message: error.message,
18
18
  });
19
19
  }
20
- },
21
- get: async (req, res, options) => {
20
+ };
21
+ static get = async (req, res, options) => {
22
22
  try {
23
23
  const result = await TestService.get(req, res, options);
24
24
  if (result)
@@ -37,8 +37,8 @@ const TestController = {
37
37
  message: error.message,
38
38
  });
39
39
  }
40
- },
41
- delete: async (req, res, options) => {
40
+ };
41
+ static delete = async (req, res, options) => {
42
42
  try {
43
43
  const result = await TestService.delete(req, res, options);
44
44
 
@@ -53,7 +53,7 @@ const TestController = {
53
53
  message: error.message,
54
54
  });
55
55
  }
56
- },
57
- };
56
+ };
57
+ }
58
58
 
59
59
  export { TestController };
@@ -4,18 +4,23 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const TestRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, async (req, res) => await TestController.post(req, res, options));
11
- router.post(`/`, authMiddleware, async (req, res) => await TestController.post(req, res, options));
12
- router.get(`/:id`, async (req, res) => await TestController.get(req, res, options));
13
- router.get(`/`, async (req, res) => await TestController.get(req, res, options));
14
- router.delete(`/:id`, async (req, res) => await TestController.delete(req, res, options));
15
- router.delete(`/`, async (req, res) => await TestController.delete(req, res, options));
16
- return router;
17
- };
7
+ class TestRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, async (req, res) => await TestController.post(req, res, options));
15
+ router.post(`/`, options.authMiddleware, async (req, res) => await TestController.post(req, res, options));
16
+ router.get(`/:id`, async (req, res) => await TestController.get(req, res, options));
17
+ router.get(`/`, async (req, res) => await TestController.get(req, res, options));
18
+ router.delete(`/:id`, async (req, res) => await TestController.delete(req, res, options));
19
+ router.delete(`/`, async (req, res) => await TestController.delete(req, res, options));
20
+ return router;
21
+ }
22
+ }
18
23
 
19
- const ApiRouter = TestRouter;
24
+ const ApiRouter = (options) => TestRouter.router(options);
20
25
 
21
26
  export { ApiRouter, TestRouter };
@@ -5,14 +5,14 @@ import { getYouTubeID, validatePassword } from '../../client/components/core/Com
5
5
 
6
6
  const logger = loggerFactory(import.meta);
7
7
 
8
- const TestService = {
9
- post: async (req, res, options) => {
8
+ class TestService {
9
+ static post = async (req, res, options) => {
10
10
  switch (req.params.id) {
11
11
  default:
12
12
  break;
13
13
  }
14
- },
15
- get: async (req, res, options) => {
14
+ };
15
+ static get = async (req, res, options) => {
16
16
  switch (req.params.id) {
17
17
  case 'verify-email':
18
18
  return validator.isEmail(req.query.email);
@@ -23,13 +23,13 @@ const TestService = {
23
23
 
24
24
  default:
25
25
  }
26
- },
27
- delete: async (req, res, options) => {
26
+ };
27
+ static delete = async (req, res, options) => {
28
28
  switch (req.params.id) {
29
29
  default:
30
30
  break;
31
31
  }
32
- },
33
- };
32
+ };
33
+ }
34
34
 
35
35
  export { TestService };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @module src/api/types
3
+ * @description Shared type definitions for the Express router layer.
4
+ */
5
+
6
+ /**
7
+ * Injected dependencies and runtime configuration for every API router instance.
8
+ * Keyed per-host/path by the multi-tenant engine (see src/runtime/express/Express.js).
9
+ *
10
+ * @typedef {Object} RouterOptions
11
+ * @property {import('express').Application} app - Express application instance.
12
+ * @property {string} host - Per-runtime host identifier (e.g. "nexodev.org").
13
+ * @property {string} path - Per-runtime path prefix (e.g. "/" or "/cyberia").
14
+ * @property {string} apiPath - Computed base URL for the API layer.
15
+ * @property {string[]} origins - Allowed origins for CORS validation.
16
+ * @property {import('express').RequestHandler} authMiddleware - Dynamically generated JWT auth middleware (keyed by host+path).
17
+ * @property {Object} [db] - DataBaseProviderService configuration or instance reference.
18
+ * @property {Object} [mailer] - MailerProvider configuration or instance reference.
19
+ * @property {Object} [png] - Cached mailer image buffers (populated by UserRouter on first load).
20
+ * @property {Record<string, Buffer>} [png.buffer] - Map of image key to raw PNG buffer.
21
+ * @property {Function} [png.header] - Sets CORS/Content-Type response headers for PNG responses.
22
+ */
23
+
24
+ export { };
@@ -0,0 +1,100 @@
1
+ import mongoose from 'mongoose';
2
+ import { UserDto } from './user.model.js';
3
+ import { ValkeyAPI } from '../../server/valkey.js';
4
+ import { hashPassword, getBearerToken, jwtSign } from '../../server/auth.js';
5
+
6
+ // ─── TTL ──────────────────────────────────────────────────────────────────────
7
+
8
+ const _guestTtlMs = () => {
9
+ const minutes = Number.parseInt(process.env.REFRESH_EXPIRE_MINUTES || '60', 10);
10
+ return Number.isFinite(minutes) && minutes > 0 ? minutes * 60 * 1000 : 60 * 60 * 1000;
11
+ };
12
+
13
+ // ─── Domain helpers ───────────────────────────────────────────────────────────
14
+
15
+ /**
16
+ * Constructs a new ephemeral guest user object.
17
+ * This is domain logic specific to the guest lifecycle; it does not belong
18
+ * in the generic Valkey storage module.
19
+ *
20
+ * @param {{ host?: string }} options
21
+ * @returns {object}
22
+ */
23
+ const buildGuestUser = (options) => {
24
+ const now = new Date().toISOString();
25
+ const objectId = new mongoose.Types.ObjectId().toString();
26
+ const role = 'guest';
27
+ const username = `${role}${objectId.slice(-5)}`;
28
+ return {
29
+ _id: `${role}${objectId}`,
30
+ username,
31
+ email: `${username}@${options.host || 'localhost'}`,
32
+ password: hashPassword(process.env.JWT_SECRET),
33
+ role,
34
+ emailConfirmed: false,
35
+ profileImageId: null,
36
+ publicKey: [],
37
+ phoneNumbers: [],
38
+ activeSessions: [],
39
+ failedLoginAttempts: 0,
40
+ recoverTimeOut: null,
41
+ lastLoginDate: null,
42
+ createdAt: now,
43
+ updatedAt: now,
44
+ guestSessionExpiresAt: Date.now() + _guestTtlMs(),
45
+ };
46
+ };
47
+
48
+ /**
49
+ * Projects a user object to the public-safe fields defined by UserDto.select.get().
50
+ * Keeps this logic next to the guest domain instead of in a generic utility.
51
+ *
52
+ * @param {object} user
53
+ * @returns {object}
54
+ */
55
+ const _toPublicUser = (user) => {
56
+ const select = UserDto.select.get();
57
+ return Object.fromEntries(
58
+ Object.keys(select)
59
+ .filter((k) => select[k] === 1 && k in user)
60
+ .map((k) => [k, user[k]]),
61
+ );
62
+ };
63
+
64
+ const _withRefreshedExpiry = (user) => ({ ...user, guestSessionExpiresAt: Date.now() + _guestTtlMs() });
65
+
66
+ // ─── Service ──────────────────────────────────────────────────────────────────
67
+
68
+ class GuestService {
69
+ static async create(req, options) {
70
+ const user = buildGuestUser(options);
71
+
72
+ await ValkeyAPI.set(options, user.email, user, _guestTtlMs());
73
+
74
+ return {
75
+ token: jwtSign(
76
+ UserDto.auth.payload(user, null, req.ip, req.headers['user-agent'], options.host, options.path),
77
+ options,
78
+ ),
79
+ user: _toPublicUser(user),
80
+ };
81
+ }
82
+
83
+ static async auth(req, options) {
84
+ const user = await ValkeyAPI.get(options, req.auth.user.email);
85
+ if (!user) throw new Error('guest user expired');
86
+
87
+ const expiresAt = Number(user.guestSessionExpiresAt || 0);
88
+ if (expiresAt && expiresAt <= Date.now()) throw new Error('guest user expired');
89
+
90
+ const refreshed = _withRefreshedExpiry(user);
91
+ await ValkeyAPI.set(options, refreshed.email, refreshed, _guestTtlMs());
92
+
93
+ return {
94
+ user: _toPublicUser(refreshed),
95
+ token: getBearerToken(req),
96
+ };
97
+ }
98
+ }
99
+
100
+ export { GuestService };
@@ -25,11 +25,11 @@ const handleRequest = (serviceMethod) => async (req, res, options) => {
25
25
  }
26
26
  };
27
27
 
28
- const UserController = {
29
- post: handleRequest(UserService.post),
30
- get: handleRequest(UserService.get),
31
- delete: handleRequest(UserService.delete),
32
- put: handleRequest(UserService.put),
33
- };
28
+ class UserController {
29
+ static post = handleRequest(UserService.post);
30
+ static get = handleRequest(UserService.get);
31
+ static delete = handleRequest(UserService.delete);
32
+ static put = handleRequest(UserService.put);
33
+ }
34
34
 
35
35
  export { UserController };