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,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module for managing Valkey
|
|
3
|
+
* @module src/server/valkey.js
|
|
4
|
+
* @namespace ValkeyService
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import Valkey from 'iovalkey';
|
|
8
|
+
import mongoose from 'mongoose';
|
|
9
|
+
import { hashPassword } from './auth.js';
|
|
10
|
+
import { loggerFactory } from './logger.js';
|
|
11
|
+
|
|
12
|
+
const logger = loggerFactory(import.meta);
|
|
13
|
+
|
|
14
|
+
// Per-instance registries keyed by `${host}${path}`
|
|
15
|
+
const ValkeyInstances = {};
|
|
16
|
+
const DummyStores = {}; // in-memory Maps per instance
|
|
17
|
+
const ValkeyStatus = {}; // 'connected' | 'dummy' | 'error' | undefined
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Checks if any Valkey instance is connected.
|
|
21
|
+
* This is a backward-compatible overall flag.
|
|
22
|
+
* @returns {boolean} True if any instance has a 'connected' status.
|
|
23
|
+
* @memberof ValkeyService
|
|
24
|
+
*/
|
|
25
|
+
const isValkeyEnable = () => Object.values(ValkeyStatus).some((s) => s === 'connected');
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Generates a unique key for a Valkey instance based on its host and path.
|
|
29
|
+
* @param {object} [opts={ host: '', path: '' }] - The instance options.
|
|
30
|
+
* @param {string} [opts.host=''] - The host of the instance.
|
|
31
|
+
* @param {string} [opts.path=''] - The path of the instance.
|
|
32
|
+
* @returns {string} The instance key.
|
|
33
|
+
* @private
|
|
34
|
+
* @memberof ValkeyService
|
|
35
|
+
*/
|
|
36
|
+
const _instanceKey = (opts = { host: '', path: '' }) => `${opts.host || ''}${opts.path || ''}`;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates and manages a connection to a Valkey server for a given instance.
|
|
40
|
+
* It sets up a client, attaches event listeners for connection status, and implements a fallback to an in-memory dummy store if the connection fails.
|
|
41
|
+
* @param {object} [instance={ host: '', path: '' }] - The instance identifier.
|
|
42
|
+
* @param {string} [instance.host=''] - The host of the instance.
|
|
43
|
+
* @param {string} [instance.path=''] - The path of the instance.
|
|
44
|
+
* @param {object} [valkeyServerConnectionOptions={ host: '', path: '' }] - Connection options for the iovalkey client.
|
|
45
|
+
* @returns {Promise<Valkey|undefined>} A promise that resolves to the Valkey client instance, or undefined if creation fails.
|
|
46
|
+
* @memberof ValkeyService
|
|
47
|
+
*/
|
|
48
|
+
const createValkeyConnection = async (
|
|
49
|
+
instance = { host: '', path: '' },
|
|
50
|
+
valkeyServerConnectionOptions = { host: '', path: '' },
|
|
51
|
+
) => {
|
|
52
|
+
const key = _instanceKey(instance);
|
|
53
|
+
// Initialize dummy store for the instance
|
|
54
|
+
if (!DummyStores[key]) DummyStores[key] = new Map();
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const client = await ValkeyAPI.valkeyClientFactory(valkeyServerConnectionOptions);
|
|
58
|
+
|
|
59
|
+
// Attach listeners for visibility
|
|
60
|
+
client.on?.('ready', () => {
|
|
61
|
+
ValkeyStatus[key] = 'connected';
|
|
62
|
+
logger.info('Valkey connected', { instance, status: ValkeyStatus[key] });
|
|
63
|
+
});
|
|
64
|
+
client.on?.('error', (err) => {
|
|
65
|
+
// Switch to dummy if not yet connected
|
|
66
|
+
if (ValkeyStatus[key] !== 'connected') {
|
|
67
|
+
ValkeyStatus[key] = 'dummy';
|
|
68
|
+
} else {
|
|
69
|
+
ValkeyStatus[key] = 'error';
|
|
70
|
+
}
|
|
71
|
+
logger.warn('Valkey error', { err: err?.message, instance, status: ValkeyStatus[key] });
|
|
72
|
+
});
|
|
73
|
+
client.on?.('end', () => {
|
|
74
|
+
if (ValkeyStatus[key] !== 'dummy') ValkeyStatus[key] = 'error';
|
|
75
|
+
logger.warn('Valkey connection ended', { instance, status: ValkeyStatus[key] });
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Probe connectivity with a short timeout
|
|
79
|
+
const probe = async () => {
|
|
80
|
+
try {
|
|
81
|
+
// basic ping via SET/GET roundtrip
|
|
82
|
+
const probeKey = `__vk_probe_${Date.now()}`;
|
|
83
|
+
await client.set(probeKey, '1');
|
|
84
|
+
await client.get(probeKey);
|
|
85
|
+
ValkeyStatus[key] = 'connected';
|
|
86
|
+
} catch (e) {
|
|
87
|
+
ValkeyStatus[key] = 'dummy';
|
|
88
|
+
logger.warn('Valkey probe failed, falling back to dummy', { instance, error: e?.message });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// Race with timeout to avoid hanging
|
|
93
|
+
await Promise.race([probe(), new Promise((resolve) => setTimeout(resolve, 1000))]);
|
|
94
|
+
|
|
95
|
+
ValkeyInstances[key] = client;
|
|
96
|
+
if (!ValkeyStatus[key]) ValkeyStatus[key] = 'dummy';
|
|
97
|
+
} catch (err) {
|
|
98
|
+
ValkeyStatus[key] = 'dummy';
|
|
99
|
+
logger.warn('Valkey client creation failed, using dummy', { instance, error: err?.message });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return ValkeyInstances[key];
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Factory function to create a Data Transfer Object (DTO) from a payload.
|
|
107
|
+
* It filters the payload to include only the keys specified in the `select` object.
|
|
108
|
+
* @param {object} payload - The source object.
|
|
109
|
+
* @param {object} select - An object where keys are field names and values are 1 to include them.
|
|
110
|
+
* @returns {object} A new object containing only the selected fields from the payload.
|
|
111
|
+
* @memberof ValkeyService
|
|
112
|
+
*/
|
|
113
|
+
const selectDtoFactory = (payload, select) => {
|
|
114
|
+
const result = {};
|
|
115
|
+
for (const key of Object.keys(select)) {
|
|
116
|
+
if (select[key] === 1 && key in payload) result[key] = payload[key];
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Factory function to create a new Valkey client instance.
|
|
123
|
+
* @param {object} options - Connection options for the iovalkey client.
|
|
124
|
+
* @returns {Promise<Valkey>} A promise that resolves to a new Valkey client.
|
|
125
|
+
* @memberof ValkeyService
|
|
126
|
+
*/
|
|
127
|
+
const valkeyClientFactory = async (options) => {
|
|
128
|
+
const valkey = new Valkey({
|
|
129
|
+
port: options?.port ? options.port : undefined,
|
|
130
|
+
host: options?.host ? options.host : undefined,
|
|
131
|
+
// Keep retry strategy minimal; state handled in createValkeyConnection
|
|
132
|
+
retryStrategy: (attempt) => {
|
|
133
|
+
if (attempt === 1) return undefined; // stop aggressive retries early
|
|
134
|
+
return 1000; // retry interval if library continues
|
|
135
|
+
},
|
|
136
|
+
}); // Connect to 127.0.0.1:6379
|
|
137
|
+
// new Valkey(6380); // 127.0.0.1:6380
|
|
138
|
+
// new Valkey(6379, '192.168.1.1'); // 192.168.1.1:6379
|
|
139
|
+
// new Valkey('/tmp/redis.sock');
|
|
140
|
+
// new Valkey({
|
|
141
|
+
// port: 6379, // Valkey port
|
|
142
|
+
// host: '127.0.0.1', // Valkey host
|
|
143
|
+
// username: 'default', // needs Valkey >= 6
|
|
144
|
+
// password: 'my-top-secret',
|
|
145
|
+
// db: 0, // Defaults to 0
|
|
146
|
+
// });
|
|
147
|
+
return valkey;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Retrieves an object from Valkey by key for a specific instance.
|
|
152
|
+
* If the Valkey client is not connected or an error occurs, it falls back to the dummy in-memory store.
|
|
153
|
+
* It automatically parses JSON strings.
|
|
154
|
+
* @param {object} [options={ host: '', path: '' }] - The instance identifier.
|
|
155
|
+
* @param {string} [key=''] - The key of the object to retrieve.
|
|
156
|
+
* @returns {Promise<object|string|null>} A promise that resolves to the retrieved object, string, or null if not found.
|
|
157
|
+
* @memberof ValkeyService
|
|
158
|
+
*/
|
|
159
|
+
const getValkeyObject = async (options = { host: '', path: '' }, key = '') => {
|
|
160
|
+
const k = _instanceKey(options);
|
|
161
|
+
const status = ValkeyStatus[k];
|
|
162
|
+
try {
|
|
163
|
+
if (status === 'connected' && ValkeyInstances[k]) {
|
|
164
|
+
const value = await ValkeyInstances[k].get(key);
|
|
165
|
+
if (value == null) return null;
|
|
166
|
+
try {
|
|
167
|
+
return JSON.parse(value);
|
|
168
|
+
} catch {
|
|
169
|
+
// not JSON, return raw string
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} catch (err) {
|
|
174
|
+
logger.warn('Valkey get failed, using dummy', { key, err: err?.message });
|
|
175
|
+
}
|
|
176
|
+
// Dummy fallback returns stored value as-is (string or object)
|
|
177
|
+
return DummyStores[k]?.get(key) ?? null;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Sets an object or string in Valkey for a specific instance.
|
|
182
|
+
* If the Valkey client is not connected, it writes to the in-memory dummy store instead.
|
|
183
|
+
* Objects are automatically stringified.
|
|
184
|
+
* @param {object} [options={ host: '', path: '' }] - The instance identifier.
|
|
185
|
+
* @param {string} [key=''] - The key under which to store the payload.
|
|
186
|
+
* @param {object|string} [payload={}] - The data to store.
|
|
187
|
+
* @returns {Promise<string>} A promise that resolves to 'OK' on success.
|
|
188
|
+
* @memberof ValkeyService
|
|
189
|
+
*/
|
|
190
|
+
const setValkeyObject = async (options = { host: '', path: '' }, key = '', payload = {}) => {
|
|
191
|
+
const k = _instanceKey(options);
|
|
192
|
+
const isString = typeof payload === 'string';
|
|
193
|
+
const value = isString ? payload : JSON.stringify(payload);
|
|
194
|
+
try {
|
|
195
|
+
if (ValkeyStatus[k] === 'connected' && ValkeyInstances[k]) {
|
|
196
|
+
return await ValkeyInstances[k].set(key, value);
|
|
197
|
+
}
|
|
198
|
+
} catch (err) {
|
|
199
|
+
logger.warn('Valkey set failed, writing to dummy', { key, err: err?.message });
|
|
200
|
+
}
|
|
201
|
+
if (!DummyStores[k]) DummyStores[k] = new Map();
|
|
202
|
+
// Store raw string or object accordingly
|
|
203
|
+
DummyStores[k].set(key, isString ? payload : payload);
|
|
204
|
+
return 'OK';
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Updates an existing object in Valkey by merging it with a new payload.
|
|
209
|
+
* It retrieves the current object, merges it with the new payload, and sets the updated object back.
|
|
210
|
+
* It also updates the `updatedAt` timestamp.
|
|
211
|
+
* @param {object} [options={ host: '', path: '' }] - The instance identifier.
|
|
212
|
+
* @param {string} [key=''] - The key of the object to update.
|
|
213
|
+
* @param {object} [payload={}] - The new data to merge into the object.
|
|
214
|
+
* @returns {Promise<string>} A promise that resolves to the result of the set operation.
|
|
215
|
+
* @memberof ValkeyService
|
|
216
|
+
*/
|
|
217
|
+
const updateValkeyObject = async (options = { host: '', path: '' }, key = '', payload = {}) => {
|
|
218
|
+
let base = await getValkeyObject(options, key);
|
|
219
|
+
if (typeof base !== 'object' || base === null) base = {};
|
|
220
|
+
base.updatedAt = new Date().toISOString();
|
|
221
|
+
return await setValkeyObject(options, key, { ...base, ...payload });
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Factory function to create a new object based on a model schema.
|
|
226
|
+
* It generates a new object with default properties like `_id`, `createdAt`, and `updatedAt`,
|
|
227
|
+
* and model-specific properties.
|
|
228
|
+
* @param {object} [options={ host: 'localhost', path: '', object: {} }] - Options for object creation.
|
|
229
|
+
* @param {string} [options.host='localhost'] - The host context for the object.
|
|
230
|
+
* @param {object} [options.object={}] - An initial object to extend.
|
|
231
|
+
* @param {string} [model=''] - The name of the model schema to use (e.g., 'user').
|
|
232
|
+
* @returns {Promise<object>} A promise that resolves to the newly created object.
|
|
233
|
+
* @memberof ValkeyService
|
|
234
|
+
*/
|
|
235
|
+
const valkeyObjectFactory = async (options = { host: 'localhost', path: '', object: {} }, model = '') => {
|
|
236
|
+
const idoDate = new Date().toISOString();
|
|
237
|
+
options.object = options.object || {};
|
|
238
|
+
const { object } = options;
|
|
239
|
+
const _id = new mongoose.Types.ObjectId().toString();
|
|
240
|
+
object._id = _id;
|
|
241
|
+
object.createdAt = idoDate;
|
|
242
|
+
object.updatedAt = idoDate;
|
|
243
|
+
switch (model) {
|
|
244
|
+
case 'user': {
|
|
245
|
+
const role = 'guest';
|
|
246
|
+
object._id = `${role}${_id}`;
|
|
247
|
+
return {
|
|
248
|
+
...object,
|
|
249
|
+
username: `${role}${_id.slice(-5)}`,
|
|
250
|
+
email: `${_id}@${options.host}`,
|
|
251
|
+
password: hashPassword(process.env.JWT_SECRET),
|
|
252
|
+
role,
|
|
253
|
+
failedLoginAttempts: 0,
|
|
254
|
+
phoneNumbers: [],
|
|
255
|
+
publicKey: [],
|
|
256
|
+
profileImageId: null,
|
|
257
|
+
emailConfirmed: false,
|
|
258
|
+
recoverTimeOut: null,
|
|
259
|
+
lastLoginDate: null,
|
|
260
|
+
activeSessions: [],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
default:
|
|
264
|
+
throw new Error(`model schema not found: ${model}`);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* A collection of Valkey-related API functions.
|
|
270
|
+
* @type {object}
|
|
271
|
+
* @memberof ValkeyServiceService
|
|
272
|
+
*/
|
|
273
|
+
const ValkeyAPI = {
|
|
274
|
+
valkeyClientFactory,
|
|
275
|
+
selectDtoFactory,
|
|
276
|
+
getValkeyObject,
|
|
277
|
+
setValkeyObject,
|
|
278
|
+
valkeyObjectFactory,
|
|
279
|
+
updateValkeyObject,
|
|
280
|
+
createValkeyConnection,
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export {
|
|
284
|
+
valkeyClientFactory,
|
|
285
|
+
selectDtoFactory,
|
|
286
|
+
getValkeyObject,
|
|
287
|
+
setValkeyObject,
|
|
288
|
+
valkeyObjectFactory,
|
|
289
|
+
updateValkeyObject,
|
|
290
|
+
isValkeyEnable,
|
|
291
|
+
createValkeyConnection,
|
|
292
|
+
ValkeyAPI,
|
|
293
|
+
};
|
package/src/server.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// https://nodejs.org/api
|
|
4
|
+
// https://expressjs.com/en/4x/api.html
|
|
5
|
+
|
|
6
|
+
import dotenv from 'dotenv';
|
|
7
|
+
import { loggerFactory } from './server/logger.js';
|
|
8
|
+
import { buildClient } from './server/client-build.js';
|
|
9
|
+
import { buildRuntime } from './server/runtime.js';
|
|
10
|
+
import { ProcessController } from './server/process.js';
|
|
11
|
+
import { Config } from './server/conf.js';
|
|
12
|
+
|
|
13
|
+
dotenv.config();
|
|
14
|
+
|
|
15
|
+
await Config.build();
|
|
16
|
+
|
|
17
|
+
const logger = loggerFactory(import.meta);
|
|
18
|
+
|
|
19
|
+
await logger.setUpInfo();
|
|
20
|
+
|
|
21
|
+
await buildClient();
|
|
22
|
+
|
|
23
|
+
await buildRuntime();
|
|
24
|
+
|
|
25
|
+
ProcessController.init(logger);
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module for creating and managing WebSocket channels.
|
|
3
|
+
* @module src/ws/IoInterface.js
|
|
4
|
+
* @namespace SocketIoInterface
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { loggerFactory } from '../server/logger.js';
|
|
8
|
+
import { Socket } from 'socket.io';
|
|
9
|
+
|
|
10
|
+
const logger = loggerFactory(import.meta);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Defines the structure for a WebSocket channel's behavior functions.
|
|
14
|
+
* @typedef {Object} ChannelInterface
|
|
15
|
+
* @property {string} channel - The name of the channel.
|
|
16
|
+
* @property {function(Socket, Object.<string, Socket>, string): Promise<void>} [connection] - Handler on client connection.
|
|
17
|
+
* @property {function(Socket, Object.<string, Socket>, any, string, any[]): Promise<void>} [controller] - Handler for incoming channel messages.
|
|
18
|
+
* @property {function(Socket, Object.<string, Socket>, string, string): Promise<void>} [disconnect] - Handler on client disconnection.
|
|
19
|
+
* @property {boolean} [stream=false] - Whether the channel should treat the message as a raw stream (no JSON parsing).
|
|
20
|
+
* @memberof SocketIoInterface
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @class IoChannel
|
|
25
|
+
* @alias IoChannel
|
|
26
|
+
* @memberof SocketIoInterface
|
|
27
|
+
* @classdesc Manages the logic, client map, and event listeners for a specific WebSocket channel,
|
|
28
|
+
* ensuring robust message handling and lifecycle management.
|
|
29
|
+
*/
|
|
30
|
+
class IoChannel {
|
|
31
|
+
/**
|
|
32
|
+
* @private
|
|
33
|
+
* @type {ChannelInterface}
|
|
34
|
+
*/
|
|
35
|
+
#IoInterface;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Map of connected sockets for this channel, keyed by socket ID.
|
|
39
|
+
* @type {Object.<string, Socket>}
|
|
40
|
+
*/
|
|
41
|
+
client = {};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Creates an instance of IoChannel.
|
|
45
|
+
* @param {ChannelInterface} IoInterface - The interface object defining the channel's behavior.
|
|
46
|
+
*/
|
|
47
|
+
constructor(IoInterface) {
|
|
48
|
+
this.#IoInterface = {
|
|
49
|
+
channel: '',
|
|
50
|
+
connection: async (socket = {}, client = {}, wsManagementId = '') => {},
|
|
51
|
+
controller: async (socket = {}, client = {}, payload = {}, wsManagementId = '', args = []) => {},
|
|
52
|
+
disconnect: async (socket = {}, client = {}, reason = '', wsManagementId = '') => {},
|
|
53
|
+
stream: false,
|
|
54
|
+
...IoInterface,
|
|
55
|
+
};
|
|
56
|
+
logger.debug(`Channel instance created for: ${this.channel}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Gets the name of the channel.
|
|
61
|
+
* @returns {string} The channel name.
|
|
62
|
+
*/
|
|
63
|
+
get channel() {
|
|
64
|
+
return this.#IoInterface.channel;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Handles a new socket connection for this channel.
|
|
69
|
+
* Sets up the listener for the channel message.
|
|
70
|
+
*
|
|
71
|
+
* @param {Socket} socket - The Socket.IO socket object.
|
|
72
|
+
* @param {string} wsManagementId - Unique identifier for the WebSocket management context.
|
|
73
|
+
* @returns {Promise<void>}
|
|
74
|
+
*/
|
|
75
|
+
async connection(socket, wsManagementId) {
|
|
76
|
+
try {
|
|
77
|
+
this.client[socket.id] = socket;
|
|
78
|
+
// Use bind/arrow function to maintain 'this' context for the controller
|
|
79
|
+
socket.on(this.channel, (...args) => this.controller(socket, args, wsManagementId));
|
|
80
|
+
await this.#IoInterface.connection(socket, this.client, wsManagementId);
|
|
81
|
+
logger.debug(`Socket ${socket.id} connected to channel ${this.channel}`);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
logger.error(error, { channel: this.channel, wsManagementId, stack: error.stack });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Handles incoming messages on the channel.
|
|
89
|
+
*
|
|
90
|
+
* @private
|
|
91
|
+
* @param {Socket} socket - The Socket.IO socket object.
|
|
92
|
+
* @param {any[]} args - The raw arguments received from the socket event.
|
|
93
|
+
* @param {string} wsManagementId - Unique identifier for the WebSocket management context.
|
|
94
|
+
* @returns {Promise<void>}
|
|
95
|
+
*/
|
|
96
|
+
async controller(socket, args, wsManagementId) {
|
|
97
|
+
try {
|
|
98
|
+
if (!args || args.length === 0) {
|
|
99
|
+
logger.warn(`No arguments received for channel: ${this.channel}`, { socketId: socket.id });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Determine if JSON parsing is needed based on the stream flag
|
|
103
|
+
const payload = this.#IoInterface.stream ? args[0] : JSON.parse(args[0]);
|
|
104
|
+
|
|
105
|
+
await this.#IoInterface.controller(socket, this.client, payload, wsManagementId, args);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.error(error, { channel: this.channel, wsManagementId, socketId: socket.id, args, stack: error.stack });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Handles a socket disconnection for this channel.
|
|
113
|
+
*
|
|
114
|
+
* @param {Socket} socket - The Socket.IO socket object.
|
|
115
|
+
* @param {string} reason - The reason for disconnection (e.g., 'client namespace disconnect').
|
|
116
|
+
* @param {string} wsManagementId - Unique identifier for the WebSocket management context.
|
|
117
|
+
* @returns {Promise<void>}
|
|
118
|
+
*/
|
|
119
|
+
async disconnect(socket, reason, wsManagementId) {
|
|
120
|
+
try {
|
|
121
|
+
await this.#IoInterface.disconnect(socket, this.client, reason, wsManagementId);
|
|
122
|
+
delete this.client[socket.id];
|
|
123
|
+
logger.debug(`Socket ${socket.id} disconnected from channel ${this.channel}. Reason: ${reason}`);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
logger.error(error, { channel: this.channel, wsManagementId, reason, socketId: socket.id, stack: error.stack });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Backward compatibility function to create a new channel instance.
|
|
132
|
+
* @memberof SocketIoInterface
|
|
133
|
+
* @function IoCreateChannel
|
|
134
|
+
* @param {ChannelInterface} IoInterface - The interface object defining the channel's behavior.
|
|
135
|
+
* @returns {IoChannel} An instance of the IoChannel class.
|
|
136
|
+
*/
|
|
137
|
+
const IoCreateChannel = (IoInterface) => new IoChannel(IoInterface);
|
|
138
|
+
|
|
139
|
+
export { IoChannel, IoCreateChannel };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module for creating and managing WebSocket servers.
|
|
3
|
+
* @module src/ws/IoServer
|
|
4
|
+
* @namespace SocketIoServer
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
import { Server } from 'socket.io';
|
|
10
|
+
import { loggerFactory } from '../server/logger.js';
|
|
11
|
+
import UnderpostStartUp from '../server/start.js';
|
|
12
|
+
|
|
13
|
+
import http from 'http';
|
|
14
|
+
|
|
15
|
+
const logger = loggerFactory(import.meta);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @class IoServerClass
|
|
19
|
+
* @alias IoServerClass
|
|
20
|
+
* @memberof SocketIoServer
|
|
21
|
+
* @classdesc Provides a static factory method to create and configure a Socket.IO server,
|
|
22
|
+
* encapsulating WebSocket server initialization logic and CORS configuration.
|
|
23
|
+
*/
|
|
24
|
+
class IoServerClass {
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new WebSocket server instance attached to an HTTP server.
|
|
27
|
+
*
|
|
28
|
+
* @static
|
|
29
|
+
* @param {http.Server} httpServer - The HTTP server instance to attach the WebSocket server to.
|
|
30
|
+
* @param {Object} options - Configuration options for the WebSocket server.
|
|
31
|
+
* @param {string[]} options.origins - List of allowed origins for Cross-Origin Resource Sharing (CORS).
|
|
32
|
+
* @param {string} options.path - The base path for the API. The WebSocket path ('/socket.io') will be appended to this.
|
|
33
|
+
* @param {function(import('socket.io').Socket): void} ConnectionHandler - The connection handler function to be executed on a new connection.
|
|
34
|
+
* @returns {Object} An object containing the final options and the server instance.
|
|
35
|
+
* @returns {import('socket.io').ServerOptions} return.options - The final options object used to create the WebSocket server.
|
|
36
|
+
* @returns {import('socket.io').Server} return.ioServer - The created and listening WebSocket server instance.
|
|
37
|
+
* @returns {object} return.meta - The module's import meta object (`import.meta`).
|
|
38
|
+
*/
|
|
39
|
+
static create(httpServer, options = {}, ConnectionHandler = () => {}) {
|
|
40
|
+
logger.info('origins', options.origins);
|
|
41
|
+
const wsOptions = {
|
|
42
|
+
cors: {
|
|
43
|
+
origins: options.origins,
|
|
44
|
+
methods: ['GET', 'POST', 'DELETE', 'PUT'],
|
|
45
|
+
allowedHeaders: [
|
|
46
|
+
'Access-Control-Allow-Headers',
|
|
47
|
+
'Access-Control-Allow-Origin',
|
|
48
|
+
'X-Requested-With',
|
|
49
|
+
'X-Access-Token',
|
|
50
|
+
'Content-Type',
|
|
51
|
+
'Host',
|
|
52
|
+
'Accept',
|
|
53
|
+
'Connection',
|
|
54
|
+
'Cache-Control',
|
|
55
|
+
'Authorization',
|
|
56
|
+
],
|
|
57
|
+
credentials: true,
|
|
58
|
+
},
|
|
59
|
+
// Ensure the path ends correctly, appending '/socket.io/'
|
|
60
|
+
path: options.path !== '/' ? `${options.path}/socket.io/` : '/socket.io/',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const ioServerInstance = UnderpostStartUp.API.listenServerFactory(() =>
|
|
64
|
+
new Server(httpServer, wsOptions).on('connection', ConnectionHandler),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
logger.info('Socket.IO Server created and listening', { path: wsOptions.path });
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
options: wsOptions,
|
|
71
|
+
meta: import.meta,
|
|
72
|
+
ioServer: ioServerInstance,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Backward compatibility export for the server creation function.
|
|
79
|
+
* @memberof SocketIoServer
|
|
80
|
+
* @function IoServer
|
|
81
|
+
* @param {http.Server} httpServer - The HTTP server instance.
|
|
82
|
+
* @param {Object} options - Configuration options.
|
|
83
|
+
* @param {function(import('socket.io').Socket): void} ConnectionHandler - The connection handler function.
|
|
84
|
+
* @returns {Object} The server configuration object.
|
|
85
|
+
*/
|
|
86
|
+
const IoServer = IoServerClass.create;
|
|
87
|
+
|
|
88
|
+
export { IoServerClass, IoServer };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loggerFactory } from '../../../server/logger.js';
|
|
2
|
+
import { IoCreateChannel } from '../../IoInterface.js';
|
|
3
|
+
import { CoreWsEmit } from '../core.ws.emit.js';
|
|
4
|
+
|
|
5
|
+
const channel = 'chat';
|
|
6
|
+
const logger = loggerFactory(import.meta);
|
|
7
|
+
|
|
8
|
+
const CoreWsChatController = {
|
|
9
|
+
channel,
|
|
10
|
+
controller: function (socket, client, payload, wsManagementId) {
|
|
11
|
+
for (const socketId of Object.keys(client)) {
|
|
12
|
+
if (socketId !== socket.id) {
|
|
13
|
+
CoreWsEmit(channel, client[socketId], { id: socket.id, ...payload });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
connection: function (socket, client, wsManagementId) {},
|
|
18
|
+
disconnect: function (socket, client, reason, wsManagementId) {},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const CoreWsChatChannel = IoCreateChannel(CoreWsChatController);
|
|
22
|
+
|
|
23
|
+
export { CoreWsChatChannel, CoreWsChatController };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { loggerFactory } from '../../../server/logger.js';
|
|
2
|
+
import { IoCreateChannel } from '../../IoInterface.js';
|
|
3
|
+
import { CoreWsMailerManagement } from '../management/core.ws.mailer.js';
|
|
4
|
+
|
|
5
|
+
const channel = 'mailer';
|
|
6
|
+
const logger = loggerFactory(import.meta);
|
|
7
|
+
|
|
8
|
+
const CoreWsMailerController = {
|
|
9
|
+
channel,
|
|
10
|
+
controller: function (socket, client, payload, wsManagementId) {
|
|
11
|
+
switch (payload.status) {
|
|
12
|
+
case 'register-user':
|
|
13
|
+
CoreWsMailerManagement.element[wsManagementId][socket.id] = {
|
|
14
|
+
model: {
|
|
15
|
+
user: payload.user,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
break;
|
|
19
|
+
case 'unregister-user':
|
|
20
|
+
delete CoreWsMailerManagement.element[wsManagementId][socket.id];
|
|
21
|
+
break;
|
|
22
|
+
|
|
23
|
+
default:
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
connection: function (socket, client, wsManagementId) {},
|
|
28
|
+
disconnect: function (socket, client, reason, wsManagementId) {
|
|
29
|
+
delete CoreWsMailerManagement.element[wsManagementId][socket.id];
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const CoreWsMailerChannel = IoCreateChannel(CoreWsMailerController);
|
|
34
|
+
|
|
35
|
+
export { CoreWsMailerChannel, CoreWsMailerController };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { loggerFactory } from '../../../server/logger.js';
|
|
2
|
+
import { IoCreateChannel } from '../../IoInterface.js';
|
|
3
|
+
import { CoreWsStreamManagement } from '../management/core.ws.stream.js';
|
|
4
|
+
|
|
5
|
+
const channel = 'stream';
|
|
6
|
+
const logger = loggerFactory(import.meta);
|
|
7
|
+
|
|
8
|
+
const CoreWsStreamController = {
|
|
9
|
+
channel,
|
|
10
|
+
stream: true,
|
|
11
|
+
controller: function (socket, client, payload, wsManagementId, args) {
|
|
12
|
+
const [roomId, userId] = args;
|
|
13
|
+
CoreWsStreamManagement.element[wsManagementId][socket.id] = args;
|
|
14
|
+
|
|
15
|
+
socket.join(roomId); // Join the room
|
|
16
|
+
socket.broadcast.emit(`${channel}-user-connected`, userId); // Tell everyone else in the room that we joined
|
|
17
|
+
},
|
|
18
|
+
connection: function (socket, client, wsManagementId) {
|
|
19
|
+
CoreWsStreamManagement.element[wsManagementId][socket.id] = [];
|
|
20
|
+
},
|
|
21
|
+
disconnect: function (socket, client, reason, wsManagementId) {
|
|
22
|
+
// Communicate the disconnection
|
|
23
|
+
const [roomId, userId] = CoreWsStreamManagement.element[wsManagementId][socket.id];
|
|
24
|
+
socket.broadcast.emit(`${channel}-user-disconnected`, userId);
|
|
25
|
+
delete CoreWsStreamManagement.element[wsManagementId][socket.id];
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const CoreWsStreamChannel = IoCreateChannel(CoreWsStreamController);
|
|
30
|
+
|
|
31
|
+
export { CoreWsStreamChannel, CoreWsStreamController };
|