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
|
@@ -1,59 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Progressive Web App (PWA) worker integration: service worker lifecycle,
|
|
3
|
+
* cache management, and the bootstrap path that wires the app's router,
|
|
4
|
+
* shell, translation, sockets, and session components together.
|
|
5
|
+
*
|
|
6
|
+
* The public surface is a single `PwaWorker` class with one shared instance,
|
|
7
|
+
* re-exported as `Worker` for backward compatibility.
|
|
8
|
+
*
|
|
5
9
|
* @module src/client/components/core/Worker.js
|
|
6
10
|
* @namespace PwaWorker
|
|
7
11
|
*/
|
|
8
12
|
|
|
9
13
|
import { BtnIcon } from './BtnIcon.js';
|
|
10
|
-
import { s4 } from './CommonJs.js';
|
|
11
14
|
import { EventsUI } from './EventsUI.js';
|
|
12
15
|
import { LoadingAnimation } from './LoadingAnimation.js';
|
|
13
16
|
import { loggerFactory } from './Logger.js';
|
|
14
|
-
import { LoadRouter } from './Router.js';
|
|
15
|
-
import { Translate } from './Translate.js';
|
|
17
|
+
import { LoadRouter, registerRoutes, getProxyPath } from './Router.js';
|
|
18
|
+
import { Translate, TranslateCore } from './Translate.js';
|
|
16
19
|
import { s } from './VanillaJs.js';
|
|
17
|
-
import {
|
|
20
|
+
import { Css } from './Css.js';
|
|
21
|
+
import { Responsive } from './Responsive.js';
|
|
22
|
+
import { SocketIo } from './SocketIo.js';
|
|
23
|
+
import { Keyboard } from './Keyboard.js';
|
|
24
|
+
|
|
18
25
|
const logger = loggerFactory(import.meta);
|
|
19
26
|
|
|
27
|
+
const SW_URL = () => `${getProxyPath()}sw.js`;
|
|
28
|
+
|
|
20
29
|
/**
|
|
21
|
-
* Manages the PWA lifecycle, service workers, and related client-side events.
|
|
22
30
|
* @memberof PwaWorker
|
|
23
31
|
*/
|
|
24
32
|
class PwaWorker {
|
|
25
|
-
/**
|
|
26
|
-
* The application title, usually from the <title> tag content.
|
|
27
|
-
* @type {string}
|
|
28
|
-
*/
|
|
33
|
+
/** App title sourced from <title>. @type {string} */
|
|
29
34
|
title = '';
|
|
30
35
|
|
|
31
|
-
/**
|
|
32
|
-
* Tracks if notification permission has been granted and is active.
|
|
33
|
-
* @type {boolean}
|
|
34
|
-
*/
|
|
35
|
-
notificationActive = false;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* A function reference to the service worker's update method (registration.update()),
|
|
39
|
-
* dynamically set upon successful registration status check.
|
|
40
|
-
* @type {function(): Promise<void>}
|
|
41
|
-
*/
|
|
42
|
-
updateServiceWorker = async () => {};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Router instance reference, initialized during the `instance` call.
|
|
46
|
-
* @type {object | null}
|
|
47
|
-
*/
|
|
36
|
+
/** Router instance reference, set during bootstrap. @type {object | null} */
|
|
48
37
|
RouterInstance = null;
|
|
49
38
|
|
|
50
|
-
/**
|
|
51
|
-
* Creates an instance of PwaWorker and initializes the application title.
|
|
52
|
-
* @memberof PwaWorker
|
|
53
|
-
*/
|
|
54
39
|
constructor() {
|
|
55
40
|
this.title = `${s('title').textContent}`;
|
|
56
|
-
if (!window.renderPayload
|
|
41
|
+
if (!window.renderPayload?.dev) {
|
|
57
42
|
console.log = () => null;
|
|
58
43
|
console.error = () => null;
|
|
59
44
|
console.info = () => null;
|
|
@@ -61,36 +46,47 @@ class PwaWorker {
|
|
|
61
46
|
}
|
|
62
47
|
}
|
|
63
48
|
|
|
49
|
+
/** @returns {boolean} True when running on localhost or with renderPayload.dev. */
|
|
50
|
+
devMode() {
|
|
51
|
+
return Boolean(
|
|
52
|
+
window.renderPayload?.dev || location.origin.match('localhost') || location.origin.match('127.0.0.1'),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
64
56
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* @
|
|
68
|
-
* @returns {boolean} True if in development mode.
|
|
57
|
+
* Awaits a component's `instance()` method, a plain function, or an array of either.
|
|
58
|
+
* Used by `instance()` to keep the bootstrap declarative.
|
|
59
|
+
* @private
|
|
69
60
|
*/
|
|
70
|
-
|
|
71
|
-
|
|
61
|
+
async #initComponent(component, options) {
|
|
62
|
+
if (!component) return;
|
|
63
|
+
if (Array.isArray(component)) {
|
|
64
|
+
for (const item of component) await this.#initComponent(item, options);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (typeof component.instance === 'function') return void (await component.instance(options));
|
|
68
|
+
if (typeof component === 'function') await component(options);
|
|
72
69
|
}
|
|
73
70
|
|
|
74
71
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* @param {object} options
|
|
80
|
-
* @param {function
|
|
81
|
-
* @param {function(): Promise<
|
|
72
|
+
* Bootstraps the app with a declarative options object. Shared core inits
|
|
73
|
+
* (Css, TranslateCore, Responsive, SocketIo, Keyboard) run in the correct
|
|
74
|
+
* order so per-app entrypoints only declare what's app-specific.
|
|
75
|
+
*
|
|
76
|
+
* @param {object} options
|
|
77
|
+
* @param {function|object} options.router Router class (with static `instance()`) or factory.
|
|
78
|
+
* @param {function(): Promise<string>} [options.template] Async function returning the landing HTML body.
|
|
79
|
+
* @param {Array} [options.themes] CSS theme list passed to `Css.loadThemes()`.
|
|
80
|
+
* @param {object|Array} [options.translate] App-level translation class(es).
|
|
81
|
+
* @param {object} [options.render] AppShell class with `instance({ htmlMainBody })`.
|
|
82
|
+
* @param {string} [options.socketPath] Socket.IO path override.
|
|
83
|
+
* @param {object} [options.appStore] AppStore whose `.Data` supplies socket channels.
|
|
84
|
+
* @param {object} [options.session] `{ socket, login, signout|logout, signup, account }`.
|
|
82
85
|
* @returns {Promise<void>}
|
|
83
86
|
*/
|
|
84
|
-
async instance({ router, render }) {
|
|
85
|
-
window.ononline =
|
|
86
|
-
|
|
87
|
-
};
|
|
88
|
-
window.onoffline = async () => {
|
|
89
|
-
logger.warn('onoffline');
|
|
90
|
-
};
|
|
91
|
-
setTimeout(() => {
|
|
92
|
-
if ('onLine' in navigator && navigator.onLine) window.ononline();
|
|
93
|
-
});
|
|
87
|
+
async instance({ router, template, themes, translate, render, socketPath, appStore, session }) {
|
|
88
|
+
window.ononline = () => logger.warn('ononline');
|
|
89
|
+
window.onoffline = () => logger.warn('onoffline');
|
|
94
90
|
|
|
95
91
|
if ('serviceWorker' in navigator) {
|
|
96
92
|
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
@@ -98,281 +94,220 @@ class PwaWorker {
|
|
|
98
94
|
});
|
|
99
95
|
navigator.serviceWorker.ready.then((worker) => {
|
|
100
96
|
logger.info('Service Worker Ready', worker);
|
|
101
|
-
|
|
102
|
-
// event message listener
|
|
103
97
|
navigator.serviceWorker.addEventListener('message', (event) => {
|
|
104
98
|
logger.info('Received event message', event.data);
|
|
105
|
-
|
|
99
|
+
if (event.data?.status === 'loader') LoadingAnimation.RenderCurrentSrcLoad(event);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
106
103
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
{
|
|
110
|
-
LoadingAnimation.RenderCurrentSrcLoad(event);
|
|
111
|
-
}
|
|
112
|
-
break;
|
|
104
|
+
this.RouterInstance = typeof router?.instance === 'function' ? router.instance() : router();
|
|
105
|
+
if (this.RouterInstance?.Routes) registerRoutes(this.RouterInstance.Routes);
|
|
113
106
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
107
|
+
// Defer SW registration out of the render critical path. Firefox in
|
|
108
|
+
// particular pays a non-trivial IPC cost for SW registration; running it
|
|
109
|
+
// after `load` keeps first paint unblocked across all engines.
|
|
110
|
+
this.#registerDeferred();
|
|
118
111
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
112
|
+
// Shared core inits — keep order: theme → translation → responsive → shell.
|
|
113
|
+
if (themes) await Css.loadThemes(themes);
|
|
114
|
+
await this.#initComponent(TranslateCore);
|
|
115
|
+
await this.#initComponent(translate);
|
|
116
|
+
await this.#initComponent(Responsive);
|
|
123
117
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// logger.info('Received broadcast message', event.data);
|
|
128
|
-
// });
|
|
129
|
-
// channel.postMessage({ title: 'Hello from Client broadcast message' });
|
|
130
|
-
// channel.close();
|
|
131
|
-
});
|
|
118
|
+
if (render && typeof render.instance === 'function') {
|
|
119
|
+
const htmlMainBody = typeof template === 'function' ? template : undefined;
|
|
120
|
+
await this.#initComponent(render, htmlMainBody ? { htmlMainBody } : undefined);
|
|
132
121
|
}
|
|
133
122
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
123
|
+
const channels = appStore?.Data ?? session?.socket?.Data;
|
|
124
|
+
await this.#initComponent(SocketIo, { channels, path: socketPath });
|
|
125
|
+
|
|
126
|
+
if (session) {
|
|
127
|
+
await this.#initComponent(session.socket);
|
|
128
|
+
await this.#initComponent(session.login);
|
|
129
|
+
await this.#initComponent(session.logout || session.signout);
|
|
130
|
+
await this.#initComponent(session.signup);
|
|
131
|
+
await this.#initComponent(session.account);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await this.#initComponent(Keyboard);
|
|
138
135
|
await LoadRouter(this.RouterInstance);
|
|
139
136
|
LoadingAnimation.removeSplashScreen();
|
|
140
|
-
if (this.devMode()) {
|
|
141
|
-
// const delayLiveReload = 1250;
|
|
142
|
-
// window.addEventListener('visibilitychange', () => {
|
|
143
|
-
// if (document.visibilityState === 'visible') {
|
|
144
|
-
// this.reload(delayLiveReload);
|
|
145
|
-
// }
|
|
146
|
-
// });
|
|
147
|
-
// window.addEventListener('focus', () => {
|
|
148
|
-
// this.reload(delayLiveReload);
|
|
149
|
-
// });
|
|
150
|
-
}
|
|
151
137
|
window.serviceWorkerReady = true;
|
|
152
138
|
}
|
|
153
139
|
|
|
154
140
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
141
|
+
* Schedules SW registration to run after page `load` (or immediately if
|
|
142
|
+
* the page is already loaded). Idempotent: existing registrations are
|
|
143
|
+
* left alone; missing ones are registered.
|
|
144
|
+
* @private
|
|
158
145
|
*/
|
|
159
|
-
|
|
160
|
-
|
|
146
|
+
#registerDeferred() {
|
|
147
|
+
if (!('serviceWorker' in navigator)) {
|
|
148
|
+
logger.warn('Service Worker disabled in browser');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const run = async () => {
|
|
152
|
+
const registration = await this.getRegistration();
|
|
153
|
+
if (!registration) await this.register();
|
|
154
|
+
};
|
|
155
|
+
if (document.readyState === 'complete') run();
|
|
156
|
+
else window.addEventListener('load', run, { once: true });
|
|
161
157
|
}
|
|
162
158
|
|
|
163
|
-
/**
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
* @memberof PwaWorker
|
|
167
|
-
* @param {number} [timeOut=3000] - Delay in milliseconds before reloading the page.
|
|
168
|
-
* @returns {Promise<void>} A promise that resolves after the page is reloaded.
|
|
169
|
-
*/
|
|
170
|
-
async reload(timeOut = 3000) {
|
|
171
|
-
return new Promise((resolve) => {
|
|
172
|
-
if (navigator.serviceWorker && navigator.serviceWorker.controller) {
|
|
173
|
-
navigator.serviceWorker.controller.postMessage({
|
|
174
|
-
status: 'skipWaiting',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
setTimeout(() => resolve(location.reload()), timeOut);
|
|
178
|
-
});
|
|
159
|
+
/** Returns the current service worker registration, if any. */
|
|
160
|
+
getRegistration() {
|
|
161
|
+
return 'serviceWorker' in navigator ? navigator.serviceWorker.getRegistration() : Promise.resolve(undefined);
|
|
179
162
|
}
|
|
180
163
|
|
|
181
|
-
/**
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
await this.updateServiceWorker();
|
|
164
|
+
/** Registers `sw.js` with the browser. Resolves with the registration (or `null` on failure). */
|
|
165
|
+
async register() {
|
|
166
|
+
if (!('serviceWorker' in navigator)) {
|
|
167
|
+
logger.warn('Service Worker disabled in browser');
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const registration = await navigator.serviceWorker.register(SW_URL());
|
|
172
|
+
logger.warn('Service Worker registered', registration);
|
|
173
|
+
return registration;
|
|
174
|
+
} catch (error) {
|
|
175
|
+
logger.error('Error registering service worker:', error);
|
|
176
|
+
return null;
|
|
197
177
|
}
|
|
198
178
|
}
|
|
199
179
|
|
|
200
180
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* @
|
|
204
|
-
* @returns {Promise<boolean>} True if at least one service worker is registered.
|
|
181
|
+
* Reloads the page, asking the active SW to skip waiting first so the
|
|
182
|
+
* new version takes effect on the next load.
|
|
183
|
+
* @param {number} [delay=3000] Milliseconds before reload.
|
|
205
184
|
*/
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return new Promise((resolve) =>
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
else if (registration.active) {
|
|
217
|
-
logger.info('active', registration);
|
|
218
|
-
// Dynamically set the update function
|
|
219
|
-
this.updateServiceWorker = async () => await registration.update();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (registrations.length > 0) status = true;
|
|
223
|
-
resolve(status);
|
|
224
|
-
})
|
|
225
|
-
.catch((...args) => {
|
|
226
|
-
logger.error('Error getting service worker registrations:', ...args);
|
|
227
|
-
resolve(false);
|
|
228
|
-
});
|
|
229
|
-
} else {
|
|
230
|
-
logger.warn('Service Worker Disabled in browser');
|
|
231
|
-
resolve(false);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
185
|
+
async reload(delay = 3000) {
|
|
186
|
+
navigator.serviceWorker?.controller?.postMessage({ status: 'skipWaiting' });
|
|
187
|
+
return new Promise((resolve) => setTimeout(() => resolve(location.reload()), delay));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Deletes every cache visible to the SW. Returns the number of caches removed. */
|
|
191
|
+
async clearAllCaches() {
|
|
192
|
+
const names = await caches.keys();
|
|
193
|
+
await Promise.all(names.map((name) => caches.delete(name)));
|
|
194
|
+
return names.length;
|
|
234
195
|
}
|
|
235
196
|
|
|
236
197
|
/**
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
* @returns {Promise<Array<any>>} A promise that resolves with the registration arguments.
|
|
198
|
+
* Deletes Workbox/background-sync IndexedDB databases that may pin stale state
|
|
199
|
+
* across reloads. Safe no-op in browsers without `indexedDB.databases`.
|
|
240
200
|
*/
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
201
|
+
async clearWorkboxIndexedDb() {
|
|
202
|
+
if (!('indexedDB' in window) || typeof indexedDB.databases !== 'function') return 0;
|
|
203
|
+
const databases = await indexedDB.databases();
|
|
204
|
+
const targets = databases
|
|
205
|
+
.map((db) => db.name)
|
|
206
|
+
.filter(
|
|
207
|
+
(name) =>
|
|
208
|
+
typeof name === 'string' &&
|
|
209
|
+
(name.toLowerCase().includes('workbox') ||
|
|
210
|
+
name.toLowerCase().includes('background-sync') ||
|
|
211
|
+
name.includes('api-mutation-queue')),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
await Promise.all(
|
|
215
|
+
targets.map(
|
|
216
|
+
(name) =>
|
|
217
|
+
new Promise((resolve) => {
|
|
218
|
+
const req = indexedDB.deleteDatabase(name);
|
|
219
|
+
req.onsuccess = () => resolve(true);
|
|
220
|
+
req.onerror = () => resolve(false);
|
|
221
|
+
req.onblocked = () => resolve(false);
|
|
222
|
+
}),
|
|
223
|
+
),
|
|
224
|
+
);
|
|
225
|
+
return targets.length;
|
|
261
226
|
}
|
|
262
227
|
|
|
263
228
|
/**
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
* @returns {Promise<Array<any>>} A promise that resolves after uninstallation.
|
|
229
|
+
* Asks the active SW to drop its caches and confirm. Resolves `false`
|
|
230
|
+
* after 1500 ms if the SW does not reply.
|
|
267
231
|
*/
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
resolve([]);
|
|
280
|
-
} catch (error) {
|
|
281
|
-
logger.error('Error during service worker uninstallation:', error);
|
|
282
|
-
resolve([error]);
|
|
283
|
-
}
|
|
284
|
-
} else {
|
|
285
|
-
logger.warn('Service Worker Disabled in browser');
|
|
286
|
-
resolve([]);
|
|
287
|
-
}
|
|
232
|
+
async requestWorkboxReset() {
|
|
233
|
+
if (!navigator.serviceWorker?.controller) return false;
|
|
234
|
+
return new Promise((resolve) => {
|
|
235
|
+
const channel = new MessageChannel();
|
|
236
|
+
const timeoutId = setTimeout(() => resolve(false), 1500);
|
|
237
|
+
channel.port1.onmessage = (event) => {
|
|
238
|
+
clearTimeout(timeoutId);
|
|
239
|
+
resolve(event.data?.status === 'workbox-reset-done');
|
|
240
|
+
};
|
|
241
|
+
navigator.serviceWorker.controller.postMessage({ status: 'workbox-reset' }, [channel.port2]);
|
|
288
242
|
});
|
|
289
243
|
}
|
|
290
244
|
|
|
291
245
|
/**
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
* @returns {Promise<boolean>} True if permission is granted, false otherwise.
|
|
246
|
+
* Targeted cache invalidation: removes app-shell entries for components,
|
|
247
|
+
* services, and index bundles, then forces the SW registration to update.
|
|
248
|
+
* Cheaper than a full reset; used as the default "Update" action.
|
|
296
249
|
*/
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}),
|
|
308
|
-
);
|
|
250
|
+
async update() {
|
|
251
|
+
const registration = await this.getRegistration();
|
|
252
|
+
if (!registration) return;
|
|
253
|
+
const names = await caches.keys();
|
|
254
|
+
for (const name of names) {
|
|
255
|
+
if (name.match('components/') || name.match('services/') || name.match('.index.js')) {
|
|
256
|
+
await caches.delete(name);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
await registration.update();
|
|
309
260
|
}
|
|
310
261
|
|
|
311
|
-
/**
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
vibrate: [200, 100, 200, 100, 200, 100, 200],
|
|
324
|
-
tag: 'vibration-sample',
|
|
325
|
-
requireInteraction: true,
|
|
326
|
-
});
|
|
327
|
-
});
|
|
262
|
+
/** Unregisters all SWs and drops every cache. */
|
|
263
|
+
async unregister() {
|
|
264
|
+
if (!('serviceWorker' in navigator)) {
|
|
265
|
+
logger.warn('Service Worker disabled in browser');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const registrations = await navigator.serviceWorker.getRegistrations();
|
|
270
|
+
await this.clearAllCaches();
|
|
271
|
+
for (const registration of registrations) {
|
|
272
|
+
logger.info('Removing service worker registration', registration);
|
|
273
|
+
registration.unregister();
|
|
328
274
|
}
|
|
329
|
-
})
|
|
275
|
+
} catch (error) {
|
|
276
|
+
logger.error('Error during service worker unregistration:', error);
|
|
277
|
+
}
|
|
330
278
|
}
|
|
331
279
|
|
|
332
|
-
/**
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
280
|
+
/** Full reset: workbox runtime + SW + client storage. Use when caches are visibly stale. */
|
|
281
|
+
async resetAndRestart() {
|
|
282
|
+
localStorage.clear();
|
|
283
|
+
sessionStorage.clear();
|
|
284
|
+
await this.requestWorkboxReset();
|
|
285
|
+
await this.unregister();
|
|
286
|
+
await this.clearAllCaches();
|
|
287
|
+
await this.clearWorkboxIndexedDb();
|
|
288
|
+
await this.register();
|
|
289
|
+
await this.reload(600);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/** Settings panel UI: a single "clean cache" action wired to `resetAndRestart`. */
|
|
338
293
|
async RenderSetting() {
|
|
339
294
|
setTimeout(() => {
|
|
340
|
-
// Event listener for the clean cache button
|
|
341
295
|
EventsUI.onClick(`.btn-clean-cache`, async (e) => {
|
|
342
296
|
e.preventDefault();
|
|
343
|
-
|
|
344
|
-
localStorage.clear();
|
|
345
|
-
await this.uninstall();
|
|
346
|
-
await this.reload();
|
|
297
|
+
await this.resetAndRestart();
|
|
347
298
|
});
|
|
348
299
|
});
|
|
349
300
|
return html` <div class="in">
|
|
350
|
-
${await BtnIcon.
|
|
351
|
-
class: 'inl section-mp btn-custom btn-install-service-controller hide',
|
|
352
|
-
label: html`<i class="fas fa-download"></i> ${Translate.Render('Install control service')}`,
|
|
353
|
-
})}
|
|
354
|
-
${await BtnIcon.Render({
|
|
355
|
-
class: 'inl section-mp btn-custom btn-uninstall-service-controller hide',
|
|
356
|
-
label: html`<i class="far fa-trash-alt"></i> ${Translate.Render('Uninstall control service')}`,
|
|
357
|
-
})}
|
|
358
|
-
${await BtnIcon.Render({
|
|
301
|
+
${await BtnIcon.instance({
|
|
359
302
|
class: 'inl section-mp btn-custom btn-clean-cache',
|
|
360
|
-
label: html`<i class="fa-solid fa-broom"></i> ${Translate.
|
|
361
|
-
})}
|
|
362
|
-
${await BtnIcon.Render({
|
|
363
|
-
class: 'inl section-mp btn-custom btn-reload hide',
|
|
364
|
-
label: html`<i class="fas fa-sync-alt"></i> ${Translate.Render('Reload')}`,
|
|
303
|
+
label: html`<i class="fa-solid fa-broom"></i> ${Translate.instance('clean-cache')}`,
|
|
365
304
|
})}
|
|
366
305
|
</div>`;
|
|
367
306
|
}
|
|
368
307
|
}
|
|
369
308
|
|
|
370
|
-
// Create the singleton instance
|
|
371
309
|
const PwaWorkerInstance = new PwaWorker();
|
|
372
310
|
|
|
373
|
-
// Export the new class name for modern usage
|
|
374
311
|
export { PwaWorker };
|
|
375
|
-
|
|
376
|
-
// Export the instance with the old name (`Worker`) for backward compatibility,
|
|
377
|
-
// ensuring existing code consuming the module continues to work.
|
|
312
|
+
// Backward-compat alias — older code imports the singleton as `Worker`.
|
|
378
313
|
export { PwaWorkerInstance as Worker };
|
|
@@ -149,23 +149,23 @@ export class PwaWindowDimensions {
|
|
|
149
149
|
* Get the best-available viewport height in pixels.
|
|
150
150
|
*
|
|
151
151
|
* Priority (from most reliable for "visible" to least):
|
|
152
|
-
* 1.
|
|
153
|
-
* 2.
|
|
154
|
-
* 3.
|
|
155
|
-
* 4.
|
|
156
|
-
* 5. window.visualViewport.height (if `preferVisualViewport` is false)
|
|
152
|
+
* 1. document.documentElement.clientHeight (Layout viewport, default — stable against iframe scrolls)
|
|
153
|
+
* 2. window.innerHeight (Window size)
|
|
154
|
+
* 3. document.body.clientHeight (Body size)
|
|
155
|
+
* 4. window.visualViewport.height (if `preferVisualViewport` is true; first priority; or last before screen fallbacks)
|
|
156
|
+
* 5. window.visualViewport.height (if `preferVisualViewport` is false — used as fallback after layout values)
|
|
157
157
|
* 6. window.screen.availHeight / window.screen.height (Physical screen)
|
|
158
158
|
* 7. window.outerHeight (Last resort)
|
|
159
159
|
*
|
|
160
160
|
* @memberof PwaWindowDimensions
|
|
161
161
|
* @static
|
|
162
162
|
* @param {Object} [options]
|
|
163
|
-
* @param {boolean} [options.preferVisualViewport=
|
|
163
|
+
* @param {boolean} [options.preferVisualViewport=false] - When true, visualViewport is checked first (best for visible screen size, e.g., above mobile keyboard). Defaults to false to use stable layout viewport height, preventing Chrome iframe scroll from causing transient visualViewport changes that affect modal sizing.
|
|
164
164
|
* @returns {number|null} Height in px (rounded integer) or null if none found.
|
|
165
165
|
* @memberof PwaWindowDimensions
|
|
166
166
|
*/
|
|
167
167
|
static getH(options = {}) {
|
|
168
|
-
const { preferVisualViewport =
|
|
168
|
+
const { preferVisualViewport = false } = options;
|
|
169
169
|
|
|
170
170
|
const vv = PwaWindowDimensions.#getFromVisualViewport();
|
|
171
171
|
const de = PwaWindowDimensions.#getFromDocumentElement();
|