cyberia 3.0.3 → 3.2.5
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/{.env.production → .env.example} +20 -4
- package/.github/workflows/engine-cyberia.cd.yml +43 -10
- package/.github/workflows/engine-cyberia.ci.yml +48 -26
- package/.github/workflows/ghpkg.ci.yml +5 -5
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +82 -0
- package/.github/workflows/npmpkg.ci.yml +60 -14
- package/.github/workflows/publish.ci.yml +26 -7
- package/.github/workflows/publish.cyberia.ci.yml +5 -5
- package/.github/workflows/pwa-microservices-template-page.cd.yml +6 -7
- package/.github/workflows/pwa-microservices-template-test.ci.yml +4 -4
- package/.github/workflows/release.cd.yml +14 -8
- package/.vscode/extensions.json +9 -8
- package/.vscode/settings.json +3 -2
- package/CHANGELOG.md +643 -1
- package/CLI-HELP.md +132 -57
- package/Dockerfile +4 -2
- package/README.md +347 -22
- package/WHITE-PAPER.md +1540 -0
- package/bin/build.js +21 -12
- package/bin/cyberia.js +2640 -106
- package/bin/deploy.js +258 -372
- package/bin/file.js +5 -1
- package/bin/index.js +2640 -106
- package/bin/vs.js +3 -3
- package/conf.js +169 -105
- package/deployment.yaml +236 -20
- package/hardhat/.env.example +31 -0
- package/hardhat/README.md +531 -0
- package/hardhat/WHITE-PAPER.md +1540 -0
- package/hardhat/contracts/ObjectLayerToken.sol +391 -0
- package/hardhat/deployments/.gitkeep +0 -0
- package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
- package/hardhat/hardhat.config.js +136 -0
- package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
- package/hardhat/networks/besu-object-layer.network.json +138 -0
- package/hardhat/package-lock.json +4323 -0
- package/hardhat/package.json +36 -0
- package/hardhat/scripts/deployObjectLayerToken.js +98 -0
- package/hardhat/test/ObjectLayerToken.js +592 -0
- package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
- package/hardhat/types/ethers-contracts/common.ts +92 -0
- package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
- package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
- package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
- package/hardhat/types/ethers-contracts/index.ts +6 -0
- package/jsdoc.dd-cyberia.json +68 -0
- package/jsdoc.json +65 -49
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +562 -0
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +297 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
- package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
- package/manifests/deployment/playwright/deployment.yaml +1 -1
- package/manifests/pv-pvc-dd.yaml +1 -1
- package/nodemon.json +1 -1
- package/package.json +60 -48
- package/proxy.yaml +118 -10
- package/pv-pvc.yaml +132 -0
- package/scripts/k3s-node-setup.sh +1 -1
- package/scripts/ports-ls.sh +2 -0
- package/scripts/rhel-grpc-setup.sh +56 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +47 -1
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +17 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
- package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
- package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
- package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
- package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
- package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
- package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
- package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
- package/src/api/cyberia-map/cyberia-map.model.js +30 -0
- package/src/api/cyberia-map/cyberia-map.router.js +40 -0
- package/src/api/cyberia-map/cyberia-map.service.js +74 -0
- package/src/api/document/document.service.js +1 -1
- package/src/api/file/file.controller.js +3 -1
- package/src/api/file/file.ref.json +18 -0
- package/src/api/file/file.service.js +28 -5
- package/src/api/ipfs/ipfs.controller.js +4 -25
- package/src/api/ipfs/ipfs.model.js +43 -34
- package/src/api/ipfs/ipfs.router.js +8 -13
- package/src/api/ipfs/ipfs.service.js +56 -104
- package/src/api/object-layer/README.md +347 -22
- package/src/api/object-layer/object-layer.controller.js +6 -2
- package/src/api/object-layer/object-layer.model.js +12 -8
- package/src/api/object-layer/object-layer.router.js +698 -42
- package/src/api/object-layer/object-layer.service.js +119 -37
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
- package/src/api/user/user.router.js +10 -5
- package/src/api/user/user.service.js +15 -14
- package/src/cli/baremetal.js +6 -10
- package/src/cli/cloud-init.js +0 -3
- package/src/cli/cluster.js +7 -7
- package/src/cli/db.js +723 -857
- package/src/cli/deploy.js +215 -105
- package/src/cli/env.js +34 -5
- package/src/cli/fs.js +5 -4
- package/src/cli/image.js +0 -3
- package/src/cli/index.js +83 -15
- package/src/cli/kubectl.js +211 -0
- package/src/cli/monitor.js +5 -6
- package/src/cli/release.js +284 -0
- package/src/cli/repository.js +708 -62
- package/src/cli/run.js +371 -151
- package/src/cli/secrets.js +73 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/test.js +3 -3
- package/src/client/Cryptokoyn.index.js +3 -4
- package/src/client/CyberiaPortal.index.js +3 -4
- package/src/client/Default.index.js +3 -4
- package/src/client/Itemledger.index.js +4 -963
- package/src/client/Underpost.index.js +3 -4
- package/src/client/components/core/AgGrid.js +20 -5
- package/src/client/components/core/Alert.js +2 -2
- package/src/client/components/core/AppStore.js +69 -0
- package/src/client/components/core/CalendarCore.js +2 -2
- package/src/client/components/core/Content.js +22 -3
- package/src/client/components/core/Docs.js +30 -6
- package/src/client/components/core/DropDown.js +137 -17
- package/src/client/components/core/FileExplorer.js +71 -4
- package/src/client/components/core/Input.js +1 -1
- package/src/client/components/core/Keyboard.js +2 -2
- package/src/client/components/core/LogIn.js +2 -2
- package/src/client/components/core/LogOut.js +2 -2
- package/src/client/components/core/Modal.js +20 -7
- package/src/client/components/core/Panel.js +0 -1
- package/src/client/components/core/PanelForm.js +19 -19
- package/src/client/components/core/RichText.js +1 -2
- package/src/client/components/core/SocketIo.js +82 -29
- package/src/client/components/core/SocketIoHandler.js +75 -0
- package/src/client/components/core/Stream.js +143 -95
- package/src/client/components/core/Webhook.js +40 -7
- package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
- package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
- package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
- package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
- package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
- package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +217 -30
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +104 -9
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
- package/src/client/components/default/AppStoreDefault.js +5 -0
- package/src/client/components/default/LogInDefault.js +3 -3
- package/src/client/components/default/LogOutDefault.js +2 -2
- package/src/client/components/default/MenuDefault.js +5 -5
- package/src/client/components/default/SocketIoDefault.js +3 -51
- package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
- package/src/client/components/itemledger/LogInItemledger.js +3 -3
- package/src/client/components/itemledger/LogOutItemledger.js +2 -2
- package/src/client/components/itemledger/MenuItemledger.js +3 -3
- package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
- package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
- package/src/client/components/underpost/CssUnderpost.js +59 -0
- package/src/client/components/underpost/LogInUnderpost.js +6 -3
- package/src/client/components/underpost/LogOutUnderpost.js +4 -2
- package/src/client/components/underpost/MenuUnderpost.js +104 -18
- package/src/client/components/underpost/RoutesUnderpost.js +2 -0
- package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
- package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
- package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
- package/src/client/public/cryptokoyn/microdata.json +85 -0
- package/src/client/public/cryptokoyn/site.webmanifest +57 -0
- package/src/client/public/cryptokoyn/sitemap +3 -3
- package/src/client/public/default/sitemap +3 -3
- package/src/client/public/itemledger/browserconfig.xml +2 -2
- package/src/client/public/itemledger/manifest.webmanifest +4 -4
- package/src/client/public/itemledger/microdata.json +71 -0
- package/src/client/public/itemledger/sitemap +3 -3
- package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
- package/src/client/public/test/sitemap +3 -3
- package/src/client/services/core/core.service.js +20 -8
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
- package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
- package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
- package/src/client/services/instance/instance.management.js +2 -2
- package/src/client/services/ipfs/ipfs.service.js +3 -23
- package/src/client/services/object-layer/object-layer.management.js +3 -3
- package/src/client/services/object-layer/object-layer.service.js +21 -0
- package/src/client/services/user/user.management.js +2 -2
- package/src/client/ssr/body/404.js +15 -11
- package/src/client/ssr/body/500.js +15 -11
- package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
- package/src/client/ssr/head/PwaItemledger.js +60 -0
- package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
- package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/pages/Test.js +11 -10
- package/src/client.build.js +0 -3
- package/src/client.dev.js +0 -3
- package/src/db/DataBaseProvider.js +17 -2
- package/src/db/mariadb/MariaDB.js +14 -9
- package/src/db/mongo/MongooseDB.js +17 -1
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
- package/src/grpc/cyberia/README.md +326 -0
- package/src/grpc/cyberia/grpc-server.js +530 -0
- package/src/index.js +24 -1
- package/src/proxy.js +0 -3
- package/src/runtime/express/Dockerfile +4 -0
- package/src/runtime/express/Express.js +33 -10
- package/src/runtime/lampp/Dockerfile +13 -2
- package/src/runtime/lampp/Lampp.js +33 -17
- package/src/runtime/wp/Dockerfile +68 -0
- package/src/runtime/wp/Wp.js +639 -0
- package/src/server/auth.js +36 -15
- package/src/server/backup.js +39 -12
- package/src/server/besu-genesis-generator.js +1630 -0
- package/src/server/client-build-docs.js +133 -17
- package/src/server/client-build-live.js +9 -18
- package/src/server/client-build.js +229 -101
- package/src/server/client-dev-server.js +14 -13
- package/src/server/client-formatted.js +109 -57
- package/src/server/conf.js +391 -164
- package/src/server/cron.js +27 -24
- package/src/server/dns.js +29 -12
- package/src/server/downloader.js +0 -2
- package/src/server/ipfs-client.js +24 -1
- package/src/server/logger.js +27 -9
- package/src/server/object-layer.js +217 -103
- package/src/server/peer.js +8 -2
- package/src/server/process.js +1 -50
- package/src/server/proxy.js +4 -8
- package/src/server/runtime.js +30 -9
- package/src/server/semantic-layer-generator-floor.js +359 -0
- package/src/server/semantic-layer-generator-skin.js +1294 -0
- package/src/server/semantic-layer-generator.js +116 -555
- package/src/server/ssr.js +0 -3
- package/src/server/start.js +19 -12
- package/src/server/tls.js +0 -2
- package/src/server.js +0 -4
- package/src/ws/IoInterface.js +1 -10
- package/src/ws/IoServer.js +14 -33
- package/src/ws/core/channels/core.ws.chat.js +65 -20
- package/src/ws/core/channels/core.ws.mailer.js +113 -32
- package/src/ws/core/channels/core.ws.stream.js +90 -31
- package/src/ws/core/core.ws.connection.js +12 -33
- package/src/ws/core/core.ws.emit.js +10 -26
- package/src/ws/core/core.ws.server.js +25 -58
- package/src/ws/default/channels/default.ws.main.js +53 -12
- package/src/ws/default/default.ws.connection.js +26 -13
- package/src/ws/default/default.ws.server.js +30 -12
- package/.env.development +0 -43
- package/.env.test +0 -43
- package/hardhat/contracts/CryptoKoyn.sol +0 -59
- package/hardhat/contracts/ItemLedger.sol +0 -73
- package/hardhat/contracts/Lock.sol +0 -34
- package/hardhat/hardhat.config.cjs +0 -45
- package/hardhat/ignition/modules/Lock.js +0 -18
- package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
- package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
- package/hardhat/scripts/deployItemledger.cjs +0 -25
- package/hardhat/test/Lock.js +0 -126
- package/hardhat/white-paper.md +0 -581
- package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
- package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
- package/src/client/components/default/ElementsDefault.js +0 -38
- package/src/client/components/itemledger/CommonItemledger.js +0 -29
- package/src/client/components/itemledger/ElementsItemledger.js +0 -38
- package/src/client/components/underpost/CommonUnderpost.js +0 -29
- package/src/client/components/underpost/ElementsUnderpost.js +0 -38
- package/src/ws/core/management/core.ws.chat.js +0 -8
- package/src/ws/core/management/core.ws.mailer.js +0 -16
- package/src/ws/core/management/core.ws.stream.js +0 -8
- package/src/ws/default/management/default.ws.main.js +0 -8
- package/white-paper.md +0 -581
package/src/server/ssr.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import fs from 'fs-extra';
|
|
8
|
-
import dotenv from 'dotenv';
|
|
9
8
|
import vm from 'node:vm';
|
|
10
9
|
|
|
11
10
|
import Underpost from '../index.js';
|
|
@@ -14,8 +13,6 @@ import { srcFormatted, JSONweb } from './client-formatted.js';
|
|
|
14
13
|
import { loggerFactory } from './logger.js';
|
|
15
14
|
import { getRootDirectory } from './process.js';
|
|
16
15
|
|
|
17
|
-
dotenv.config();
|
|
18
|
-
|
|
19
16
|
const logger = loggerFactory(import.meta);
|
|
20
17
|
|
|
21
18
|
/**
|
package/src/server/start.js
CHANGED
|
@@ -147,27 +147,33 @@ class UnderpostStartUp {
|
|
|
147
147
|
* @param {string} deployId - The ID of the deployment.
|
|
148
148
|
* @param {string} env - The environment of the deployment.
|
|
149
149
|
* @param {Object} options - Options for the build.
|
|
150
|
+
* @param {boolean} options.skipPullBase - Whether to skip pulling the base code and use the current workspace code directly.
|
|
150
151
|
* @param {boolean} options.underpostQuicklyInstall - Whether to use underpost quickly install.
|
|
151
152
|
* @memberof UnderpostStartUp
|
|
152
153
|
*/
|
|
153
|
-
async build(
|
|
154
|
+
async build(
|
|
155
|
+
deployId = 'dd-default',
|
|
156
|
+
env = 'development',
|
|
157
|
+
options = { underpostQuicklyInstall: false, skipPullBase: false },
|
|
158
|
+
) {
|
|
154
159
|
const buildBasePath = `/home/dd`;
|
|
155
160
|
const repoName = `engine-${deployId.split('-')[1]}`;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
if (!options.skipPullBase) {
|
|
162
|
+
shellExec(`cd ${buildBasePath} && underpost clone ${process.env.GITHUB_USERNAME}/${repoName}`);
|
|
163
|
+
shellExec(`mkdir -p ${buildBasePath}/engine`);
|
|
164
|
+
shellExec(`cd ${buildBasePath} && sudo cp -a ./${repoName}/. ./engine`);
|
|
165
|
+
shellExec(`cd ${buildBasePath} && sudo rm -rf ./${repoName}`);
|
|
166
|
+
}
|
|
162
167
|
shellCd(`${buildBasePath}/engine`);
|
|
168
|
+
Underpost.repo.privateEngineRepoFactory(deployId);
|
|
163
169
|
shellExec(options?.underpostQuicklyInstall ? `underpost install` : `npm install`);
|
|
164
|
-
shellExec(`node bin
|
|
170
|
+
shellExec(`node bin env ${deployId} ${env}`);
|
|
165
171
|
if (fs.existsSync('./engine-private/itc-scripts')) {
|
|
166
172
|
const itcScripts = await fs.readdir('./engine-private/itc-scripts');
|
|
167
173
|
for (const itcScript of itcScripts)
|
|
168
174
|
if (itcScript.match(deployId)) shellExec(`node ./engine-private/itc-scripts/${itcScript}`);
|
|
169
175
|
}
|
|
170
|
-
shellExec(`node bin
|
|
176
|
+
shellExec(`node bin client ${deployId}`);
|
|
171
177
|
},
|
|
172
178
|
/**
|
|
173
179
|
* Runs a deployment.
|
|
@@ -177,19 +183,20 @@ class UnderpostStartUp {
|
|
|
177
183
|
* @memberof UnderpostStartUp
|
|
178
184
|
*/
|
|
179
185
|
async run(deployId = 'dd-default', env = 'development', options = {}) {
|
|
180
|
-
const runCmd = env === 'production' ? 'run prod
|
|
186
|
+
const runCmd = env === 'production' ? 'run prod:container' : 'run dev:container';
|
|
181
187
|
if (fs.existsSync(`./engine-private/replica`)) {
|
|
182
188
|
const replicas = await fs.readdir(`./engine-private/replica`);
|
|
183
189
|
for (const replica of replicas) {
|
|
184
190
|
if (!replica.match(deployId)) continue;
|
|
185
|
-
shellExec(`node bin
|
|
191
|
+
shellExec(`node bin env ${replica} ${env}`);
|
|
186
192
|
shellExec(`npm ${runCmd} ${replica}`, { async: true });
|
|
187
193
|
await awaitDeployMonitor(true);
|
|
188
194
|
}
|
|
189
195
|
}
|
|
190
|
-
shellExec(`node bin
|
|
196
|
+
shellExec(`node bin env ${deployId} ${env}`);
|
|
191
197
|
shellExec(`npm ${runCmd} ${deployId}`, { async: true });
|
|
192
198
|
await awaitDeployMonitor(true);
|
|
199
|
+
if (env === 'production' && Underpost.env.isInsideContainer()) Underpost.secret.globalSecretClean();
|
|
193
200
|
Underpost.env.set('container-status', `${deployId}-${env}-running-deployment`);
|
|
194
201
|
},
|
|
195
202
|
};
|
package/src/server/tls.js
CHANGED
|
@@ -7,10 +7,8 @@
|
|
|
7
7
|
import fs from 'fs-extra';
|
|
8
8
|
import https from 'https';
|
|
9
9
|
import path from 'path';
|
|
10
|
-
import dotenv from 'dotenv';
|
|
11
10
|
import { loggerFactory } from './logger.js';
|
|
12
11
|
|
|
13
|
-
dotenv.config();
|
|
14
12
|
const logger = loggerFactory(import.meta);
|
|
15
13
|
|
|
16
14
|
const DEFAULT_HOST = 'localhost';
|
package/src/server.js
CHANGED
|
@@ -3,15 +3,11 @@
|
|
|
3
3
|
// https://nodejs.org/api
|
|
4
4
|
// https://expressjs.com/en/4x/api.html
|
|
5
5
|
|
|
6
|
-
import dotenv from 'dotenv';
|
|
7
6
|
import { loggerFactory } from './server/logger.js';
|
|
8
7
|
import { buildClient } from './server/client-build.js';
|
|
9
8
|
import { buildRuntime } from './server/runtime.js';
|
|
10
9
|
import { ProcessController } from './server/process.js';
|
|
11
10
|
import { Config } from './server/conf.js';
|
|
12
|
-
|
|
13
|
-
dotenv.config();
|
|
14
|
-
|
|
15
11
|
await Config.build();
|
|
16
12
|
|
|
17
13
|
const logger = loggerFactory(import.meta);
|
package/src/ws/IoInterface.js
CHANGED
|
@@ -126,13 +126,4 @@ class IoChannel {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
* Backward compatibility function to create a new channel instance.
|
|
131
|
-
* @memberof SocketIoInterface
|
|
132
|
-
* @function IoCreateChannel
|
|
133
|
-
* @param {ChannelInterface} IoInterface - The interface object defining the channel's behavior.
|
|
134
|
-
* @returns {IoChannel} An instance of the IoChannel class.
|
|
135
|
-
*/
|
|
136
|
-
const IoCreateChannel = (IoInterface) => new IoChannel(IoInterface);
|
|
137
|
-
|
|
138
|
-
export { IoChannel, IoCreateChannel };
|
|
129
|
+
export { IoChannel };
|
package/src/ws/IoServer.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Module for creating and managing WebSocket servers.
|
|
3
|
-
* @module
|
|
4
|
-
* @namespace SocketIoServer
|
|
3
|
+
* @module ws/IoServer
|
|
5
4
|
*/
|
|
6
5
|
|
|
7
6
|
'use strict';
|
|
@@ -9,33 +8,27 @@
|
|
|
9
8
|
import { Server } from 'socket.io';
|
|
10
9
|
import { loggerFactory } from '../server/logger.js';
|
|
11
10
|
import Underpost from '../index.js';
|
|
12
|
-
import http from 'http';
|
|
13
11
|
|
|
14
12
|
const logger = loggerFactory(import.meta);
|
|
15
13
|
|
|
16
14
|
/**
|
|
17
|
-
* @class
|
|
18
|
-
* @
|
|
19
|
-
*
|
|
20
|
-
* @classdesc Provides a static factory method to create and configure a Socket.IO server,
|
|
21
|
-
* encapsulating WebSocket server initialization logic and CORS configuration.
|
|
15
|
+
* @class IoServer
|
|
16
|
+
* @classdesc Factory for creating and configuring Socket.IO server instances
|
|
17
|
+
* with CORS configuration and HTTP server attachment.
|
|
22
18
|
*/
|
|
23
|
-
class
|
|
19
|
+
class IoServer {
|
|
24
20
|
/**
|
|
25
21
|
* Creates a new WebSocket server instance attached to an HTTP server.
|
|
26
22
|
*
|
|
27
23
|
* @static
|
|
28
|
-
* @param {http.Server} httpServer - The HTTP server instance to attach
|
|
29
|
-
* @param {Object} options - Configuration options
|
|
30
|
-
* @param {string[]} options.origins -
|
|
31
|
-
* @param {string} options.path -
|
|
32
|
-
* @param {function(import('socket.io').Socket): void}
|
|
33
|
-
* @returns {
|
|
34
|
-
* @returns {import('socket.io').ServerOptions} return.options - The final options object used to create the WebSocket server.
|
|
35
|
-
* @returns {import('socket.io').Server} return.ioServer - The created and listening WebSocket server instance.
|
|
36
|
-
* @returns {object} return.meta - The module's import meta object (`import.meta`).
|
|
24
|
+
* @param {import('http').Server} httpServer - The HTTP server instance to attach to.
|
|
25
|
+
* @param {Object} options - Configuration options.
|
|
26
|
+
* @param {string[]} options.origins - Allowed CORS origins.
|
|
27
|
+
* @param {string} options.path - Base API path. Socket.IO path is appended automatically.
|
|
28
|
+
* @param {function(import('socket.io').Socket): void} connectionHandler - Handler for new connections.
|
|
29
|
+
* @returns {{ options: import('socket.io').ServerOptions, ioServer: import('socket.io').Server, meta: ImportMeta }}
|
|
37
30
|
*/
|
|
38
|
-
static create(httpServer, options = {},
|
|
31
|
+
static create(httpServer, options = {}, connectionHandler = () => {}) {
|
|
39
32
|
logger.info('origins', options.origins);
|
|
40
33
|
const wsOptions = {
|
|
41
34
|
cors: {
|
|
@@ -55,12 +48,11 @@ class IoServerClass {
|
|
|
55
48
|
],
|
|
56
49
|
credentials: true,
|
|
57
50
|
},
|
|
58
|
-
// Ensure the path ends correctly, appending '/socket.io/'
|
|
59
51
|
path: options.path !== '/' ? `${options.path}/socket.io/` : '/socket.io/',
|
|
60
52
|
};
|
|
61
53
|
|
|
62
54
|
const ioServerInstance = Underpost.start.listenServerFactory(() =>
|
|
63
|
-
new Server(httpServer, wsOptions).on('connection',
|
|
55
|
+
new Server(httpServer, wsOptions).on('connection', connectionHandler),
|
|
64
56
|
);
|
|
65
57
|
|
|
66
58
|
logger.info('Socket.IO Server created and listening', { path: wsOptions.path });
|
|
@@ -73,15 +65,4 @@ class IoServerClass {
|
|
|
73
65
|
}
|
|
74
66
|
}
|
|
75
67
|
|
|
76
|
-
|
|
77
|
-
* Backward compatibility export for the server creation function.
|
|
78
|
-
* @memberof SocketIoServer
|
|
79
|
-
* @function IoServer
|
|
80
|
-
* @param {http.Server} httpServer - The HTTP server instance.
|
|
81
|
-
* @param {Object} options - Configuration options.
|
|
82
|
-
* @param {function(import('socket.io').Socket): void} ConnectionHandler - The connection handler function.
|
|
83
|
-
* @returns {Object} The server configuration object.
|
|
84
|
-
*/
|
|
85
|
-
const IoServer = IoServerClass.create;
|
|
86
|
-
|
|
87
|
-
export { IoServerClass, IoServer };
|
|
68
|
+
export { IoServer };
|
|
@@ -1,23 +1,68 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Chat WebSocket channel — broadcasts messages to all connected sockets except the sender.
|
|
3
|
+
* @module ws/core/channels/core.ws.chat
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IoChannel } from '../../IoInterface.js';
|
|
7
|
+
import { CoreWsEmitter } from '../core.ws.emit.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @class CoreWsChatChannel
|
|
11
|
+
* @classdesc Manages the chat WebSocket channel with per-instance state.
|
|
12
|
+
* Broadcasts incoming messages to all other connected sockets.
|
|
13
|
+
*/
|
|
14
|
+
class CoreWsChatChannel {
|
|
15
|
+
/** @type {Object.<string, Object>} Per-instance state keyed by wsManagementId. */
|
|
16
|
+
static #state = {};
|
|
17
|
+
|
|
18
|
+
/** @type {IoChannel} */
|
|
19
|
+
static #io = new IoChannel({
|
|
20
|
+
channel: 'chat',
|
|
21
|
+
controller(socket, client, payload, wsManagementId) {
|
|
22
|
+
for (const socketId of Object.keys(client)) {
|
|
23
|
+
if (socketId !== socket.id) {
|
|
24
|
+
CoreWsEmitter.emit('chat', client[socketId], { id: socket.id, ...payload });
|
|
25
|
+
}
|
|
14
26
|
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/** @returns {Object.<string, import('socket.io').Socket>} Connected sockets map. */
|
|
31
|
+
static get client() {
|
|
32
|
+
return this.#io.client;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** @returns {string} Channel name. */
|
|
36
|
+
static get channel() {
|
|
37
|
+
return this.#io.channel;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Initializes state for a server instance.
|
|
42
|
+
* @param {string} wsManagementId - Unique server context ID.
|
|
43
|
+
*/
|
|
44
|
+
static init(wsManagementId) {
|
|
45
|
+
this.#state[wsManagementId] = {};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Registers a socket connection.
|
|
50
|
+
* @param {import('socket.io').Socket} socket
|
|
51
|
+
* @param {string} wsManagementId
|
|
52
|
+
*/
|
|
53
|
+
static connection(socket, wsManagementId) {
|
|
54
|
+
return this.#io.connection(socket, wsManagementId);
|
|
55
|
+
}
|
|
20
56
|
|
|
21
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Handles socket disconnection.
|
|
59
|
+
* @param {import('socket.io').Socket} socket
|
|
60
|
+
* @param {string} reason
|
|
61
|
+
* @param {string} wsManagementId
|
|
62
|
+
*/
|
|
63
|
+
static disconnect(socket, reason, wsManagementId) {
|
|
64
|
+
return this.#io.disconnect(socket, reason, wsManagementId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
22
67
|
|
|
23
|
-
export { CoreWsChatChannel
|
|
68
|
+
export { CoreWsChatChannel };
|
|
@@ -1,35 +1,116 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Mailer WebSocket channel — manages user↔socket bidirectional mapping
|
|
3
|
+
* for targeted real-time pushes (e.g. email confirmation notifications).
|
|
4
|
+
* @module ws/core/channels/core.ws.mailer
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { IoChannel } from '../../IoInterface.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @class CoreWsMailerChannel
|
|
11
|
+
* @classdesc Manages the mailer WebSocket channel with O(1) user↔socket lookup.
|
|
12
|
+
* Handles register/unregister messages and cleanup on disconnect.
|
|
13
|
+
*/
|
|
14
|
+
class CoreWsMailerChannel {
|
|
15
|
+
/** @type {Object.<string, Object.<string, { model: { user: Object } }>>} Socket data keyed by `[wsManagementId][socketId]`. */
|
|
16
|
+
static #data = {};
|
|
17
|
+
|
|
18
|
+
/** @type {Object.<string, Object.<string, string>>} Reverse index: `[wsManagementId][userId]` → socketId. */
|
|
19
|
+
static #userIndex = {};
|
|
20
|
+
|
|
21
|
+
/** @type {IoChannel} */
|
|
22
|
+
static #io = new IoChannel({
|
|
23
|
+
channel: 'mailer',
|
|
24
|
+
controller(socket, client, payload, wsManagementId) {
|
|
25
|
+
switch (payload.status) {
|
|
26
|
+
case 'register-user':
|
|
27
|
+
CoreWsMailerChannel.setUser(wsManagementId, socket.id, payload.user);
|
|
28
|
+
break;
|
|
29
|
+
case 'unregister-user':
|
|
30
|
+
CoreWsMailerChannel.removeSocket(wsManagementId, socket.id);
|
|
31
|
+
break;
|
|
32
|
+
default:
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
disconnect(socket, client, reason, wsManagementId) {
|
|
37
|
+
CoreWsMailerChannel.removeSocket(wsManagementId, socket.id);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/** @returns {Object.<string, import('socket.io').Socket>} Connected sockets map. */
|
|
42
|
+
static get client() {
|
|
43
|
+
return this.#io.client;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** @returns {string} Channel name. */
|
|
47
|
+
static get channel() {
|
|
48
|
+
return this.#io.channel;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Initializes state for a server instance.
|
|
53
|
+
* @param {string} wsManagementId - Unique server context ID (`${host}${path}`).
|
|
54
|
+
*/
|
|
55
|
+
static init(wsManagementId) {
|
|
56
|
+
this.#data[wsManagementId] = {};
|
|
57
|
+
this.#userIndex[wsManagementId] = {};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Registers a socket connection.
|
|
62
|
+
* @param {import('socket.io').Socket} socket
|
|
63
|
+
* @param {string} wsManagementId
|
|
64
|
+
*/
|
|
65
|
+
static connection(socket, wsManagementId) {
|
|
66
|
+
return this.#io.connection(socket, wsManagementId);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Handles socket disconnection.
|
|
71
|
+
* @param {import('socket.io').Socket} socket
|
|
72
|
+
* @param {string} reason
|
|
73
|
+
* @param {string} wsManagementId
|
|
74
|
+
*/
|
|
75
|
+
static disconnect(socket, reason, wsManagementId) {
|
|
76
|
+
return this.#io.disconnect(socket, reason, wsManagementId);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Registers a user↔socket mapping.
|
|
81
|
+
* @param {string} wsManagementId
|
|
82
|
+
* @param {string} socketId
|
|
83
|
+
* @param {Object} user - User data with `_id` property.
|
|
84
|
+
*/
|
|
85
|
+
static setUser(wsManagementId, socketId, user) {
|
|
86
|
+
this.#data[wsManagementId][socketId] = { model: { user } };
|
|
87
|
+
if (user?._id) {
|
|
88
|
+
this.#userIndex[wsManagementId][user._id.toString()] = socketId;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Removes a socket entry and its reverse user index.
|
|
94
|
+
* @param {string} wsManagementId
|
|
95
|
+
* @param {string} socketId
|
|
96
|
+
*/
|
|
97
|
+
static removeSocket(wsManagementId, socketId) {
|
|
98
|
+
const entry = this.#data[wsManagementId]?.[socketId];
|
|
99
|
+
if (entry?.model?.user?._id) {
|
|
100
|
+
delete this.#userIndex[wsManagementId][entry.model.user._id.toString()];
|
|
25
101
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
disconnect: function (socket, client, reason, wsManagementId) {
|
|
29
|
-
delete CoreWsMailerManagement.element[wsManagementId][socket.id];
|
|
30
|
-
},
|
|
31
|
-
};
|
|
102
|
+
delete this.#data[wsManagementId]?.[socketId];
|
|
103
|
+
}
|
|
32
104
|
|
|
33
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Finds the socket ID for a user (O(1) reverse index lookup).
|
|
107
|
+
* @param {string} wsManagementId
|
|
108
|
+
* @param {string} userId - The user `_id`.
|
|
109
|
+
* @returns {string|undefined} Socket ID, or `undefined` if not connected.
|
|
110
|
+
*/
|
|
111
|
+
static getUserWsId(wsManagementId, userId) {
|
|
112
|
+
return this.#userIndex[wsManagementId]?.[userId];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
34
115
|
|
|
35
|
-
export { CoreWsMailerChannel
|
|
116
|
+
export { CoreWsMailerChannel };
|
|
@@ -1,31 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Stream WebSocket channel — manages per-socket room membership and user tracking.
|
|
3
|
+
* @module ws/core/channels/core.ws.stream
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IoChannel } from '../../IoInterface.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @class CoreWsStreamChannel
|
|
10
|
+
* @classdesc Manages the stream WebSocket channel. Each socket can join a room
|
|
11
|
+
* and broadcast connection/disconnection events to other room members.
|
|
12
|
+
*/
|
|
13
|
+
class CoreWsStreamChannel {
|
|
14
|
+
/** @type {Object.<string, Object.<string, Array>>} Per-socket room/user args keyed by `[wsManagementId][socketId]`. */
|
|
15
|
+
static #state = {};
|
|
16
|
+
|
|
17
|
+
/** @type {IoChannel} */
|
|
18
|
+
static #io = new IoChannel({
|
|
19
|
+
channel: 'stream',
|
|
20
|
+
stream: true,
|
|
21
|
+
controller(socket, client, payload, wsManagementId, args) {
|
|
22
|
+
const [roomId, userId] = args;
|
|
23
|
+
|
|
24
|
+
// Collect existing users in the room before registering the new one
|
|
25
|
+
const existingUsers = [];
|
|
26
|
+
for (const entry of Object.values(CoreWsStreamChannel.#state[wsManagementId])) {
|
|
27
|
+
if (entry[0] === roomId && entry[1]) existingUsers.push(entry[1]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
CoreWsStreamChannel.#state[wsManagementId][socket.id] = args;
|
|
31
|
+
socket.join(roomId);
|
|
32
|
+
socket.to(roomId).emit('stream-user-connected', userId);
|
|
33
|
+
|
|
34
|
+
// Tell the joining user about everyone already in the room
|
|
35
|
+
if (existingUsers.length > 0) socket.emit('stream-existing-users', existingUsers);
|
|
36
|
+
},
|
|
37
|
+
connection(socket, client, wsManagementId) {
|
|
38
|
+
CoreWsStreamChannel.#state[wsManagementId][socket.id] = [];
|
|
39
|
+
},
|
|
40
|
+
disconnect(socket, client, reason, wsManagementId) {
|
|
41
|
+
const entry = CoreWsStreamChannel.#state[wsManagementId]?.[socket.id];
|
|
42
|
+
if (!entry || entry.length === 0) {
|
|
43
|
+
if (CoreWsStreamChannel.#state[wsManagementId]) delete CoreWsStreamChannel.#state[wsManagementId][socket.id];
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const [roomId, userId] = entry;
|
|
47
|
+
socket.to(roomId).emit('stream-user-disconnected', userId);
|
|
48
|
+
delete CoreWsStreamChannel.#state[wsManagementId][socket.id];
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
/** @returns {Object.<string, import('socket.io').Socket>} Connected sockets map. */
|
|
53
|
+
static get client() {
|
|
54
|
+
return this.#io.client;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** @returns {string} Channel name. */
|
|
58
|
+
static get channel() {
|
|
59
|
+
return this.#io.channel;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Initializes state for a server instance.
|
|
64
|
+
* @param {string} wsManagementId - Unique server context ID (`${host}${path}`).
|
|
65
|
+
*/
|
|
66
|
+
static init(wsManagementId) {
|
|
67
|
+
this.#state[wsManagementId] = {};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Registers a socket connection.
|
|
72
|
+
* @param {import('socket.io').Socket} socket
|
|
73
|
+
* @param {string} wsManagementId
|
|
74
|
+
*/
|
|
75
|
+
static connection(socket, wsManagementId) {
|
|
76
|
+
return this.#io.connection(socket, wsManagementId);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Handles socket disconnection.
|
|
81
|
+
* @param {import('socket.io').Socket} socket
|
|
82
|
+
* @param {string} reason
|
|
83
|
+
* @param {string} wsManagementId
|
|
84
|
+
*/
|
|
85
|
+
static disconnect(socket, reason, wsManagementId) {
|
|
86
|
+
return this.#io.disconnect(socket, reason, wsManagementId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { CoreWsStreamChannel };
|
|
@@ -1,47 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* @module ws/core.ws.connection
|
|
4
|
-
* @namespace CoreWsConnection
|
|
2
|
+
* Core WebSocket connection handler — wires sockets to all channels.
|
|
3
|
+
* @module ws/core/core.ws.connection
|
|
5
4
|
*/
|
|
6
5
|
|
|
7
6
|
import { loggerFactory } from '../../server/logger.js';
|
|
8
7
|
import { CoreWsChatChannel } from './channels/core.ws.chat.js';
|
|
9
8
|
import { CoreWsMailerChannel } from './channels/core.ws.mailer.js';
|
|
10
9
|
import { CoreWsStreamChannel } from './channels/core.ws.stream.js';
|
|
11
|
-
import { Socket } from 'socket.io'; // Added for JSDoc type hinting
|
|
12
10
|
|
|
13
11
|
const logger = loggerFactory(import.meta);
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
|
-
* @class
|
|
17
|
-
* @
|
|
18
|
-
*
|
|
19
|
-
* @classdesc Manages the lifecycle of a new WebSocket connection, setting up listeners for
|
|
20
|
-
* all registered channels (Chat, Mailer, Stream) and handling disconnection by delegating to channel handlers.
|
|
14
|
+
* @class CoreWsConnectionHandler
|
|
15
|
+
* @classdesc Subscribes a new socket to all core channels (chat, mailer, stream)
|
|
16
|
+
* and delegates disconnect events to each channel.
|
|
21
17
|
*/
|
|
22
|
-
class
|
|
18
|
+
class CoreWsConnectionHandler {
|
|
23
19
|
/**
|
|
24
|
-
* Handles a new WebSocket connection
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @static
|
|
28
|
-
* @param {Socket} socket - The Socket.IO socket object representing the client connection.
|
|
29
|
-
* @param {string} wsManagementId - Unique identifier for the WebSocket management context.
|
|
30
|
-
* @returns {void}
|
|
20
|
+
* Handles a new WebSocket connection.
|
|
21
|
+
* @param {import('socket.io').Socket} socket
|
|
22
|
+
* @param {string} wsManagementId
|
|
31
23
|
*/
|
|
32
|
-
static
|
|
24
|
+
static handle(socket, wsManagementId) {
|
|
33
25
|
logger.info(`New connection established. Socket ID: ${socket.id}`);
|
|
34
26
|
|
|
35
|
-
// Subscribe socket to all channel connection handlers (assuming these channels are IoChannel instances)
|
|
36
27
|
CoreWsChatChannel.connection(socket, wsManagementId);
|
|
37
28
|
CoreWsMailerChannel.connection(socket, wsManagementId);
|
|
38
29
|
CoreWsStreamChannel.connection(socket, wsManagementId);
|
|
39
30
|
|
|
40
|
-
// Set up the disconnect listener
|
|
41
31
|
socket.on('disconnect', (reason) => {
|
|
42
|
-
logger.info(`Connection disconnected. Socket ID: ${socket.id}
|
|
32
|
+
logger.info(`Connection disconnected. Socket ID: ${socket.id}, reason: ${reason}`);
|
|
43
33
|
|
|
44
|
-
// Notify all channels of the disconnection
|
|
45
34
|
CoreWsChatChannel.disconnect(socket, reason, wsManagementId);
|
|
46
35
|
CoreWsMailerChannel.disconnect(socket, reason, wsManagementId);
|
|
47
36
|
CoreWsStreamChannel.disconnect(socket, reason, wsManagementId);
|
|
@@ -49,14 +38,4 @@ class CoreWsConnectionManager {
|
|
|
49
38
|
}
|
|
50
39
|
}
|
|
51
40
|
|
|
52
|
-
|
|
53
|
-
* Backward compatibility export for the connection handler function.
|
|
54
|
-
* @memberof CoreWsConnection
|
|
55
|
-
* @function CoreWsConnection
|
|
56
|
-
* @param {Socket} socket - The Socket.IO socket object.
|
|
57
|
-
* @param {string} wsManagementId - Unique identifier for the WebSocket management context.
|
|
58
|
-
* @returns {void}
|
|
59
|
-
*/
|
|
60
|
-
const CoreWsConnection = CoreWsConnectionManager.handleConnection;
|
|
61
|
-
|
|
62
|
-
export { CoreWsConnectionManager, CoreWsConnection };
|
|
41
|
+
export { CoreWsConnectionHandler };
|