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,178 @@
1
+ /**
2
+ * Fallback World Generator — pure-function module.
3
+ *
4
+ * Produces a complete in-memory multi-map world with portal topology,
5
+ * floor tiles, obstacles, foreground, and bots. Nothing is persisted
6
+ * to MongoDB — the result is regenerated on every call.
7
+ *
8
+ * Everything that can be random IS random (counts within ranges,
9
+ * positions, dimensions). The floor is the exception: it deterministically
10
+ * covers the entire map grid so there are no gaps.
11
+ *
12
+ * Shared by:
13
+ * - gRPC server (getFullInstance fallback path)
14
+ * - CyberiaInstanceService (API / GUI fallback endpoint)
15
+ *
16
+ * All exported functions are stateless and synchronous.
17
+ *
18
+ * @module src/api/cyberia-instance/cyberia-fallback-world
19
+ */
20
+
21
+ import { connectPortals } from './cyberia-portal-connector.js';
22
+
23
+ import {
24
+ generateObstacles,
25
+ generateForeground,
26
+ generateResources,
27
+ generateFloorEntities,
28
+ generatePortalEntity,
29
+ generatePortalEntities,
30
+ generateBots,
31
+ OccupancyGrid,
32
+ } from './cyberia-world-generator.js';
33
+
34
+ import { CYBERIA_INSTANCE_CONF_DEFAULTS } from '../cyberia-instance-conf/cyberia-instance-conf.defaults.js';
35
+
36
+ // ── Defaults ─────────────────────────────────────────────────────────────────
37
+
38
+ const DEFAULT_MAP_COUNT = 4;
39
+ const DEFAULT_GRID_SIZE = 64;
40
+
41
+ // ── Single map generator ─────────────────────────────────────────────────────
42
+
43
+ /**
44
+ * Generate a complete in-memory map with all entity types.
45
+ * Everything except floor tiles is randomized.
46
+ *
47
+ * @param {string} mapCode
48
+ * @param {Array} colors Palette from CYBERIA_INSTANCE_CONF_DEFAULTS.
49
+ * @param {object} [opts]
50
+ * @param {number} [opts.gridSize]
51
+ * @param {number} [opts.obstacleCount]
52
+ * @param {number} [opts.foregroundCount]
53
+ * @param {number} [opts.botCount]
54
+ * @param {number} [opts.resourceCount]
55
+ * @returns {object} CyberiaMap-shaped plain object.
56
+ */
57
+ function generateFallbackMap(mapCode, colors, opts = {}) {
58
+ const gridSize = opts.gridSize || DEFAULT_GRID_SIZE;
59
+ const mapDims = { gridX: gridSize, gridY: gridSize };
60
+
61
+ // 1. Floor — deterministic full coverage
62
+ const floors = generateFloorEntities(mapDims, colors);
63
+
64
+ // 2. Obstacles — random count, position, dimensions (placed first)
65
+ const obstacles = generateObstacles(mapDims, colors, { count: opts.obstacleCount });
66
+
67
+ // 3. Build occupancy grid from obstacles
68
+ const grid = new OccupancyGrid(gridSize, gridSize);
69
+ grid.addObstacles(obstacles);
70
+
71
+ // 4. Portals — placed on walkable cells only, then blocked so bots avoid them
72
+ const portalEntities = generatePortalEntities(mapDims, colors, { grid });
73
+
74
+ // 5. Bots — placed on walkable cells (avoids obstacles and portals)
75
+ const bots = generateBots(mapDims, colors, { count: opts.botCount, grid });
76
+
77
+ // 6. Resources — static exploitable entities placed on walkable cells
78
+ const resources = generateResources(mapDims, colors, { count: opts.resourceCount, grid });
79
+
80
+ // 7. Foreground — decorative, no collision restriction
81
+ const foreground = generateForeground(mapDims, colors, { count: opts.foregroundCount });
82
+
83
+ const entities = [...floors, ...obstacles, ...portalEntities, ...foreground, ...bots, ...resources];
84
+
85
+ return {
86
+ code: mapCode,
87
+ name: `Fallback ${mapCode}`,
88
+ gridX: gridSize,
89
+ gridY: gridSize,
90
+ cellWidth: 32,
91
+ cellHeight: 32,
92
+ entities,
93
+ };
94
+ }
95
+
96
+ // ── Full world generator ─────────────────────────────────────────────────────
97
+
98
+ /**
99
+ * Generate a complete in-memory fallback world: multiple maps connected
100
+ * by a portal ring topology.
101
+ *
102
+ * Returns a plain-object structure matching what a real CyberiaInstance
103
+ * + CyberiaMap query would return, so consumers can treat it identically.
104
+ *
105
+ * Nothing is persisted to MongoDB.
106
+ *
107
+ * @param {object} [opts]
108
+ * @param {number} [opts.mapCount=4] Number of maps to generate.
109
+ * @param {number} [opts.gridSize=64] Grid size per map.
110
+ * @param {number} [opts.obstacleCount] Obstacles per map (random if omitted).
111
+ * @param {number} [opts.foregroundCount] Foreground entities per map (random if omitted).
112
+ * @param {number} [opts.botCount] Bots per map (random if omitted).
113
+ * @param {number} [opts.resourceCount] Resources per map (random if omitted).
114
+ * @param {Array} [opts.colors] Override palette.
115
+ * @returns {{
116
+ * instance: object,
117
+ * maps: object[],
118
+ * portals: object[],
119
+ * topology: string,
120
+ * config: object,
121
+ * _fallback: true
122
+ * }}
123
+ */
124
+ function generateFallbackWorld(opts = {}) {
125
+ const {
126
+ mapCount = DEFAULT_MAP_COUNT,
127
+ gridSize,
128
+ obstacleCount,
129
+ foregroundCount,
130
+ botCount,
131
+ resourceCount,
132
+ colors = CYBERIA_INSTANCE_CONF_DEFAULTS.colors,
133
+ } = opts;
134
+
135
+ // Generate map codes.
136
+ const mapCodes = [];
137
+ for (let i = 0; i < mapCount; i++) {
138
+ mapCodes.push(`fallback-map-${i}`);
139
+ }
140
+
141
+ // Generate each map (all randomized independently).
142
+ const maps = mapCodes.map((code) =>
143
+ generateFallbackMap(code, colors, {
144
+ gridSize,
145
+ obstacleCount,
146
+ foregroundCount,
147
+ botCount,
148
+ resourceCount,
149
+ }),
150
+ );
151
+
152
+ // Connect maps with portal topology using the portal connector module.
153
+ const { portals, topology } = connectPortals(mapCodes, maps);
154
+
155
+ // Build the instance shell (never persisted — no mongoId).
156
+ const instance = {
157
+ code: 'fallback',
158
+ name: 'Fallback Instance',
159
+ description: 'Auto-generated procedural world (not persisted)',
160
+ tags: ['fallback', 'procedural'],
161
+ cyberiaMapCodes: mapCodes,
162
+ portals,
163
+ topologyMode: 'procedural',
164
+ };
165
+
166
+ return {
167
+ instance,
168
+ maps,
169
+ portals,
170
+ topology,
171
+ config: CYBERIA_INSTANCE_CONF_DEFAULTS,
172
+ _fallback: true,
173
+ };
174
+ }
175
+
176
+ // ── Public API ───────────────────────────────────────────────────────────────
177
+
178
+ export { generateFallbackWorld, generateFallbackMap };
@@ -0,0 +1,92 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaInstanceService } from './cyberia-instance.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaInstanceController {
7
+ static fallbackWorld = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaInstanceService.fallbackWorld(req);
10
+ return res.status(200).json({ status: 'success', data: result });
11
+ } catch (error) {
12
+ logger.error(error, error.stack);
13
+ return res.status(400).json({ status: 'error', message: error.message });
14
+ }
15
+ };
16
+ static portalConnect = async (req, res, options) => {
17
+ try {
18
+ const result = await CyberiaInstanceService.portalConnect(req, res, options);
19
+ return res.status(200).json({ status: 'success', data: result });
20
+ } catch (error) {
21
+ logger.error(error, error.stack);
22
+ return res.status(400).json({ status: 'error', message: error.message });
23
+ }
24
+ };
25
+ static post = async (req, res, options) => {
26
+ try {
27
+ const result = await CyberiaInstanceService.post(req, res, options);
28
+ return res.status(200).json({
29
+ status: 'success',
30
+ data: result,
31
+ });
32
+ } catch (error) {
33
+ logger.error(error, error.stack);
34
+ return res.status(400).json({
35
+ status: 'error',
36
+ message: error.message,
37
+ });
38
+ }
39
+ };
40
+ static get = async (req, res, options) => {
41
+ try {
42
+ const { page, limit } = req.query;
43
+ const result = await CyberiaInstanceService.get(
44
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
45
+ res,
46
+ options,
47
+ );
48
+ return res.status(200).json({
49
+ status: 'success',
50
+ data: result,
51
+ });
52
+ } catch (error) {
53
+ logger.error(error, error.stack);
54
+ return res.status(400).json({
55
+ status: 'error',
56
+ message: error.message,
57
+ });
58
+ }
59
+ };
60
+ static put = async (req, res, options) => {
61
+ try {
62
+ const result = await CyberiaInstanceService.put(req, res, options);
63
+ return res.status(200).json({
64
+ status: 'success',
65
+ data: result,
66
+ });
67
+ } catch (error) {
68
+ logger.error(error, error.stack);
69
+ return res.status(400).json({
70
+ status: 'error',
71
+ message: error.message,
72
+ });
73
+ }
74
+ };
75
+ static delete = async (req, res, options) => {
76
+ try {
77
+ const result = await CyberiaInstanceService.delete(req, res, options);
78
+ return res.status(200).json({
79
+ status: 'success',
80
+ data: result,
81
+ });
82
+ } catch (error) {
83
+ logger.error(error, error.stack);
84
+ return res.status(400).json({
85
+ status: 'error',
86
+ message: error.message,
87
+ });
88
+ }
89
+ };
90
+ }
91
+
92
+ export { CyberiaInstanceController };
@@ -0,0 +1,87 @@
1
+ import { Schema, model } from 'mongoose';
2
+
3
+ /**
4
+ * Directed edge in a graph.
5
+ * Each portal represents an adjacency relation:
6
+ * source node -> target node
7
+ */
8
+ const PortalEdgeSchema = new Schema(
9
+ {
10
+ // Origin node (graph source vertex)
11
+ sourceMapCode: { type: String, required: true, trim: true },
12
+ sourceCellX: { type: Number },
13
+ sourceCellY: { type: Number },
14
+
15
+ // Destination node (graph target vertex)
16
+ targetMapCode: { type: String, required: true, trim: true },
17
+ targetCellX: { type: Number },
18
+ targetCellY: { type: Number },
19
+
20
+ // Transport behaviour of this edge:
21
+ // inter-portal — teleport to a portal entity on another map
22
+ // inter-random — teleport to a random walkable cell on another map
23
+ // intra-random — teleport to a random walkable cell on the same map
24
+ // intra-portal — teleport to a portal entity on the same map
25
+ portalMode: {
26
+ type: String,
27
+ enum: ['inter-portal', 'inter-random', 'intra-random', 'intra-portal'],
28
+ default: 'inter-portal',
29
+ },
30
+ },
31
+ { _id: false },
32
+ );
33
+
34
+ /**
35
+ * Graph container / instance.
36
+ * The instance stores:
37
+ * - nodes: cyberiaMapCodes[]
38
+ * - edges: portals[]
39
+ */
40
+ const CyberiaInstanceSchema = new Schema(
41
+ {
42
+ // Instance identifier
43
+ code: { type: String, default: '', trim: true, unique: true },
44
+
45
+ name: { type: String, default: '', trim: true },
46
+ description: { type: String, default: '' },
47
+ tags: { type: [String], default: [] },
48
+ creator: { type: Schema.Types.ObjectId, ref: 'User' },
49
+ status: { type: String, default: 'unlisted' },
50
+ thumbnail: { type: Schema.Types.ObjectId, ref: 'File' },
51
+
52
+ // Vertex set of the graph
53
+ cyberiaMapCodes: { type: [String], default: [] },
54
+
55
+ // Instance-level object layer item IDs.
56
+ itemIds: { type: [String], default: [] },
57
+
58
+ // Directed edge set of the graph
59
+ portals: { type: [PortalEdgeSchema], default: [] },
60
+
61
+ // Optional topology generation mode
62
+ seed: { type: String, default: '' },
63
+ topologyMode: {
64
+ type: String,
65
+ enum: ['manual', 'procedural', 'hybrid'],
66
+ default: 'hybrid',
67
+ },
68
+
69
+ // Game server configuration (all tuning parameters live in a separate document).
70
+ // Linked to CyberiaInstanceConf.instanceCode === this.code.
71
+ conf: { type: Schema.Types.ObjectId, ref: 'CyberiaInstanceConf' },
72
+ },
73
+ { timestamps: true },
74
+ );
75
+
76
+ /**
77
+ * Indexes for fast adjacency lookups.
78
+ * Useful for traversing the graph by source or target node.
79
+ */
80
+ CyberiaInstanceSchema.index({ 'portals.sourceMapCode': 1 });
81
+ CyberiaInstanceSchema.index({ 'portals.targetMapCode': 1 });
82
+
83
+ const CyberiaInstanceModel = model('CyberiaInstance', CyberiaInstanceSchema);
84
+
85
+ const ProviderSchema = CyberiaInstanceSchema;
86
+
87
+ export { CyberiaInstanceSchema, CyberiaInstanceModel, ProviderSchema };
@@ -0,0 +1,63 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaInstanceController } from './cyberia-instance.controller.js';
3
+ import { userGuard, adminGuard } from '../../server/auth.js';
4
+ import express from 'express';
5
+
6
+ const logger = loggerFactory(import.meta);
7
+
8
+ const CyberiaInstanceRouter = (options) => {
9
+ const router = express.Router();
10
+ const authMiddleware = options.authMiddleware;
11
+ // ── Custom actions (must come before generic /:id routes) ──────────────
12
+ router.get(`/fallback-world`, async (req, res) => await CyberiaInstanceController.fallbackWorld(req, res, options));
13
+ router.get(
14
+ `/:id/portal-connect`,
15
+ authMiddleware,
16
+ userGuard,
17
+ async (req, res) => await CyberiaInstanceController.portalConnect(req, res, options),
18
+ );
19
+
20
+ router.post(
21
+ `/:id`,
22
+ authMiddleware,
23
+ userGuard,
24
+ async (req, res) => await CyberiaInstanceController.post(req, res, options),
25
+ );
26
+ router.post(
27
+ `/`,
28
+ authMiddleware,
29
+ userGuard,
30
+ async (req, res) => await CyberiaInstanceController.post(req, res, options),
31
+ );
32
+ router.get(`/:id`, async (req, res) => await CyberiaInstanceController.get(req, res, options));
33
+ router.get(`/`, async (req, res) => await CyberiaInstanceController.get(req, res, options));
34
+ router.put(
35
+ `/:id`,
36
+ authMiddleware,
37
+ userGuard,
38
+ async (req, res) => await CyberiaInstanceController.put(req, res, options),
39
+ );
40
+ router.put(
41
+ `/`,
42
+ authMiddleware,
43
+ userGuard,
44
+ async (req, res) => await CyberiaInstanceController.put(req, res, options),
45
+ );
46
+ router.delete(
47
+ `/:id`,
48
+ authMiddleware,
49
+ userGuard,
50
+ async (req, res) => await CyberiaInstanceController.delete(req, res, options),
51
+ );
52
+ router.delete(
53
+ `/`,
54
+ authMiddleware,
55
+ adminGuard,
56
+ async (req, res) => await CyberiaInstanceController.delete(req, res, options),
57
+ );
58
+ return router;
59
+ };
60
+
61
+ const ApiRouter = CyberiaInstanceRouter;
62
+
63
+ export { ApiRouter, CyberiaInstanceRouter };
@@ -0,0 +1,156 @@
1
+ import { DataBaseProvider } from '../../db/DataBaseProvider.js';
2
+ import { loggerFactory } from '../../server/logger.js';
3
+ import { DataQuery } from '../../server/data-query.js';
4
+ import { connectPortals } from './cyberia-portal-connector.js';
5
+ import { generateFallbackWorld } from './cyberia-fallback-world.js';
6
+
7
+ const logger = loggerFactory(import.meta);
8
+
9
+ class CyberiaInstanceService {
10
+ static post = async (req, res, options) => {
11
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
12
+ const CyberiaInstance = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstance;
13
+ const CyberiaInstanceConf =
14
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
15
+ if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
16
+ const instance = await new CyberiaInstance(req.body).save();
17
+
18
+ // Auto-upsert a CyberiaInstanceConf for this instance using schema defaults.
19
+ // $setOnInsert ensures existing conf documents are never overwritten.
20
+ if (instance.code && CyberiaInstanceConf) {
21
+ try {
22
+ const conf = await CyberiaInstanceConf.findOneAndUpdate(
23
+ { instanceCode: instance.code },
24
+ { $setOnInsert: { instanceCode: instance.code } },
25
+ { upsert: true, returnDocument: 'after' },
26
+ );
27
+ if (conf && !instance.conf) {
28
+ await CyberiaInstance.findByIdAndUpdate(instance._id, { conf: conf._id });
29
+ instance.conf = conf._id;
30
+ }
31
+ } catch (e) {
32
+ logger.error('auto-upsert CyberiaInstanceConf failed:', e);
33
+ }
34
+ }
35
+
36
+ return instance;
37
+ };
38
+ static get = async (req, res, options) => {
39
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
40
+ const CyberiaInstance = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstance;
41
+ const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
42
+ if (req.params.id) return await CyberiaInstance.findById(req.params.id).populate(populateCreator);
43
+
44
+ // Parse query parameters using DataQuery helper
45
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
46
+
47
+ const [data, total] = await Promise.all([
48
+ CyberiaInstance.find(query).sort(sort).limit(limit).skip(skip).populate(populateCreator),
49
+ CyberiaInstance.countDocuments(query),
50
+ ]);
51
+
52
+ const totalPages = Math.ceil(total / limit);
53
+ return { data, total, page, totalPages };
54
+ };
55
+ static put = async (req, res, options) => {
56
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
57
+ const CyberiaInstance = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstance;
58
+ const instance = await CyberiaInstance.findById(req.params.id);
59
+ if (!instance) throw new Error('instance not found');
60
+ if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
61
+ throw new Error('insufficient permission');
62
+ if (req.body.thumbnail && instance.thumbnail && String(req.body.thumbnail) !== String(instance.thumbnail)) {
63
+ const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
64
+ await File.findByIdAndDelete(instance.thumbnail);
65
+ }
66
+ return await CyberiaInstance.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
67
+ };
68
+ /**
69
+ * Central portal connector endpoint.
70
+ *
71
+ * Delegates topology computation to the pure-function `connectPortals()`
72
+ * from cyberia-portal-connector.js so the same logic can be used by the
73
+ * GUI without a DB dependency.
74
+ *
75
+ * Builds a minimal ring connecting all maps and assigns random portal
76
+ * subtypes to remaining portals. Does NOT generate procedural entities —
77
+ * entity generation is handled exclusively by the fallback world logic
78
+ * (cyberia-world-generator.js).
79
+ *
80
+ * ?persist=true — save generated portals to DB
81
+ */
82
+ static portalConnect = async (req, res, options) => {
83
+ const CyberiaInstance = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstance;
84
+ const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
85
+
86
+ const instance = await CyberiaInstance.findById(req.params.id).lean();
87
+ if (!instance) throw new Error('instance not found');
88
+
89
+ const mapCodes = instance.cyberiaMapCodes || [];
90
+
91
+ // Load maps with the fields needed by the connector.
92
+ const mapDocs = await CyberiaMap.find(
93
+ { code: { $in: mapCodes } },
94
+ {
95
+ code: 1,
96
+ gridX: 1,
97
+ gridY: 1,
98
+ entities: 1,
99
+ },
100
+ ).lean();
101
+
102
+ // ── Portal topology (pure function) ──────────────────────────────────
103
+ const result = connectPortals(mapCodes, mapDocs);
104
+
105
+ // ── Persist to DB when requested ─────────────────────────────────────
106
+ const persist = req.query?.persist === 'true';
107
+ if (persist) {
108
+ await CyberiaInstance.findByIdAndUpdate(req.params.id, { portals: result.portals });
109
+ }
110
+
111
+ return {
112
+ ...result,
113
+ persisted: persist,
114
+ };
115
+ };
116
+
117
+ static delete = async (req, res, options) => {
118
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
119
+ const CyberiaInstance = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstance;
120
+ if (req.params.id) {
121
+ const instance = await CyberiaInstance.findById(req.params.id);
122
+ if (!instance) throw new Error('instance not found');
123
+ if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
124
+ throw new Error('insufficient permission');
125
+ if (instance.thumbnail) {
126
+ const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
127
+ await File.findByIdAndDelete(instance.thumbnail);
128
+ }
129
+ return await CyberiaInstance.findByIdAndDelete(req.params.id);
130
+ } else return await CyberiaInstance.deleteMany();
131
+ };
132
+
133
+ /**
134
+ * Return an in-memory procedural fallback world.
135
+ *
136
+ * Nothing is persisted to MongoDB. The world is regenerated on every
137
+ * call but stays deterministic for a given seed.
138
+ *
139
+ * Query params:
140
+ * ?mapCount=<number> — maps to generate (default: 4)
141
+ * ?botCount=<number> — bots per map (random 8–16 if omitted)
142
+ * ?obstacleCount=<number> — obstacles per map (random 12–20 if omitted)
143
+ * ?foregroundCount=<number>— foreground per map (random 6–12 if omitted)
144
+ */
145
+ static fallbackWorld = async (req) => {
146
+ const q = req.query || {};
147
+ return generateFallbackWorld({
148
+ mapCount: q.mapCount ? parseInt(q.mapCount, 10) : undefined,
149
+ botCount: q.botCount ? parseInt(q.botCount, 10) : undefined,
150
+ obstacleCount: q.obstacleCount ? parseInt(q.obstacleCount, 10) : undefined,
151
+ foregroundCount: q.foregroundCount ? parseInt(q.foregroundCount, 10) : undefined,
152
+ });
153
+ };
154
+ }
155
+
156
+ export { CyberiaInstanceService };