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.
- package/.env.example +0 -2
- package/.github/workflows/engine-cyberia.cd.yml +10 -8
- package/.github/workflows/engine-cyberia.ci.yml +12 -29
- package/.github/workflows/ghpkg.ci.yml +4 -4
- package/.github/workflows/npmpkg.ci.yml +28 -11
- package/.github/workflows/publish.ci.yml +21 -2
- package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -5
- package/.github/workflows/pwa-microservices-template-test.ci.yml +3 -3
- package/.github/workflows/release.cd.yml +14 -10
- package/CHANGELOG.md +783 -1
- package/CLI-HELP.md +95 -18
- package/Dockerfile +0 -2
- package/README.md +290 -220
- package/bin/build.js +24 -7
- package/bin/cyberia.js +2838 -252
- package/bin/deploy.js +747 -125
- package/bin/file.js +9 -0
- package/bin/index.js +2838 -252
- package/bin/vs.js +1 -1
- package/conf.js +99 -65
- package/deployment.yaml +18 -164
- package/hardhat/hardhat.config.js +13 -13
- package/hardhat/ignition/modules/ObjectLayerToken.js +1 -1
- package/hardhat/package-lock.json +2559 -5864
- package/hardhat/package.json +14 -23
- package/hardhat/scripts/deployObjectLayerToken.js +1 -1
- package/hardhat/test/ObjectLayerToken.js +4 -2
- package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
- package/hardhat/types/ethers-contracts/common.ts +92 -0
- package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
- package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
- package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
- package/hardhat/types/ethers-contracts/index.ts +6 -0
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +6 -5
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +6 -5
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +18 -164
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +7 -79
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +112 -28
- package/manifests/deployment/dd-test-development/proxy.yaml +46 -1
- package/manifests/deployment/playwright/deployment.yaml +1 -1
- package/nodemon.json +1 -1
- package/package.json +39 -24
- package/proxy.yaml +7 -79
- package/scripts/k3s-node-setup.sh +2 -2
- package/scripts/nat-iptables.sh +103 -18
- package/scripts/rhel-grpc-setup.sh +56 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +58 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +23 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +148 -20
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.service.js +10 -10
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.service.js +8 -8
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +27 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
- package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
- package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
- package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +178 -0
- package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
- package/src/api/cyberia-instance/cyberia-instance.model.js +87 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +156 -0
- package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +574 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +231 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
- package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
- package/src/api/cyberia-map/cyberia-map.model.js +30 -0
- package/src/api/cyberia-map/cyberia-map.router.js +40 -0
- package/src/api/cyberia-map/cyberia-map.service.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.service.js +10 -10
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.ref.json +18 -0
- package/src/api/file/file.service.js +36 -36
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.service.js +10 -10
- package/src/api/ipfs/ipfs.controller.js +15 -36
- package/src/api/ipfs/ipfs.model.js +47 -47
- package/src/api/ipfs/ipfs.router.js +8 -13
- package/src/api/ipfs/ipfs.service.js +67 -129
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.router.js +30 -0
- package/src/api/object-layer/object-layer.service.js +126 -43
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.service.js +8 -8
- package/src/api/user/guest.service.js +99 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.service.js +11 -27
- package/src/cli/cluster.js +68 -21
- package/src/cli/db.js +753 -825
- package/src/cli/deploy.js +215 -125
- package/src/cli/env.js +29 -0
- package/src/cli/fs.js +82 -8
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +74 -3
- package/src/cli/kubectl.js +211 -0
- package/src/cli/release.js +340 -0
- package/src/cli/repository.js +475 -74
- package/src/cli/run.js +582 -43
- package/src/cli/secrets.js +73 -0
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +3 -3
- package/src/client/Cryptokoyn.index.js +18 -22
- package/src/client/CyberiaPortal.index.js +19 -24
- package/src/client/Default.index.js +21 -34
- package/src/client/Itemledger.index.js +20 -27
- package/src/client/Underpost.index.js +19 -24
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +69 -0
- package/src/client/components/core/Auth.js +35 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +43 -64
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +87 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +194 -96
- package/src/client/components/core/EventBus.js +92 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +26 -19
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +43 -43
- package/src/client/components/core/LogOut.js +25 -16
- package/src/client/components/core/Modal.js +462 -179
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -51
- package/src/client/components/core/PanelForm.js +44 -144
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +112 -30
- package/src/client/components/core/SocketIoHandler.js +75 -0
- package/src/client/components/core/Stream.js +143 -95
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Webhook.js +40 -7
- package/src/client/components/core/Worker.js +163 -27
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +59 -59
- package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +9 -7
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +8 -6
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
- package/src/client/components/cyberia/InstanceEngineCyberia.js +781 -0
- package/src/client/components/cyberia/MapEngineCyberia.js +1836 -2
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1220 -99
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +252 -316
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +136 -103
- package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +462 -32
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +9 -7
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +8 -6
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +91 -91
- package/src/client/components/default/AppStoreDefault.js +5 -0
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +9 -7
- package/src/client/components/default/LogOutDefault.js +8 -6
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/SocketIoDefault.js +3 -51
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +59 -59
- package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +9 -7
- package/src/client/components/itemledger/LogOutItemledger.js +8 -6
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +92 -92
- package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +9 -7
- package/src/client/components/underpost/LogOutUnderpost.js +8 -6
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +35 -55
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +116 -0
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
- package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
- package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +6 -6
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +14 -40
- package/src/client/services/object-layer/object-layer.management.js +14 -14
- package/src/client/services/object-layer/object-layer.service.js +39 -24
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +6 -6
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/offline/Maintenance.js +12 -11
- package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
- package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/pages/Test.js +2 -2
- package/src/client/sw/core.sw.js +212 -0
- package/src/grpc/cyberia/grpc-server.js +642 -0
- package/src/index.js +24 -1
- package/src/runtime/cyberia-client/Dockerfile +80 -0
- package/src/runtime/cyberia-server/Dockerfile +37 -0
- package/src/runtime/express/Dockerfile +5 -1
- package/src/runtime/express/Express.js +18 -1
- package/src/runtime/lampp/Dockerfile +17 -5
- package/src/runtime/lampp/Lampp.js +27 -4
- package/src/runtime/wp/Dockerfile +62 -0
- package/src/runtime/wp/Wp.js +639 -0
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +24 -1
- package/src/server/backup.js +37 -9
- package/src/server/client-build-docs.js +52 -46
- package/src/server/client-build.js +356 -82
- package/src/server/client-formatted.js +140 -57
- package/src/server/conf.js +29 -13
- package/src/server/cron.js +25 -23
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +24 -1
- package/src/server/ipfs-client.js +253 -89
- package/src/server/object-layer.js +150 -114
- package/src/server/peer.js +8 -0
- package/src/server/process.js +13 -27
- package/src/server/runtime.js +25 -1
- package/src/server/semantic-layer-generator-floor.js +319 -0
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +1164 -0
- package/src/server/semantic-layer-generator.js +211 -542
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +19 -5
- package/src/server/valkey.js +141 -235
- package/src/ws/IoInterface.js +1 -10
- package/src/ws/IoServer.js +14 -33
- package/src/ws/core/channels/core.ws.chat.js +65 -20
- package/src/ws/core/channels/core.ws.mailer.js +113 -32
- package/src/ws/core/channels/core.ws.stream.js +90 -31
- package/src/ws/core/core.ws.connection.js +12 -33
- package/src/ws/core/core.ws.emit.js +10 -26
- package/src/ws/core/core.ws.server.js +25 -58
- package/src/ws/default/channels/default.ws.main.js +53 -12
- package/src/ws/default/default.ws.connection.js +26 -13
- package/src/ws/default/default.ws.server.js +30 -12
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -59
- package/jsdoc.json +0 -59
- package/src/api/object-layer/README.md +0 -347
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
- package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -58
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/ElementsDefault.js +0 -38
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/CommonItemledger.js +0 -29
- package/src/client/components/itemledger/ElementsItemledger.js +0 -38
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/CommonUnderpost.js +0 -29
- package/src/client/components/underpost/ElementsUnderpost.js +0 -38
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/ws/core/management/core.ws.chat.js +0 -8
- package/src/ws/core/management/core.ws.mailer.js +0 -16
- package/src/ws/core/management/core.ws.stream.js +0 -8
- 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 };
|