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
|
@@ -34,7 +34,6 @@ const logger = loggerFactory(import.meta);
|
|
|
34
34
|
* @property {Object<string, number[][][]>} frames - Map of direction names to arrays of frame matrices.
|
|
35
35
|
* @property {Array<number[]>} colors - Global color palette shared across all frames.
|
|
36
36
|
* @property {number} frame_duration - Duration of each frame in milliseconds.
|
|
37
|
-
* @property {boolean} is_stateless - Whether the render layer is stateless (no animation state).
|
|
38
37
|
* @memberof CyberiaObjectLayer
|
|
39
38
|
*/
|
|
40
39
|
|
|
@@ -414,21 +413,18 @@ export class ObjectLayerEngine {
|
|
|
414
413
|
if (metadata && metadata.objectLayerRenderFramesData) {
|
|
415
414
|
objectLayerRenderFramesData = {
|
|
416
415
|
frame_duration: metadata.objectLayerRenderFramesData.frame_duration || 250,
|
|
417
|
-
is_stateless: metadata.objectLayerRenderFramesData.is_stateless || false,
|
|
418
416
|
frames: {},
|
|
419
417
|
colors: [],
|
|
420
418
|
};
|
|
421
419
|
} else if (metadata && metadata.data && metadata.data.render) {
|
|
422
420
|
objectLayerRenderFramesData = {
|
|
423
421
|
frame_duration: metadata.data.render.frame_duration || 250,
|
|
424
|
-
is_stateless: metadata.data.render.is_stateless || false,
|
|
425
422
|
frames: {},
|
|
426
423
|
colors: [],
|
|
427
424
|
};
|
|
428
425
|
} else {
|
|
429
426
|
objectLayerRenderFramesData = {
|
|
430
427
|
frame_duration: 250,
|
|
431
|
-
is_stateless: false,
|
|
432
428
|
frames: {},
|
|
433
429
|
colors: [],
|
|
434
430
|
};
|
|
@@ -559,7 +555,7 @@ export class ObjectLayerEngine {
|
|
|
559
555
|
* @param {string} params.itemId - Unique item identifier.
|
|
560
556
|
* @param {ObjectLayerRenderFramesData} params.objectLayerRenderFramesData
|
|
561
557
|
* - The render frames data containing `frames`, `colors`,
|
|
562
|
-
*
|
|
558
|
+
* and `frame_duration`.
|
|
563
559
|
* @param {Object} [params.objectLayerData=null] - When provided, a
|
|
564
560
|
* `metadata.json` file is written alongside the frame PNGs.
|
|
565
561
|
* @param {number} [params.cellPixelDim=20] - Pixel size per grid cell.
|
|
@@ -623,7 +619,6 @@ export class ObjectLayerEngine {
|
|
|
623
619
|
data: objectLayerData.data,
|
|
624
620
|
objectLayerRenderFramesData: {
|
|
625
621
|
frame_duration: objectLayerRenderFramesData.frame_duration,
|
|
626
|
-
is_stateless: objectLayerRenderFramesData.is_stateless,
|
|
627
622
|
},
|
|
628
623
|
generated: true,
|
|
629
624
|
generatorVersion: '1.0.0',
|
|
@@ -639,11 +634,12 @@ export class ObjectLayerEngine {
|
|
|
639
634
|
|
|
640
635
|
/**
|
|
641
636
|
* Creates new ObjectLayerRenderFrames and ObjectLayer documents in MongoDB from the
|
|
642
|
-
* provided data,
|
|
637
|
+
* provided data, with cut-over consistency: all CIDs (atlas PNG, atlas metadata, data JSON)
|
|
638
|
+
* are computed and pinned to IPFS BEFORE the ObjectLayer document is created or updated in
|
|
639
|
+
* MongoDB, so the object layer is never visible in queries with empty CIDs.
|
|
643
640
|
*
|
|
644
|
-
*
|
|
645
|
-
*
|
|
646
|
-
* (which now includes `data.render.cid`) and persists an IPFS CID.
|
|
641
|
+
* If an existing ObjectLayer with the same `data.item.id` is found, it is atomically
|
|
642
|
+
* replaced (findByIdAndUpdate) and the old ObjectLayerRenderFrames is cleaned up.
|
|
647
643
|
*
|
|
648
644
|
* @static
|
|
649
645
|
* @param {Object} params - Parameters.
|
|
@@ -664,44 +660,95 @@ export class ObjectLayerEngine {
|
|
|
664
660
|
}) {
|
|
665
661
|
const { generateAtlas = true, atlasServiceContext = null } = createOptions;
|
|
666
662
|
|
|
667
|
-
// 1. Persist ObjectLayerRenderFrames
|
|
663
|
+
// 1. Persist ObjectLayerRenderFrames (not queried by the viewer table)
|
|
668
664
|
const objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
|
|
669
665
|
|
|
670
|
-
// 2.
|
|
666
|
+
// 2. Set up references in memory
|
|
671
667
|
objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
|
|
672
668
|
if (!objectLayerData.data.render) objectLayerData.data.render = {};
|
|
673
|
-
objectLayerData.data.render.cid =
|
|
674
|
-
objectLayerData.
|
|
669
|
+
objectLayerData.data.render.cid = '';
|
|
670
|
+
objectLayerData.data.render.metadataCid = '';
|
|
675
671
|
|
|
676
|
-
// 3.
|
|
672
|
+
// 3. Stage atlas + IPFS CIDs BEFORE creating/updating the ObjectLayer
|
|
673
|
+
if (generateAtlas && atlasServiceContext) {
|
|
674
|
+
const {
|
|
675
|
+
req,
|
|
676
|
+
res,
|
|
677
|
+
options,
|
|
678
|
+
AtlasSpriteSheetService,
|
|
679
|
+
IpfsClient: ipfsClient,
|
|
680
|
+
createPinRecord,
|
|
681
|
+
} = atlasServiceContext;
|
|
682
|
+
|
|
683
|
+
try {
|
|
684
|
+
const stagingOL = {
|
|
685
|
+
data: objectLayerData.data,
|
|
686
|
+
objectLayerRenderFramesId: objectLayerRenderFramesDoc,
|
|
687
|
+
};
|
|
688
|
+
const result = await AtlasSpriteSheetService.generate(
|
|
689
|
+
{ objectLayer: stagingOL, auth: req ? req.auth : undefined },
|
|
690
|
+
res,
|
|
691
|
+
options,
|
|
692
|
+
{ skipObjectLayerSave: true },
|
|
693
|
+
);
|
|
694
|
+
objectLayerData.data.render.cid = result.atlasCid;
|
|
695
|
+
objectLayerData.data.render.metadataCid = result.atlasMetadataCid;
|
|
696
|
+
objectLayerData.atlasSpriteSheetId = result.atlasDoc._id;
|
|
697
|
+
} catch (atlasError) {
|
|
698
|
+
logger.error('Failed to generate atlas during staging:', atlasError);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// Compute final SHA-256 (includes render CIDs)
|
|
702
|
+
objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
|
|
703
|
+
|
|
704
|
+
// Pin data JSON to IPFS
|
|
705
|
+
if (ipfsClient) {
|
|
706
|
+
try {
|
|
707
|
+
const itemId = objectLayerData.data.item.id;
|
|
708
|
+
const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
|
|
709
|
+
const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayerData.data, `${itemId}_data.json`, mfsPath);
|
|
710
|
+
if (ipfsResult) {
|
|
711
|
+
objectLayerData.cid = ipfsResult.cid;
|
|
712
|
+
if (createPinRecord) {
|
|
713
|
+
await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
} catch (ipfsError) {
|
|
717
|
+
logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
} else {
|
|
721
|
+
// No atlas generation - compute SHA-256 without render CIDs
|
|
722
|
+
objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// 4. Atomic create/upsert - ObjectLayer is fully populated with all CIDs
|
|
677
726
|
let objectLayer;
|
|
678
|
-
const
|
|
679
|
-
if (
|
|
680
|
-
|
|
681
|
-
|
|
727
|
+
const existingByItemId = await ObjectLayer.findOne({ 'data.item.id': objectLayerData.data.item.id });
|
|
728
|
+
if (existingByItemId) {
|
|
729
|
+
const oldRenderFramesId = existingByItemId.objectLayerRenderFramesId;
|
|
730
|
+
logger.info(
|
|
731
|
+
`ObjectLayer for item "${objectLayerData.data.item.id}" exists (${existingByItemId._id}), replacing atomically...`,
|
|
732
|
+
);
|
|
733
|
+
objectLayer = await ObjectLayer.findByIdAndUpdate(existingByItemId._id, objectLayerData, {
|
|
682
734
|
returnDocument: 'after',
|
|
683
735
|
}).populate('objectLayerRenderFramesId');
|
|
736
|
+
if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
|
|
737
|
+
await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
|
|
738
|
+
}
|
|
684
739
|
} else {
|
|
685
740
|
objectLayer = await (await ObjectLayer.create(objectLayerData)).populate('objectLayerRenderFramesId');
|
|
686
741
|
logger.info(`ObjectLayer created successfully with id: ${objectLayer._id}`);
|
|
687
742
|
}
|
|
688
743
|
|
|
689
|
-
// 4. Optional atlas generation + final SHA-256 / IPFS CID
|
|
690
|
-
if (generateAtlas && atlasServiceContext) {
|
|
691
|
-
objectLayer = await ObjectLayerEngine._generateAtlasAndFinalize({
|
|
692
|
-
objectLayer,
|
|
693
|
-
ObjectLayer,
|
|
694
|
-
atlasServiceContext,
|
|
695
|
-
isNew: true,
|
|
696
|
-
});
|
|
697
|
-
}
|
|
698
|
-
|
|
699
744
|
return { objectLayer, objectLayerRenderFramesDoc };
|
|
700
745
|
}
|
|
701
746
|
|
|
702
747
|
/**
|
|
703
748
|
* Updates an existing ObjectLayer and its ObjectLayerRenderFrames from the provided data,
|
|
704
|
-
*
|
|
749
|
+
* with cut-over consistency: a new ObjectLayerRenderFrames is created, then atlas and all
|
|
750
|
+
* CIDs are staged BEFORE the live ObjectLayer is touched. The live document is updated
|
|
751
|
+
* atomically via findByIdAndUpdate only after all CIDs are computed.
|
|
705
752
|
*
|
|
706
753
|
* @static
|
|
707
754
|
* @param {Object} params - Parameters.
|
|
@@ -724,27 +771,75 @@ export class ObjectLayerEngine {
|
|
|
724
771
|
}) {
|
|
725
772
|
const { generateAtlas = true, atlasServiceContext = null } = updateOptions;
|
|
726
773
|
|
|
727
|
-
// 1.
|
|
728
|
-
let objectLayerRenderFramesDoc;
|
|
774
|
+
// 1. Load existing ObjectLayer to get old references
|
|
729
775
|
const existingObjectLayer = await ObjectLayer.findById(objectLayerId);
|
|
730
|
-
if (existingObjectLayer
|
|
731
|
-
|
|
732
|
-
existingObjectLayer.objectLayerRenderFramesId,
|
|
733
|
-
objectLayerRenderFramesData,
|
|
734
|
-
{ returnDocument: 'after' },
|
|
735
|
-
);
|
|
736
|
-
objectLayerData.objectLayerRenderFramesId = existingObjectLayer.objectLayerRenderFramesId;
|
|
737
|
-
} else {
|
|
738
|
-
objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
|
|
739
|
-
objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
|
|
776
|
+
if (!existingObjectLayer) {
|
|
777
|
+
throw new Error('ObjectLayer not found for update');
|
|
740
778
|
}
|
|
779
|
+
const oldRenderFramesId = existingObjectLayer.objectLayerRenderFramesId;
|
|
780
|
+
|
|
781
|
+
// 2. Create NEW RenderFrames (avoid mutating old doc mid-update)
|
|
782
|
+
const objectLayerRenderFramesDoc = await ObjectLayerRenderFrames.create(objectLayerRenderFramesData);
|
|
783
|
+
objectLayerData.objectLayerRenderFramesId = objectLayerRenderFramesDoc._id;
|
|
741
784
|
|
|
742
|
-
//
|
|
785
|
+
// 3. Set up render CIDs
|
|
743
786
|
if (!objectLayerData.data.render) objectLayerData.data.render = {};
|
|
744
|
-
objectLayerData.data.render.cid =
|
|
745
|
-
objectLayerData.
|
|
787
|
+
objectLayerData.data.render.cid = '';
|
|
788
|
+
objectLayerData.data.render.metadataCid = '';
|
|
789
|
+
|
|
790
|
+
// 4. Stage atlas + IPFS CIDs BEFORE updating the ObjectLayer
|
|
791
|
+
if (generateAtlas && atlasServiceContext) {
|
|
792
|
+
const {
|
|
793
|
+
req,
|
|
794
|
+
res,
|
|
795
|
+
options,
|
|
796
|
+
AtlasSpriteSheetService,
|
|
797
|
+
IpfsClient: ipfsClient,
|
|
798
|
+
createPinRecord,
|
|
799
|
+
} = atlasServiceContext;
|
|
800
|
+
|
|
801
|
+
try {
|
|
802
|
+
const stagingOL = {
|
|
803
|
+
data: objectLayerData.data,
|
|
804
|
+
objectLayerRenderFramesId: objectLayerRenderFramesDoc,
|
|
805
|
+
};
|
|
806
|
+
const result = await AtlasSpriteSheetService.generate(
|
|
807
|
+
{ objectLayer: stagingOL, auth: req ? req.auth : undefined },
|
|
808
|
+
res,
|
|
809
|
+
options,
|
|
810
|
+
{ skipObjectLayerSave: true },
|
|
811
|
+
);
|
|
812
|
+
objectLayerData.data.render.cid = result.atlasCid;
|
|
813
|
+
objectLayerData.data.render.metadataCid = result.atlasMetadataCid;
|
|
814
|
+
objectLayerData.atlasSpriteSheetId = result.atlasDoc._id;
|
|
815
|
+
} catch (atlasError) {
|
|
816
|
+
logger.error('Failed to generate atlas during update staging:', atlasError);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Compute final SHA-256 (includes render CIDs)
|
|
820
|
+
objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
|
|
746
821
|
|
|
747
|
-
|
|
822
|
+
// Pin data JSON to IPFS
|
|
823
|
+
if (ipfsClient) {
|
|
824
|
+
try {
|
|
825
|
+
const itemId = objectLayerData.data.item.id;
|
|
826
|
+
const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
|
|
827
|
+
const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayerData.data, `${itemId}_data.json`, mfsPath);
|
|
828
|
+
if (ipfsResult) {
|
|
829
|
+
objectLayerData.cid = ipfsResult.cid;
|
|
830
|
+
if (createPinRecord) {
|
|
831
|
+
await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
} catch (ipfsError) {
|
|
835
|
+
logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
} else {
|
|
839
|
+
objectLayerData.sha256 = ObjectLayerEngine.computeSha256(objectLayerData.data);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// 5. Atomic update - ObjectLayer is fully populated with all CIDs
|
|
748
843
|
let objectLayer;
|
|
749
844
|
try {
|
|
750
845
|
objectLayer = await ObjectLayer.findByIdAndUpdate(objectLayerId, objectLayerData, {
|
|
@@ -753,20 +848,15 @@ export class ObjectLayerEngine {
|
|
|
753
848
|
if (!objectLayer) {
|
|
754
849
|
throw new Error('ObjectLayer not found for update');
|
|
755
850
|
}
|
|
756
|
-
logger.info(`ObjectLayer updated
|
|
851
|
+
logger.info(`ObjectLayer updated atomically with id: ${objectLayerId}`);
|
|
757
852
|
} catch (error) {
|
|
758
853
|
logger.error('Error updating ObjectLayer:', error);
|
|
759
854
|
throw error;
|
|
760
855
|
}
|
|
761
856
|
|
|
762
|
-
//
|
|
763
|
-
if (
|
|
764
|
-
|
|
765
|
-
objectLayer,
|
|
766
|
-
ObjectLayer,
|
|
767
|
-
atlasServiceContext,
|
|
768
|
-
isNew: false,
|
|
769
|
-
});
|
|
857
|
+
// 6. Clean up old RenderFrames
|
|
858
|
+
if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
|
|
859
|
+
await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
|
|
770
860
|
}
|
|
771
861
|
|
|
772
862
|
return { objectLayer, objectLayerRenderFramesDoc };
|
|
@@ -783,26 +873,22 @@ export class ObjectLayerEngine {
|
|
|
783
873
|
* @param {Object} params.objectLayer - The mongoose ObjectLayer document (must be populated).
|
|
784
874
|
* @param {Object} [params.ipfsClient=null] - The IpfsClient module; when `null`, IPFS pinning is skipped.
|
|
785
875
|
* @param {function} [params.createPinRecord=null] - The `createPinRecord` helper; when `null`, pin records are skipped.
|
|
786
|
-
* @param {string} [params.userId] - Authenticated user ID for IPFS pin record creation.
|
|
787
876
|
* @param {Object} [params.options] - Server options (host, path) forwarded to `createPinRecord`.
|
|
788
877
|
* @returns {Promise<Object>} The saved ObjectLayer document.
|
|
789
878
|
* @memberof CyberiaObjectLayer
|
|
790
879
|
*/
|
|
791
|
-
static async computeAndSaveFinalSha256({ objectLayer, ipfsClient = null, createPinRecord = null,
|
|
880
|
+
static async computeAndSaveFinalSha256({ objectLayer, ipfsClient = null, createPinRecord = null, options }) {
|
|
792
881
|
const finalSha256 = ObjectLayerEngine.computeSha256(objectLayer.data);
|
|
793
882
|
|
|
794
883
|
if (ipfsClient) {
|
|
795
884
|
try {
|
|
796
885
|
const itemId = objectLayer.data.item.id;
|
|
797
|
-
const
|
|
798
|
-
|
|
799
|
-
`${itemId}_data.json`,
|
|
800
|
-
`/object-layer/${itemId}/${itemId}_data.json`,
|
|
801
|
-
);
|
|
886
|
+
const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
|
|
887
|
+
const ipfsResult = await ipfsClient.addJsonToIpfs(objectLayer.data, `${itemId}_data.json`, mfsPath);
|
|
802
888
|
if (ipfsResult) {
|
|
803
889
|
objectLayer.cid = ipfsResult.cid;
|
|
804
|
-
if (
|
|
805
|
-
await createPinRecord({ cid: ipfsResult.cid,
|
|
890
|
+
if (createPinRecord) {
|
|
891
|
+
await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
|
|
806
892
|
}
|
|
807
893
|
}
|
|
808
894
|
} catch (ipfsError) {
|
|
@@ -882,58 +968,8 @@ export class ObjectLayerEngine {
|
|
|
882
968
|
);
|
|
883
969
|
return { cid: `sha256:${sha256}`, sha256, source: 'sha256-fallback' };
|
|
884
970
|
}
|
|
885
|
-
|
|
886
|
-
/**
|
|
887
|
-
* Internal helper that generates an atlas sprite sheet and then finalizes the SHA-256 / IPFS CID.
|
|
888
|
-
* @static
|
|
889
|
-
* @param {Object} params - Parameters.
|
|
890
|
-
* @param {Object} params.objectLayer - The mongoose ObjectLayer document.
|
|
891
|
-
* @param {Object} params.ObjectLayer - Mongoose ObjectLayer model (for re-reading).
|
|
892
|
-
* @param {Object} params.atlasServiceContext - Context with `{ req, res, options, AtlasSpriteSheetService, IpfsClient, createPinRecord }`.
|
|
893
|
-
* @param {boolean} params.isNew - Whether this is a newly created object layer (used for logging).
|
|
894
|
-
* @returns {Promise<Object>} The finalized ObjectLayer document.
|
|
895
|
-
* @memberof CyberiaObjectLayer
|
|
896
|
-
* @private
|
|
897
|
-
*/
|
|
898
|
-
static async _generateAtlasAndFinalize({ objectLayer, ObjectLayer, atlasServiceContext, isNew }) {
|
|
899
|
-
const { req, res, options, AtlasSpriteSheetService, IpfsClient: ipfsClient, createPinRecord } = atlasServiceContext;
|
|
900
|
-
|
|
901
|
-
// Generate atlas sprite sheet
|
|
902
|
-
try {
|
|
903
|
-
await AtlasSpriteSheetService.generate(
|
|
904
|
-
{ params: { id: objectLayer._id }, objectLayer, auth: req ? req.auth : undefined },
|
|
905
|
-
res,
|
|
906
|
-
options,
|
|
907
|
-
);
|
|
908
|
-
} catch (atlasError) {
|
|
909
|
-
logger.error(`Failed to auto-${isNew ? 'generate' : 'update'} atlas for ObjectLayer:`, atlasError);
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
// Re-read the objectLayer so data.render.cid is up-to-date
|
|
913
|
-
objectLayer = await ObjectLayer.findById(objectLayer._id).populate('objectLayerRenderFramesId');
|
|
914
|
-
|
|
915
|
-
// Compute definitive SHA-256 and IPFS CID
|
|
916
|
-
const userId = req && req.auth && req.auth.user ? req.auth.user._id : undefined;
|
|
917
|
-
objectLayer = await ObjectLayerEngine.computeAndSaveFinalSha256({
|
|
918
|
-
objectLayer,
|
|
919
|
-
ipfsClient: ipfsClient || null,
|
|
920
|
-
createPinRecord: createPinRecord || null,
|
|
921
|
-
userId,
|
|
922
|
-
options,
|
|
923
|
-
});
|
|
924
|
-
|
|
925
|
-
return objectLayer;
|
|
926
|
-
}
|
|
927
971
|
}
|
|
928
972
|
|
|
929
|
-
/**
|
|
930
|
-
* Mapping of item type names to numerical IDs.
|
|
931
|
-
* @constant
|
|
932
|
-
* @type {{floor: number, skin: number, weapon: number, skill: number, coin: number}}
|
|
933
|
-
* @memberof CyberiaObjectLayer
|
|
934
|
-
*/
|
|
935
|
-
export const itemTypes = { floor: 0, skin: 1, weapon: 2, skill: 3, coin: 4 };
|
|
936
|
-
|
|
937
973
|
// ──────────────────────────────────────────────────────────────────────────
|
|
938
974
|
// Backward-compatible named exports matching the original destructured imports.
|
|
939
975
|
// ──────────────────────────────────────────────────────────────────────────
|
package/src/server/peer.js
CHANGED
|
@@ -44,6 +44,14 @@ const logger = loggerFactory(import.meta);
|
|
|
44
44
|
*/
|
|
45
45
|
const createPeerServer = async ({ port, origins, path }) => {
|
|
46
46
|
logger.info('origins', origins);
|
|
47
|
+
|
|
48
|
+
// In development, allow the local client origin (peer runs on port+1 relative to the client)
|
|
49
|
+
if (process.env.NODE_ENV === 'development') {
|
|
50
|
+
const clientPort = port - 1;
|
|
51
|
+
const devOrigin = `http://localhost:${clientPort}`;
|
|
52
|
+
if (!origins.includes(devOrigin)) origins.push(devOrigin);
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
/** @type {import('peer').IConfig} */
|
|
48
56
|
const options = {
|
|
49
57
|
port,
|
package/src/server/process.js
CHANGED
|
@@ -4,35 +4,30 @@
|
|
|
4
4
|
* @module src/server/process.js
|
|
5
5
|
* @namespace Process
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
// https://nodejs.org/api/process
|
|
9
|
-
|
|
10
8
|
import shell from 'shelljs';
|
|
11
9
|
import { loggerFactory } from './logger.js';
|
|
12
10
|
import clipboard from 'clipboardy';
|
|
13
11
|
import Underpost from '../index.js';
|
|
14
12
|
import { getNpmRootPath } from './conf.js';
|
|
15
|
-
|
|
16
13
|
const logger = loggerFactory(import.meta);
|
|
17
|
-
|
|
18
14
|
/**
|
|
19
15
|
* Gets the current working directory, replacing backslashes with forward slashes for consistency.
|
|
20
16
|
* @memberof Process
|
|
21
17
|
* @returns {string} The root directory path.
|
|
22
18
|
*/
|
|
23
19
|
const getRootDirectory = () => process.cwd().replace(/\\/g, '/');
|
|
24
|
-
|
|
25
20
|
/**
|
|
26
21
|
* Controls and manages process-level events and signals.
|
|
27
22
|
* @namespace ProcessController
|
|
28
23
|
*/
|
|
29
|
-
|
|
24
|
+
class ProcessController {
|
|
30
25
|
/**
|
|
31
26
|
* List of signals to listen for for graceful shutdown/handling.
|
|
32
27
|
* @memberof ProcessController
|
|
33
28
|
* @type {string[]}
|
|
34
29
|
*/
|
|
35
|
-
SIG
|
|
30
|
+
static SIG = [
|
|
36
31
|
'SIGPIPE',
|
|
37
32
|
'SIGHUP',
|
|
38
33
|
'SIGTERM',
|
|
@@ -45,29 +40,26 @@ const ProcessController = {
|
|
|
45
40
|
'SIGFPE',
|
|
46
41
|
'SIGSEGV',
|
|
47
42
|
'SIGILL',
|
|
48
|
-
]
|
|
49
|
-
|
|
43
|
+
];
|
|
50
44
|
/**
|
|
51
45
|
* Sets up listeners for various process signals defined in {@link ProcessController.SIG}.
|
|
52
46
|
* Handles graceful exit on 'SIGINT' (Ctrl+C).
|
|
53
47
|
* @memberof ProcessController
|
|
54
48
|
* @returns {Array<process.Process>} An array of process listener handles.
|
|
55
49
|
*/
|
|
56
|
-
onSigListen
|
|
57
|
-
return
|
|
50
|
+
static onSigListen() {
|
|
51
|
+
return ProcessController.SIG.map((sig) =>
|
|
58
52
|
process.on(sig, (...args) => {
|
|
59
|
-
|
|
53
|
+
ProcessController.logger.info(`process on ${sig}`, args);
|
|
60
54
|
switch (sig) {
|
|
61
55
|
case 'SIGINT':
|
|
62
56
|
return process.exit();
|
|
63
|
-
|
|
64
57
|
default:
|
|
65
58
|
break;
|
|
66
59
|
}
|
|
67
60
|
}),
|
|
68
61
|
);
|
|
69
|
-
}
|
|
70
|
-
|
|
62
|
+
}
|
|
71
63
|
/**
|
|
72
64
|
* Initializes the ProcessController.
|
|
73
65
|
* Sets up signal listeners, registers a listener for the 'exit' event, and cleans up temporary deployment environment variables.
|
|
@@ -75,16 +67,15 @@ const ProcessController = {
|
|
|
75
67
|
* @param {Object} logger - The logger instance to use for internal logging.
|
|
76
68
|
* @returns {void}
|
|
77
69
|
*/
|
|
78
|
-
init
|
|
79
|
-
|
|
70
|
+
static init(logger) {
|
|
71
|
+
ProcessController.logger = logger;
|
|
80
72
|
process.on('exit', (...args) => {
|
|
81
|
-
|
|
73
|
+
ProcessController.logger.info(`process on exit`, args);
|
|
82
74
|
});
|
|
83
|
-
|
|
75
|
+
ProcessController.onSigListen();
|
|
84
76
|
Underpost.env.delete('await-deploy');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
77
|
+
}
|
|
78
|
+
}
|
|
88
79
|
/**
|
|
89
80
|
* Executes a shell command using shelljs.
|
|
90
81
|
* @memberof Process
|
|
@@ -105,7 +96,6 @@ const shellExec = (
|
|
|
105
96
|
if (options.callback) return shell.exec(cmd, options, options.callback);
|
|
106
97
|
return options.stdout ? shell.exec(cmd, options).stdout : shell.exec(cmd, options);
|
|
107
98
|
};
|
|
108
|
-
|
|
109
99
|
/**
|
|
110
100
|
* Changes the current working directory using shelljs.
|
|
111
101
|
* @memberof Process
|
|
@@ -118,7 +108,6 @@ const shellCd = (cd, options = { disableLog: false }) => {
|
|
|
118
108
|
if (!options.disableLog) logger.info(`cd`, cd);
|
|
119
109
|
return shell.cd(cd);
|
|
120
110
|
};
|
|
121
|
-
|
|
122
111
|
/**
|
|
123
112
|
* Wraps a command to run it as a daemon process in a shell (keeping the process alive/terminal open).
|
|
124
113
|
* @memberof Process
|
|
@@ -126,7 +115,6 @@ const shellCd = (cd, options = { disableLog: false }) => {
|
|
|
126
115
|
* @returns {string} The shell command string for the daemon process.
|
|
127
116
|
*/
|
|
128
117
|
const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
|
|
129
|
-
|
|
130
118
|
/**
|
|
131
119
|
* Retrieves the process ID (PID) of the most recently created gnome-terminal instance.
|
|
132
120
|
* Note: This function is environment-specific (GNOME/Linux) and uses `pgrep -n`.
|
|
@@ -136,7 +124,6 @@ const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
|
|
|
136
124
|
// list all terminals: pgrep gnome-terminal
|
|
137
125
|
// list last terminal: pgrep -n gnome-terminal
|
|
138
126
|
const getTerminalPid = () => JSON.parse(shellExec(`pgrep -n gnome-terminal`, { stdout: true, silent: true }));
|
|
139
|
-
|
|
140
127
|
/**
|
|
141
128
|
* Copies text content to the system clipboard using clipboardy.
|
|
142
129
|
* Logs the copied content for confirmation.
|
|
@@ -148,5 +135,4 @@ function pbcopy(data) {
|
|
|
148
135
|
clipboard.writeSync(data || '🦄');
|
|
149
136
|
logger.info(`copied to clipboard`, clipboard.readSync());
|
|
150
137
|
}
|
|
151
|
-
|
|
152
138
|
export { ProcessController, getRootDirectory, shellExec, shellCd, pbcopy, getTerminalPid, daemonProcess };
|
package/src/server/runtime.js
CHANGED
|
@@ -11,6 +11,7 @@ import * as promClient from 'prom-client';
|
|
|
11
11
|
import { loggerFactory } from './logger.js';
|
|
12
12
|
import { newInstance } from '../client/components/core/CommonJs.js';
|
|
13
13
|
import { Lampp } from '../runtime/lampp/Lampp.js';
|
|
14
|
+
import { WpService } from '../runtime/wp/Wp.js';
|
|
14
15
|
import { getInstanceContext, readConfJson } from './conf.js';
|
|
15
16
|
|
|
16
17
|
import ExpressService from '../runtime/express/Express.js';
|
|
@@ -71,6 +72,9 @@ const buildRuntime = async () => {
|
|
|
71
72
|
valkey,
|
|
72
73
|
apiBaseHost,
|
|
73
74
|
useLocalSsl,
|
|
75
|
+
grpc,
|
|
76
|
+
repository,
|
|
77
|
+
wp,
|
|
74
78
|
} = confServer[host][path];
|
|
75
79
|
|
|
76
80
|
// Calculate context data
|
|
@@ -116,6 +120,7 @@ const buildRuntime = async () => {
|
|
|
116
120
|
peer,
|
|
117
121
|
valkey,
|
|
118
122
|
apiBaseHost,
|
|
123
|
+
grpc,
|
|
119
124
|
redirectTarget,
|
|
120
125
|
rootHostPath,
|
|
121
126
|
confSSR,
|
|
@@ -129,7 +134,7 @@ const buildRuntime = async () => {
|
|
|
129
134
|
|
|
130
135
|
case 'lampp':
|
|
131
136
|
{
|
|
132
|
-
const { disabled } =
|
|
137
|
+
const { disabled } = Lampp.createApp({
|
|
133
138
|
port,
|
|
134
139
|
host,
|
|
135
140
|
path,
|
|
@@ -143,6 +148,25 @@ const buildRuntime = async () => {
|
|
|
143
148
|
await Underpost.start.listenPortController(Underpost.start.listenServerFactory(), port, runningData);
|
|
144
149
|
}
|
|
145
150
|
break;
|
|
151
|
+
|
|
152
|
+
case 'wp':
|
|
153
|
+
{
|
|
154
|
+
const { disabled } = WpService.createApp({
|
|
155
|
+
port,
|
|
156
|
+
host,
|
|
157
|
+
pathRoute: path,
|
|
158
|
+
repository,
|
|
159
|
+
db,
|
|
160
|
+
wp,
|
|
161
|
+
redirect,
|
|
162
|
+
redirectTarget,
|
|
163
|
+
resetRouter: currentPort === initPort,
|
|
164
|
+
});
|
|
165
|
+
if (disabled) continue;
|
|
166
|
+
await Underpost.start.listenPortController(Underpost.start.listenServerFactory(), port, runningData);
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
|
|
146
170
|
default:
|
|
147
171
|
break;
|
|
148
172
|
}
|