@underpostnet/cyberia 3.3.0 → 3.3.76
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/.dockerignore +1 -0
- package/.env.example +17 -5
- package/.github/workflows/coverall.cyberia.ci.yml +39 -14
- package/.github/workflows/cyberia-client.cd.yml +5 -0
- package/.github/workflows/cyberia-server.cd.yml +5 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
- package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
- package/.github/workflows/engine-cyberia.cd.yml +3 -0
- package/.github/workflows/engine-cyberia.ci.yml +4 -5
- package/.github/workflows/ghpkg.ci.yml +35 -20
- package/.github/workflows/hardhat.ci.yml +12 -11
- package/.github/workflows/npmpkg.ci.yml +17 -15
- package/.github/workflows/publish.cyberia.ci.yml +44 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +96 -0
- package/CHANGELOG.md +653 -2513
- package/CLI-HELP.md +323 -157
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +5 -5
- package/README.md +48 -28
- package/bin/build.js +86 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +1494 -1403
- package/bin/deploy.js +18 -104
- package/bin/index.js +1494 -1403
- package/compose.env +17 -5
- package/conf.js +98 -7
- package/deploy/cyberia-client/deploy.sh +46 -0
- package/deploy/cyberia-client/package.sh +17 -0
- package/deploy/cyberia-client/state.sh +15 -0
- package/deploy/cyberia-server/deploy.sh +46 -0
- package/deploy/cyberia-server/package.sh +17 -0
- package/deploy/cyberia-server/state.sh +15 -0
- package/deploy/dd-cyberia/deploy.sh +9 -29
- package/deploy/dd-cyberia/init.sh +38 -45
- package/deploy/dd-cyberia/package.sh +16 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +133 -147
- package/deploy/lib/config.sh +29 -0
- package/deploy/lib/github-actions-logging.sh +610 -0
- package/deploy/lib/host.sh +194 -0
- package/deploy/lib/state.sh +65 -0
- package/deploy/pwa-microservices-template/deploy.sh +17 -42
- package/deploy/release/deploy.sh +9 -41
- package/deployment.yaml +7 -2
- package/docker-compose.yml +23 -17
- package/examples/static-page/README.md +19 -19
- package/examples/static-page/ssr-components/CustomPage.js +2 -2
- package/hardhat/hardhat.config.js +1 -6
- package/hardhat/package-lock.json +101 -40
- package/hardhat/package.json +2 -2
- package/manifests/alertmanager/deployment.yaml +81 -0
- package/manifests/blackbox-exporter/deployment.yaml +75 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/mongo-express/deployment.yaml +46 -27
- package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
- package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
- package/manifests/deployment/mongo-express/service.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
- package/manifests/grafana/deployment.yaml +26 -7
- package/manifests/grafana/kustomization.yaml +1 -0
- package/manifests/grafana/service.yaml +6 -1
- package/manifests/mariadb/pv.yaml +1 -0
- package/manifests/mongodb/statefulset.yaml +9 -2
- package/manifests/mysql/pv-pvc.yaml +14 -1
- package/manifests/postgresql/pv.yaml +12 -1
- package/manifests/postgresql/pvc.yaml +1 -0
- package/manifests/prometheus/deployment.yaml +18 -22
- package/package.json +87 -12
- package/scripts/event-monitor.sh +56 -0
- package/scripts/k3s-node-setup.sh +27 -14
- package/scripts/kubeadm-node-setup.sh +31 -11
- package/scripts/maas-setup.sh +8 -8
- package/scripts/selinux-normalize.sh +907 -0
- package/scripts/shutdown-machine.sh +843 -0
- package/scripts/test-monitor.sh +5 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +15 -10
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +7 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +90 -186
- package/src/api/core/core.controller.js +1 -1
- package/src/api/core/core.router.js +2 -2
- package/src/api/core/core.service.js +2 -2
- package/src/api/crypto/crypto.controller.js +1 -1
- package/src/api/crypto/crypto.service.js +1 -1
- package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
- package/src/api/cyberia-action/cyberia-action.router.js +3 -3
- package/src/api/cyberia-action/cyberia-action.service.js +5 -6
- package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
- package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
- package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
- package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +2 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +13 -35
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +17 -34
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
- package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +3 -3
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +468 -5
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +502 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +29 -40
- package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
- package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +35 -142
- package/src/api/cyberia-instance/cyberia-instance.controller.js +2 -5
- package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
- package/src/api/cyberia-instance/cyberia-instance.router.js +5 -18
- package/src/api/cyberia-instance/cyberia-instance.service.js +5 -45
- package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +76 -3
- package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
- package/src/api/cyberia-map/cyberia-map.router.js +1 -1
- package/src/api/cyberia-map/cyberia-map.service.js +8 -4
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +4 -4
- package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
- package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -214
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
- package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
- package/src/api/default/default.controller.js +1 -1
- package/src/api/default/default.router.js +1 -1
- package/src/api/default/default.service.js +2 -2
- package/src/api/document/document.controller.js +1 -1
- package/src/api/document/document.router.js +1 -1
- package/src/api/document/document.service.js +2 -2
- package/src/api/file/file.controller.js +1 -1
- package/src/api/file/file.ref.js +153 -0
- package/src/api/file/file.ref.json +11 -2
- package/src/api/file/file.router.js +1 -1
- package/src/api/file/file.service.js +2 -2
- package/src/api/instance/instance.controller.js +1 -1
- package/src/api/instance/instance.router.js +1 -1
- package/src/api/instance/instance.service.js +2 -2
- package/src/api/ipfs/ipfs.controller.js +1 -1
- package/src/api/ipfs/ipfs.router.js +2 -2
- package/src/api/ipfs/ipfs.service.js +2 -2
- package/src/api/object-layer/object-layer.controller.js +1 -1
- package/src/api/object-layer/object-layer.model.js +47 -12
- package/src/api/object-layer/object-layer.router.js +12 -5
- package/src/api/object-layer/object-layer.service.js +116 -123
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
- package/src/api/test/test.controller.js +1 -1
- package/src/api/test/test.service.js +1 -1
- package/src/api/user/guest.service.js +3 -3
- package/src/api/user/user.controller.js +1 -1
- package/src/api/user/user.router.js +2 -2
- package/src/api/user/user.service.js +4 -4
- package/src/api.js +5 -9
- package/src/cli/app.js +402 -0
- package/src/cli/baremetal.js +30 -35
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +191 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +157 -75
- package/src/cli/docker-compose.js +5 -5
- package/src/cli/domains.js +184 -0
- package/src/cli/dotenv-store.js +143 -0
- package/src/cli/event.js +2281 -0
- package/src/cli/fs-selection.js +115 -0
- package/src/cli/fs.js +159 -343
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -6
- package/src/cli/index.js +343 -151
- package/src/cli/ipfs.js +34 -30
- package/src/cli/kickstart.js +1 -1
- package/src/cli/kubectl.js +218 -41
- package/src/cli/lxd.js +3 -3
- package/src/cli/monitor.js +1359 -26
- package/src/cli/package.js +90 -0
- package/src/cli/release.js +16 -12
- package/src/cli/repository.js +586 -363
- package/src/cli/run.js +398 -843
- package/src/cli/secrets.js +2158 -964
- package/src/cli/ssh.js +478 -279
- package/src/cli/state.js +394 -0
- package/src/cli/static.js +2 -2
- package/src/cli/system.js +1 -1
- package/src/cli/test.js +203 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1112 -306
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +327 -303
- package/src/client/components/core/FileExplorer.js +0 -21
- package/src/client/components/core/Modal.js +56 -1
- package/src/client/components/core/PanelForm.js +4 -4
- package/src/client/components/core/Repository.js +56 -0
- package/src/client/components/core/Translate.js +7 -0
- package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
- package/src/client/components/core/Wallet.js +0 -11
- package/src/client/components/core/Worker.js +7 -1
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
- package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
- package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
- package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
- package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
- package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
- package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -35
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
- package/src/client/components/default/AppShellDefault.js +1 -1
- package/src/client/components/default/SettingsDefault.js +2 -2
- package/src/client/components/itemledger/SettingsItemledger.js +2 -2
- package/src/client/components/underpost/AppShellUnderpost.js +3 -2
- package/src/client/components/underpost/SettingsUnderpost.js +2 -2
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +313 -30
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
- package/src/client/public/cyberia-docs/CYBERIA.md +48 -28
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/browserconfig.xml +1 -1
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +5 -5
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +1 -1
- package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
- package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
- package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -10
- package/src/client/services/object-layer/object-layer.service.js +3 -1
- package/src/client/ssr/RootDocument.js +1 -1
- package/src/client/ssr/body/404.js +1 -1
- package/src/client/ssr/body/500.js +1 -1
- package/src/client/ssr/body/CacheControl.js +1 -1
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
- package/src/client/ssr/head/CryptokoynScripts.js +1 -1
- package/src/client/ssr/head/Css.js +1 -1
- package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
- package/src/client/ssr/head/DefaultScripts.js +1 -1
- package/src/client/ssr/head/ItemledgerScripts.js +1 -1
- package/src/client/ssr/head/Microdata.js +1 -1
- package/src/client/ssr/head/Production.js +1 -1
- package/src/client/ssr/head/Pwa.js +1 -1
- package/src/client/ssr/head/PwaItemledger.js +1 -1
- package/src/client/ssr/head/Seo.js +1 -1
- package/src/client/ssr/head/UnderpostScripts.js +1 -1
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
- package/src/client/ssr/views/Cyberia404.js +7 -5
- package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/views/Maintenance.js +1 -1
- package/src/client/ssr/views/NoNetworkConnection.js +1 -1
- package/src/client/ssr/views/Test.js +1 -1
- package/src/client/sw/core.sw.js +20 -14
- package/src/client-builder/client-build-docs.js +92 -77
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +105 -74
- package/src/client-builder/client-bundle.js +347 -0
- package/src/client-builder/client-dev-server.js +3 -3
- package/src/client-builder/client-icons.js +2 -2
- package/src/client-builder/ssr.js +3 -3
- package/src/client.build.js +3 -6
- package/src/client.dev.js +3 -6
- package/src/db/DataBaseProvider.js +186 -3
- package/src/db/mariadb/MariaDB.js +3 -2
- package/src/db/mongo/MongoBootstrap.js +273 -101
- package/src/db/mongo/MongoExpress.js +187 -0
- package/src/db/mongo/MongooseDB.js +7 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +6 -8
- package/src/index.js +79 -23
- package/src/mailer/EmailRender.js +2 -2
- package/src/mailer/MailerInterceptor.js +87 -0
- package/src/mailer/MailerProvider.js +50 -6
- package/src/projects/cyberia/atlas-sprite-sheet-generator.js +144 -147
- package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
- package/src/projects/cyberia/besu-genesis-generator.js +8 -17
- package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
- package/src/projects/cyberia/catalog-cyberia.js +54 -10
- package/src/projects/cyberia/gemini-client.js +4 -4
- package/src/projects/cyberia/generate-saga.js +5 -12
- package/src/projects/cyberia/hot-reload-trigger.js +18 -29
- package/src/projects/cyberia/instance-backup.js +210 -0
- package/src/projects/cyberia/instance-data.js +178 -258
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +33 -69
- package/src/projects/cyberia/object-layer.js +153 -320
- package/src/projects/cyberia/seed-audio.js +139 -0
- package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
- package/src/projects/cyberia/semantic-layer-generator.js +3 -19
- package/src/projects/cyberia/stat-balance.js +81 -0
- package/src/projects/cyberia/stat-commands.js +23 -0
- package/src/projects/cyberia/stat-contract-generator.js +101 -0
- package/src/projects/underpost/catalog-underpost.js +9 -1
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +17 -8
- package/src/runtime/cyberia-client/Dockerfile.dev +13 -4
- package/src/runtime/cyberia-server/Dockerfile +18 -6
- package/src/runtime/cyberia-server/Dockerfile.dev +16 -3
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +5 -5
- package/src/runtime/engine-cyberia/compose.env +17 -5
- package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
- package/src/runtime/express/Express.js +32 -27
- package/src/runtime/lampp/Lampp.js +22 -70
- package/src/runtime/nginx/Nginx.js +1 -1
- package/src/runtime/wp/Wp.js +16 -48
- package/src/server/{catalog.js → build/catalog.js} +15 -5
- package/src/server/build/coverage.js +188 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +508 -0
- package/src/server/build/testing.js +578 -0
- package/src/server/{dns.js → network/dns.js} +144 -11
- package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
- package/src/server/{middlewares.js → network/middlewares.js} +11 -5
- package/src/server/network/node-capability.js +98 -0
- package/src/server/{peer.js → network/peer.js} +3 -3
- package/src/server/{proxy.js → network/proxy.js} +7 -13
- package/src/server/network/router.js +356 -0
- package/src/server/{tls.js → network/tls.js} +2 -2
- package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
- package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
- package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
- package/src/server/{cri.js → ops/cri.js} +2 -2
- package/src/server/{cron.js → ops/cron.js} +349 -74
- package/src/server/ops/event-notification.js +284 -0
- package/src/server/{logger.js → ops/logger.js} +143 -23
- package/src/server/ops/monitoring.js +1724 -0
- package/src/server/{systemd.js → ops/systemd.js} +55 -1
- package/src/server/{conf.js → runtime/conf.js} +516 -423
- package/src/server/runtime/config-scope.js +215 -0
- package/src/server/runtime/environment.js +149 -0
- package/src/server/{process.js → runtime/process.js} +153 -12
- package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
- package/src/server/{runtime.js → runtime/runtime.js} +12 -8
- package/src/server/{start.js → runtime/start.js} +128 -39
- package/src/server/{auth.js → security/auth.js} +7 -8
- package/src/server/security/container-storage.js +382 -0
- package/src/server/{crypto.js → security/crypto.js} +1 -1
- package/src/server/{selinux.js → security/selinux.js} +1 -1
- package/src/server/{backup.js → storage/backup.js} +17 -8
- package/src/server/{data-query.js → storage/data-query.js} +17 -1
- package/src/server/storage/downloader.js +121 -0
- package/src/server/storage/repository.js +68 -0
- package/src/server/storage/zip.js +153 -0
- package/src/server.js +4 -7
- package/src/ws/IoInterface.js +1 -1
- package/src/ws/IoServer.js +1 -1
- package/src/ws/core/core.ws.connection.js +1 -1
- package/src/ws/core/core.ws.emit.js +1 -1
- package/src/ws/core/core.ws.server.js +1 -1
- package/src/ws/default/default.ws.connection.js +1 -1
- package/src/ws/default/default.ws.emit.js +1 -1
- package/src/ws/default/default.ws.server.js +1 -1
- package/test/e2e/event-e2e-public-ingress-down.js +45 -0
- package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
- package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
- package/test/{api.test.js → integration/app/api.test.js} +33 -14
- package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
- package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
- package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +64 -0
- package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
- package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +17 -23
- package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
- package/test/integration/app/cyberia/cyberia-load.test.js +466 -0
- package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
- package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +338 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
- package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
- package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
- package/test/integration/app/cyberia/seed-audio.test.js +275 -0
- package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
- package/test/integration/infra/1-security/config-scope.test.js +305 -0
- package/test/integration/infra/1-security/container-storage.test.js +356 -0
- package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
- package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
- package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
- package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
- package/test/integration/infra/1-security/systemd-service.test.js +70 -0
- package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
- package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
- package/test/integration/infra/2-network/node-capability.test.js +182 -0
- package/test/integration/infra/2-network/wireguard-cli.test.js +1187 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +649 -55
- package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
- package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
- package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
- package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
- package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
- package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
- package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
- package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
- package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
- package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
- package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
- package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
- package/test/integration/infra/5-observability/event-notification.test.js +197 -0
- package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
- package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
- package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
- package/test/support/shell-harness.js +73 -0
- package/test/unit/build-template.test.js +97 -0
- package/test/unit/build-workflow-offline.test.js +132 -0
- package/test/unit/catalog.test.js +71 -0
- package/test/unit/client-build-docs.test.js +361 -0
- package/test/unit/client-bundle.test.js +313 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +996 -0
- package/test/unit/coverage-artifact.test.js +221 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/cyberia/instance-backup.test.js +183 -0
- package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
- package/test/unit/cyberia/publish-workflow.test.js +22 -0
- package/test/unit/cyberia/stat-balance.test.js +69 -0
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +518 -0
- package/test/unit/downloader-integrity.test.js +98 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/file-reference-registry.test.js +141 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/fs-storage-paths.test.js +596 -0
- package/test/unit/logger-redaction.test.js +141 -0
- package/test/unit/package.test.js +457 -0
- package/test/unit/prepare-host.test.js +382 -0
- package/test/unit/process-environment.test.js +18 -0
- package/test/unit/propagation-message.test.js +78 -0
- package/test/unit/redeploy-plan.test.js +24 -0
- package/test/unit/release-bump.test.js +474 -0
- package/test/unit/ssh-output-redaction.test.js +28 -0
- package/test/unit/start-options.test.js +46 -0
- package/test/unit/test-tiers.test.js +220 -0
- package/test/unit/zip-archive.test.js +142 -0
- package/vitest.config.js +66 -0
- package/.nycrc +0 -9
- package/deploy/lib/logging.sh +0 -96
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
- package/manifests/mongodb/pv-pvc.yaml +0 -59
- package/scripts/coverall-test-cyberia.sh +0 -24
- package/scripts/coverall-test.sh +0 -24
- package/scripts/link-local-underpost-cli.sh +0 -6
- package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
- package/src/api/user/user.build.js +0 -16
- package/src/cli/env.js +0 -177
- package/src/client/components/core/Blockchain.js +0 -41
- package/src/client/components/core/Blog.js +0 -9
- package/src/client/components/core/KeyboardAvoidance.js +0 -145
- package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +0 -148
- package/src/server/downloader.js +0 -73
- package/src/server/environment.js +0 -98
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZIP archive helpers built on JSZip, shared by the file-storage CLI and the client builder.
|
|
3
|
+
* @module src/server/storage/zip.js
|
|
4
|
+
* @namespace Zip
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import JSZip from 'jszip';
|
|
8
|
+
import * as dir from 'path';
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
|
|
11
|
+
const ZIP_LOCAL_FILE_HEADER = Buffer.from([0x50, 0x4b, 0x03, 0x04]);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Reports whether a buffer starts with the ZIP local file header signature.
|
|
15
|
+
* @function isZipBuffer
|
|
16
|
+
* @param {Buffer} buffer - Candidate archive bytes.
|
|
17
|
+
* @returns {boolean} True when the buffer looks like a ZIP archive.
|
|
18
|
+
* @memberof Zip
|
|
19
|
+
*/
|
|
20
|
+
const isZipBuffer = (buffer) => Buffer.isBuffer(buffer) && buffer.subarray(0, 4).equals(ZIP_LOCAL_FILE_HEADER);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Loads a ZIP archive from a buffer or a local path.
|
|
24
|
+
* @function loadZip
|
|
25
|
+
* @param {Buffer|string} source - Archive bytes or a path to the archive.
|
|
26
|
+
* @returns {Promise<JSZip>} The loaded archive.
|
|
27
|
+
* @memberof Zip
|
|
28
|
+
*/
|
|
29
|
+
const loadZip = async (source) => JSZip.loadAsync(Buffer.isBuffer(source) ? source : fs.readFileSync(source));
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolves an archive entry by exact name, then by trailing path segment, then by
|
|
33
|
+
* falling back to the only entry of a single-file archive.
|
|
34
|
+
* @function findZipEntry
|
|
35
|
+
* @param {JSZip} zip - The loaded archive.
|
|
36
|
+
* @param {string} entryName - Entry name or basename to look up.
|
|
37
|
+
* @returns {object|null} The matching JSZip entry, or null when nothing matches.
|
|
38
|
+
* @memberof Zip
|
|
39
|
+
*/
|
|
40
|
+
const findZipEntry = (zip, entryName) => {
|
|
41
|
+
const files = Object.values(zip.files).filter((entry) => !entry.dir);
|
|
42
|
+
return (
|
|
43
|
+
files.find((entry) => entry.name === entryName) ??
|
|
44
|
+
files.find((entry) => entry.name.endsWith(`/${entryName}`)) ??
|
|
45
|
+
(files.length === 1 ? files[0] : null)
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Reads a single entry out of an archive.
|
|
51
|
+
* @function readZipEntry
|
|
52
|
+
* @param {Buffer|string} source - Archive bytes or a path to the archive.
|
|
53
|
+
* @param {string} entryName - Entry name or basename to read.
|
|
54
|
+
* @returns {Promise<Buffer|null>} The entry contents, or null when the entry is absent.
|
|
55
|
+
* @memberof Zip
|
|
56
|
+
*/
|
|
57
|
+
const readZipEntry = async (source, entryName) => {
|
|
58
|
+
const entry = findZipEntry(await loadZip(source), entryName);
|
|
59
|
+
return entry ? await entry.async('nodebuffer') : null;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Builds an archive buffer from local files.
|
|
64
|
+
* @function zipFromLocalFiles
|
|
65
|
+
* @param {Array<{localPath: string, entryName: string}>} entries - Files to archive.
|
|
66
|
+
* @returns {Promise<Buffer>} The generated archive bytes.
|
|
67
|
+
* @memberof Zip
|
|
68
|
+
*/
|
|
69
|
+
const zipFromLocalFiles = async (entries) => {
|
|
70
|
+
const zip = new JSZip();
|
|
71
|
+
for (const { localPath, entryName } of entries) {
|
|
72
|
+
const stats = fs.statSync(localPath);
|
|
73
|
+
zip.file(entryName, fs.readFileSync(localPath), {
|
|
74
|
+
date: stats.mtime,
|
|
75
|
+
unixPermissions: stats.mode & 0o777,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return await zip.generateAsync({
|
|
79
|
+
type: 'nodebuffer',
|
|
80
|
+
platform: 'UNIX',
|
|
81
|
+
compression: 'DEFLATE',
|
|
82
|
+
compressionOptions: { level: 6 },
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Resolves an entry name against an output directory, rejecting archive paths that
|
|
88
|
+
* escape it (zip slip).
|
|
89
|
+
* @function resolveEntryTarget
|
|
90
|
+
* @param {string} outputPath - Extraction root.
|
|
91
|
+
* @param {string} entryName - Entry name from the archive.
|
|
92
|
+
* @returns {string} The absolute target path.
|
|
93
|
+
* @throws {Error} When the entry resolves outside the extraction root.
|
|
94
|
+
* @memberof Zip
|
|
95
|
+
*/
|
|
96
|
+
const resolveEntryTarget = (outputPath, entryName) => {
|
|
97
|
+
const root = dir.resolve(outputPath);
|
|
98
|
+
const target = dir.resolve(root, entryName);
|
|
99
|
+
if (target !== root && !target.startsWith(root + dir.sep)) {
|
|
100
|
+
throw new Error(`Blocked zip entry outside extraction directory: ${entryName}`);
|
|
101
|
+
}
|
|
102
|
+
return target;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extracts every entry of an archive into a directory.
|
|
107
|
+
* @function extractZipTo
|
|
108
|
+
* @param {Buffer|string} source - Archive bytes or a path to the archive.
|
|
109
|
+
* @param {string} outputPath - Extraction root; created when missing.
|
|
110
|
+
* @returns {Promise<string[]>} The written file paths.
|
|
111
|
+
* @memberof Zip
|
|
112
|
+
*/
|
|
113
|
+
const extractZipTo = async (source, outputPath) => {
|
|
114
|
+
const zip = await loadZip(source);
|
|
115
|
+
fs.mkdirSync(outputPath, { recursive: true });
|
|
116
|
+
|
|
117
|
+
const writtenPaths = [];
|
|
118
|
+
for (const entry of Object.values(zip.files)) {
|
|
119
|
+
const target = resolveEntryTarget(outputPath, entry.name);
|
|
120
|
+
if (entry.dir) {
|
|
121
|
+
fs.mkdirSync(target, { recursive: true });
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
fs.mkdirSync(dir.dirname(target), { recursive: true });
|
|
125
|
+
fs.writeFileSync(target, await entry.async('nodebuffer'));
|
|
126
|
+
if (entry.unixPermissions) fs.chmodSync(target, entry.unixPermissions & 0o777);
|
|
127
|
+
writtenPaths.push(target);
|
|
128
|
+
}
|
|
129
|
+
return writtenPaths;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Extracts a single archive entry into a directory, flattening its archive path.
|
|
134
|
+
* @function extractZipEntryTo
|
|
135
|
+
* @param {Buffer|string} source - Archive bytes or a path to the archive.
|
|
136
|
+
* @param {string} entryName - Entry name or basename to extract.
|
|
137
|
+
* @param {string} targetDir - Destination directory; created when missing.
|
|
138
|
+
* @returns {Promise<string>} The written file path.
|
|
139
|
+
* @throws {Error} When the entry is not present in the archive.
|
|
140
|
+
* @memberof Zip
|
|
141
|
+
*/
|
|
142
|
+
const extractZipEntryTo = async (source, entryName, targetDir) => {
|
|
143
|
+
const entry = findZipEntry(await loadZip(source), entryName);
|
|
144
|
+
if (!entry) throw new Error(`Zip entry not found: ${entryName}`);
|
|
145
|
+
|
|
146
|
+
const target = resolveEntryTarget(targetDir, dir.basename(entryName));
|
|
147
|
+
fs.mkdirSync(dir.dirname(target), { recursive: true });
|
|
148
|
+
fs.writeFileSync(target, await entry.async('nodebuffer'));
|
|
149
|
+
if (entry.unixPermissions) fs.chmodSync(target, entry.unixPermissions & 0o777);
|
|
150
|
+
return target;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export { isZipBuffer, loadZip, findZipEntry, readZipEntry, zipFromLocalFiles, extractZipTo, extractZipEntryTo };
|
package/src/server.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// https://nodejs.org/api
|
|
4
|
-
// https://expressjs.com/en/4x/api.html
|
|
5
|
-
|
|
6
3
|
import dotenv from 'dotenv';
|
|
7
|
-
import { loggerFactory } from './server/logger.js';
|
|
4
|
+
import { loggerFactory } from './server/ops/logger.js';
|
|
8
5
|
import { buildClient } from './client-builder/client-build.js';
|
|
9
|
-
import { buildRuntime } from './server/runtime.js';
|
|
10
|
-
import { ProcessController } from './server/process.js';
|
|
11
|
-
import { Config } from './server/conf.js';
|
|
6
|
+
import { buildRuntime } from './server/runtime/runtime.js';
|
|
7
|
+
import { ProcessController } from './server/runtime/process.js';
|
|
8
|
+
import { Config } from './server/runtime/conf.js';
|
|
12
9
|
|
|
13
10
|
dotenv.config();
|
|
14
11
|
|
package/src/ws/IoInterface.js
CHANGED
package/src/ws/IoServer.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module ws/core/core.ws.connection
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { loggerFactory } from '../../server/logger.js';
|
|
6
|
+
import { loggerFactory } from '../../server/ops/logger.js';
|
|
7
7
|
import { CoreWsChatChannel } from './channels/core.ws.chat.js';
|
|
8
8
|
import { CoreWsMailerChannel } from './channels/core.ws.mailer.js';
|
|
9
9
|
import { CoreWsStreamChannel } from './channels/core.ws.stream.js';
|
|
@@ -10,7 +10,7 @@ import { CoreWsConnectionHandler } from './core.ws.connection.js';
|
|
|
10
10
|
import { CoreWsChatChannel } from './channels/core.ws.chat.js';
|
|
11
11
|
import { CoreWsMailerChannel } from './channels/core.ws.mailer.js';
|
|
12
12
|
import { CoreWsStreamChannel } from './channels/core.ws.stream.js';
|
|
13
|
-
import { resolveHostKeyContext } from '../../server/conf.js';
|
|
13
|
+
import { resolveHostKeyContext } from '../../server/runtime/conf.js';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @class CoreWsServer
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module ws/default/default.ws.connection
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { loggerFactory } from '../../server/logger.js';
|
|
6
|
+
import { loggerFactory } from '../../server/ops/logger.js';
|
|
7
7
|
import { DefaultWsMainChannel } from './channels/default.ws.main.js';
|
|
8
8
|
|
|
9
9
|
const logger = loggerFactory(import.meta);
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { IoServer } from '../IoServer.js';
|
|
9
9
|
import { DefaultWsConnectionHandler } from './default.ws.connection.js';
|
|
10
10
|
import { DefaultWsMainChannel } from './channels/default.ws.main.js';
|
|
11
|
-
import { resolveHostKeyContext } from '../../server/conf.js';
|
|
11
|
+
import { resolveHostKeyContext } from '../../server/runtime/conf.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* @class DefaultWsServer
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Underpost from '../../src/index.js';
|
|
2
|
+
|
|
3
|
+
/** The ports HAProxy publishes on the hub; blocking these takes every host down. */
|
|
4
|
+
const EDGE_PORTS = '80,443';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* End-to-end rehearsal for `public-ingress-down`.
|
|
8
|
+
*
|
|
9
|
+
* The outage is induced where the public edge actually terminates — the hub —
|
|
10
|
+
* by blocking inbound traffic on the published ports. That is the one fault
|
|
11
|
+
* that takes every host down at once, which is the condition this event
|
|
12
|
+
* remediates; stopping a workload would produce the partial state the handler
|
|
13
|
+
* deliberately refuses to act on.
|
|
14
|
+
*
|
|
15
|
+
* The block is scoped to those ports rather than to every port, because
|
|
16
|
+
* remediation reaches the hub over SSH: a total ingress block would drop the
|
|
17
|
+
* connection that repairs it and leave the edge unrecoverable from anywhere but
|
|
18
|
+
* the provider console. `--unblock-all-ingress`, which the handler runs, clears
|
|
19
|
+
* this block along with any other.
|
|
20
|
+
*
|
|
21
|
+
* @module test/event-e2e-public-ingress-down.js
|
|
22
|
+
*/
|
|
23
|
+
export default {
|
|
24
|
+
description: 'Blocks public ingress on each hub, then verifies the edge is restored and every host answers again.',
|
|
25
|
+
|
|
26
|
+
async subjects({ options }) {
|
|
27
|
+
return Underpost.event.subjectSelection('hub', options).map((hubHost) => {
|
|
28
|
+
const target = Underpost.event.hubTarget(hubHost);
|
|
29
|
+
return {
|
|
30
|
+
label: `ingress via ${target.nodeName || hubHost}`,
|
|
31
|
+
probes: Underpost.event.publicIngressUrls().map((entry) => ({ module: 'http_2xx', target: entry.url })),
|
|
32
|
+
dispatchOptions: { nodes: target.nodeName || hubHost },
|
|
33
|
+
remote: { user: target.user, host: target.host },
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
async break(context, subject) {
|
|
39
|
+
return await Underpost.event.runCommand(`node bin ip --block-ingress-port ${EDGE_PORTS}`, subject.remote);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
async restore(context, subject) {
|
|
43
|
+
return await Underpost.event.runCommand(`node bin ip --unblock-ingress-port ${EDGE_PORTS}`, subject.remote);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Underpost from '../../src/index.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* End-to-end rehearsal for `wireguard-server-down`.
|
|
5
|
+
*
|
|
6
|
+
* Every registered hub is rehearsed, or those `--nodes` selects. A hub is
|
|
7
|
+
* taken down the only way an operator can reach it while its tunnel is dead —
|
|
8
|
+
* through the external SSH endpoint registered for it — which is also the path
|
|
9
|
+
* the remediation must use. Stopping the interface any other way would not
|
|
10
|
+
* exercise that dependency.
|
|
11
|
+
*
|
|
12
|
+
* @module test/event-e2e-wireguard-server-down.js
|
|
13
|
+
*/
|
|
14
|
+
export default {
|
|
15
|
+
description: 'Stops WireGuard on each hub over its registered management SSH, then verifies the repair.',
|
|
16
|
+
|
|
17
|
+
async subjects({ options }) {
|
|
18
|
+
return Underpost.event.subjectSelection('hub', options).map((hubHost) => {
|
|
19
|
+
const target = Underpost.event.hubTarget(hubHost);
|
|
20
|
+
if (!target.address)
|
|
21
|
+
throw new Error(`[event] the tunnel address of hub ${hubHost} is underivable; nothing can be probed`);
|
|
22
|
+
return {
|
|
23
|
+
label: `hub ${target.nodeName || hubHost}`,
|
|
24
|
+
probes: [{ module: 'icmp', target: target.address }],
|
|
25
|
+
dispatchOptions: { nodes: target.nodeName || hubHost },
|
|
26
|
+
remote: { user: target.user, host: target.host },
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
async break(context, subject) {
|
|
32
|
+
return await Underpost.event.runCommand('node bin wireguard --wireguard-stop', subject.remote);
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async restore(context, subject) {
|
|
36
|
+
return await Underpost.event.runCommand('node bin wireguard --wireguard-start', subject.remote);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import Underpost from '../../src/index.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* End-to-end rehearsal for `wireguard-spoke-down`.
|
|
5
|
+
*
|
|
6
|
+
* Every peer of this node's hub is rehearsed, or those `--nodes` /
|
|
7
|
+
* `--spoke` selects, one at a time. Each is taken down through the same
|
|
8
|
+
* identity chain the remediation resolves — locally for the selected control
|
|
9
|
+
* node, over LAN SSH for a worker — so a spoke that can be broken but not
|
|
10
|
+
* repaired fails the rehearsal rather than an outage.
|
|
11
|
+
*
|
|
12
|
+
* @module test/event-e2e-wireguard-spoke-down.js
|
|
13
|
+
*/
|
|
14
|
+
export default {
|
|
15
|
+
description: 'Stops WireGuard on each registered spoke, then verifies the repair of that spoke alone.',
|
|
16
|
+
|
|
17
|
+
async subjects({ options }) {
|
|
18
|
+
const hubAddress = Underpost.event.hubAddress();
|
|
19
|
+
return Underpost.event.subjectSelection('spoke', options).map((spokeId) => {
|
|
20
|
+
const spoke = Underpost.event.spokes().find((entry) => entry.id === spokeId);
|
|
21
|
+
const target = Underpost.event.spokeTarget(spokeId);
|
|
22
|
+
return {
|
|
23
|
+
label: `spoke ${spokeId}`,
|
|
24
|
+
// The local spoke is proved through the hub tunnel: its own 10.0.0.x stays
|
|
25
|
+
// reachable on the machine itself even when the tunnel carries nothing.
|
|
26
|
+
probes: [{ module: 'icmp', target: spoke.local ? hubAddress : spoke.address }],
|
|
27
|
+
dispatchOptions: { spoke: spokeId },
|
|
28
|
+
remote: { user: target.user, host: target.host },
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
async break(context, subject) {
|
|
34
|
+
return await Underpost.event.runCommand('node bin wireguard --wireguard-stop', subject.remote);
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async restore(context, subject) {
|
|
38
|
+
return await Underpost.event.runCommand('node bin wireguard --wireguard-start', subject.remote);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
@@ -1,29 +1,48 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
import axios from 'axios';
|
|
4
|
-
import
|
|
4
|
+
import express from 'express';
|
|
5
5
|
|
|
6
6
|
import { expect } from 'chai';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
dotenv.config();
|
|
10
|
-
|
|
11
|
-
const PORT = parseInt(process.env.PORT) + 1;
|
|
7
|
+
import { TestRouter } from '../../../src/api/test/test.router.js';
|
|
8
|
+
import { loggerFactory } from '../../../src/server/ops/logger.js';
|
|
12
9
|
|
|
13
10
|
const logger = loggerFactory(import.meta);
|
|
14
11
|
|
|
15
12
|
await logger.setUpInfo();
|
|
16
13
|
|
|
17
|
-
const BASE_URL =
|
|
18
|
-
process.env.NODE_ENV === 'development'
|
|
19
|
-
? `http://localhost:${PORT}/${process.env.BASE_API}`
|
|
20
|
-
: `https://www.nexodev.org/api`;
|
|
21
|
-
|
|
22
14
|
describe(`GET 'Test' API Request `, async () => {
|
|
15
|
+
const app = express();
|
|
16
|
+
app.use('/api/test', TestRouter.router({ authMiddleware: (_req, _res, next) => next() }));
|
|
17
|
+
|
|
18
|
+
let server;
|
|
19
|
+
let baseUrl;
|
|
20
|
+
|
|
21
|
+
beforeAll(
|
|
22
|
+
() =>
|
|
23
|
+
new Promise((resolve, reject) => {
|
|
24
|
+
server = app.listen(0, '127.0.0.1', () => {
|
|
25
|
+
baseUrl = `http://127.0.0.1:${server.address().port}/api`;
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
server.on('error', reject);
|
|
29
|
+
}),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
afterAll(
|
|
33
|
+
() =>
|
|
34
|
+
new Promise((resolve, reject) =>
|
|
35
|
+
server.close((error) => {
|
|
36
|
+
if (error) reject(error);
|
|
37
|
+
else resolve();
|
|
38
|
+
}),
|
|
39
|
+
),
|
|
40
|
+
);
|
|
41
|
+
|
|
23
42
|
{
|
|
24
43
|
const youtubeId = '2aib-pmgUdQ';
|
|
25
|
-
const url = `${BASE_URL}/test/youtube-id/?url=https://www.youtube.com/watch?v=${youtubeId}`;
|
|
26
44
|
it(`youtube id from raw youtube url`, async () => {
|
|
45
|
+
const url = `${baseUrl}/test/youtube-id/?url=https://www.youtube.com/watch?v=${youtubeId}`;
|
|
27
46
|
logger.info('request info', { url });
|
|
28
47
|
const res = await axios.get(url);
|
|
29
48
|
logger.info('response', res.data);
|
|
@@ -32,8 +51,8 @@ describe(`GET 'Test' API Request `, async () => {
|
|
|
32
51
|
}
|
|
33
52
|
{
|
|
34
53
|
const email = 'test@gmail.com';
|
|
35
|
-
const url = `${BASE_URL}/test/verify-email/?email=${email}`;
|
|
36
54
|
it(`valid format email`, async () => {
|
|
55
|
+
const url = `${baseUrl}/test/verify-email/?email=${email}`;
|
|
37
56
|
logger.info('request info', { url });
|
|
38
57
|
const res = await axios.get(url);
|
|
39
58
|
logger.info('response', res.data);
|
|
@@ -42,8 +61,8 @@ describe(`GET 'Test' API Request `, async () => {
|
|
|
42
61
|
}
|
|
43
62
|
{
|
|
44
63
|
const password = 'Password123!';
|
|
45
|
-
const url = `${BASE_URL}/test/is-strong-password/?password=${password}`;
|
|
46
64
|
it(`valid password`, async () => {
|
|
65
|
+
const url = `${baseUrl}/test/is-strong-password/?password=${password}`;
|
|
47
66
|
logger.info('request info', { url });
|
|
48
67
|
const res = await axios.get(url);
|
|
49
68
|
logger.info('response', res.data);
|