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
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # ──────────────────────────────────────────────────────────────────
5
+ # rhel-grpc-setup.sh — Install gRPC / Protocol Buffers system
6
+ # packages on RHEL / Rocky Linux / AlmaLinux / Fedora.
7
+ #
8
+ # Installs:
9
+ # 1. protobuf-compiler (protoc) + protobuf-devel
10
+ # 2. grpc / grpc-devel / grpc-plugins (C++ libs + plugin binaries)
11
+ #
12
+ # For Go-specific tooling (protoc-gen-go, protoc-gen-go-grpc,
13
+ # go mod tidy, proto codegen) use:
14
+ # ./cyberia-server/scripts/grpc-setup.sh
15
+ #
16
+ # Usage:
17
+ # sudo ./scripts/rhel-grpc-setup.sh
18
+ # ──────────────────────────────────────────────────────────────────
19
+
20
+ if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
21
+ echo "Usage: sudo $0"
22
+ echo "Installs protobuf + gRPC system packages via dnf."
23
+ echo "For Go codegen plugins, run: ./cyberia-server/scripts/grpc-setup.sh"
24
+ exit 0
25
+ fi
26
+
27
+ # ── 1. Enable EPEL (needed for protobuf / grpc on RHEL) ──────────
28
+ echo ">>> Enabling EPEL repository..."
29
+ sudo dnf install -y epel-release || true
30
+ sudo dnf install -y dnf-plugins-core || true
31
+
32
+ # On RHEL proper, enable CRB/PowerTools for devel headers
33
+ if grep -qi 'Red Hat Enterprise' /etc/os-release 2>/dev/null; then
34
+ sudo dnf config-manager --set-enabled codeready-builder-for-rhel-"$(rpm -E %rhel)"-"$(uname -m)-rpms" 2>/dev/null || true
35
+ elif grep -qi 'Rocky\|AlmaLinux' /etc/os-release 2>/dev/null; then
36
+ sudo dnf config-manager --set-enabled crb 2>/dev/null || \
37
+ sudo dnf config-manager --set-enabled powertools 2>/dev/null || true
38
+ fi
39
+
40
+ # ── 2. Install protobuf compiler + gRPC system packages ──────────
41
+ echo ">>> Installing protobuf-compiler, protobuf-devel, grpc, grpc-devel, grpc-plugins..."
42
+ sudo dnf install -y \
43
+ protobuf-compiler \
44
+ protobuf-devel \
45
+ grpc \
46
+ grpc-devel \
47
+ grpc-plugins
48
+
49
+ # ── 3. Verify protoc ─────────────────────────────────────────────
50
+ if command -v protoc &>/dev/null; then
51
+ echo ">>> protoc installed: $(protoc --version)"
52
+ else
53
+ echo "WARNING: protoc not found in PATH after install." >&2
54
+ fi
55
+
56
+ echo ">>> gRPC system packages setup complete."
@@ -3,8 +3,28 @@ import { AtlasSpriteSheetService } from './atlas-sprite-sheet.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const AtlasSpriteSheetController = {
7
- generate: async (req, res, options) => {
6
+ class AtlasSpriteSheetController {
7
+ static blob = async (req, res, options) => {
8
+ try {
9
+ if (req && req.headers && req.headers.origin) {
10
+ res.set('Access-Control-Allow-Origin', req.headers.origin);
11
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
12
+ res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
13
+
14
+ const { buffer, mimetype, name } = await AtlasSpriteSheetService.blob(req, res, options);
15
+ res.set('Content-Type', mimetype);
16
+ res.set('Content-Length', buffer.length);
17
+ res.set('Content-Disposition', `inline; filename="${name}"`);
18
+ return res.status(200).end(buffer);
19
+ } catch (error) {
20
+ logger.error('AtlasSpriteSheetController.blob error:', error);
21
+ return res.status(404).json({
22
+ status: 'error',
23
+ message: error.message,
24
+ });
25
+ }
26
+ };
27
+ static generate = async (req, res, options) => {
8
28
  try {
9
29
  const result = await AtlasSpriteSheetService.generate(req, res, options);
10
30
  return res.status(200).json({
@@ -18,8 +38,8 @@ const AtlasSpriteSheetController = {
18
38
  message: error.message,
19
39
  });
20
40
  }
21
- },
22
- deleteByObjectLayerId: async (req, res, options) => {
41
+ };
42
+ static deleteByObjectLayerId = async (req, res, options) => {
23
43
  try {
24
44
  const result = await AtlasSpriteSheetService.deleteByObjectLayerId(req, res, options);
25
45
  return res.status(200).json({
@@ -33,8 +53,8 @@ const AtlasSpriteSheetController = {
33
53
  message: error.message,
34
54
  });
35
55
  }
36
- },
37
- post: async (req, res, options) => {
56
+ };
57
+ static post = async (req, res, options) => {
38
58
  try {
39
59
  const result = await AtlasSpriteSheetService.post(req, res, options);
40
60
  return res.status(200).json({
@@ -48,8 +68,8 @@ const AtlasSpriteSheetController = {
48
68
  message: error.message,
49
69
  });
50
70
  }
51
- },
52
- get: async (req, res, options) => {
71
+ };
72
+ static get = async (req, res, options) => {
53
73
  try {
54
74
  if (req && req.headers && req.headers.origin) {
55
75
  res.set('Access-Control-Allow-Origin', req.headers.origin);
@@ -72,8 +92,8 @@ const AtlasSpriteSheetController = {
72
92
  message: error.message,
73
93
  });
74
94
  }
75
- },
76
- put: async (req, res, options) => {
95
+ };
96
+ static put = async (req, res, options) => {
77
97
  try {
78
98
  const result = await AtlasSpriteSheetService.put(req, res, options);
79
99
  return res.status(200).json({
@@ -87,8 +107,8 @@ const AtlasSpriteSheetController = {
87
107
  message: error.message,
88
108
  });
89
109
  }
90
- },
91
- delete: async (req, res, options) => {
110
+ };
111
+ static delete = async (req, res, options) => {
92
112
  try {
93
113
  const result = await AtlasSpriteSheetService.delete(req, res, options);
94
114
  return res.status(200).json({
@@ -102,7 +122,31 @@ const AtlasSpriteSheetController = {
102
122
  message: error.message,
103
123
  });
104
124
  }
105
- },
106
- };
125
+ };
126
+ static getMetadata = async (req, res, options) => {
127
+ try {
128
+ if (req && req.headers && req.headers.origin) {
129
+ res.set('Access-Control-Allow-Origin', req.headers.origin);
130
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
131
+ res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
132
+ const { page, limit } = req.query;
133
+ const result = await AtlasSpriteSheetService.getMetadata(
134
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
135
+ res,
136
+ options,
137
+ );
138
+ return res.status(200).json({
139
+ status: 'success',
140
+ data: result,
141
+ });
142
+ } catch (error) {
143
+ logger.error(error, error.stack);
144
+ return res.status(404).json({
145
+ status: 'error',
146
+ message: error.message,
147
+ });
148
+ }
149
+ };
150
+ }
107
151
 
108
152
  export { AtlasSpriteSheetController };
@@ -3,9 +3,7 @@
3
3
  * @module src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js
4
4
  * @namespace CyberiaAtlasSpriteSheetModel
5
5
  */
6
-
7
6
  import { Schema, model, Types } from 'mongoose';
8
-
9
7
  /**
10
8
  * @typedef {Object} FrameMetadata
11
9
  * @property {number} x - X position in the atlas
@@ -25,7 +23,6 @@ const FrameMetadataSchema = new Schema(
25
23
  },
26
24
  { _id: false },
27
25
  );
28
-
29
26
  /**
30
27
  * @typedef {Object} DirectionFrames
31
28
  * @property {FrameMetadata[]} up_idle - Up idle animation frames
@@ -71,7 +68,6 @@ const DirectionFramesSchema = new Schema(
71
68
  },
72
69
  { _id: false },
73
70
  );
74
-
75
71
  /**
76
72
  * @typedef {Object} AtlasSpriteSheet
77
73
  * @property {Types.ObjectId} fileId - Reference to File document (consolidated PNG)
@@ -81,6 +77,7 @@ const DirectionFramesSchema = new Schema(
81
77
  * @property {number} metadata.atlasWidth - Total atlas width in pixels
82
78
  * @property {number} metadata.atlasHeight - Total atlas height in pixels
83
79
  * @property {number} metadata.cellPixelDim - Pixel dimension of each cell
80
+ * @property {number} metadata.frame_duration - Duration of each frame in milliseconds
84
81
  * @property {DirectionFrames} metadata.frames - Frame positions in atlas by direction
85
82
  * @property {Date} createdAt - When the document was created
86
83
  * @property {Date} updatedAt - When the document was last updated
@@ -103,6 +100,7 @@ const AtlasSpriteSheetSchema = new Schema(
103
100
  atlasWidth: { type: Number, required: true, min: 1 },
104
101
  atlasHeight: { type: Number, required: true, min: 1 },
105
102
  cellPixelDim: { type: Number, required: true, min: 1, default: 20 },
103
+ frame_duration: { type: Number, min: 0, default: 100 },
106
104
  frames: { type: DirectionFramesSchema, required: true },
107
105
  },
108
106
  },
@@ -112,24 +110,19 @@ const AtlasSpriteSheetSchema = new Schema(
112
110
  toObject: { virtuals: true },
113
111
  },
114
112
  );
115
-
116
113
  // Indexes for efficient querying
117
114
  AtlasSpriteSheetSchema.index({ 'metadata.itemKey': 1 }, { unique: true });
118
115
  AtlasSpriteSheetSchema.index({ fileId: 1 });
119
-
120
116
  // Pre-save validation
121
117
  AtlasSpriteSheetSchema.pre('save', function () {
122
118
  if (!this.fileId || !this.metadata) {
123
119
  throw new Error('AtlasSpriteSheet missing required fields: fileId or metadata');
124
120
  }
125
121
  });
126
-
127
122
  const AtlasSpriteSheetModel = model('AtlasSpriteSheet', AtlasSpriteSheetSchema);
128
-
129
123
  const ProviderSchema = AtlasSpriteSheetSchema;
130
-
131
- const AtlasSpriteSheetDto = {
132
- select: {
124
+ class AtlasSpriteSheetDto {
125
+ static select = {
133
126
  get: () => {
134
127
  return {
135
128
  _id: 1,
@@ -140,7 +133,23 @@ const AtlasSpriteSheetDto = {
140
133
  updatedAt: 1,
141
134
  };
142
135
  },
143
- },
144
- };
145
-
136
+ // Returns all fields the client needs per itemKey:
137
+ // layout dims + frames for rendering, no fileId.
138
+ // Client flow: GET /metadata/:itemKey → cache → GET /blob/:itemKey → cache PNG.
139
+ getMetadataOnly: () => {
140
+ return {
141
+ _id: 1,
142
+ cid: 1,
143
+ 'metadata.itemKey': 1,
144
+ 'metadata.atlasWidth': 1,
145
+ 'metadata.atlasHeight': 1,
146
+ 'metadata.cellPixelDim': 1,
147
+ 'metadata.frame_duration': 1,
148
+ 'metadata.frames': 1,
149
+ createdAt: 1,
150
+ updatedAt: 1,
151
+ };
152
+ },
153
+ };
154
+ }
146
155
  export { AtlasSpriteSheetSchema, AtlasSpriteSheetModel, ProviderSchema, AtlasSpriteSheetDto };
@@ -19,6 +19,11 @@ const AtlasSpriteSheetRouter = (options) => {
19
19
  );
20
20
  router.post(`/:id`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
21
21
  router.post(`/`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
22
+ router.get(`/blob/:itemKey`, async (req, res) => await AtlasSpriteSheetController.blob(req, res, options));
23
+ // Metadata endpoints: returns itemKey, atlasWidth, atlasHeight, cellPixelDim, frames (no fileId).
24
+ // Client fetches /metadata/:itemKey once, caches it, then fetches /blob/:itemKey for the PNG.
25
+ router.get(`/metadata/:itemKey`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
26
+ router.get(`/metadata`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
22
27
  router.get(
23
28
  `/:id`,
24
29
  // authMiddleware,
@@ -8,9 +8,67 @@ import { IpfsClient } from '../../server/ipfs-client.js';
8
8
  import { createPinRecord, removePinRecordsAndUnpin } from '../ipfs/ipfs.service.js';
9
9
 
10
10
  const logger = loggerFactory(import.meta);
11
+ const DEFAULT_ATLAS_FRAME_DURATION = 100;
11
12
 
12
- const AtlasSpriteSheetService = {
13
- generate: async (req, res, options) => {
13
+ function parseAtlasFrameDuration(value) {
14
+ const frameDuration = Number(value);
15
+ return Number.isFinite(frameDuration) ? frameDuration : null;
16
+ }
17
+
18
+ async function resolveAtlasFrameDuration(ObjectLayer, itemKey) {
19
+ if (!itemKey) return DEFAULT_ATLAS_FRAME_DURATION;
20
+
21
+ const objectLayer = await ObjectLayer.findOne({ 'data.item.id': itemKey })
22
+ .select({ _id: 1, objectLayerRenderFramesId: 1 })
23
+ .populate('objectLayerRenderFramesId', { _id: 1, frame_duration: 1 })
24
+ .lean();
25
+
26
+ return (
27
+ parseAtlasFrameDuration(objectLayer?.objectLayerRenderFramesId?.frame_duration) || DEFAULT_ATLAS_FRAME_DURATION
28
+ );
29
+ }
30
+
31
+ async function withResolvedAtlasFrameDuration(doc, ObjectLayer) {
32
+ if (!doc?.metadata) return doc;
33
+
34
+ const frameDuration = parseAtlasFrameDuration(doc.metadata.frame_duration);
35
+ if (frameDuration !== null) {
36
+ return {
37
+ ...doc,
38
+ metadata: {
39
+ ...doc.metadata,
40
+ frame_duration: frameDuration,
41
+ },
42
+ };
43
+ }
44
+
45
+ return {
46
+ ...doc,
47
+ metadata: {
48
+ ...doc.metadata,
49
+ frame_duration: await resolveAtlasFrameDuration(ObjectLayer, doc.metadata.itemKey),
50
+ },
51
+ };
52
+ }
53
+
54
+ class AtlasSpriteSheetService {
55
+ static blob = async (req, res, options) => {
56
+ /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
57
+ const AtlasSpriteSheet =
58
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
59
+ /** @type {import('../file/file.model.js').FileModel} */
60
+ const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
61
+
62
+ const itemKey = req.params.itemKey;
63
+ const atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey }).lean();
64
+ if (!atlasDoc) throw new Error(`Atlas not found for itemKey: ${itemKey}`);
65
+
66
+ const fileDoc = await File.findById(atlasDoc.fileId);
67
+ if (!fileDoc || !fileDoc.data) throw new Error(`File not found for atlas itemKey: ${itemKey}`);
68
+
69
+ return { buffer: Buffer.from(fileDoc.data), mimetype: fileDoc.mimetype || 'image/png', name: fileDoc.name };
70
+ };
71
+ static generate = async (req, res, options, generateOptions = {}) => {
14
72
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
15
73
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
16
74
  /** @type {import('../file/file.model.js').FileModel} */
@@ -53,9 +111,6 @@ const AtlasSpriteSheetService = {
53
111
  );
54
112
  if (ipfsResult) {
55
113
  atlasCid = ipfsResult.cid;
56
- if (userId) {
57
- await createPinRecord({ cid: atlasCid, userId, options });
58
- }
59
114
  logger.info(`Atlas sprite sheet pinned to IPFS – CID: ${atlasCid}`);
60
115
  }
61
116
  } catch (ipfsError) {
@@ -71,9 +126,6 @@ const AtlasSpriteSheetService = {
71
126
  );
72
127
  if (metadataIpfsResult) {
73
128
  atlasMetadataCid = metadataIpfsResult.cid;
74
- if (userId) {
75
- await createPinRecord({ cid: atlasMetadataCid, userId, options });
76
- }
77
129
  logger.info(`Atlas metadata pinned to IPFS – CID: ${atlasMetadataCid}`);
78
130
  }
79
131
  } catch (ipfsError) {
@@ -99,6 +151,39 @@ const AtlasSpriteSheetService = {
99
151
  }).save();
100
152
  }
101
153
 
154
+ // Register CIDs in the IPFS registry now that atlasDoc._id is known.
155
+ if (atlasCid) {
156
+ try {
157
+ await createPinRecord({
158
+ cid: atlasCid,
159
+ resourceType: 'atlas-sprite-sheet',
160
+ mfsPath: `/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet.png`,
161
+ options,
162
+ });
163
+ } catch (e) {
164
+ logger.warn('IPFS registry update failed (atlas PNG):', e.message);
165
+ }
166
+ }
167
+ if (atlasMetadataCid) {
168
+ try {
169
+ await createPinRecord({
170
+ cid: atlasMetadataCid,
171
+ resourceType: 'atlas-metadata',
172
+ mfsPath: `/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet_metadata.json`,
173
+ options,
174
+ });
175
+ } catch (e) {
176
+ logger.warn('IPFS registry update failed (atlas metadata):', e.message);
177
+ }
178
+ }
179
+
180
+ // When skipObjectLayerSave is set, return CIDs without mutating the OL document.
181
+ // This enables cut-over consistency: callers stage CIDs in memory and write the
182
+ // ObjectLayer atomically only after all CIDs are computed.
183
+ if (generateOptions.skipObjectLayerSave) {
184
+ return { atlasDoc, atlasCid, atlasMetadataCid };
185
+ }
186
+
102
187
  objectLayer.atlasSpriteSheetId = atlasDoc._id;
103
188
  if (!objectLayer.data.render) objectLayer.data.render = {};
104
189
  objectLayer.data.render.cid = atlasCid;
@@ -107,8 +192,8 @@ const AtlasSpriteSheetService = {
107
192
  await objectLayer.save();
108
193
 
109
194
  return atlasDoc;
110
- },
111
- deleteByObjectLayerId: async (req, res, options) => {
195
+ };
196
+ static deleteByObjectLayerId = async (req, res, options) => {
112
197
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
113
198
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
114
199
  /** @type {import('../file/file.model.js').FileModel} */
@@ -166,14 +251,14 @@ const AtlasSpriteSheetService = {
166
251
  }
167
252
 
168
253
  return { success: true };
169
- },
170
- post: async (req, res, options) => {
254
+ };
255
+ static post = async (req, res, options) => {
171
256
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
172
257
  const AtlasSpriteSheet =
173
258
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
174
259
  return await new AtlasSpriteSheet(req.body).save();
175
- },
176
- get: async (req, res, options) => {
260
+ };
261
+ static get = async (req, res, options) => {
177
262
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
178
263
  const AtlasSpriteSheet =
179
264
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -197,14 +282,57 @@ const AtlasSpriteSheetService = {
197
282
 
198
283
  const totalPages = Math.ceil(total / limit);
199
284
  return { data, total, page, totalPages };
200
- },
201
- put: async (req, res, options) => {
285
+ };
286
+ // Returns atlas metadata (layout + frames) for the client.
287
+ // Client fetches this once per itemKey, caches it, then fetches the PNG blob.
288
+ static getMetadata = async (req, res, options) => {
289
+ /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
290
+ const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
291
+ /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
292
+ const AtlasSpriteSheet =
293
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
294
+
295
+ if (req.params.itemKey) {
296
+ const doc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': req.params.itemKey })
297
+ .select(AtlasSpriteSheetDto.select.getMetadataOnly())
298
+ .lean();
299
+ if (!doc) throw new Error(`Atlas not found for itemKey: ${req.params.itemKey}`);
300
+ return await withResolvedAtlasFrameDuration(doc, ObjectLayer);
301
+ }
302
+
303
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
304
+
305
+ const [data, total] = await Promise.all([
306
+ AtlasSpriteSheet.find(query)
307
+ .select(AtlasSpriteSheetDto.select.getMetadataOnly())
308
+ .sort(sort)
309
+ .limit(limit)
310
+ .skip(skip)
311
+ .lean(),
312
+ AtlasSpriteSheet.countDocuments(query),
313
+ ]);
314
+
315
+ const totalPages = Math.ceil(total / limit);
316
+ return {
317
+ data: data.map((doc) => ({
318
+ ...doc,
319
+ metadata: {
320
+ ...doc.metadata,
321
+ frame_duration: parseAtlasFrameDuration(doc?.metadata?.frame_duration) || DEFAULT_ATLAS_FRAME_DURATION,
322
+ },
323
+ })),
324
+ total,
325
+ page,
326
+ totalPages,
327
+ };
328
+ };
329
+ static put = async (req, res, options) => {
202
330
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
203
331
  const AtlasSpriteSheet =
204
332
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
205
333
  return await AtlasSpriteSheet.findByIdAndUpdate(req.params.id, req.body);
206
- },
207
- delete: async (req, res, options) => {
334
+ };
335
+ static delete = async (req, res, options) => {
208
336
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
209
337
  const AtlasSpriteSheet =
210
338
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -256,7 +384,7 @@ const AtlasSpriteSheetService = {
256
384
  }
257
385
  return await AtlasSpriteSheet.deleteMany();
258
386
  }
259
- },
260
- };
387
+ };
388
+ }
261
389
 
262
390
  export { AtlasSpriteSheetService };
@@ -3,8 +3,8 @@ import { CoreService } from './core.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CoreController = {
7
- post: async (req, res, options) => {
6
+ class CoreController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await CoreService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const CoreController = {
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 result = await CoreService.put(req, res, options);
25
25
  return res.status(200).json({
@@ -33,8 +33,8 @@ const CoreController = {
33
33
  message: error.message,
34
34
  });
35
35
  }
36
- },
37
- put: async (req, res, options) => {
36
+ };
37
+ static put = async (req, res, options) => {
38
38
  try {
39
39
  const result = await CoreService.get(req, res, options);
40
40
  return res.status(200).json({
@@ -48,8 +48,8 @@ const CoreController = {
48
48
  message: error.message,
49
49
  });
50
50
  }
51
- },
52
- delete: async (req, res, options) => {
51
+ };
52
+ static delete = async (req, res, options) => {
53
53
  try {
54
54
  const result = await CoreService.delete(req, res, options);
55
55
  return res.status(200).json({
@@ -63,7 +63,7 @@ const CoreController = {
63
63
  message: error.message,
64
64
  });
65
65
  }
66
- },
67
- };
66
+ };
67
+ }
68
68
 
69
69
  export { CoreController };
@@ -4,27 +4,27 @@ import { shellExec } from '../../server/process.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CoreService = {
8
- post: async (req, res, options) => {
7
+ class CoreService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./core.model.js').CoreModel} */
10
10
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
11
11
  return await new Core(req.body).save();
12
- },
13
- get: async (req, res, options) => {
12
+ };
13
+ static get = async (req, res, options) => {
14
14
  /** @type {import('./core.model.js').CoreModel} */
15
15
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
16
16
  return await Core.findById(req.params.id);
17
- },
18
- put: async (req, res, options) => {
17
+ };
18
+ static put = async (req, res, options) => {
19
19
  /** @type {import('./core.model.js').CoreModel} */
20
20
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
21
21
  return await Core.findByIdAndUpdate(req.params.id, req.body);
22
- },
23
- delete: async (req, res, options) => {
22
+ };
23
+ static delete = async (req, res, options) => {
24
24
  /** @type {import('./core.model.js').CoreModel} */
25
25
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
26
26
  return await Core.findByIdAndDelete(req.params.id);
27
- },
28
- };
27
+ };
28
+ }
29
29
 
30
30
  export { CoreService };
@@ -2,8 +2,8 @@ import { loggerFactory } from '../../server/logger.js';
2
2
  import { CryptoService } from './crypto.service.js';
3
3
  const logger = loggerFactory(import.meta);
4
4
 
5
- const CryptoController = {
6
- post: async (req, res, options) => {
5
+ class CryptoController {
6
+ static post = async (req, res, options) => {
7
7
  try {
8
8
  return res.status(200).json({
9
9
  status: 'success',
@@ -16,8 +16,8 @@ const CryptoController = {
16
16
  message: error.message,
17
17
  });
18
18
  }
19
- },
20
- get: async (req, res, options) => {
19
+ };
20
+ static get = async (req, res, options) => {
21
21
  try {
22
22
  return res.status(200).json({
23
23
  status: 'success',
@@ -30,8 +30,8 @@ const CryptoController = {
30
30
  message: error.message,
31
31
  });
32
32
  }
33
- },
34
- delete: async (req, res, options) => {
33
+ };
34
+ static delete = async (req, res, options) => {
35
35
  try {
36
36
  const result = await CryptoService.delete(req, res, options);
37
37
  return res.status(200).json({
@@ -45,7 +45,7 @@ const CryptoController = {
45
45
  message: error.message,
46
46
  });
47
47
  }
48
- },
49
- };
48
+ };
49
+ }
50
50
 
51
51
  export { CryptoController };
@@ -3,8 +3,8 @@ import crypto from 'crypto';
3
3
  import { DataBaseProvider } from '../../db/DataBaseProvider.js';
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CryptoService = {
7
- post: async (req, res, options) => {
6
+ class CryptoService {
7
+ static post = async (req, res, options) => {
8
8
  /** @type {import('./crypto.model.js').CryptoModel} */
9
9
  const Crypto = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Crypto;
10
10
  /** @type {import('../user/user.model.js').UserModel} */
@@ -48,17 +48,17 @@ const CryptoService = {
48
48
  return publicKey;
49
49
  }
50
50
  }
51
- },
52
- get: async (req, res, options) => {
51
+ };
52
+ static get = async (req, res, options) => {
53
53
  switch (req.params.id) {
54
54
  default:
55
55
  }
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  switch (req.params.id) {
59
59
  default:
60
60
  }
61
- },
62
- };
61
+ };
62
+ }
63
63
 
64
64
  export { CryptoService };