cyberia 2.8.885
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 +15 -0
- package/.env.development +45 -0
- package/.env.production +50 -0
- package/.env.test +45 -0
- package/.github/workflows/engine-cyberia.cd.yml +31 -0
- package/.github/workflows/engine-cyberia.ci.yml +60 -0
- package/.github/workflows/ghpkg.ci.yml +87 -0
- package/.github/workflows/npmpkg.ci.yml +72 -0
- package/.github/workflows/publish.ci.yml +84 -0
- package/.github/workflows/publish.cyberia.ci.yml +84 -0
- package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
- package/.github/workflows/release.cd.yml +37 -0
- package/.nycrc +9 -0
- package/.prettierignore +13 -0
- package/.prettierrc +9 -0
- package/.vscode/extensions.json +51 -0
- package/.vscode/settings.json +87 -0
- package/AUTHORS.md +21 -0
- package/CHANGELOG.md +205 -0
- package/Dockerfile +28 -0
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/bin/build.js +209 -0
- package/bin/cron.js +47 -0
- package/bin/cyberia.js +145 -0
- package/bin/db.js +199 -0
- package/bin/deploy.js +1293 -0
- package/bin/file.js +197 -0
- package/bin/hwt.js +49 -0
- package/bin/index.js +145 -0
- package/bin/ssl.js +63 -0
- package/bin/util.js +80 -0
- package/bin/vs.js +74 -0
- package/cli.md +714 -0
- package/conf.js +204 -0
- package/deployment.yaml +138 -0
- package/jsconfig.json +7 -0
- package/jsdoc.json +32 -0
- package/manifests/deployment/adminer/deployment.yaml +32 -0
- package/manifests/deployment/adminer/kustomization.yaml +7 -0
- package/manifests/deployment/adminer/service.yaml +13 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
- package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
- package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
- package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
- package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
- package/manifests/deployment/fastapi/backend-service.yml +19 -0
- package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
- package/manifests/deployment/fastapi/frontend-service.yml +15 -0
- package/manifests/deployment/fastapi/initial_data.sh +56 -0
- package/manifests/deployment/kafka/deployment.yaml +69 -0
- package/manifests/deployment/mongo-express/deployment.yaml +60 -0
- package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
- package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
- package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
- package/manifests/envoy-service-nodeport.yaml +23 -0
- package/manifests/grafana/deployment.yaml +57 -0
- package/manifests/grafana/kustomization.yaml +7 -0
- package/manifests/grafana/pvc.yaml +12 -0
- package/manifests/grafana/service.yaml +14 -0
- package/manifests/kind-config-dev.yaml +12 -0
- package/manifests/kind-config.yaml +12 -0
- package/manifests/kubeadm-calico-config.yaml +119 -0
- package/manifests/kubelet-config.yaml +65 -0
- package/manifests/letsencrypt-prod.yaml +15 -0
- package/manifests/lxd/lxd-admin-profile.yaml +17 -0
- package/manifests/lxd/lxd-preseed.yaml +30 -0
- package/manifests/lxd/underpost-setup.sh +163 -0
- package/manifests/mariadb/config.yaml +10 -0
- package/manifests/mariadb/kustomization.yaml +9 -0
- package/manifests/mariadb/pv.yaml +12 -0
- package/manifests/mariadb/pvc.yaml +10 -0
- package/manifests/mariadb/secret.yaml +8 -0
- package/manifests/mariadb/service.yaml +10 -0
- package/manifests/mariadb/statefulset.yaml +56 -0
- package/manifests/mariadb/storage-class.yaml +10 -0
- package/manifests/mongodb/backup-access.yaml +16 -0
- package/manifests/mongodb/backup-cronjob.yaml +42 -0
- package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
- package/manifests/mongodb/configmap.yaml +26 -0
- package/manifests/mongodb/headless-service.yaml +10 -0
- package/manifests/mongodb/kustomization.yaml +11 -0
- package/manifests/mongodb/pv-pvc.yaml +23 -0
- package/manifests/mongodb/statefulset.yaml +126 -0
- package/manifests/mongodb/storage-class.yaml +9 -0
- package/manifests/mongodb-4.4/kustomization.yaml +7 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
- package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
- package/manifests/mysql/kustomization.yaml +7 -0
- package/manifests/mysql/pv-pvc.yaml +27 -0
- package/manifests/mysql/statefulset.yaml +55 -0
- package/manifests/postgresql/configmap.yaml +9 -0
- package/manifests/postgresql/kustomization.yaml +10 -0
- package/manifests/postgresql/pv.yaml +15 -0
- package/manifests/postgresql/pvc.yaml +13 -0
- package/manifests/postgresql/service.yaml +10 -0
- package/manifests/postgresql/statefulset.yaml +37 -0
- package/manifests/prometheus/deployment.yaml +82 -0
- package/manifests/valkey/kustomization.yaml +7 -0
- package/manifests/valkey/service.yaml +11 -0
- package/manifests/valkey/statefulset.yaml +38 -0
- package/nodemon.json +6 -0
- package/package.json +118 -0
- package/proxy.yaml +35 -0
- package/scripts/device-scan.sh +43 -0
- package/scripts/gpu-diag.sh +19 -0
- package/scripts/maas-setup.sh +120 -0
- package/scripts/nat-iptables.sh +26 -0
- package/scripts/nvim.sh +91 -0
- package/scripts/snap-clean.sh +26 -0
- package/scripts/ssh-cluster-info.sh +14 -0
- package/scripts/ssl.sh +164 -0
- package/src/api/blockchain/blockchain.controller.js +51 -0
- package/src/api/blockchain/blockchain.model.js +90 -0
- package/src/api/blockchain/blockchain.router.js +21 -0
- package/src/api/blockchain/blockchain.service.js +24 -0
- package/src/api/core/core.controller.js +69 -0
- package/src/api/core/core.model.js +11 -0
- package/src/api/core/core.router.js +24 -0
- package/src/api/core/core.service.js +35 -0
- package/src/api/crypto/crypto.controller.js +51 -0
- package/src/api/crypto/crypto.model.js +23 -0
- package/src/api/crypto/crypto.router.js +20 -0
- package/src/api/crypto/crypto.service.js +64 -0
- package/src/api/default/default.controller.js +74 -0
- package/src/api/default/default.model.js +20 -0
- package/src/api/default/default.router.js +27 -0
- package/src/api/default/default.service.js +40 -0
- package/src/api/document/document.controller.js +66 -0
- package/src/api/document/document.model.js +51 -0
- package/src/api/document/document.router.js +24 -0
- package/src/api/document/document.service.js +133 -0
- package/src/api/file/file.controller.js +67 -0
- package/src/api/file/file.model.js +19 -0
- package/src/api/file/file.router.js +22 -0
- package/src/api/file/file.service.js +100 -0
- package/src/api/instance/instance.controller.js +69 -0
- package/src/api/instance/instance.model.js +40 -0
- package/src/api/instance/instance.router.js +34 -0
- package/src/api/instance/instance.service.js +70 -0
- package/src/api/ipfs/ipfs.controller.js +51 -0
- package/src/api/ipfs/ipfs.model.js +17 -0
- package/src/api/ipfs/ipfs.router.js +20 -0
- package/src/api/ipfs/ipfs.service.js +25 -0
- package/src/api/object-layer/README.md +85 -0
- package/src/api/object-layer/object-layer.controller.js +69 -0
- package/src/api/object-layer/object-layer.model.js +181 -0
- package/src/api/object-layer/object-layer.router.js +29 -0
- package/src/api/object-layer/object-layer.service.js +49 -0
- package/src/api/test/test.controller.js +59 -0
- package/src/api/test/test.model.js +14 -0
- package/src/api/test/test.router.js +21 -0
- package/src/api/test/test.service.js +35 -0
- package/src/api/user/postman_collection.json +216 -0
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +35 -0
- package/src/api/user/user.model.js +100 -0
- package/src/api/user/user.router.js +400 -0
- package/src/api/user/user.service.js +500 -0
- package/src/api.js +23 -0
- package/src/cli/baremetal.js +1310 -0
- package/src/cli/cloud-init.js +548 -0
- package/src/cli/cluster.js +834 -0
- package/src/cli/cron.js +95 -0
- package/src/cli/db.js +414 -0
- package/src/cli/deploy.js +661 -0
- package/src/cli/env.js +101 -0
- package/src/cli/fs.js +256 -0
- package/src/cli/image.js +156 -0
- package/src/cli/index.js +436 -0
- package/src/cli/lxd.js +402 -0
- package/src/cli/monitor.js +260 -0
- package/src/cli/repository.js +274 -0
- package/src/cli/run.js +728 -0
- package/src/cli/script.js +85 -0
- package/src/cli/secrets.js +71 -0
- package/src/cli/ssh.js +46 -0
- package/src/cli/test.js +159 -0
- package/src/client/Cyberia.index.js +50 -0
- package/src/client/CyberiaAdmin.index.js +34 -0
- package/src/client/CyberiaPortal.index.js +36 -0
- package/src/client/Default.index.js +84 -0
- package/src/client/components/core/404.js +20 -0
- package/src/client/components/core/500.js +20 -0
- package/src/client/components/core/Account.js +326 -0
- package/src/client/components/core/AgGrid.js +191 -0
- package/src/client/components/core/Alert.js +77 -0
- package/src/client/components/core/Auth.js +342 -0
- package/src/client/components/core/Badge.js +32 -0
- package/src/client/components/core/Blockchain.js +41 -0
- package/src/client/components/core/Blog.js +9 -0
- package/src/client/components/core/BtnIcon.js +111 -0
- package/src/client/components/core/CalendarCore.js +464 -0
- package/src/client/components/core/Chat.js +64 -0
- package/src/client/components/core/ColorPalette.js +5267 -0
- package/src/client/components/core/CommonJs.js +1010 -0
- package/src/client/components/core/Content.js +196 -0
- package/src/client/components/core/Css.js +1099 -0
- package/src/client/components/core/CssCore.js +882 -0
- package/src/client/components/core/D3Chart.js +44 -0
- package/src/client/components/core/Docs.js +376 -0
- package/src/client/components/core/DropDown.js +223 -0
- package/src/client/components/core/EventsUI.js +133 -0
- package/src/client/components/core/FileExplorer.js +707 -0
- package/src/client/components/core/FullScreen.js +36 -0
- package/src/client/components/core/Input.js +383 -0
- package/src/client/components/core/JoyStick.js +80 -0
- package/src/client/components/core/Keyboard.js +73 -0
- package/src/client/components/core/LoadingAnimation.js +159 -0
- package/src/client/components/core/LogIn.js +190 -0
- package/src/client/components/core/LogOut.js +63 -0
- package/src/client/components/core/Logger.js +29 -0
- package/src/client/components/core/Modal.js +2494 -0
- package/src/client/components/core/NotificationManager.js +84 -0
- package/src/client/components/core/ObjectLayerEngine.js +1229 -0
- package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
- package/src/client/components/core/Pagination.js +207 -0
- package/src/client/components/core/Panel.js +772 -0
- package/src/client/components/core/PanelForm.js +627 -0
- package/src/client/components/core/Polyhedron.js +162 -0
- package/src/client/components/core/Recover.js +207 -0
- package/src/client/components/core/Responsive.js +82 -0
- package/src/client/components/core/RichText.js +43 -0
- package/src/client/components/core/Router.js +317 -0
- package/src/client/components/core/Scroll.js +76 -0
- package/src/client/components/core/SignUp.js +125 -0
- package/src/client/components/core/SocketIo.js +74 -0
- package/src/client/components/core/Stream.js +113 -0
- package/src/client/components/core/ToggleSwitch.js +101 -0
- package/src/client/components/core/ToolTip.js +90 -0
- package/src/client/components/core/Translate.js +522 -0
- package/src/client/components/core/Validator.js +115 -0
- package/src/client/components/core/VanillaJs.js +423 -0
- package/src/client/components/core/Wallet.js +106 -0
- package/src/client/components/core/WebComponent.js +44 -0
- package/src/client/components/core/Webhook.js +25 -0
- package/src/client/components/core/Worker.js +371 -0
- package/src/client/components/core/windowGetDimensions.js +269 -0
- package/src/client/components/cyberia/BagCyberia.js +1253 -0
- package/src/client/components/cyberia/BiomeCyberia.js +130 -0
- package/src/client/components/cyberia/CharacterCyberia.js +321 -0
- package/src/client/components/cyberia/CommonCyberia.js +1834 -0
- package/src/client/components/cyberia/CssCyberia.js +816 -0
- package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
- package/src/client/components/cyberia/ElementsCyberia.js +146 -0
- package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
- package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
- package/src/client/components/cyberia/LogInCyberia.js +68 -0
- package/src/client/components/cyberia/LogOutCyberia.js +24 -0
- package/src/client/components/cyberia/MainUserCyberia.js +424 -0
- package/src/client/components/cyberia/MapCyberia.js +160 -0
- package/src/client/components/cyberia/MatrixCyberia.js +147 -0
- package/src/client/components/cyberia/MenuCyberia.js +575 -0
- package/src/client/components/cyberia/PixiCyberia.js +1639 -0
- package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
- package/src/client/components/cyberia/QuestCyberia.js +1420 -0
- package/src/client/components/cyberia/RoutesCyberia.js +47 -0
- package/src/client/components/cyberia/SettingsCyberia.js +16 -0
- package/src/client/components/cyberia/SignUpCyberia.js +14 -0
- package/src/client/components/cyberia/SkillCyberia.js +124 -0
- package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
- package/src/client/components/cyberia/TileCyberia.js +685 -0
- package/src/client/components/cyberia/TranslateCyberia.js +96 -0
- package/src/client/components/cyberia/UniverseCyberia.js +14 -0
- package/src/client/components/cyberia/WebhookCyberia.js +13 -0
- package/src/client/components/cyberia/WikiCyberia.js +144 -0
- package/src/client/components/cyberia/WorldCyberia.js +680 -0
- package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
- package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
- package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
- package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
- package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
- package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
- package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
- package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
- package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
- package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
- package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
- package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
- package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
- package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
- package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
- package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
- package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
- package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
- package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
- package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
- package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
- package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
- package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
- package/src/client/components/default/CommonDefault.js +29 -0
- package/src/client/components/default/CssDefault.js +27 -0
- package/src/client/components/default/ElementsDefault.js +38 -0
- package/src/client/components/default/LogInDefault.js +14 -0
- package/src/client/components/default/LogOutDefault.js +10 -0
- package/src/client/components/default/MenuDefault.js +743 -0
- package/src/client/components/default/RoutesDefault.js +48 -0
- package/src/client/components/default/SettingsDefault.js +16 -0
- package/src/client/components/default/SignUpDefault.js +9 -0
- package/src/client/components/default/SocketIoDefault.js +54 -0
- package/src/client/components/default/TranslateDefault.js +7 -0
- 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-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152-precomposed.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-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76-precomposed.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/dark.jpg +0 -0
- package/src/client/public/default/assets/background/dark.svg +557 -0
- package/src/client/public/default/assets/background/white.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/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/assets/logo/underpost.gif +0 -0
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +12 -0
- 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 +69 -0
- 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/plantuml/client-conf.svg +1 -0
- package/src/client/public/default/plantuml/client-schema.svg +1 -0
- package/src/client/public/default/plantuml/cron-conf.svg +1 -0
- package/src/client/public/default/plantuml/cron-schema.svg +1 -0
- package/src/client/public/default/plantuml/server-conf.svg +1 -0
- package/src/client/public/default/plantuml/server-schema.svg +1 -0
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
- package/src/client/public/default/safari-pinned-tab.svg +24 -0
- package/src/client/public/default/site.webmanifest +69 -0
- package/src/client/public/default/sitemap +148 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +9 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +148 -0
- package/src/client/public/test/favicon.ico +0 -0
- package/src/client/public/test/sitemap +148 -0
- package/src/client/services/blockchain/blockchain.service.js +73 -0
- package/src/client/services/core/core.service.js +165 -0
- package/src/client/services/crypto/crypto.service.js +73 -0
- package/src/client/services/default/default.management.js +450 -0
- package/src/client/services/default/default.service.js +98 -0
- package/src/client/services/document/document.service.js +97 -0
- package/src/client/services/file/file.service.js +72 -0
- package/src/client/services/instance/instance.management.js +78 -0
- package/src/client/services/instance/instance.service.js +97 -0
- package/src/client/services/ipfs/ipfs.service.js +73 -0
- package/src/client/services/object-layer/object-layer.service.js +93 -0
- package/src/client/services/test/test.service.js +73 -0
- package/src/client/services/user/user.management.js +56 -0
- package/src/client/services/user/user.service.js +108 -0
- package/src/client/ssr/Render.js +237 -0
- package/src/client/ssr/body/404.js +73 -0
- package/src/client/ssr/body/500.js +72 -0
- package/src/client/ssr/body/CacheControl.js +114 -0
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
- package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
- package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
- package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/head/Css.js +241 -0
- package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
- package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
- package/src/client/ssr/head/CyberiaScripts.js +6 -0
- package/src/client/ssr/head/DefaultScripts.js +6 -0
- package/src/client/ssr/head/Microdata.js +11 -0
- package/src/client/ssr/head/Production.js +1 -0
- package/src/client/ssr/head/Pwa.js +146 -0
- package/src/client/ssr/head/Seo.js +15 -0
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/offline/Maintenance.js +63 -0
- package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
- package/src/client/ssr/pages/404.js +12 -0
- package/src/client/ssr/pages/500.js +12 -0
- package/src/client/ssr/pages/Test.js +198 -0
- package/src/client/ssr/pages/maintenance.js +14 -0
- package/src/client/ssr/pages/offline.js +21 -0
- package/src/client/sw/default.sw.js +108 -0
- package/src/client/sw/template.sw.js +84 -0
- package/src/client.build.js +22 -0
- package/src/client.dev.js +24 -0
- package/src/db/DataBaseProvider.js +98 -0
- package/src/db/mariadb/MariaDB.js +66 -0
- package/src/db/mongo/MongooseDB.js +70 -0
- package/src/index.js +198 -0
- package/src/mailer/EmailRender.js +116 -0
- package/src/mailer/MailerProvider.js +213 -0
- package/src/monitor.js +24 -0
- package/src/proxy.js +22 -0
- package/src/runtime/express/Express.js +256 -0
- package/src/runtime/lampp/Dockerfile +50 -0
- package/src/runtime/lampp/Lampp.js +343 -0
- package/src/server/auth.js +689 -0
- package/src/server/backup.js +96 -0
- package/src/server/client-build-docs.js +205 -0
- package/src/server/client-build-live.js +109 -0
- package/src/server/client-build.js +690 -0
- package/src/server/client-dev-server.js +87 -0
- package/src/server/client-formatted.js +87 -0
- package/src/server/client-icons.js +108 -0
- package/src/server/conf.js +1071 -0
- package/src/server/crypto.js +210 -0
- package/src/server/dns.js +276 -0
- package/src/server/downloader.js +74 -0
- package/src/server/json-schema.js +77 -0
- package/src/server/logger.js +197 -0
- package/src/server/network.js +72 -0
- package/src/server/object-layer.js +294 -0
- package/src/server/peer.js +69 -0
- package/src/server/process.js +171 -0
- package/src/server/proxy.js +110 -0
- package/src/server/runtime.js +170 -0
- package/src/server/ssr.js +127 -0
- package/src/server/start.js +161 -0
- package/src/server/tls.js +251 -0
- package/src/server/valkey.js +293 -0
- package/src/server.js +25 -0
- package/src/ws/IoInterface.js +139 -0
- package/src/ws/IoServer.js +88 -0
- package/src/ws/core/channels/core.ws.chat.js +23 -0
- package/src/ws/core/channels/core.ws.mailer.js +35 -0
- package/src/ws/core/channels/core.ws.stream.js +31 -0
- package/src/ws/core/core.ws.connection.js +62 -0
- package/src/ws/core/core.ws.emit.js +53 -0
- package/src/ws/core/core.ws.server.js +76 -0
- package/src/ws/core/management/core.ws.chat.js +8 -0
- package/src/ws/core/management/core.ws.mailer.js +16 -0
- package/src/ws/core/management/core.ws.stream.js +8 -0
- package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
- package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
- package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
- package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
- package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
- package/src/ws/cyberia/cyberia.ws.server.js +67 -0
- package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
- package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
- package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
- package/src/ws/default/channels/default.ws.main.js +16 -0
- package/src/ws/default/default.ws.connection.js +22 -0
- package/src/ws/default/default.ws.emit.js +14 -0
- package/src/ws/default/default.ws.server.js +20 -0
- package/src/ws/default/management/default.ws.main.js +8 -0
- package/test/api.test.js +53 -0
- package/test/crypto.test.js +117 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module for process and shell command management.
|
|
3
|
+
* Provides utilities for executing shell commands, managing signals, and handling environment details.
|
|
4
|
+
* @module src/server/process.js
|
|
5
|
+
* @namespace Process
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// https://nodejs.org/api/process
|
|
9
|
+
|
|
10
|
+
import shell from 'shelljs';
|
|
11
|
+
import dotenv from 'dotenv';
|
|
12
|
+
import { loggerFactory } from './logger.js';
|
|
13
|
+
import clipboard from 'clipboardy';
|
|
14
|
+
import UnderpostRootEnv from '../cli/env.js';
|
|
15
|
+
|
|
16
|
+
dotenv.config();
|
|
17
|
+
|
|
18
|
+
const logger = loggerFactory(import.meta);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Gets the current working directory, replacing backslashes with forward slashes for consistency.
|
|
22
|
+
* @memberof Process
|
|
23
|
+
* @returns {string} The root directory path.
|
|
24
|
+
*/
|
|
25
|
+
const getRootDirectory = () => process.cwd().replace(/\\/g, '/');
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Controls and manages process-level events and signals.
|
|
29
|
+
* @namespace ProcessController
|
|
30
|
+
*/
|
|
31
|
+
const ProcessController = {
|
|
32
|
+
/**
|
|
33
|
+
* List of signals to listen for for graceful shutdown/handling.
|
|
34
|
+
* @memberof ProcessController
|
|
35
|
+
* @type {string[]}
|
|
36
|
+
*/
|
|
37
|
+
SIG: [
|
|
38
|
+
'SIGPIPE',
|
|
39
|
+
'SIGHUP',
|
|
40
|
+
'SIGTERM',
|
|
41
|
+
'SIGINT',
|
|
42
|
+
'SIGBREAK',
|
|
43
|
+
'SIGWINCH',
|
|
44
|
+
// 'SIGKILL',
|
|
45
|
+
// 'SIGSTOP',
|
|
46
|
+
'SIGBUS',
|
|
47
|
+
'SIGFPE',
|
|
48
|
+
'SIGSEGV',
|
|
49
|
+
'SIGILL',
|
|
50
|
+
],
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sets up listeners for various process signals defined in {@link ProcessController.SIG}.
|
|
54
|
+
* Handles graceful exit on 'SIGINT' (Ctrl+C).
|
|
55
|
+
* @memberof ProcessController
|
|
56
|
+
* @returns {Array<process.Process>} An array of process listener handles.
|
|
57
|
+
*/
|
|
58
|
+
onSigListen: function () {
|
|
59
|
+
return this.SIG.map((sig) =>
|
|
60
|
+
process.on(sig, (...args) => {
|
|
61
|
+
this.logger.info(`process on ${sig}`, args);
|
|
62
|
+
switch (sig) {
|
|
63
|
+
case 'SIGINT':
|
|
64
|
+
return process.exit();
|
|
65
|
+
|
|
66
|
+
default:
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Initializes the ProcessController.
|
|
75
|
+
* Sets up signal listeners, registers a listener for the 'exit' event, and cleans up temporary deployment environment variables.
|
|
76
|
+
* @memberof ProcessController
|
|
77
|
+
* @param {Object} logger - The logger instance to use for internal logging.
|
|
78
|
+
* @returns {void}
|
|
79
|
+
*/
|
|
80
|
+
init: function (logger) {
|
|
81
|
+
this.logger = logger;
|
|
82
|
+
process.on('exit', (...args) => {
|
|
83
|
+
this.logger.info(`process on exit`, args);
|
|
84
|
+
});
|
|
85
|
+
this.onSigListen();
|
|
86
|
+
UnderpostRootEnv.API.delete('await-deploy');
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Executes a shell command using shelljs.
|
|
92
|
+
* @memberof Process
|
|
93
|
+
* @param {string} cmd - The command string to execute.
|
|
94
|
+
* @param {Object} [options] - Options for execution.
|
|
95
|
+
* @param {boolean} [options.silent=false] - Suppress output from shell commands.
|
|
96
|
+
* @param {boolean} [options.async=false] - Run command asynchronously.
|
|
97
|
+
* @param {boolean} [options.stdout=false] - Return stdout content (string) instead of shelljs result object.
|
|
98
|
+
* @param {boolean} [options.disableLog=false] - Prevent logging of the command.
|
|
99
|
+
* @returns {string|shelljs.ShellString} The result of the shell command (string if `stdout: true`, otherwise a ShellString object).
|
|
100
|
+
*/
|
|
101
|
+
const shellExec = (cmd, options = { silent: false, async: false, stdout: false, disableLog: false }) => {
|
|
102
|
+
if (!options.disableLog) logger.info(`cmd`, cmd);
|
|
103
|
+
return options.stdout ? shell.exec(cmd, options).stdout : shell.exec(cmd, options);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Changes the current working directory using shelljs.
|
|
108
|
+
* @memberof Process
|
|
109
|
+
* @param {string} cd - The path to change the directory to.
|
|
110
|
+
* @param {Object} [options] - Options for the CD operation.
|
|
111
|
+
* @param {boolean} [options.disableLog=false] - Prevent logging of the CD command.
|
|
112
|
+
* @returns {shelljs.ShellString} The result of the shelljs cd command.
|
|
113
|
+
*/
|
|
114
|
+
const shellCd = (cd, options = { disableLog: false }) => {
|
|
115
|
+
if (!options.disableLog) logger.info(`cd`, cd);
|
|
116
|
+
return shell.cd(cd);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Opens a new GNOME terminal and executes a command.
|
|
121
|
+
* Note: This function is environment-specific (GNOME/Linux).
|
|
122
|
+
* @memberof Process
|
|
123
|
+
* @param {string} cmd - The command to execute in the new terminal.
|
|
124
|
+
* @param {Object} [options] - Options for the terminal opening.
|
|
125
|
+
* @param {boolean} [options.single=false] - If true, execute as a single session process using `setsid`.
|
|
126
|
+
* @returns {void}
|
|
127
|
+
*/
|
|
128
|
+
const openTerminal = (cmd, options = { single: false }) => {
|
|
129
|
+
if (options.single === true) {
|
|
130
|
+
// Run as a single session process
|
|
131
|
+
shellExec(`setsid gnome-terminal -- bash -ic "${cmd}; exec bash" >/dev/null 2>&1 &`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Run asynchronously and disown
|
|
135
|
+
shellExec(`gnome-terminal -- bash -c "${cmd}; exec bash" & disown`, {
|
|
136
|
+
async: true,
|
|
137
|
+
stdout: true,
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Wraps a command to run it as a daemon process in a shell (keeping the process alive/terminal open).
|
|
143
|
+
* @memberof Process
|
|
144
|
+
* @param {string} cmd - The command to daemonize.
|
|
145
|
+
* @returns {string} The shell command string for the daemon process.
|
|
146
|
+
*/
|
|
147
|
+
const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Retrieves the process ID (PID) of the most recently created gnome-terminal instance.
|
|
151
|
+
* Note: This function is environment-specific (GNOME/Linux) and uses `pgrep -n`.
|
|
152
|
+
* @memberof Process
|
|
153
|
+
* @returns {number} The PID of the last gnome-terminal process.
|
|
154
|
+
*/
|
|
155
|
+
// list all terminals: pgrep gnome-terminal
|
|
156
|
+
// list last terminal: pgrep -n gnome-terminal
|
|
157
|
+
const getTerminalPid = () => JSON.parse(shellExec(`pgrep -n gnome-terminal`, { stdout: true, silent: true }));
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Copies text content to the system clipboard using clipboardy.
|
|
161
|
+
* Logs the copied content for confirmation.
|
|
162
|
+
* @memberof Process
|
|
163
|
+
* @param {string} [data='🦄'] - The data to copy. Defaults to '🦄'.
|
|
164
|
+
* @returns {void}
|
|
165
|
+
*/
|
|
166
|
+
function pbcopy(data) {
|
|
167
|
+
clipboard.writeSync(data || '🦄');
|
|
168
|
+
logger.info(`copied to clipboard`, clipboard.readSync());
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export { ProcessController, getRootDirectory, shellExec, shellCd, pbcopy, openTerminal, getTerminalPid, daemonProcess };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages the creation and configuration of the reverse proxy server,
|
|
3
|
+
* including handling HTTP/HTTPS listeners and routing based on host configuration.
|
|
4
|
+
* @module src/server/proxy.js
|
|
5
|
+
* @namespace ProxyService
|
|
6
|
+
*/
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
import express from 'express';
|
|
10
|
+
import dotenv from 'dotenv';
|
|
11
|
+
|
|
12
|
+
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
13
|
+
import { loggerFactory, loggerMiddleware } from './logger.js';
|
|
14
|
+
import { TLS } from './tls.js';
|
|
15
|
+
import { buildPortProxyRouter, buildProxyRouter } from './conf.js';
|
|
16
|
+
import UnderpostStartUp from './start.js';
|
|
17
|
+
|
|
18
|
+
dotenv.config();
|
|
19
|
+
|
|
20
|
+
const logger = loggerFactory(import.meta);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Main class for building and running the proxy server.
|
|
24
|
+
* All utility methods are implemented as static to serve as a namespace container.
|
|
25
|
+
* @class Proxy
|
|
26
|
+
* @augments Proxy
|
|
27
|
+
* @memberof ProxyService
|
|
28
|
+
*/
|
|
29
|
+
class Proxy {
|
|
30
|
+
/**
|
|
31
|
+
* Initializes and starts the reverse proxy server for all configured ports and hosts.
|
|
32
|
+
* @async
|
|
33
|
+
* @static
|
|
34
|
+
* @memberof ProxyService
|
|
35
|
+
* @returns {Promise<void>}
|
|
36
|
+
* @memberof ProxyService
|
|
37
|
+
*/
|
|
38
|
+
static async buildProxy() {
|
|
39
|
+
// Start a default Express listener on process.env.PORT (potentially unused, but ensures Express is initialized)
|
|
40
|
+
express().listen(process.env.PORT);
|
|
41
|
+
|
|
42
|
+
const proxyRouter = buildProxyRouter();
|
|
43
|
+
|
|
44
|
+
for (let port of Object.keys(proxyRouter)) {
|
|
45
|
+
port = parseInt(port);
|
|
46
|
+
const hosts = proxyRouter[port];
|
|
47
|
+
const proxyPath = '/';
|
|
48
|
+
const proxyHost = 'localhost';
|
|
49
|
+
const runningData = { host: proxyHost, path: proxyPath, client: null, runtime: 'nodejs', meta: import.meta };
|
|
50
|
+
const app = express();
|
|
51
|
+
|
|
52
|
+
// Set logger middleware
|
|
53
|
+
app.use(loggerMiddleware(import.meta));
|
|
54
|
+
|
|
55
|
+
// Proxy middleware options
|
|
56
|
+
/** @type {import('http-proxy-middleware/dist/types').Options} */
|
|
57
|
+
const options = {
|
|
58
|
+
ws: true, // Enable websocket proxying
|
|
59
|
+
target: `http://localhost:${process.env.PORT}`, // Default target (should be overridden by router)
|
|
60
|
+
router: {},
|
|
61
|
+
xfwd: true, // Adds x-forward headers (Host, Proto, etc.)
|
|
62
|
+
onProxyReq: (proxyReq, req, res, options) => {
|
|
63
|
+
// Use the static method from the TLS class for redirection logic
|
|
64
|
+
TLS.sslRedirectMiddleware(req, res, port, proxyRouter);
|
|
65
|
+
},
|
|
66
|
+
pathRewrite: {
|
|
67
|
+
// Add path rewrite rules here if necessary
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
options.router = buildPortProxyRouter(port, proxyRouter);
|
|
72
|
+
|
|
73
|
+
const filter = proxyPath; // Use '/' as the general filter
|
|
74
|
+
app.use(proxyPath, createProxyMiddleware(filter, options));
|
|
75
|
+
|
|
76
|
+
// Determine which server to start (HTTP or HTTPS) based on port and environment
|
|
77
|
+
switch (process.env.NODE_ENV) {
|
|
78
|
+
case 'production':
|
|
79
|
+
switch (port) {
|
|
80
|
+
case 443:
|
|
81
|
+
// For port 443 (HTTPS), create the SSL server
|
|
82
|
+
const { ServerSSL } = await TLS.createSslServer(app, hosts);
|
|
83
|
+
await UnderpostStartUp.API.listenPortController(ServerSSL, port, runningData);
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
default:
|
|
87
|
+
// For other ports in production, use standard HTTP
|
|
88
|
+
await UnderpostStartUp.API.listenPortController(app, port, runningData);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
|
|
93
|
+
default:
|
|
94
|
+
// In non-production, always use standard HTTP listener
|
|
95
|
+
await UnderpostStartUp.API.listenPortController(app, port, runningData);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
logger.info('Proxy running', { port, options });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Backward compatibility export
|
|
105
|
+
* @type {function(): Promise<void>}
|
|
106
|
+
* @memberof ProxyService
|
|
107
|
+
*/
|
|
108
|
+
const buildProxy = Proxy.buildProxy;
|
|
109
|
+
|
|
110
|
+
export { Proxy, buildProxy };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The main runtime orchestrator responsible for reading configuration,
|
|
3
|
+
* initializing services (Prometheus, Ports, DB, Mailer), and building the
|
|
4
|
+
* specific server runtime for each host/path (e.g., nodejs, lampp).
|
|
5
|
+
* @module src/server/runtime.js
|
|
6
|
+
* @namespace Runtime
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import dotenv from 'dotenv';
|
|
11
|
+
import * as promClient from 'prom-client';
|
|
12
|
+
|
|
13
|
+
import UnderpostStartUp from './start.js';
|
|
14
|
+
import { loggerFactory } from './logger.js';
|
|
15
|
+
import { newInstance } from '../client/components/core/CommonJs.js';
|
|
16
|
+
import { Lampp } from '../runtime/lampp/Lampp.js';
|
|
17
|
+
import { getInstanceContext } from './conf.js';
|
|
18
|
+
|
|
19
|
+
import ExpressService from '../runtime/express/Express.js';
|
|
20
|
+
|
|
21
|
+
dotenv.config();
|
|
22
|
+
|
|
23
|
+
const logger = loggerFactory(import.meta);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Reads server configurations, sets up Prometheus metrics, and iterates through
|
|
27
|
+
* all defined hosts and paths to build and start the corresponding runtime instances.
|
|
28
|
+
*
|
|
29
|
+
* @memberof Runtime
|
|
30
|
+
* @returns {Promise<void>}
|
|
31
|
+
* @function buildRuntime
|
|
32
|
+
*/
|
|
33
|
+
const buildRuntime = async () => {
|
|
34
|
+
const deployId = process.env.DEPLOY_ID;
|
|
35
|
+
|
|
36
|
+
// 1. Initialize Prometheus Metrics
|
|
37
|
+
const collectDefaultMetrics = promClient.collectDefaultMetrics;
|
|
38
|
+
collectDefaultMetrics();
|
|
39
|
+
|
|
40
|
+
const promCounterOption = {
|
|
41
|
+
name: `${deployId.replaceAll('-', '_')}_http_requests_total`,
|
|
42
|
+
help: 'Total number of HTTP requests',
|
|
43
|
+
labelNames: ['instance', 'method', 'status_code'],
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const requestCounter = new promClient.Counter(promCounterOption);
|
|
47
|
+
const initPort = parseInt(process.env.PORT) + 1;
|
|
48
|
+
let currentPort = initPort;
|
|
49
|
+
|
|
50
|
+
// 2. Load Configuration
|
|
51
|
+
const confServer = JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'));
|
|
52
|
+
const confSSR = JSON.parse(fs.readFileSync(`./conf/conf.ssr.json`, 'utf8'));
|
|
53
|
+
const singleReplicaHosts = [];
|
|
54
|
+
|
|
55
|
+
// 3. Iterate through hosts and paths
|
|
56
|
+
for (const host of Object.keys(confServer)) {
|
|
57
|
+
if (singleReplicaHosts.length > 0)
|
|
58
|
+
currentPort += singleReplicaHosts.reduce((accumulator, currentValue) => accumulator + currentValue.replicas, 0);
|
|
59
|
+
|
|
60
|
+
const rootHostPath = `/public/${host}`;
|
|
61
|
+
for (const path of Object.keys(confServer[host])) {
|
|
62
|
+
confServer[host][path].port = newInstance(currentPort);
|
|
63
|
+
const {
|
|
64
|
+
runtime,
|
|
65
|
+
port,
|
|
66
|
+
client,
|
|
67
|
+
apis,
|
|
68
|
+
origins,
|
|
69
|
+
directory,
|
|
70
|
+
ws,
|
|
71
|
+
mailer,
|
|
72
|
+
db,
|
|
73
|
+
redirect,
|
|
74
|
+
peer,
|
|
75
|
+
singleReplica,
|
|
76
|
+
replicas,
|
|
77
|
+
valkey,
|
|
78
|
+
apiBaseHost,
|
|
79
|
+
useLocalSsl,
|
|
80
|
+
} = confServer[host][path];
|
|
81
|
+
|
|
82
|
+
// Calculate context data
|
|
83
|
+
const { redirectTarget, singleReplicaHost } = await getInstanceContext({
|
|
84
|
+
redirect,
|
|
85
|
+
singleReplicaHosts,
|
|
86
|
+
singleReplica,
|
|
87
|
+
replicas,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
if (singleReplicaHost) {
|
|
91
|
+
singleReplicaHosts.push({
|
|
92
|
+
host,
|
|
93
|
+
replicas: replicas.length,
|
|
94
|
+
});
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const runningData = {
|
|
99
|
+
host,
|
|
100
|
+
path,
|
|
101
|
+
runtime,
|
|
102
|
+
client,
|
|
103
|
+
meta: import.meta,
|
|
104
|
+
apis,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
switch (runtime) {
|
|
108
|
+
case 'nodejs':
|
|
109
|
+
logger.info('Build nodejs server runtime', `${host}${path}:${port}`);
|
|
110
|
+
|
|
111
|
+
const { portsUsed } = await ExpressService.createApp({
|
|
112
|
+
host,
|
|
113
|
+
path,
|
|
114
|
+
port,
|
|
115
|
+
client,
|
|
116
|
+
apis,
|
|
117
|
+
origins,
|
|
118
|
+
directory,
|
|
119
|
+
useLocalSsl,
|
|
120
|
+
ws,
|
|
121
|
+
mailer,
|
|
122
|
+
db,
|
|
123
|
+
redirect,
|
|
124
|
+
peer,
|
|
125
|
+
valkey,
|
|
126
|
+
apiBaseHost,
|
|
127
|
+
redirectTarget,
|
|
128
|
+
rootHostPath,
|
|
129
|
+
confSSR,
|
|
130
|
+
promRequestCounter: requestCounter,
|
|
131
|
+
promRegister: promClient.register,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Increment currentPort by any additional ports used by the service (e.g., PeerServer port)
|
|
135
|
+
currentPort += portsUsed;
|
|
136
|
+
break;
|
|
137
|
+
|
|
138
|
+
case 'lampp':
|
|
139
|
+
{
|
|
140
|
+
const { disabled } = await Lampp.createApp({
|
|
141
|
+
port,
|
|
142
|
+
host,
|
|
143
|
+
path,
|
|
144
|
+
directory,
|
|
145
|
+
rootHostPath,
|
|
146
|
+
redirect,
|
|
147
|
+
redirectTarget,
|
|
148
|
+
resetRouter: currentPort === initPort,
|
|
149
|
+
});
|
|
150
|
+
if (disabled) continue;
|
|
151
|
+
await UnderpostStartUp.API.listenPortController(
|
|
152
|
+
UnderpostStartUp.API.listenServerFactory(),
|
|
153
|
+
port,
|
|
154
|
+
runningData,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
default:
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
currentPort++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (Lampp.enabled() && Lampp.router) Lampp.initService();
|
|
166
|
+
|
|
167
|
+
UnderpostStartUp.API.logRuntimeRouter();
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export { buildRuntime };
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module for managing server side rendering
|
|
3
|
+
* @module src/server/ssr.js
|
|
4
|
+
* @namespace ServerSideRendering
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import dotenv from 'dotenv';
|
|
9
|
+
import vm from 'node:vm';
|
|
10
|
+
|
|
11
|
+
import Underpost from '../index.js';
|
|
12
|
+
|
|
13
|
+
import { srcFormatted, JSONweb } from './client-formatted.js';
|
|
14
|
+
import { loggerFactory } from './logger.js';
|
|
15
|
+
import { getRootDirectory } from './process.js';
|
|
16
|
+
|
|
17
|
+
dotenv.config();
|
|
18
|
+
|
|
19
|
+
const logger = loggerFactory(import.meta);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates a server-side rendering component function from a given file path.
|
|
23
|
+
* It reads the component file, formats it, and executes it in a sandboxed Node.js VM context to extract the component.
|
|
24
|
+
* @param {string} [componentPath='./src/client/ssr/Render.js'] - The path to the SSR component file.
|
|
25
|
+
* @returns {Promise<Function>} A promise that resolves to the SSR component function.
|
|
26
|
+
* @memberof ServerSideRendering
|
|
27
|
+
*/
|
|
28
|
+
const ssrFactory = async (componentPath = `./src/client/ssr/Render.js`) => {
|
|
29
|
+
const context = { SrrComponent: () => {}, npm_package_version: Underpost.version };
|
|
30
|
+
vm.createContext(context);
|
|
31
|
+
vm.runInContext(await srcFormatted(fs.readFileSync(componentPath, 'utf8')), context);
|
|
32
|
+
return context.SrrComponent;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Sanitizes an HTML string by adding a nonce to all script and style tags for Content Security Policy (CSP).
|
|
37
|
+
* The nonce is retrieved from `res.locals.nonce`.
|
|
38
|
+
* @param {object} res - The Express response object.
|
|
39
|
+
* @param {object} req - The Express request object.
|
|
40
|
+
* @param {string} html - The HTML string to sanitize.
|
|
41
|
+
* @returns {string} The sanitized HTML string with nonces.
|
|
42
|
+
* @memberof ServerSideRendering
|
|
43
|
+
*/
|
|
44
|
+
const sanitizeHtml = (res, req, html) => {
|
|
45
|
+
const nonce = res.locals.nonce;
|
|
46
|
+
|
|
47
|
+
return html
|
|
48
|
+
.replace(/<script(?=\s|>)/gi, `<script nonce="${nonce}"`)
|
|
49
|
+
.replace(/<style(?=\s|>)/gi, `<style nonce="${nonce}"`);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Factory function to create Express middleware for handling 404 and 500 errors.
|
|
54
|
+
* It generates server-side rendered HTML for these error pages. If static error pages exist, it redirects to them.
|
|
55
|
+
* @param {object} options - The options for creating the middleware.
|
|
56
|
+
* @param {object} options.app - The Express app instance.
|
|
57
|
+
* @param {string} options.directory - The directory for the instance's static files.
|
|
58
|
+
* @param {string} options.rootHostPath - The root path for the host's public files.
|
|
59
|
+
* @param {string} options.path - The base path for the instance.
|
|
60
|
+
* @returns {Promise<{error500: Function, error400: Function}>} A promise that resolves to an object containing the 500 and 404 error handling middleware.
|
|
61
|
+
* @memberof ServerSideRendering
|
|
62
|
+
*/
|
|
63
|
+
const ssrMiddlewareFactory = async ({ app, directory, rootHostPath, path }) => {
|
|
64
|
+
const Render = await ssrFactory();
|
|
65
|
+
const ssrPath = path === '/' ? path : `${path}/`;
|
|
66
|
+
|
|
67
|
+
// Build default html src for 404 and 500
|
|
68
|
+
|
|
69
|
+
const defaultHtmlSrc404 = Render({
|
|
70
|
+
title: '404 Not Found',
|
|
71
|
+
ssrPath,
|
|
72
|
+
ssrHeadComponents: '',
|
|
73
|
+
ssrBodyComponents: (await ssrFactory(`./src/client/ssr/body/404.js`))(),
|
|
74
|
+
renderPayload: {
|
|
75
|
+
apiBasePath: process.env.BASE_API,
|
|
76
|
+
version: Underpost.version,
|
|
77
|
+
},
|
|
78
|
+
renderApi: {
|
|
79
|
+
JSONweb,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
const path404 = `${directory ? directory : `${getRootDirectory()}${rootHostPath}`}/404/index.html`;
|
|
83
|
+
const page404 = fs.existsSync(path404) ? `${path === '/' ? '' : path}/404` : undefined;
|
|
84
|
+
|
|
85
|
+
const defaultHtmlSrc500 = Render({
|
|
86
|
+
title: '500 Server Error',
|
|
87
|
+
ssrPath,
|
|
88
|
+
ssrHeadComponents: '',
|
|
89
|
+
ssrBodyComponents: (await ssrFactory(`./src/client/ssr/body/500.js`))(),
|
|
90
|
+
renderPayload: {
|
|
91
|
+
apiBasePath: process.env.BASE_API,
|
|
92
|
+
version: Underpost.version,
|
|
93
|
+
},
|
|
94
|
+
renderApi: {
|
|
95
|
+
JSONweb,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const path500 = `${directory ? directory : `${getRootDirectory()}${rootHostPath}`}/500/index.html`;
|
|
99
|
+
const page500 = fs.existsSync(path500) ? `${path === '/' ? '' : path}/500` : undefined;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
error500: function (err, req, res, next) {
|
|
103
|
+
logger.error(err, err.stack);
|
|
104
|
+
if (page500) return res.status(500).redirect(page500);
|
|
105
|
+
else {
|
|
106
|
+
res.set('Content-Type', 'text/html');
|
|
107
|
+
return res.status(500).send(sanitizeHtml(res, req, defaultHtmlSrc500));
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
error400: function (req, res, next) {
|
|
111
|
+
// if /<path>/home redirect to /<path>
|
|
112
|
+
const homeRedirectPath = `${path === '/' ? '' : path}/home`;
|
|
113
|
+
if (req.url.startsWith(homeRedirectPath)) {
|
|
114
|
+
const redirectUrl = req.url.replace('/home', '');
|
|
115
|
+
return res.redirect(redirectUrl.startsWith('/') ? redirectUrl : `/${redirectUrl}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (page404) return res.status(404).redirect(page404);
|
|
119
|
+
else {
|
|
120
|
+
res.set('Content-Type', 'text/html');
|
|
121
|
+
return res.status(404).send(sanitizeHtml(res, req, defaultHtmlSrc404));
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export { ssrMiddlewareFactory, ssrFactory, sanitizeHtml };
|