cyberia 3.2.5 → 3.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/engine-cyberia.cd.yml +8 -2
- package/.github/workflows/npmpkg.ci.yml +1 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/.github/workflows/release.cd.yml +2 -2
- package/.vscode/extensions.json +9 -9
- package/.vscode/settings.json +20 -4
- package/CHANGELOG.md +563 -1
- package/CLI-HELP.md +130 -34
- package/Dockerfile +0 -4
- package/README.md +194 -607
- package/bin/build.js +42 -12
- package/bin/build.template.js +187 -0
- package/bin/cyberia.js +1367 -281
- package/bin/deploy.js +582 -3
- package/bin/index.js +1367 -281
- package/bump.config.js +26 -0
- package/conf.js +195 -111
- package/deployment.yaml +6 -222
- package/hardhat/package-lock.json +118 -149
- package/hardhat/package.json +5 -4
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/manifests/kind-config-dev.yaml +8 -0
- package/manifests/lxd/lxd-admin-profile.yaml +12 -3
- package/manifests/mongodb/pv-pvc.yaml +44 -8
- package/manifests/mongodb/statefulset.yaml +55 -68
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +3 -1
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/valkey/statefulset.yaml +1 -1
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/package.json +45 -24
- package/proxy.yaml +10 -118
- package/scripts/ipxe-setup.sh +52 -49
- package/scripts/k3s-node-setup.sh +83 -48
- package/scripts/lxd-vm-setup.sh +193 -8
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/scripts/nat-iptables.sh +103 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.router.js +19 -14
- package/src/api/core/core.service.js +15 -15
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.router.js +18 -12
- package/src/api/crypto/crypto.service.js +11 -11
- 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 +31 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
- package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
- package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
- package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
- package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
- package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
- package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.router.js +35 -30
- package/src/api/cyberia-map/cyberia-map.service.js +17 -17
- 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 +31 -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 +31 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.router.js +22 -18
- package/src/api/default/default.service.js +15 -15
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/document/document.router.js +28 -23
- package/src/api/document/document.service.js +100 -23
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.router.js +19 -13
- package/src/api/file/file.service.js +45 -43
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.router.js +29 -24
- package/src/api/instance/instance.service.js +16 -16
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.router.js +21 -16
- package/src/api/ipfs/ipfs.service.js +22 -36
- 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 +512 -507
- package/src/api/object-layer/object-layer.service.js +29 -26
- 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.router.js +22 -18
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.router.js +17 -12
- package/src/api/test/test.service.js +8 -8
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +100 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.router.js +297 -288
- package/src/api/user/user.service.js +103 -55
- package/src/cli/baremetal.js +132 -101
- package/src/cli/cluster.js +732 -217
- package/src/cli/db.js +106 -62
- package/src/cli/deploy.js +260 -149
- package/src/cli/fs.js +90 -9
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +106 -16
- package/src/cli/ipfs.js +4 -6
- package/src/cli/kubectl.js +4 -1
- package/src/cli/lxd.js +1099 -223
- package/src/cli/monitor.js +9 -3
- package/src/cli/release.js +336 -86
- package/src/cli/repository.js +136 -53
- package/src/cli/run.js +599 -76
- package/src/cli/secrets.js +11 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +9 -3
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +30 -36
- package/src/client/Itemledger.index.js +20 -26
- package/src/client/Underpost.index.js +19 -23
- 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 +1 -1
- package/src/client/components/core/Auth.js +40 -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 +42 -63
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +163 -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 +69 -91
- package/src/client/components/core/EventBus.js +96 -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 +25 -18
- 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 +41 -41
- package/src/client/components/core/LogOut.js +23 -14
- package/src/client/components/core/Modal.js +544 -219
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -50
- package/src/client/components/core/PanelForm.js +81 -177
- 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 +31 -2
- package/src/client/components/core/SocketIoHandler.js +6 -6
- 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/Worker.js +211 -276
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
- 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/cyberia/InstanceEngineCyberia.js +141 -60
- package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
- 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/TranslateCyberiaPortal.js +4 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +6 -4
- package/src/client/components/default/LogOutDefault.js +6 -4
- 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/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +6 -4
- package/src/client/components/itemledger/LogOutItemledger.js +6 -4
- 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/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
- 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 +6 -4
- package/src/client/components/underpost/LogOutUnderpost.js +6 -4
- 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/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -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/UNDERPOST-PLATFORM.md +106 -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 +17 -49
- 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-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
- package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
- package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
- 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 +5 -5
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +12 -18
- package/src/client/services/object-layer/object-layer.management.js +12 -12
- package/src/client/services/object-layer/object-layer.service.js +20 -26
- 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 +5 -5
- 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/views/CyberiaServerMetrics.js +982 -0
- package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
- package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
- package/src/client/ssr/{pages → views}/Test.js +2 -2
- package/src/client/sw/core.sw.js +274 -0
- package/src/db/DataBaseProvider.js +115 -15
- package/src/db/mariadb/MariaDB.js +2 -1
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +129 -21
- package/src/grpc/cyberia/grpc-server.js +185 -105
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +101 -0
- package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
- package/src/runtime/cyberia-server/Dockerfile +62 -0
- package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/runtime/wp/Wp.js +8 -5
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +2 -2
- package/src/server/client-build-docs.js +46 -47
- package/src/server/client-build.js +371 -132
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +91 -87
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +22 -0
- package/src/server/ipfs-client.js +232 -91
- package/src/server/object-layer.js +1 -6
- package/src/server/process.js +192 -45
- package/src/server/proxy.js +9 -2
- package/src/server/runtime.js +1 -1
- package/src/server/semantic-layer-generator-floor.js +11 -51
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +41 -171
- package/src/server/semantic-layer-generator.js +122 -14
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +34 -8
- package/src/server/valkey.js +143 -235
- package/src/ws/IoInterface.js +16 -16
- package/src/ws/core/channels/core.ws.chat.js +11 -11
- package/src/ws/core/channels/core.ws.mailer.js +29 -29
- package/src/ws/core/channels/core.ws.stream.js +19 -19
- package/src/ws/core/core.ws.connection.js +8 -8
- package/src/ws/core/core.ws.server.js +6 -5
- package/src/ws/default/channels/default.ws.main.js +10 -10
- package/src/ws/default/default.ws.connection.js +4 -4
- package/src/ws/default/default.ws.server.js +4 -3
- 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/bin/file.js +0 -196
- package/bin/vs.js +0 -74
- package/bin/zed.js +0 -84
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -68
- package/jsdoc.json +0 -68
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
- package/src/api/object-layer/README.md +0 -672
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
- package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
- package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
- package/src/grpc/cyberia/README.md +0 -326
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* @namespace CyberiaObjectLayerService
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
14
14
|
import { loggerFactory } from '../../server/logger.js';
|
|
15
15
|
import { ObjectLayerRenderFramesDto } from '../object-layer-render-frames/object-layer-render-frames.model.js';
|
|
16
16
|
import { FileFactory } from '../file/file.service.js';
|
|
@@ -36,7 +36,7 @@ const logger = loggerFactory(import.meta);
|
|
|
36
36
|
* @namespace CyberiaObjectLayerService.ObjectLayerService
|
|
37
37
|
* @memberof CyberiaObjectLayerService
|
|
38
38
|
*/
|
|
39
|
-
|
|
39
|
+
class ObjectLayerService {
|
|
40
40
|
/**
|
|
41
41
|
* POST handler for creating object layers and uploading frame images.
|
|
42
42
|
*
|
|
@@ -59,7 +59,7 @@ const ObjectLayerService = {
|
|
|
59
59
|
* @returns {Promise<Object>} The created object layer document or frame upload result.
|
|
60
60
|
* @throws {Error} If file validation fails or required parameters are missing.
|
|
61
61
|
*/
|
|
62
|
-
post
|
|
62
|
+
static post = async (req, res, options) => {
|
|
63
63
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
64
64
|
|
|
65
65
|
if (req.path.startsWith('/frame-image')) {
|
|
@@ -149,9 +149,9 @@ const ObjectLayerService = {
|
|
|
149
149
|
fs.writeFileSync(`${publicFolder}/metadata.json`, metadataContent);
|
|
150
150
|
|
|
151
151
|
// Build object layer data from the asset directory
|
|
152
|
-
const ObjectLayer =
|
|
152
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
153
153
|
const ObjectLayerRenderFrames =
|
|
154
|
-
|
|
154
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
155
155
|
|
|
156
156
|
const { objectLayerRenderFramesData, objectLayerData } =
|
|
157
157
|
await ObjectLayerEngine.buildObjectLayerDataFromDirectory({
|
|
@@ -183,9 +183,9 @@ const ObjectLayerService = {
|
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
// create object layer from body – cut-over consistency: stage all CIDs before writing to DB
|
|
186
|
-
const ObjectLayer =
|
|
186
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
187
187
|
const ObjectLayerRenderFrames =
|
|
188
|
-
|
|
188
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
189
189
|
|
|
190
190
|
const bodyData = { ...req.body };
|
|
191
191
|
if (!bodyData.data) bodyData.data = {};
|
|
@@ -245,7 +245,7 @@ const ObjectLayerService = {
|
|
|
245
245
|
}
|
|
246
246
|
|
|
247
247
|
return newObjectLayer;
|
|
248
|
-
}
|
|
248
|
+
};
|
|
249
249
|
|
|
250
250
|
/**
|
|
251
251
|
* GET handler for retrieving object layers.
|
|
@@ -268,9 +268,9 @@ const ObjectLayerService = {
|
|
|
268
268
|
* @returns {Promise<Object>} The requested object layer data, list, or frame counts.
|
|
269
269
|
* @throws {Error} If the requested object layer is not found.
|
|
270
270
|
*/
|
|
271
|
-
get
|
|
271
|
+
static get = async (req, res, options) => {
|
|
272
272
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
273
|
-
const ObjectLayer =
|
|
273
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
274
274
|
|
|
275
275
|
// GET /search-item-ids?q=<partial> - Fast partial match search on data.item.id
|
|
276
276
|
if (req.path.startsWith('/search-item-ids')) {
|
|
@@ -360,8 +360,8 @@ const ObjectLayerService = {
|
|
|
360
360
|
if (objectLayer.atlasSpriteSheetId) {
|
|
361
361
|
try {
|
|
362
362
|
const AtlasSpriteSheet =
|
|
363
|
-
|
|
364
|
-
const File =
|
|
363
|
+
DataBaseProviderService.getModel("AtlasSpriteSheet", options);
|
|
364
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
365
365
|
|
|
366
366
|
const atlasDoc = await AtlasSpriteSheet.findById(objectLayer.atlasSpriteSheetId);
|
|
367
367
|
|
|
@@ -432,7 +432,7 @@ const ObjectLayerService = {
|
|
|
432
432
|
ObjectLayer.countDocuments(query), // { userId: req.auth.user._id }
|
|
433
433
|
]);
|
|
434
434
|
return { data, total, page, totalPages: Math.ceil(total / limit) };
|
|
435
|
-
}
|
|
435
|
+
};
|
|
436
436
|
|
|
437
437
|
/**
|
|
438
438
|
* Generates a WebP animation from PNG frame images for a specific direction of an object layer.
|
|
@@ -449,9 +449,9 @@ const ObjectLayerService = {
|
|
|
449
449
|
* @returns {Promise<Buffer>} The generated WebP animation as a Buffer.
|
|
450
450
|
* @throws {Error} If required parameters are missing, frames directory is not found, or img2webp fails.
|
|
451
451
|
*/
|
|
452
|
-
generateWebp
|
|
452
|
+
static generateWebp = async (req, res, options) => {
|
|
453
453
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
454
|
-
const ObjectLayer =
|
|
454
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
455
455
|
|
|
456
456
|
// GET /generate-webp/:itemType/:itemId/:directionCode - Generate webp animation from PNG frames
|
|
457
457
|
const itemType = req.params.itemType;
|
|
@@ -515,7 +515,10 @@ const ObjectLayerService = {
|
|
|
515
515
|
|
|
516
516
|
logger.info(`Executing command: ${cmd}`);
|
|
517
517
|
|
|
518
|
-
|
|
518
|
+
// silentOnError so we can build a domain-specific Error with the
|
|
519
|
+
// captured stderr/stdout context (callers want a friendly message,
|
|
520
|
+
// not a generic ShellExecError).
|
|
521
|
+
const result = shellExec(cmd, { silent: false, silentOnError: true });
|
|
519
522
|
|
|
520
523
|
if (result.code !== 0) {
|
|
521
524
|
throw new Error(`img2webp command failed: ${result.stderr || result.stdout}`);
|
|
@@ -560,7 +563,7 @@ const ObjectLayerService = {
|
|
|
560
563
|
|
|
561
564
|
throw error;
|
|
562
565
|
}
|
|
563
|
-
}
|
|
566
|
+
};
|
|
564
567
|
|
|
565
568
|
/**
|
|
566
569
|
* PUT handler for updating object layers, their frame images, and metadata.
|
|
@@ -584,9 +587,9 @@ const ObjectLayerService = {
|
|
|
584
587
|
* @returns {Promise<Object>} The updated object layer document or frame upload result.
|
|
585
588
|
* @throws {Error} If file validation fails, object layer is not found, or required parameters are missing.
|
|
586
589
|
*/
|
|
587
|
-
put
|
|
590
|
+
static put = async (req, res, options) => {
|
|
588
591
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
589
|
-
const ObjectLayer =
|
|
592
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
590
593
|
|
|
591
594
|
// PUT /:id/frame-image/:itemType/:itemId/:directionCode - Update frame images for specific direction
|
|
592
595
|
if (req.path.includes('/frame-image/')) {
|
|
@@ -686,7 +689,7 @@ const ObjectLayerService = {
|
|
|
686
689
|
fs.writeFileSync(`${publicFolder}/metadata.json`, metadataContent);
|
|
687
690
|
|
|
688
691
|
const ObjectLayerRenderFrames =
|
|
689
|
-
|
|
692
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
690
693
|
|
|
691
694
|
// Build object layer data from the asset directory
|
|
692
695
|
const { objectLayerRenderFramesData, objectLayerData } =
|
|
@@ -775,7 +778,7 @@ const ObjectLayerService = {
|
|
|
775
778
|
}).populate('objectLayerRenderFramesId');
|
|
776
779
|
|
|
777
780
|
return updatedObjectLayer;
|
|
778
|
-
}
|
|
781
|
+
};
|
|
779
782
|
|
|
780
783
|
/**
|
|
781
784
|
* DELETE handler for removing object layers and all associated resources.
|
|
@@ -801,11 +804,11 @@ const ObjectLayerService = {
|
|
|
801
804
|
* @returns {Promise<Object>} The deleted object layer document or bulk delete count.
|
|
802
805
|
* @throws {Error} If the object layer is not found.
|
|
803
806
|
*/
|
|
804
|
-
delete
|
|
807
|
+
static delete = async (req, res, options) => {
|
|
805
808
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
806
|
-
const ObjectLayer =
|
|
809
|
+
const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
|
|
807
810
|
const ObjectLayerRenderFrames =
|
|
808
|
-
|
|
811
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
809
812
|
|
|
810
813
|
if (req.params.id) {
|
|
811
814
|
// Load the full object layer so we can access all references
|
|
@@ -890,7 +893,7 @@ const ObjectLayerService = {
|
|
|
890
893
|
}
|
|
891
894
|
return { deletedCount: allObjectLayers.length };
|
|
892
895
|
}
|
|
893
|
-
}
|
|
894
|
-
}
|
|
896
|
+
};
|
|
897
|
+
}
|
|
895
898
|
|
|
896
899
|
export { ObjectLayerService };
|
|
@@ -3,8 +3,8 @@ import { ObjectLayerRenderFramesService } from './object-layer-render-frames.ser
|
|
|
3
3
|
|
|
4
4
|
const logger = loggerFactory(import.meta);
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
post
|
|
6
|
+
class ObjectLayerRenderFramesController {
|
|
7
|
+
static post = async (req, res, options) => {
|
|
8
8
|
try {
|
|
9
9
|
const result = await ObjectLayerRenderFramesService.post(req, res, options);
|
|
10
10
|
return res.status(200).json({
|
|
@@ -18,8 +18,8 @@ const ObjectLayerRenderFramesController = {
|
|
|
18
18
|
message: error.message,
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
}
|
|
22
|
-
get
|
|
21
|
+
};
|
|
22
|
+
static get = async (req, res, options) => {
|
|
23
23
|
try {
|
|
24
24
|
const { page, limit } = req.query;
|
|
25
25
|
const result = await ObjectLayerRenderFramesService.get(
|
|
@@ -38,8 +38,8 @@ const ObjectLayerRenderFramesController = {
|
|
|
38
38
|
message: error.message,
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
|
-
}
|
|
42
|
-
put
|
|
41
|
+
};
|
|
42
|
+
static put = async (req, res, options) => {
|
|
43
43
|
try {
|
|
44
44
|
const result = await ObjectLayerRenderFramesService.put(req, res, options);
|
|
45
45
|
return res.status(200).json({
|
|
@@ -53,8 +53,8 @@ const ObjectLayerRenderFramesController = {
|
|
|
53
53
|
message: error.message,
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
}
|
|
57
|
-
delete
|
|
56
|
+
};
|
|
57
|
+
static delete = async (req, res, options) => {
|
|
58
58
|
try {
|
|
59
59
|
const result = await ObjectLayerRenderFramesService.delete(req, res, options);
|
|
60
60
|
return res.status(200).json({
|
|
@@ -68,7 +68,7 @@ const ObjectLayerRenderFramesController = {
|
|
|
68
68
|
message: error.message,
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
73
|
|
|
74
74
|
export { ObjectLayerRenderFramesController };
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
* @module src/api/object-layer-render-frames/object-layer-render-frames.model.js
|
|
4
4
|
* @namespace CyberiaObjectLayerRenderFramesModel
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
6
|
import { Schema, model } from 'mongoose';
|
|
8
|
-
|
|
9
7
|
/**
|
|
10
8
|
* @typedef {Object} ObjectLayerRenderFramesDirections
|
|
11
9
|
* @property {number[][][]} up_idle - Up idle animation frames
|
|
@@ -51,13 +49,11 @@ const ObjectLayerRenderFramesDirectionsSchema = new Schema(
|
|
|
51
49
|
},
|
|
52
50
|
{ _id: false },
|
|
53
51
|
);
|
|
54
|
-
|
|
55
52
|
/**
|
|
56
53
|
* @typedef {Object} ObjectLayerRenderFrames
|
|
57
54
|
* @property {RenderFrames} frames - Animation frames for different states
|
|
58
55
|
* @property {number[][]} colors - Color palette for rendering
|
|
59
56
|
* @property {number} frame_duration - Duration of each frame in milliseconds
|
|
60
|
-
* @property {boolean} is_stateless - Whether the render is stateless
|
|
61
57
|
* @property {Date} createdAt - When the document was created
|
|
62
58
|
* @property {Date} updatedAt - When the document was last updated
|
|
63
59
|
* @memberof CyberiaObjectLayerRenderFramesModel
|
|
@@ -67,7 +63,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
|
|
|
67
63
|
frames: { type: ObjectLayerRenderFramesDirectionsSchema, required: true },
|
|
68
64
|
colors: { type: [[Number]], required: true },
|
|
69
65
|
frame_duration: { type: Number, required: true, min: 0 },
|
|
70
|
-
is_stateless: { type: Boolean, default: false },
|
|
71
66
|
},
|
|
72
67
|
{
|
|
73
68
|
timestamps: true,
|
|
@@ -75,7 +70,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
|
|
|
75
70
|
toObject: { virtuals: true },
|
|
76
71
|
},
|
|
77
72
|
);
|
|
78
|
-
|
|
79
73
|
// Pre-save hook to ensure data consistency
|
|
80
74
|
ObjectLayerRenderFramesSchema.pre('save', function () {
|
|
81
75
|
// Ensure all required fields are present
|
|
@@ -83,21 +77,17 @@ ObjectLayerRenderFramesSchema.pre('save', function () {
|
|
|
83
77
|
throw new Error('Missing required fields: frames, colors, or frame_duration');
|
|
84
78
|
}
|
|
85
79
|
});
|
|
86
|
-
|
|
87
80
|
// Create and export the model
|
|
88
81
|
const ObjectLayerRenderFramesModel = model('ObjectLayerRenderFrames', ObjectLayerRenderFramesSchema);
|
|
89
|
-
|
|
90
82
|
const ProviderSchema = ObjectLayerRenderFramesSchema;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
select: {
|
|
83
|
+
class ObjectLayerRenderFramesDto {
|
|
84
|
+
static select = {
|
|
94
85
|
get: () => {
|
|
95
|
-
return { _id: 1, frame_duration: 1
|
|
86
|
+
return { _id: 1, frame_duration: 1 };
|
|
96
87
|
},
|
|
97
88
|
getFull: () => {
|
|
98
|
-
return { _id: 1, frames: 1, colors: 1, frame_duration: 1
|
|
89
|
+
return { _id: 1, frames: 1, colors: 1, frame_duration: 1 };
|
|
99
90
|
},
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
91
|
+
};
|
|
92
|
+
}
|
|
103
93
|
export { ObjectLayerRenderFramesSchema, ObjectLayerRenderFramesModel, ProviderSchema, ObjectLayerRenderFramesDto };
|
|
@@ -4,24 +4,28 @@ import express from 'express';
|
|
|
4
4
|
|
|
5
5
|
const logger = loggerFactory(import.meta);
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
router
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async (req, res) => await ObjectLayerRenderFramesController.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
class ObjectLayerRenderFramesRouter {
|
|
8
|
+
/**
|
|
9
|
+
* @param {import('../types.js').RouterOptions} options
|
|
10
|
+
* @returns {import('express').Router}
|
|
11
|
+
*/
|
|
12
|
+
static router(options) {
|
|
13
|
+
const router = express.Router();
|
|
14
|
+
router.post(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
|
|
15
|
+
router.post(`/`, async (req, res) => await ObjectLayerRenderFramesController.post(req, res, options));
|
|
16
|
+
router.get(`/:id`,
|
|
17
|
+
// options.authMiddleware,
|
|
18
|
+
async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options),
|
|
19
|
+
);
|
|
20
|
+
router.get(`/`, async (req, res) => await ObjectLayerRenderFramesController.get(req, res, options));
|
|
21
|
+
router.put(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
|
|
22
|
+
router.put(`/`, async (req, res) => await ObjectLayerRenderFramesController.put(req, res, options));
|
|
23
|
+
router.delete(`/:id`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
|
|
24
|
+
router.delete(`/`, async (req, res) => await ObjectLayerRenderFramesController.delete(req, res, options));
|
|
25
|
+
return router;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
24
28
|
|
|
25
|
-
const ApiRouter = ObjectLayerRenderFramesRouter;
|
|
29
|
+
const ApiRouter = (options) => ObjectLayerRenderFramesRouter.router(options);
|
|
26
30
|
|
|
27
31
|
export { ApiRouter, ObjectLayerRenderFramesRouter };
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
2
2
|
import { loggerFactory } from '../../server/logger.js';
|
|
3
3
|
import { DataQuery } from '../../server/data-query.js';
|
|
4
4
|
|
|
5
5
|
const logger = loggerFactory(import.meta);
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
post
|
|
7
|
+
class ObjectLayerRenderFramesService {
|
|
8
|
+
static post = async (req, res, options) => {
|
|
9
9
|
/** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
|
|
10
|
-
const ObjectLayerRenderFrames =
|
|
10
|
+
const ObjectLayerRenderFrames =
|
|
11
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
11
12
|
return await new ObjectLayerRenderFrames(req.body).save();
|
|
12
|
-
}
|
|
13
|
-
get
|
|
13
|
+
};
|
|
14
|
+
static get = async (req, res, options) => {
|
|
14
15
|
/** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
|
|
15
|
-
const ObjectLayerRenderFrames =
|
|
16
|
+
const ObjectLayerRenderFrames =
|
|
17
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
16
18
|
if (req.params.id) return await ObjectLayerRenderFrames.findById(req.params.id);
|
|
17
19
|
|
|
18
20
|
// Parse query parameters using DataQuery helper
|
|
@@ -25,18 +27,20 @@ const ObjectLayerRenderFramesService = {
|
|
|
25
27
|
|
|
26
28
|
const totalPages = Math.ceil(total / limit);
|
|
27
29
|
return { data, total, page, totalPages };
|
|
28
|
-
}
|
|
29
|
-
put
|
|
30
|
+
};
|
|
31
|
+
static put = async (req, res, options) => {
|
|
30
32
|
/** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
|
|
31
|
-
const ObjectLayerRenderFrames =
|
|
33
|
+
const ObjectLayerRenderFrames =
|
|
34
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
32
35
|
return await ObjectLayerRenderFrames.findByIdAndUpdate(req.params.id, req.body);
|
|
33
|
-
}
|
|
34
|
-
delete
|
|
36
|
+
};
|
|
37
|
+
static delete = async (req, res, options) => {
|
|
35
38
|
/** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
|
|
36
|
-
const ObjectLayerRenderFrames =
|
|
39
|
+
const ObjectLayerRenderFrames =
|
|
40
|
+
DataBaseProviderService.getModel("ObjectLayerRenderFrames", options);
|
|
37
41
|
if (req.params.id) return await ObjectLayerRenderFrames.findByIdAndDelete(req.params.id);
|
|
38
42
|
else return await ObjectLayerRenderFrames.deleteMany();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
41
45
|
|
|
42
46
|
export { ObjectLayerRenderFramesService };
|
|
@@ -3,8 +3,8 @@ import { TestService } from './test.service.js';
|
|
|
3
3
|
|
|
4
4
|
const logger = loggerFactory(import.meta);
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
post
|
|
6
|
+
class TestController {
|
|
7
|
+
static post = async (req, res, options) => {
|
|
8
8
|
try {
|
|
9
9
|
return res.status(200).json({
|
|
10
10
|
status: 'success',
|
|
@@ -17,8 +17,8 @@ const TestController = {
|
|
|
17
17
|
message: error.message,
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
|
-
}
|
|
21
|
-
get
|
|
20
|
+
};
|
|
21
|
+
static get = async (req, res, options) => {
|
|
22
22
|
try {
|
|
23
23
|
const result = await TestService.get(req, res, options);
|
|
24
24
|
if (result)
|
|
@@ -37,8 +37,8 @@ const TestController = {
|
|
|
37
37
|
message: error.message,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
-
}
|
|
41
|
-
delete
|
|
40
|
+
};
|
|
41
|
+
static delete = async (req, res, options) => {
|
|
42
42
|
try {
|
|
43
43
|
const result = await TestService.delete(req, res, options);
|
|
44
44
|
|
|
@@ -53,7 +53,7 @@ const TestController = {
|
|
|
53
53
|
message: error.message,
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
58
|
|
|
59
59
|
export { TestController };
|
|
@@ -4,18 +4,23 @@ import express from 'express';
|
|
|
4
4
|
|
|
5
5
|
const logger = loggerFactory(import.meta);
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
router
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
7
|
+
class TestRouter {
|
|
8
|
+
/**
|
|
9
|
+
* @param {import('../types.js').RouterOptions} options
|
|
10
|
+
* @returns {import('express').Router}
|
|
11
|
+
*/
|
|
12
|
+
static router(options) {
|
|
13
|
+
const router = express.Router();
|
|
14
|
+
router.post(`/:id`, async (req, res) => await TestController.post(req, res, options));
|
|
15
|
+
router.post(`/`, options.authMiddleware, async (req, res) => await TestController.post(req, res, options));
|
|
16
|
+
router.get(`/:id`, async (req, res) => await TestController.get(req, res, options));
|
|
17
|
+
router.get(`/`, async (req, res) => await TestController.get(req, res, options));
|
|
18
|
+
router.delete(`/:id`, async (req, res) => await TestController.delete(req, res, options));
|
|
19
|
+
router.delete(`/`, async (req, res) => await TestController.delete(req, res, options));
|
|
20
|
+
return router;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
18
23
|
|
|
19
|
-
const ApiRouter = TestRouter;
|
|
24
|
+
const ApiRouter = (options) => TestRouter.router(options);
|
|
20
25
|
|
|
21
26
|
export { ApiRouter, TestRouter };
|
|
@@ -5,14 +5,14 @@ import { getYouTubeID, validatePassword } from '../../client/components/core/Com
|
|
|
5
5
|
|
|
6
6
|
const logger = loggerFactory(import.meta);
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
post
|
|
8
|
+
class TestService {
|
|
9
|
+
static post = async (req, res, options) => {
|
|
10
10
|
switch (req.params.id) {
|
|
11
11
|
default:
|
|
12
12
|
break;
|
|
13
13
|
}
|
|
14
|
-
}
|
|
15
|
-
get
|
|
14
|
+
};
|
|
15
|
+
static get = async (req, res, options) => {
|
|
16
16
|
switch (req.params.id) {
|
|
17
17
|
case 'verify-email':
|
|
18
18
|
return validator.isEmail(req.query.email);
|
|
@@ -23,13 +23,13 @@ const TestService = {
|
|
|
23
23
|
|
|
24
24
|
default:
|
|
25
25
|
}
|
|
26
|
-
}
|
|
27
|
-
delete
|
|
26
|
+
};
|
|
27
|
+
static delete = async (req, res, options) => {
|
|
28
28
|
switch (req.params.id) {
|
|
29
29
|
default:
|
|
30
30
|
break;
|
|
31
31
|
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
34
|
|
|
35
35
|
export { TestService };
|
package/src/api/types.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/api/types
|
|
3
|
+
* @description Shared type definitions for the Express router layer.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Injected dependencies and runtime configuration for every API router instance.
|
|
8
|
+
* Keyed per-host/path by the multi-tenant engine (see src/runtime/express/Express.js).
|
|
9
|
+
*
|
|
10
|
+
* @typedef {Object} RouterOptions
|
|
11
|
+
* @property {import('express').Application} app - Express application instance.
|
|
12
|
+
* @property {string} host - Per-runtime host identifier (e.g. "nexodev.org").
|
|
13
|
+
* @property {string} path - Per-runtime path prefix (e.g. "/" or "/cyberia").
|
|
14
|
+
* @property {string} apiPath - Computed base URL for the API layer.
|
|
15
|
+
* @property {string[]} origins - Allowed origins for CORS validation.
|
|
16
|
+
* @property {import('express').RequestHandler} authMiddleware - Dynamically generated JWT auth middleware (keyed by host+path).
|
|
17
|
+
* @property {Object} [db] - DataBaseProviderService configuration or instance reference.
|
|
18
|
+
* @property {Object} [mailer] - MailerProvider configuration or instance reference.
|
|
19
|
+
* @property {Object} [png] - Cached mailer image buffers (populated by UserRouter on first load).
|
|
20
|
+
* @property {Record<string, Buffer>} [png.buffer] - Map of image key to raw PNG buffer.
|
|
21
|
+
* @property {Function} [png.header] - Sets CORS/Content-Type response headers for PNG responses.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export { };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import { UserDto } from './user.model.js';
|
|
3
|
+
import { ValkeyAPI } from '../../server/valkey.js';
|
|
4
|
+
import { hashPassword, getBearerToken, jwtSign } from '../../server/auth.js';
|
|
5
|
+
|
|
6
|
+
// ─── TTL ──────────────────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
const _guestTtlMs = () => {
|
|
9
|
+
const minutes = Number.parseInt(process.env.REFRESH_EXPIRE_MINUTES || '60', 10);
|
|
10
|
+
return Number.isFinite(minutes) && minutes > 0 ? minutes * 60 * 1000 : 60 * 60 * 1000;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// ─── Domain helpers ───────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Constructs a new ephemeral guest user object.
|
|
17
|
+
* This is domain logic specific to the guest lifecycle; it does not belong
|
|
18
|
+
* in the generic Valkey storage module.
|
|
19
|
+
*
|
|
20
|
+
* @param {{ host?: string }} options
|
|
21
|
+
* @returns {object}
|
|
22
|
+
*/
|
|
23
|
+
const buildGuestUser = (options) => {
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
const objectId = new mongoose.Types.ObjectId().toString();
|
|
26
|
+
const role = 'guest';
|
|
27
|
+
const username = `${role}${objectId.slice(-5)}`;
|
|
28
|
+
return {
|
|
29
|
+
_id: `${role}${objectId}`,
|
|
30
|
+
username,
|
|
31
|
+
email: `${username}@${options.host || 'localhost'}`,
|
|
32
|
+
password: hashPassword(process.env.JWT_SECRET),
|
|
33
|
+
role,
|
|
34
|
+
emailConfirmed: false,
|
|
35
|
+
profileImageId: null,
|
|
36
|
+
publicKey: [],
|
|
37
|
+
phoneNumbers: [],
|
|
38
|
+
activeSessions: [],
|
|
39
|
+
failedLoginAttempts: 0,
|
|
40
|
+
recoverTimeOut: null,
|
|
41
|
+
lastLoginDate: null,
|
|
42
|
+
createdAt: now,
|
|
43
|
+
updatedAt: now,
|
|
44
|
+
guestSessionExpiresAt: Date.now() + _guestTtlMs(),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Projects a user object to the public-safe fields defined by UserDto.select.get().
|
|
50
|
+
* Keeps this logic next to the guest domain instead of in a generic utility.
|
|
51
|
+
*
|
|
52
|
+
* @param {object} user
|
|
53
|
+
* @returns {object}
|
|
54
|
+
*/
|
|
55
|
+
const _toPublicUser = (user) => {
|
|
56
|
+
const select = UserDto.select.get();
|
|
57
|
+
return Object.fromEntries(
|
|
58
|
+
Object.keys(select)
|
|
59
|
+
.filter((k) => select[k] === 1 && k in user)
|
|
60
|
+
.map((k) => [k, user[k]]),
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const _withRefreshedExpiry = (user) => ({ ...user, guestSessionExpiresAt: Date.now() + _guestTtlMs() });
|
|
65
|
+
|
|
66
|
+
// ─── Service ──────────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
class GuestService {
|
|
69
|
+
static async create(req, options) {
|
|
70
|
+
const user = buildGuestUser(options);
|
|
71
|
+
|
|
72
|
+
await ValkeyAPI.set(options, user.email, user, _guestTtlMs());
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
token: jwtSign(
|
|
76
|
+
UserDto.auth.payload(user, null, req.ip, req.headers['user-agent'], options.host, options.path),
|
|
77
|
+
options,
|
|
78
|
+
),
|
|
79
|
+
user: _toPublicUser(user),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static async auth(req, options) {
|
|
84
|
+
const user = await ValkeyAPI.get(options, req.auth.user.email);
|
|
85
|
+
if (!user) throw new Error('guest user expired');
|
|
86
|
+
|
|
87
|
+
const expiresAt = Number(user.guestSessionExpiresAt || 0);
|
|
88
|
+
if (expiresAt && expiresAt <= Date.now()) throw new Error('guest user expired');
|
|
89
|
+
|
|
90
|
+
const refreshed = _withRefreshedExpiry(user);
|
|
91
|
+
await ValkeyAPI.set(options, refreshed.email, refreshed, _guestTtlMs());
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
user: _toPublicUser(refreshed),
|
|
95
|
+
token: getBearerToken(req),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { GuestService };
|
|
@@ -25,11 +25,11 @@ const handleRequest = (serviceMethod) => async (req, res, options) => {
|
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
post
|
|
30
|
-
get
|
|
31
|
-
delete
|
|
32
|
-
put
|
|
33
|
-
}
|
|
28
|
+
class UserController {
|
|
29
|
+
static post = handleRequest(UserService.post);
|
|
30
|
+
static get = handleRequest(UserService.get);
|
|
31
|
+
static delete = handleRequest(UserService.delete);
|
|
32
|
+
static put = handleRequest(UserService.put);
|
|
33
|
+
}
|
|
34
34
|
|
|
35
35
|
export { UserController };
|