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
@@ -4,24 +4,28 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CyberiaInstanceConfRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, async (req, res) => await CyberiaInstanceConfController.post(req, res, options));
11
- router.post(`/`, async (req, res) => await CyberiaInstanceConfController.post(req, res, options));
12
- router.get(
13
- `/:id`,
14
- // authMiddleware,
15
- async (req, res) => await CyberiaInstanceConfController.get(req, res, options),
16
- );
17
- router.get(`/`, async (req, res) => await CyberiaInstanceConfController.get(req, res, options));
18
- router.put(`/:id`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
19
- router.put(`/`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
20
- router.delete(`/:id`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
21
- router.delete(`/`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
22
- return router;
23
- };
7
+ class CyberiaInstanceConfRouter {
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 CyberiaInstanceConfController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await CyberiaInstanceConfController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await CyberiaInstanceConfController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await CyberiaInstanceConfController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
24
28
 
25
- const ApiRouter = CyberiaInstanceConfRouter;
29
+ const ApiRouter = (options) => CyberiaInstanceConfRouter.router(options);
26
30
 
27
31
  export { ApiRouter, CyberiaInstanceConfRouter };
@@ -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 CyberiaInstanceConfService = {
8
- post: async (req, res, options) => {
7
+ class CyberiaInstanceConfService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
10
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
10
+ const CyberiaInstanceConf =
11
+ DataBaseProviderService.getModel("CyberiaInstanceConf", options);
11
12
  return await new CyberiaInstanceConf(req.body).save();
12
- },
13
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
14
15
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
15
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
16
+ const CyberiaInstanceConf =
17
+ DataBaseProviderService.getModel("CyberiaInstanceConf", options);
16
18
  if (req.params.id) return await CyberiaInstanceConf.findById(req.params.id);
17
19
 
18
20
  // Parse query parameters using DataQuery helper
@@ -25,18 +27,20 @@ const CyberiaInstanceConfService = {
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('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
31
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
33
+ const CyberiaInstanceConf =
34
+ DataBaseProviderService.getModel("CyberiaInstanceConf", options);
32
35
  return await CyberiaInstanceConf.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('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
36
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
39
+ const CyberiaInstanceConf =
40
+ DataBaseProviderService.getModel("CyberiaInstanceConf", options);
37
41
  if (req.params.id) return await CyberiaInstanceConf.findByIdAndDelete(req.params.id);
38
42
  else return await CyberiaInstanceConf.deleteMany();
39
- },
40
- };
43
+ };
44
+ }
41
45
 
42
46
  export { CyberiaInstanceConfService };
@@ -3,8 +3,8 @@ import { CyberiaMapService } from './cyberia-map.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CyberiaMapController = {
7
- post: async (req, res, options) => {
6
+ class CyberiaMapController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await CyberiaMapService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const CyberiaMapController = {
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 CyberiaMapService.get(
@@ -43,8 +43,8 @@ const CyberiaMapController = {
43
43
  message: error.message,
44
44
  });
45
45
  }
46
- },
47
- put: async (req, res, options) => {
46
+ };
47
+ static put = async (req, res, options) => {
48
48
  try {
49
49
  const result = await CyberiaMapService.put(req, res, options);
50
50
  return res.status(200).json({
@@ -58,8 +58,8 @@ const CyberiaMapController = {
58
58
  message: error.message,
59
59
  });
60
60
  }
61
- },
62
- delete: async (req, res, options) => {
61
+ };
62
+ static delete = async (req, res, options) => {
63
63
  try {
64
64
  const result = await CyberiaMapService.delete(req, res, options);
65
65
  return res.status(200).json({
@@ -73,7 +73,7 @@ const CyberiaMapController = {
73
73
  message: error.message,
74
74
  });
75
75
  }
76
- },
77
- };
76
+ };
77
+ }
78
78
 
79
79
  export { CyberiaMapController };
@@ -5,36 +5,41 @@ import express from 'express';
5
5
 
6
6
  const logger = loggerFactory(import.meta);
7
7
 
8
- const CyberiaMapRouter = (options) => {
9
- const router = express.Router();
10
- const authMiddleware = options.authMiddleware;
11
- router.post(
12
- `/:id`,
13
- authMiddleware,
14
- userGuard,
15
- async (req, res) => await CyberiaMapController.post(req, res, options),
16
- );
17
- router.post(`/`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.post(req, res, options));
18
- router.get(`/search-codes`, async (req, res) => await CyberiaMapController.get(req, res, options));
19
- router.get(`/:id`, async (req, res) => await CyberiaMapController.get(req, res, options));
20
- router.get(`/`, async (req, res) => await CyberiaMapController.get(req, res, options));
21
- router.put(`/:id`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
22
- router.put(`/`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
23
- router.delete(
24
- `/:id`,
25
- authMiddleware,
26
- userGuard,
27
- async (req, res) => await CyberiaMapController.delete(req, res, options),
28
- );
29
- router.delete(
30
- `/`,
31
- authMiddleware,
32
- adminGuard,
33
- async (req, res) => await CyberiaMapController.delete(req, res, options),
34
- );
35
- return router;
36
- };
8
+ class CyberiaMapRouter {
9
+ /**
10
+ * @param {import('../types.js').RouterOptions} options
11
+ * @returns {import('express').Router}
12
+ */
13
+ static router(options) {
14
+ const router = express.Router();
15
+ router.post(
16
+ `/:id`,
17
+ options.authMiddleware,
18
+ userGuard,
19
+ async (req, res) => await CyberiaMapController.post(req, res, options),
20
+ );
21
+ router.post(`/`, options.authMiddleware, userGuard, async (req, res) => await CyberiaMapController.post(req, res, options));
22
+ router.get(`/search-codes`, async (req, res) => await CyberiaMapController.get(req, res, options));
23
+ router.get(`/:id`, async (req, res) => await CyberiaMapController.get(req, res, options));
24
+ router.get(`/`, async (req, res) => await CyberiaMapController.get(req, res, options));
25
+ router.put(`/:id`, options.authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
26
+ router.put(`/`, options.authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
27
+ router.delete(
28
+ `/:id`,
29
+ options.authMiddleware,
30
+ userGuard,
31
+ async (req, res) => await CyberiaMapController.delete(req, res, options),
32
+ );
33
+ router.delete(
34
+ `/`,
35
+ options.authMiddleware,
36
+ adminGuard,
37
+ async (req, res) => await CyberiaMapController.delete(req, res, options),
38
+ );
39
+ return router;
40
+ }
41
+ }
37
42
 
38
- const ApiRouter = CyberiaMapRouter;
43
+ const ApiRouter = (options) => CyberiaMapRouter.router(options);
39
44
 
40
45
  export { ApiRouter, CyberiaMapRouter };
@@ -1,19 +1,19 @@
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 CyberiaMapService = {
8
- post: async (req, res, options) => {
7
+ class CyberiaMapService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
10
- const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
10
+ const CyberiaMap = DataBaseProviderService.getModel("CyberiaMap", options);
11
11
  if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
12
12
  return await new CyberiaMap(req.body).save();
13
- },
14
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
15
15
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
16
- const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
16
+ const CyberiaMap = DataBaseProviderService.getModel("CyberiaMap", options);
17
17
  const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
18
18
 
19
19
  // GET /search-codes?q=<partial> - Fast partial match search on code
@@ -40,35 +40,35 @@ const CyberiaMapService = {
40
40
 
41
41
  const totalPages = Math.ceil(total / limit);
42
42
  return { data, total, page, totalPages };
43
- },
44
- put: async (req, res, options) => {
43
+ };
44
+ static put = async (req, res, options) => {
45
45
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
46
- const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
46
+ const CyberiaMap = DataBaseProviderService.getModel("CyberiaMap", options);
47
47
  const map = await CyberiaMap.findById(req.params.id);
48
48
  if (!map) throw new Error('map not found');
49
49
  if (req.auth.user.role !== 'admin' && String(map.creator) !== String(req.auth.user._id))
50
50
  throw new Error('insufficient permission');
51
51
  if (req.body.thumbnail && map.thumbnail && String(req.body.thumbnail) !== String(map.thumbnail)) {
52
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
52
+ const File = DataBaseProviderService.getModel("File", options);
53
53
  await File.findByIdAndDelete(map.thumbnail);
54
54
  }
55
55
  return await CyberiaMap.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
59
- const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
59
+ const CyberiaMap = DataBaseProviderService.getModel("CyberiaMap", options);
60
60
  if (req.params.id) {
61
61
  const map = await CyberiaMap.findById(req.params.id);
62
62
  if (!map) throw new Error('map not found');
63
63
  if (req.auth.user.role !== 'admin' && String(map.creator) !== String(req.auth.user._id))
64
64
  throw new Error('insufficient permission');
65
65
  if (map.thumbnail) {
66
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
66
+ const File = DataBaseProviderService.getModel("File", options);
67
67
  await File.findByIdAndDelete(map.thumbnail);
68
68
  }
69
69
  return await CyberiaMap.findByIdAndDelete(req.params.id);
70
70
  } else return await CyberiaMap.deleteMany();
71
- },
72
- };
71
+ };
72
+ }
73
73
 
74
74
  export { CyberiaMapService };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaQuestService } from './cyberia-quest.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaQuestController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaQuestService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ };
22
+ static get = async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaQuestService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ };
42
+ static put = async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaQuestService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ };
57
+ static delete = async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaQuestService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ export { CyberiaQuestController };
@@ -0,0 +1,67 @@
1
+ import { Schema, model } from 'mongoose';
2
+ import { QUEST_STEPS_TYPES } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
3
+
4
+ // https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
5
+
6
+ const CyberiaQuestSchema = new Schema(
7
+ {
8
+ // Spatial origin: the NPC/entity cell that grants this quest.
9
+ // Matched against map entity initCellX/initCellY during instance init
10
+ // and assignable from ObjectLayerEngineModal.
11
+ sourceMapCode: { type: String, trim: true },
12
+ sourceCellX: { type: Number },
13
+ sourceCellY: { type: Number },
14
+
15
+ // Stable slug, e.g. "fallback-intro-quest"
16
+ code: { type: String, required: true, trim: true },
17
+ title: { type: String, required: true, trim: true },
18
+ description: { type: String, default: '' },
19
+
20
+ // ── Chain / tree unlock structure ─────────────────────────────────────
21
+ // All listed quest codes must be completed before this quest becomes
22
+ // available (AND logic). Empty array = no prerequisites.
23
+ prerequisiteCodes: { type: [String], default: [] },
24
+
25
+ // Quest codes unlocked when this quest is completed.
26
+ // Supports both chain (one successor) and tree (multiple successors).
27
+ // The server re-checks prerequisiteCodes on each target before activating it.
28
+ unlocksQuestCodes: { type: [String], default: [] },
29
+
30
+ // ── Steps ─────────────────────────────────────────────────────────────
31
+ // Ordered linear sequence. The active step is always the first incomplete one.
32
+ steps: [
33
+ {
34
+ id: { type: String, required: true },
35
+ description: { type: String, default: '' },
36
+ objectives: [
37
+ {
38
+ // collect — itemId = item that must appear in the player's inventory
39
+ // talk — itemId = provideItemId of the CyberiaAction to interact with
40
+ // kill — itemId = skin item ID of the target entity
41
+ type: { type: String, required: true, enum: QUEST_STEPS_TYPES },
42
+ itemId: { type: String, required: true, trim: true },
43
+ quantity: { type: Number, default: 1, min: 1 },
44
+ },
45
+ ],
46
+ },
47
+ ],
48
+
49
+ // ── Rewards ───────────────────────────────────────────────────────────
50
+ rewards: [
51
+ {
52
+ itemId: { type: String, required: true, trim: true },
53
+ quantity: { type: Number, default: 1, min: 1 },
54
+ },
55
+ ],
56
+ },
57
+ { timestamps: true },
58
+ );
59
+
60
+ CyberiaQuestSchema.index({ code: 1 }, { unique: true });
61
+ CyberiaQuestSchema.index({ sourceMapCode: 1, sourceCellX: 1, sourceCellY: 1 });
62
+
63
+ const CyberiaQuestModel = model('CyberiaQuest', CyberiaQuestSchema);
64
+
65
+ const ProviderSchema = CyberiaQuestSchema;
66
+
67
+ export { CyberiaQuestSchema, CyberiaQuestModel, ProviderSchema };
@@ -0,0 +1,31 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaQuestController } from './cyberia-quest.controller.js';
3
+ import express from 'express';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ class CyberiaQuestRouter {
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 CyberiaQuestController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await CyberiaQuestController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await CyberiaQuestController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await CyberiaQuestController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await CyberiaQuestController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await CyberiaQuestController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await CyberiaQuestController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await CyberiaQuestController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
28
+
29
+ const ApiRouter = (options) => CyberiaQuestRouter.router(options);
30
+
31
+ export { ApiRouter, CyberiaQuestRouter };
@@ -0,0 +1,42 @@
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
+ import { loggerFactory } from '../../server/logger.js';
3
+ import { DataQuery } from '../../server/data-query.js';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ class CyberiaQuestService {
8
+ static post = async (req, res, options) => {
9
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
10
+ const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
11
+ return await new CyberiaQuest(req.body).save();
12
+ };
13
+ static get = async (req, res, options) => {
14
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
15
+ const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
16
+ if (req.params.id) return await CyberiaQuest.findById(req.params.id);
17
+
18
+ // Parse query parameters using DataQuery helper
19
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
20
+
21
+ const [data, total] = await Promise.all([
22
+ CyberiaQuest.find(query).sort(sort).limit(limit).skip(skip),
23
+ CyberiaQuest.countDocuments(query),
24
+ ]);
25
+
26
+ const totalPages = Math.ceil(total / limit);
27
+ return { data, total, page, totalPages };
28
+ };
29
+ static put = async (req, res, options) => {
30
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
31
+ const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
32
+ return await CyberiaQuest.findByIdAndUpdate(req.params.id, req.body);
33
+ };
34
+ static delete = async (req, res, options) => {
35
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
36
+ const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
37
+ if (req.params.id) return await CyberiaQuest.findByIdAndDelete(req.params.id);
38
+ else return await CyberiaQuest.deleteMany();
39
+ };
40
+ }
41
+
42
+ export { CyberiaQuestService };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaQuestProgressService } from './cyberia-quest-progress.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaQuestProgressController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaQuestProgressService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ };
22
+ static get = async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaQuestProgressService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ };
42
+ static put = async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaQuestProgressService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ };
57
+ static delete = async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaQuestProgressService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ export { CyberiaQuestProgressController };
@@ -0,0 +1,49 @@
1
+ import { Schema, model } from 'mongoose';
2
+
3
+ // https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
4
+
5
+ const CyberiaQuestProgressSchema = new Schema(
6
+ {
7
+ // Matches the Go relay server's player UUID
8
+ playerId: { type: String, required: true, trim: true },
9
+ // References CyberiaQuest.code
10
+ questCode: { type: String, required: true, trim: true },
11
+ // active | completed
12
+ // Quests do not fail — they stay active until completed or abandoned by the player.
13
+ status: {
14
+ type: String,
15
+ required: true,
16
+ enum: ['active', 'completed'],
17
+ default: 'active',
18
+ },
19
+ // One entry per step in the corresponding CyberiaQuest.steps[].
20
+ // A step is complete when all its objectiveProgress entries satisfy current >= required.
21
+ // The active step is the first step where not all objectives are done.
22
+ // done flags are intentionally omitted — completeness is always computed, never stored.
23
+ stepProgress: [
24
+ {
25
+ stepId: { type: String, required: true },
26
+ // One entry per objective in CyberiaQuest.steps[i].objectives[].
27
+ // `required` is denormalized from the quest definition for efficient server checks.
28
+ objectiveProgress: [
29
+ {
30
+ current: { type: Number, default: 0, min: 0 },
31
+ required: { type: Number, default: 1, min: 1 },
32
+ },
33
+ ],
34
+ },
35
+ ],
36
+ startedAt: { type: Date, default: Date.now },
37
+ completedAt: { type: Date, default: null },
38
+ },
39
+ { timestamps: true },
40
+ );
41
+
42
+ CyberiaQuestProgressSchema.index({ playerId: 1, questCode: 1 }, { unique: true });
43
+ CyberiaQuestProgressSchema.index({ playerId: 1, status: 1 });
44
+
45
+ const CyberiaQuestProgressModel = model('CyberiaQuestProgress', CyberiaQuestProgressSchema);
46
+
47
+ const ProviderSchema = CyberiaQuestProgressSchema;
48
+
49
+ export { CyberiaQuestProgressSchema, CyberiaQuestProgressModel, ProviderSchema };