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
|
@@ -15,7 +15,7 @@ const main = () => {
|
|
|
15
15
|
es: 'El servidor está en mantenimiento <br> volveremos pronto.',
|
|
16
16
|
},
|
|
17
17
|
},
|
|
18
|
-
|
|
18
|
+
instance: function (id) {
|
|
19
19
|
return this.Data[id][getLang()] ? this.Data[id][getLang()] : this.Data[id]['en'];
|
|
20
20
|
},
|
|
21
21
|
};
|
|
@@ -47,17 +47,18 @@ const main = () => {
|
|
|
47
47
|
<div class="abs center" style="top: 45%">
|
|
48
48
|
${icon}
|
|
49
49
|
<br />
|
|
50
|
-
<br />${Translate.
|
|
50
|
+
<br />${Translate.instance('server-maintenance')}
|
|
51
51
|
</div>`,
|
|
52
52
|
);
|
|
53
53
|
};
|
|
54
54
|
|
|
55
|
-
SrrComponent = () =>
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
SrrComponent = () =>
|
|
56
|
+
html`<script>
|
|
57
|
+
{
|
|
58
|
+
const s = ${s};
|
|
59
|
+
const append = ${append};
|
|
60
|
+
const getLang = ${getLang};
|
|
61
|
+
const main = ${main};
|
|
62
|
+
window.onload = main;
|
|
63
|
+
}
|
|
64
|
+
</script>`;
|
|
@@ -19,7 +19,7 @@ const main = () => {
|
|
|
19
19
|
es: 'Volver a <br> la pagina principal',
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
|
-
|
|
22
|
+
instance: function (id) {
|
|
23
23
|
return this.Data[id][getLang()] ? this.Data[id][getLang()] : this.Data[id]['en'];
|
|
24
24
|
},
|
|
25
25
|
};
|
|
@@ -49,9 +49,9 @@ const main = () => {
|
|
|
49
49
|
${icon}
|
|
50
50
|
<br />
|
|
51
51
|
<br />
|
|
52
|
-
<br />${Translate.
|
|
52
|
+
<br />${Translate.instance('no-internet-connection')} <br />
|
|
53
53
|
<br />
|
|
54
|
-
<a target="_top" href="${location.origin}">${Translate.
|
|
54
|
+
<a target="_top" href="${location.origin}">${Translate.instance('back')}</a>
|
|
55
55
|
</div>`,
|
|
56
56
|
);
|
|
57
57
|
};
|
|
@@ -15,7 +15,7 @@ const main = () => {
|
|
|
15
15
|
es: 'Volver a <br> la pagina principal',
|
|
16
16
|
},
|
|
17
17
|
},
|
|
18
|
-
|
|
18
|
+
instance: function (id) {
|
|
19
19
|
return this.Data[id][getLang()] ? this.Data[id][getLang()] : this.Data[id]['en'];
|
|
20
20
|
},
|
|
21
21
|
};
|
|
@@ -182,7 +182,7 @@ const main = () => {
|
|
|
182
182
|
<span class="bold">Test Page</span>
|
|
183
183
|
<br />
|
|
184
184
|
<br />
|
|
185
|
-
<a target="_top" href="${location.origin}">${Translate.
|
|
185
|
+
<a target="_top" href="${location.origin}">${Translate.instance('back')}</a>
|
|
186
186
|
</div>`,
|
|
187
187
|
);
|
|
188
188
|
};
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
// Workbox modules are bundled inline by esbuild — no CDN, no importScripts.
|
|
2
|
+
import { setCacheNameDetails, clientsClaim } from 'workbox-core';
|
|
3
|
+
import { precacheAndRoute, cleanupOutdatedCaches, matchPrecache } from 'workbox-precaching';
|
|
4
|
+
import { registerRoute, setCatchHandler } from 'workbox-routing';
|
|
5
|
+
import { StaleWhileRevalidate, NetworkFirst, NetworkOnly } from 'workbox-strategies';
|
|
6
|
+
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
|
|
7
|
+
import { ExpirationPlugin } from 'workbox-expiration';
|
|
8
|
+
import { BackgroundSyncPlugin } from 'workbox-background-sync';
|
|
9
|
+
|
|
10
|
+
// ─── Runtime config injected by client-build.js ───────────────────────────────
|
|
11
|
+
// OFFLINE_URL and MAINTENANCE_URL are absolute (proxy-prefixed) index.html paths
|
|
12
|
+
// resolved at build time from the SSR config's `fallbacks` map.
|
|
13
|
+
const payload = self.renderPayload || {};
|
|
14
|
+
const CACHE_PREFIX = payload.CACHE_PREFIX || 'engine-core';
|
|
15
|
+
const PRE_CACHED_RESOURCES = Array.isArray(payload.PRE_CACHED_RESOURCES) ? payload.PRE_CACHED_RESOURCES : [];
|
|
16
|
+
const OFFLINE_URL = payload.OFFLINE_URL || '/offline/index.html';
|
|
17
|
+
const MAINTENANCE_URL = payload.MAINTENANCE_URL || '/maintenance/index.html';
|
|
18
|
+
|
|
19
|
+
// Dedicated cache for fallback pages so they're available even if precacheAndRoute
|
|
20
|
+
// fails (e.g. a precache manifest entry returns non-200 during install).
|
|
21
|
+
const FALLBACK_CACHE = `${CACHE_PREFIX}-fallbacks`;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Ultimate inline HTML fallback used ONLY when the network is unavailable and
|
|
25
|
+
* the custom SSR pages (NoNetworkConnection / Maintenance views from config)
|
|
26
|
+
* have not yet been cached. Once cached on first successful visit, the custom
|
|
27
|
+
* pages take over.
|
|
28
|
+
* @param {'offline'|'maintenance'} kind
|
|
29
|
+
* @returns {Response}
|
|
30
|
+
*/
|
|
31
|
+
const inlineFallback = (kind) => {
|
|
32
|
+
const title = kind === 'offline' ? 'Offline' : 'Maintenance';
|
|
33
|
+
const icon = kind === 'offline' ? '🌐' : '🔧';
|
|
34
|
+
const msg =
|
|
35
|
+
kind === 'offline'
|
|
36
|
+
? 'You are offline. Please check your internet connection and try again.'
|
|
37
|
+
: 'The server is under maintenance. We\'ll be back shortly.';
|
|
38
|
+
const html = `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title>${title}</title><style>body{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#f5f5f5;color:#333;padding:1rem;text-align:center}h1{font-size:2rem;margin-bottom:.5rem}p{font-size:1rem;color:#666;max-width:24rem}</style></head><body><h1>${icon} ${title}</h1><p>${msg}</p></body></html>`;
|
|
39
|
+
return new Response(html, {
|
|
40
|
+
status: 200,
|
|
41
|
+
statusText: 'OK',
|
|
42
|
+
headers: { 'Content-Type': 'text/html; charset=utf-8' },
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Returns a Response for the cached fallback page.
|
|
48
|
+
* Tries (in order):
|
|
49
|
+
* 1. Dedicated FALLBACK_CACHE (primary & secondary URL)
|
|
50
|
+
* 2. Workbox precache (primary & secondary URL)
|
|
51
|
+
* 3. If online, fetches the custom SSR page from the server (caches it for next time)
|
|
52
|
+
* 4. Ultimate inline HTML string (never a browser error page)
|
|
53
|
+
*
|
|
54
|
+
* @param {'offline'|'maintenance'} kind
|
|
55
|
+
* @returns {Promise<Response>}
|
|
56
|
+
*/
|
|
57
|
+
const getFallback = async (kind) => {
|
|
58
|
+
const primary = kind === 'maintenance' ? MAINTENANCE_URL : OFFLINE_URL;
|
|
59
|
+
const secondary = kind === 'maintenance' ? OFFLINE_URL : MAINTENANCE_URL;
|
|
60
|
+
const cache = await caches.open(FALLBACK_CACHE);
|
|
61
|
+
|
|
62
|
+
// ── 1. Try cache (own + precache) ──────────────────────────────────────
|
|
63
|
+
const cached =
|
|
64
|
+
(await cache.match(primary)) ||
|
|
65
|
+
(await matchPrecache(primary)) ||
|
|
66
|
+
(await cache.match(secondary)) ||
|
|
67
|
+
(await matchPrecache(secondary));
|
|
68
|
+
if (cached) return cached;
|
|
69
|
+
|
|
70
|
+
// ── 2. If we appear online, try to fetch the custom SSR page from server ─
|
|
71
|
+
// This handles the case where the install-time caching didn't happen yet
|
|
72
|
+
// (e.g. first install while server was up, but fallback pages weren't cached).
|
|
73
|
+
if (typeof navigator === 'undefined' || navigator.onLine !== false) {
|
|
74
|
+
try {
|
|
75
|
+
const fetchResp = await fetch(primary, { credentials: 'same-origin' });
|
|
76
|
+
if (fetchResp.ok) {
|
|
77
|
+
cache.put(primary, fetchResp.clone()).catch(() => { });
|
|
78
|
+
return fetchResp;
|
|
79
|
+
}
|
|
80
|
+
} catch (_) { }
|
|
81
|
+
try {
|
|
82
|
+
const fetchResp = await fetch(secondary, { credentials: 'same-origin' });
|
|
83
|
+
if (fetchResp.ok) {
|
|
84
|
+
cache.put(secondary, fetchResp.clone()).catch(() => { });
|
|
85
|
+
return fetchResp;
|
|
86
|
+
}
|
|
87
|
+
} catch (_) { }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── 3. Ultimate inline fallback ────────────────────────────────────────
|
|
91
|
+
return inlineFallback(kind);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Background-caches the offline and maintenance SSR pages for future use.
|
|
96
|
+
* Called after each successful navigation so the custom views are available
|
|
97
|
+
* the next time the network is unreachable.
|
|
98
|
+
*/
|
|
99
|
+
const cacheFallbackPages = async () => {
|
|
100
|
+
const cache = await caches.open(FALLBACK_CACHE);
|
|
101
|
+
for (const url of [OFFLINE_URL, MAINTENANCE_URL]) {
|
|
102
|
+
try {
|
|
103
|
+
if (!(await cache.match(url))) {
|
|
104
|
+
const response = await fetch(url, { credentials: 'same-origin' });
|
|
105
|
+
if (response.ok) {
|
|
106
|
+
await cache.put(url, response);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} catch (_) {
|
|
110
|
+
// Network unavailable now — will try again on next navigation.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// ─── Core setup ───────────────────────────────────────────────────────────────
|
|
116
|
+
setCacheNameDetails({ prefix: CACHE_PREFIX });
|
|
117
|
+
clientsClaim();
|
|
118
|
+
|
|
119
|
+
self.addEventListener('install', (event) => {
|
|
120
|
+
self.skipWaiting();
|
|
121
|
+
// Note: install-time caching of fallback pages is unreliable in some browsers.
|
|
122
|
+
// We rely on the post-navigation eager caching in the navigation handler.
|
|
123
|
+
// The inline HTML fallback ensures the user never sees a browser error page
|
|
124
|
+
// before the custom SSR pages are cached.
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
self.addEventListener('activate', (event) => {
|
|
128
|
+
event.waitUntil(
|
|
129
|
+
(async () => {
|
|
130
|
+
if ('navigationPreload' in self.registration) {
|
|
131
|
+
await self.registration.navigationPreload.enable();
|
|
132
|
+
}
|
|
133
|
+
})(),
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
self.addEventListener('message', (event) => {
|
|
138
|
+
const { status } = event.data || {};
|
|
139
|
+
if (status === 'skipWaiting') {
|
|
140
|
+
self.skipWaiting();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (status === 'workbox-reset') {
|
|
144
|
+
event.waitUntil(
|
|
145
|
+
(async () => {
|
|
146
|
+
const names = await caches.keys();
|
|
147
|
+
await Promise.all(names.map((name) => caches.delete(name)));
|
|
148
|
+
event.ports?.[0]?.postMessage({ status: 'workbox-reset-done', deleted: names.length });
|
|
149
|
+
})(),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// ─── Precaching ───────────────────────────────────────────────────────────────
|
|
155
|
+
precacheAndRoute(PRE_CACHED_RESOURCES.map((url) => ({ url, revision: null })));
|
|
156
|
+
cleanupOutdatedCaches();
|
|
157
|
+
|
|
158
|
+
// ─── Static assets: StaleWhileRevalidate ─────────────────────────────────────
|
|
159
|
+
registerRoute(
|
|
160
|
+
({ request, url }) =>
|
|
161
|
+
request.method === 'GET' &&
|
|
162
|
+
url.origin === self.location.origin &&
|
|
163
|
+
['style', 'script', 'font', 'image'].includes(request.destination),
|
|
164
|
+
new StaleWhileRevalidate({
|
|
165
|
+
cacheName: `${CACHE_PREFIX}-assets`,
|
|
166
|
+
plugins: [
|
|
167
|
+
new CacheableResponsePlugin({ statuses: [0, 200] }),
|
|
168
|
+
new ExpirationPlugin({ maxEntries: 350, maxAgeSeconds: 30 * 24 * 60 * 60 }),
|
|
169
|
+
],
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// ─── API GET: NetworkFirst with short timeout ─────────────────────────────────
|
|
174
|
+
registerRoute(
|
|
175
|
+
({ request, url }) => request.method === 'GET' && url.pathname.includes('/api/'),
|
|
176
|
+
new NetworkFirst({
|
|
177
|
+
cacheName: `${CACHE_PREFIX}-api-get`,
|
|
178
|
+
networkTimeoutSeconds: 5,
|
|
179
|
+
plugins: [
|
|
180
|
+
new CacheableResponsePlugin({ statuses: [0, 200] }),
|
|
181
|
+
new ExpirationPlugin({ maxEntries: 120, maxAgeSeconds: 5 * 60 }),
|
|
182
|
+
],
|
|
183
|
+
}),
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// ─── API mutations: NetworkOnly + background sync replay ─────────────────────
|
|
187
|
+
registerRoute(
|
|
188
|
+
({ request, url }) => request.method !== 'GET' && url.pathname.includes('/api/'),
|
|
189
|
+
new NetworkOnly({
|
|
190
|
+
plugins: [new BackgroundSyncPlugin('api-mutation-queue', { maxRetentionTime: 24 * 60 })],
|
|
191
|
+
}),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
// ─── Navigation with offline/maintenance dispatcher ─────────────────────────
|
|
195
|
+
//
|
|
196
|
+
// CRITICAL: We use direct fetch() instead of NetworkFirst for navigation so
|
|
197
|
+
// that when the server is unreachable:
|
|
198
|
+
// - NetworkFirst would silently return a STALE cached real page (status 200)
|
|
199
|
+
// making it look like the app still works when it doesn't
|
|
200
|
+
// - fetch() throws on network failure → catch → fallback page
|
|
201
|
+
// - fetch() returns 5xx → maintenance fallback
|
|
202
|
+
//
|
|
203
|
+
// After each successful fetch, we eagerly cache the custom offline/maintenance
|
|
204
|
+
// SSR pages so they're available when the network goes down.
|
|
205
|
+
//
|
|
206
|
+
// The dispatcher logic:
|
|
207
|
+
// 1. If navigator.onLine === false → offline fallback immediately
|
|
208
|
+
// 2. Try navigation preload — if it succeeds (< 500) use it, else fall through
|
|
209
|
+
// 3. Try direct fetch() — if it succeeds (< 500) cache and return it
|
|
210
|
+
// 4. If fetch returned 5xx → maintenance fallback
|
|
211
|
+
// 5. If fetch threw (network down) → fallback based on connectivity
|
|
212
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
|
|
214
|
+
registerRoute(
|
|
215
|
+
({ request }) => request.mode === 'navigate',
|
|
216
|
+
async ({ event }) => {
|
|
217
|
+
// ── 1. Check browser offline state ────────────────────────────────────
|
|
218
|
+
if (typeof navigator !== 'undefined' && navigator.onLine === false) {
|
|
219
|
+
return getFallback('offline');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ── 2. Try navigation preload ────────────────────────────────────────
|
|
223
|
+
try {
|
|
224
|
+
const preload = await event.preloadResponse;
|
|
225
|
+
if (preload && preload.status < 500) {
|
|
226
|
+
// Fire-and-forget: eagerly cache fallback pages in the background
|
|
227
|
+
// after a successful navigation so they're available when offline.
|
|
228
|
+
cacheFallbackPages().catch(() => { });
|
|
229
|
+
return preload;
|
|
230
|
+
}
|
|
231
|
+
} catch (_) {
|
|
232
|
+
// Preload threw — fall through to direct fetch
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ── 3. Try direct fetch to the server ─────────────────────────────────
|
|
236
|
+
try {
|
|
237
|
+
const response = await fetch(event.request);
|
|
238
|
+
|
|
239
|
+
if (response.status >= 500) {
|
|
240
|
+
return getFallback('maintenance');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (response.ok) {
|
|
244
|
+
// Cache the successful response for future navigations
|
|
245
|
+
const cache = await caches.open(`${CACHE_PREFIX}-pages`);
|
|
246
|
+
cache.put(event.request, response.clone()).catch(() => { });
|
|
247
|
+
|
|
248
|
+
// Eagerly cache fallback pages in the background
|
|
249
|
+
cacheFallbackPages().catch(() => { });
|
|
250
|
+
|
|
251
|
+
return response;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return response;
|
|
255
|
+
} catch (_) {
|
|
256
|
+
const reallyOffline =
|
|
257
|
+
typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
258
|
+
return getFallback(reallyOffline ? 'offline' : 'maintenance');
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
// ─── Global catch handler (non-navigation failures) ──────────────────────────
|
|
264
|
+
setCatchHandler(async ({ request }) => {
|
|
265
|
+
if (request.mode === 'navigate') {
|
|
266
|
+
const reallyOffline =
|
|
267
|
+
typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
268
|
+
return getFallback(reallyOffline ? 'offline' : 'maintenance');
|
|
269
|
+
}
|
|
270
|
+
return new Response(JSON.stringify({ status: 'error', message: 'request failed' }), {
|
|
271
|
+
status: 503,
|
|
272
|
+
headers: { 'Content-Type': 'application/json' },
|
|
273
|
+
});
|
|
274
|
+
});
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { MongooseDB } from './mongo/MongooseDB.js';
|
|
2
2
|
import { loggerFactory } from '../server/logger.js';
|
|
3
|
+
import { getCapVariableName } from '../client/components/core/CommonJs.js';
|
|
4
|
+
import { resolveHostKeyContext } from '../server/conf.js';
|
|
5
|
+
import Underpost from '../index.js';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Module for managing and loading various database connections (e.g., Mongoose, MariaDB).
|
|
@@ -22,16 +25,107 @@ class DataBaseProviderService {
|
|
|
22
25
|
* @type {object.<string, object>}
|
|
23
26
|
* @method
|
|
24
27
|
*/
|
|
25
|
-
#instance = {};
|
|
28
|
+
static #instance = {};
|
|
26
29
|
|
|
27
30
|
/**
|
|
28
31
|
* Retrieves the internal instance storage for direct access (used for backward compatibility).
|
|
29
32
|
* @returns {object.<string, object>} The internal connection instance map.
|
|
30
33
|
*/
|
|
31
|
-
get instance() {
|
|
34
|
+
static get instance() {
|
|
32
35
|
return this.#instance;
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Retrieves a loaded provider bucket for a context.
|
|
40
|
+
* @param {{host?: string, path?: string}|string} [context={ host: '', path: '' }] - Context object or key.
|
|
41
|
+
* @param {string} [provider='mongoose'] - Provider name.
|
|
42
|
+
* @returns {{models: object, connection: object, close: Function, dbSignature?: string}} Provider bucket.
|
|
43
|
+
* @throws {Error} When the provider is not loaded for the context.
|
|
44
|
+
*/
|
|
45
|
+
static getProvider(context = { host: '', path: '' }, provider = 'mongoose') {
|
|
46
|
+
const key = resolveHostKeyContext(context);
|
|
47
|
+
const entry = this.#instance[key]?.[provider];
|
|
48
|
+
|
|
49
|
+
if (!entry) throw new Error(`Database provider not loaded for context "${key}" (${provider})`);
|
|
50
|
+
return entry;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns the raw DB connection object for a context/provider.
|
|
55
|
+
* @param {{host?: string, path?: string}|string} [context={ host: '', path: '' }] - Context object or key.
|
|
56
|
+
* @param {string} [provider='mongoose'] - Provider name.
|
|
57
|
+
* @returns {object} Provider connection object.
|
|
58
|
+
*/
|
|
59
|
+
static getConnection(context = { host: '', path: '' }, provider = 'mongoose') {
|
|
60
|
+
return this.getProvider(context, provider).connection;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Resolves a loaded model by name for a given context/provider.
|
|
65
|
+
* @param {string} modelName - API/model identifier.
|
|
66
|
+
* @param {{host?: string, path?: string}|string} [context={ host: '', path: '' }] - Context object or key.
|
|
67
|
+
* @param {string} [provider='mongoose'] - Provider name.
|
|
68
|
+
* @returns {object} Loaded model instance.
|
|
69
|
+
* @throws {Error} When the model is not loaded for the context.
|
|
70
|
+
*/
|
|
71
|
+
static getModel(modelName, context = { host: '', path: '' }, provider = 'mongoose') {
|
|
72
|
+
const models = this.getProvider(context, provider).models || {};
|
|
73
|
+
const normalizedModelName = getCapVariableName(modelName);
|
|
74
|
+
|
|
75
|
+
// First try direct key (supports callers passing exact model names).
|
|
76
|
+
let model = models?.[modelName];
|
|
77
|
+
if (!model) {
|
|
78
|
+
model = models?.[normalizedModelName];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!model) {
|
|
82
|
+
// Final fallback: case-insensitive comparison without separators.
|
|
83
|
+
const target = String(modelName || '')
|
|
84
|
+
.replaceAll('-', '')
|
|
85
|
+
.replaceAll('_', '')
|
|
86
|
+
.replaceAll(' ', '')
|
|
87
|
+
.toLowerCase();
|
|
88
|
+
const resolvedModelName = Object.keys(models).find(
|
|
89
|
+
(key) => key.replaceAll('_', '').replaceAll(' ', '').toLowerCase() === target,
|
|
90
|
+
);
|
|
91
|
+
if (resolvedModelName) model = models[resolvedModelName];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!model) {
|
|
95
|
+
throw new Error(`Model not loaded for context "${resolveHostKeyContext(context)}": ${normalizedModelName}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return model;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Builds a minimal dispatcher bound to a specific context/provider.
|
|
103
|
+
* @param {{host?: string, path?: string}|string} [context={ host: '', path: '' }] - Context object or key.
|
|
104
|
+
* @param {string} [provider='mongoose'] - Provider name.
|
|
105
|
+
* @returns {{getConnection: () => object, getModel: (modelName: string) => object}} Bound accessor helpers.
|
|
106
|
+
*/
|
|
107
|
+
static getDispatcher(context = { host: '', path: '' }, provider = 'mongoose') {
|
|
108
|
+
return {
|
|
109
|
+
getConnection: () => this.getConnection(context, provider),
|
|
110
|
+
getModel: (modelName) => this.getModel(modelName, context, provider),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Builds a stable signature used to detect provider configuration changes.
|
|
116
|
+
* @param {object} [db={}] - Database configuration object.
|
|
117
|
+
* @returns {string} Stringified signature for change detection.
|
|
118
|
+
*/
|
|
119
|
+
static buildDbSignature(db = {}) {
|
|
120
|
+
return JSON.stringify({
|
|
121
|
+
authSource: db.authSource || '',
|
|
122
|
+
host: db.host || '',
|
|
123
|
+
name: db.name || '',
|
|
124
|
+
provider: db.provider || '',
|
|
125
|
+
replicaSet: db.replicaSet || '',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
35
129
|
/**
|
|
36
130
|
* Loads and initializes a database provider based on the configuration.
|
|
37
131
|
* If the connection is already loaded for the given host/path, it returns the existing instance.
|
|
@@ -48,21 +142,30 @@ class DataBaseProviderService {
|
|
|
48
142
|
* @returns {Promise<object|undefined>} A promise that resolves to the initialized provider object
|
|
49
143
|
* or `undefined` on error or if the provider is already loaded.
|
|
50
144
|
*/
|
|
51
|
-
async load(options = { apis: [], host: '', path: '', db: {} }) {
|
|
145
|
+
static async load(options = { apis: [], host: '', path: '', db: {} }) {
|
|
52
146
|
try {
|
|
53
147
|
const { apis, host, path, db } = options;
|
|
54
|
-
const key =
|
|
148
|
+
const key = resolveHostKeyContext({ host, path });
|
|
149
|
+
const dbSignature = DataBaseProviderService.buildDbSignature(db);
|
|
55
150
|
|
|
56
151
|
if (!this.#instance[key]) this.#instance[key] = {};
|
|
152
|
+
if (!db) return undefined;
|
|
57
153
|
|
|
58
|
-
|
|
154
|
+
const currentProvider = this.#instance[key][db.provider];
|
|
155
|
+
if (currentProvider && currentProvider.dbSignature === dbSignature) return currentProvider;
|
|
156
|
+
|
|
157
|
+
if (currentProvider && currentProvider.close) {
|
|
158
|
+
await currentProvider.close();
|
|
159
|
+
delete this.#instance[key][db.provider];
|
|
160
|
+
}
|
|
59
161
|
|
|
60
162
|
// logger.info(`Load ${db.provider} provider`, key);
|
|
61
163
|
switch (db.provider) {
|
|
62
164
|
case 'mongoose':
|
|
63
165
|
{
|
|
64
|
-
const conn = await MongooseDB.connect(db
|
|
166
|
+
const conn = await MongooseDB.connect(db);
|
|
65
167
|
this.#instance[key][db.provider] = {
|
|
168
|
+
dbSignature,
|
|
66
169
|
models: await MongooseDB.loadModels({ conn, apis }),
|
|
67
170
|
connection: conn,
|
|
68
171
|
close: async () => {
|
|
@@ -97,17 +200,14 @@ class DataBaseProviderService {
|
|
|
97
200
|
: {},
|
|
98
201
|
};
|
|
99
202
|
logger.error(error.message, { safeOptions });
|
|
203
|
+
if (Underpost.env.isInsideContainer()) Underpost.env.set('container-status', 'error');
|
|
100
204
|
return undefined;
|
|
101
205
|
}
|
|
102
206
|
}
|
|
103
207
|
}
|
|
104
208
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
*/
|
|
111
|
-
const DataBaseProvider = new DataBaseProviderService();
|
|
112
|
-
|
|
113
|
-
export { DataBaseProvider, DataBaseProviderService as DataBaseProviderClass };
|
|
209
|
+
export {
|
|
210
|
+
DataBaseProviderService as DataBaseProviderClass,
|
|
211
|
+
DataBaseProviderService as default,
|
|
212
|
+
DataBaseProviderService,
|
|
213
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createPool } from 'mariadb';
|
|
2
|
-
|
|
2
|
+
import Underpost from '../../index.js';
|
|
3
3
|
import { loggerFactory } from '../../server/logger.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -51,6 +51,7 @@ class MariaDBService {
|
|
|
51
51
|
console.log(result);
|
|
52
52
|
} catch (error) {
|
|
53
53
|
logger.error('MariaDB query failed', { error: error.message });
|
|
54
|
+
if (Underpost.env.isInsideContainer()) Underpost.env.set('container-status', 'error');
|
|
54
55
|
} finally {
|
|
55
56
|
if (conn) conn.release(); // release to pool
|
|
56
57
|
await pool.end();
|