cyberia 3.1.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.
Files changed (208) hide show
  1. package/.env.example +0 -2
  2. package/.github/workflows/engine-cyberia.cd.yml +10 -8
  3. package/.github/workflows/engine-cyberia.ci.yml +12 -29
  4. package/.github/workflows/ghpkg.ci.yml +4 -4
  5. package/.github/workflows/npmpkg.ci.yml +28 -11
  6. package/.github/workflows/publish.ci.yml +21 -2
  7. package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -5
  8. package/.github/workflows/pwa-microservices-template-test.ci.yml +3 -3
  9. package/.github/workflows/release.cd.yml +13 -8
  10. package/CHANGELOG.md +433 -1
  11. package/CLI-HELP.md +57 -7
  12. package/Dockerfile +4 -2
  13. package/README.md +347 -22
  14. package/bin/build.js +5 -2
  15. package/bin/cyberia.js +1789 -112
  16. package/bin/deploy.js +177 -124
  17. package/bin/file.js +3 -0
  18. package/bin/index.js +1789 -112
  19. package/conf.js +64 -8
  20. package/deployment.yaml +92 -20
  21. package/hardhat/hardhat.config.js +13 -13
  22. package/hardhat/ignition/modules/ObjectLayerToken.js +1 -1
  23. package/hardhat/package-lock.json +2554 -5859
  24. package/hardhat/package.json +13 -22
  25. package/hardhat/scripts/deployObjectLayerToken.js +1 -1
  26. package/hardhat/test/ObjectLayerToken.js +4 -2
  27. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  28. package/hardhat/types/ethers-contracts/common.ts +92 -0
  29. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  30. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  31. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  32. package/hardhat/types/ethers-contracts/index.ts +6 -0
  33. package/jsdoc.dd-cyberia.json +64 -55
  34. package/jsdoc.json +64 -55
  35. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
  36. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
  37. package/manifests/deployment/dd-cyberia-development/deployment.yaml +92 -20
  38. package/manifests/deployment/dd-cyberia-development/proxy.yaml +54 -18
  39. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  40. package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
  41. package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
  42. package/manifests/deployment/playwright/deployment.yaml +1 -1
  43. package/nodemon.json +1 -1
  44. package/package.json +22 -16
  45. package/proxy.yaml +54 -18
  46. package/scripts/rhel-grpc-setup.sh +56 -0
  47. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +44 -0
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +16 -0
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
  51. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  52. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  53. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  54. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  55. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  56. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  57. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  58. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  59. package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
  60. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  61. package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
  62. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  63. package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
  64. package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
  65. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  66. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
  67. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
  68. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  69. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
  70. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  71. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  72. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  73. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  74. package/src/api/file/file.ref.json +18 -0
  75. package/src/api/ipfs/ipfs.controller.js +4 -25
  76. package/src/api/ipfs/ipfs.model.js +43 -34
  77. package/src/api/ipfs/ipfs.router.js +8 -13
  78. package/src/api/ipfs/ipfs.service.js +54 -102
  79. package/src/api/object-layer/README.md +347 -22
  80. package/src/api/object-layer/object-layer.router.js +30 -0
  81. package/src/api/object-layer/object-layer.service.js +114 -31
  82. package/src/api/user/user.service.js +8 -7
  83. package/src/cli/cluster.js +7 -7
  84. package/src/cli/db.js +710 -827
  85. package/src/cli/deploy.js +151 -93
  86. package/src/cli/env.js +29 -0
  87. package/src/cli/fs.js +5 -2
  88. package/src/cli/index.js +48 -2
  89. package/src/cli/kubectl.js +211 -0
  90. package/src/cli/release.js +284 -0
  91. package/src/cli/repository.js +438 -75
  92. package/src/cli/run.js +195 -35
  93. package/src/cli/secrets.js +73 -0
  94. package/src/cli/test.js +3 -3
  95. package/src/client/Cryptokoyn.index.js +3 -4
  96. package/src/client/CyberiaPortal.index.js +3 -4
  97. package/src/client/Default.index.js +3 -4
  98. package/src/client/Itemledger.index.js +3 -4
  99. package/src/client/Underpost.index.js +3 -4
  100. package/src/client/components/core/AppStore.js +69 -0
  101. package/src/client/components/core/CalendarCore.js +2 -2
  102. package/src/client/components/core/DropDown.js +137 -17
  103. package/src/client/components/core/Keyboard.js +2 -2
  104. package/src/client/components/core/LogIn.js +2 -2
  105. package/src/client/components/core/LogOut.js +2 -2
  106. package/src/client/components/core/Modal.js +0 -1
  107. package/src/client/components/core/Panel.js +0 -1
  108. package/src/client/components/core/PanelForm.js +19 -19
  109. package/src/client/components/core/SocketIo.js +82 -29
  110. package/src/client/components/core/SocketIoHandler.js +75 -0
  111. package/src/client/components/core/Stream.js +143 -95
  112. package/src/client/components/core/Webhook.js +40 -7
  113. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  114. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
  115. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
  116. package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
  117. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  118. package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
  119. package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
  120. package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
  121. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
  122. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  123. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +216 -30
  124. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -3
  125. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
  126. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +40 -7
  127. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +4 -0
  128. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  129. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  130. package/src/client/components/default/AppStoreDefault.js +5 -0
  131. package/src/client/components/default/LogInDefault.js +3 -3
  132. package/src/client/components/default/LogOutDefault.js +2 -2
  133. package/src/client/components/default/MenuDefault.js +5 -5
  134. package/src/client/components/default/SocketIoDefault.js +3 -51
  135. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  136. package/src/client/components/itemledger/LogInItemledger.js +3 -3
  137. package/src/client/components/itemledger/LogOutItemledger.js +2 -2
  138. package/src/client/components/itemledger/MenuItemledger.js +3 -3
  139. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  140. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  141. package/src/client/components/underpost/LogInUnderpost.js +3 -3
  142. package/src/client/components/underpost/LogOutUnderpost.js +2 -2
  143. package/src/client/components/underpost/MenuUnderpost.js +5 -5
  144. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  145. package/src/client/services/core/core.service.js +20 -8
  146. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
  147. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  148. package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
  149. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  150. package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
  151. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
  152. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  153. package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
  154. package/src/client/services/instance/instance.management.js +2 -2
  155. package/src/client/services/ipfs/ipfs.service.js +3 -23
  156. package/src/client/services/object-layer/object-layer.management.js +3 -3
  157. package/src/client/services/object-layer/object-layer.service.js +21 -0
  158. package/src/client/services/user/user.management.js +2 -2
  159. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  160. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
  161. package/src/grpc/cyberia/README.md +326 -0
  162. package/src/grpc/cyberia/grpc-server.js +530 -0
  163. package/src/index.js +24 -1
  164. package/src/runtime/express/Dockerfile +4 -0
  165. package/src/runtime/express/Express.js +18 -1
  166. package/src/runtime/lampp/Dockerfile +13 -2
  167. package/src/runtime/lampp/Lampp.js +27 -4
  168. package/src/runtime/wp/Dockerfile +68 -0
  169. package/src/runtime/wp/Wp.js +639 -0
  170. package/src/server/auth.js +24 -1
  171. package/src/server/backup.js +37 -9
  172. package/src/server/client-build-docs.js +9 -2
  173. package/src/server/client-build.js +31 -31
  174. package/src/server/client-formatted.js +109 -57
  175. package/src/server/conf.js +24 -9
  176. package/src/server/cron.js +25 -23
  177. package/src/server/dns.js +2 -1
  178. package/src/server/ipfs-client.js +24 -1
  179. package/src/server/object-layer.js +149 -108
  180. package/src/server/peer.js +8 -0
  181. package/src/server/runtime.js +25 -1
  182. package/src/server/semantic-layer-generator-floor.js +359 -0
  183. package/src/server/semantic-layer-generator-skin.js +1294 -0
  184. package/src/server/semantic-layer-generator.js +116 -555
  185. package/src/server/start.js +2 -2
  186. package/src/ws/IoInterface.js +1 -10
  187. package/src/ws/IoServer.js +14 -33
  188. package/src/ws/core/channels/core.ws.chat.js +65 -20
  189. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  190. package/src/ws/core/channels/core.ws.stream.js +90 -31
  191. package/src/ws/core/core.ws.connection.js +12 -33
  192. package/src/ws/core/core.ws.emit.js +10 -26
  193. package/src/ws/core/core.ws.server.js +25 -58
  194. package/src/ws/default/channels/default.ws.main.js +53 -12
  195. package/src/ws/default/default.ws.connection.js +26 -13
  196. package/src/ws/default/default.ws.server.js +30 -12
  197. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  198. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  199. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  200. package/src/client/components/default/ElementsDefault.js +0 -38
  201. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  202. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  203. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  204. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  205. package/src/ws/core/management/core.ws.chat.js +0 -8
  206. package/src/ws/core/management/core.ws.mailer.js +0 -16
  207. package/src/ws/core/management/core.ws.stream.js +0 -8
  208. package/src/ws/default/management/default.ws.main.js +0 -8
package/src/cli/run.js CHANGED
@@ -4,7 +4,8 @@
4
4
  * @namespace UnderpostRun
5
5
  */
6
6
 
7
- import { daemonProcess, getTerminalPid, shellCd, shellExec } from '../server/process.js';
7
+ import { daemonProcess, getTerminalPid, pbcopy, shellCd, shellExec } from '../server/process.js';
8
+ import crypto from 'crypto';
8
9
  import {
9
10
  awaitDeployMonitor,
10
11
  buildKindPorts,
@@ -17,12 +18,31 @@ import {
17
18
  import { actionInitLog, loggerFactory } from '../server/logger.js';
18
19
 
19
20
  import fs from 'fs-extra';
21
+ import net from 'net';
20
22
  import { range, setPad, timer } from '../client/components/core/CommonJs.js';
21
23
 
22
24
  import os from 'os';
23
25
  import Underpost from '../index.js';
24
26
  import dotenv from 'dotenv';
25
27
 
28
+ const waitForPort = (port, host = '127.0.0.1', { maxAttempts = 30, interval = 2000 } = {}) =>
29
+ new Promise((resolve, reject) => {
30
+ let attempts = 0;
31
+ const tryConnect = () => {
32
+ attempts++;
33
+ const socket = net.createConnection({ port, host }, () => {
34
+ socket.destroy();
35
+ resolve();
36
+ });
37
+ socket.on('error', () => {
38
+ socket.destroy();
39
+ if (attempts >= maxAttempts) return reject(new Error(`Port ${port} not ready after ${maxAttempts} attempts`));
40
+ setTimeout(tryConnect, interval);
41
+ });
42
+ };
43
+ tryConnect();
44
+ });
45
+
26
46
  const logger = loggerFactory(import.meta);
27
47
 
28
48
  /**
@@ -154,6 +174,8 @@ const DEFAULT_OPTION = {
154
174
  createJobNow: false,
155
175
  fromNCommit: 0,
156
176
  hostAliases: '',
177
+ gitClean: false,
178
+ copy: false,
157
179
  };
158
180
 
159
181
  /**
@@ -246,8 +268,15 @@ class UnderpostRun {
246
268
  const ports = '6379,27017';
247
269
  shellExec(`node bin run kill '${ports}'`);
248
270
  shellExec(`node bin run dev-cluster --dev --expose --namespace ${options.namespace}`, { async: true });
249
- console.log('Loading fordward services...');
250
- await timer(5000);
271
+ logger.info('Waiting for port-forward services to be ready...');
272
+ try {
273
+ await Promise.all([waitForPort(27017), waitForPort(6379)]);
274
+ logger.info('Port-forward services are ready');
275
+ } catch (err) {
276
+ logger.error('Port-forward services failed to become ready', { error: err.message });
277
+ shellExec(`node bin run kill '${ports}'`);
278
+ throw err;
279
+ }
251
280
  shellExec(`node bin metadata --generate ${path}`);
252
281
  shellExec(`node bin db --dev --clean-fs-collection dd`);
253
282
  shellExec(`node bin run kill '${ports}'`);
@@ -373,8 +402,12 @@ class UnderpostRun {
373
402
  }
374
403
  shellExec(`${baseCommand} run pull`);
375
404
 
376
- // Capture last N commit messages for propagation (default: last 1 commit)
377
- const fromN = options.fromNCommit && parseInt(options.fromNCommit) > 0 ? parseInt(options.fromNCommit) : 1;
405
+ // Capture last N commit messages for propagation.
406
+ // When --from-n-commit is not set, auto-detect unpushed commit count (same as --unpush flag).
407
+ const fromN =
408
+ options.fromNCommit && parseInt(options.fromNCommit) > 0
409
+ ? parseInt(options.fromNCommit)
410
+ : Underpost.repo.getUnpushedCount('.').count;
378
411
  const message = shellExec(`node bin cmt --changelog ${fromN} --changelog-no-hash`, {
379
412
  silent: true,
380
413
  stdout: true,
@@ -423,6 +456,40 @@ class UnderpostRun {
423
456
  });
424
457
  },
425
458
 
459
+ /**
460
+ * @method template-deploy-local
461
+ * @description Similar to `template-deploy` but runs the workflow locally without dispatching GitHub Actions. It pulls the latest changes, pushes to GitHub, builds the template, and optionally triggers a local release with CI push.
462
+ * @param {string} path - The deployment path identifier (e.g., 'sync-engine-core', 'init-engine-core', or empty for build-only).
463
+ * @param {Object} options - The default underpost runner options for customizing workflow
464
+ * @memberof UnderpostRun
465
+ */
466
+ 'template-deploy-local': async (path, options = DEFAULT_OPTION) => {
467
+ const baseCommand = options.dev ? 'node bin' : 'underpost';
468
+ shellExec(`npm run security:secrets`);
469
+ const reportPath = './gitleaks-report.json';
470
+ if (fs.existsSync(reportPath) && JSON.parse(fs.readFileSync(reportPath, 'utf8')).length > 0) {
471
+ logger.error('Secrets detected in gitleaks-report.json, aborting template-deploy');
472
+ return;
473
+ }
474
+ shellExec(`${baseCommand} run pull`);
475
+
476
+ // Capture last N commit messages from the engine repo.
477
+ // When --from-n-commit is not set, auto-detect unpushed commit count (same as --unpush flag).
478
+ const fromN =
479
+ options.fromNCommit && parseInt(options.fromNCommit) > 0
480
+ ? parseInt(options.fromNCommit)
481
+ : Underpost.repo.getUnpushedCount('.').count;
482
+ const rawMessage = shellExec(`node bin cmt --changelog ${fromN} --changelog-no-hash`, {
483
+ silent: true,
484
+ stdout: true,
485
+ }).trim();
486
+ const sanitizedMessage = Underpost.repo.sanitizeChangelogMessage(rawMessage);
487
+
488
+ const { triggerCmd } = path
489
+ ? await Underpost.release.ci(path, sanitizedMessage, options)
490
+ : await Underpost.release.pwa(sanitizedMessage, options);
491
+ pbcopy(triggerCmd + ' && cd /home/dd/engine');
492
+ },
426
493
  /**
427
494
  * @method template-deploy-image
428
495
  * @description Dispatches the Docker image CI workflow for the `engine` repository.
@@ -438,6 +505,21 @@ class UnderpostRun {
438
505
  inputs: {},
439
506
  });
440
507
  },
508
+ /**
509
+ * @method docker-image
510
+ * @description Dispatches the Docker image CI workflow (`docker-image.ci.yml`) for the `engine` repository via `workflow_dispatch`.
511
+ * @param {string} path - The input value, identifier, or path for the operation.
512
+ * @param {Object} options - The default underpost runner options for customizing workflow
513
+ * @memberof UnderpostRun
514
+ */
515
+ 'docker-image': (path, options = DEFAULT_OPTION) => {
516
+ Underpost.repo.dispatchWorkflow({
517
+ repo: `${process.env.GITHUB_USERNAME}/engine`,
518
+ workflowFile: 'docker-image.ci.yml',
519
+ ref: 'master',
520
+ inputs: {},
521
+ });
522
+ },
441
523
  /**
442
524
  * @method clean
443
525
  * @description Changes directory to the provided path (defaulting to `/home/dd/engine`) and runs `node bin/deploy clean-core-repo`.
@@ -572,6 +654,7 @@ echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com
572
654
  const env = options.dev ? 'development' : 'production';
573
655
  const baseCommand = options.dev ? 'node bin' : 'underpost';
574
656
  const baseClusterCommand = options.dev ? ' --dev' : '';
657
+ const clusterFlag = options.k3s ? ' --k3s' : options.kind ? ' --kind' : ' --kubeadm';
575
658
  const defaultPath = [
576
659
  'dd-default',
577
660
  options.replicas,
@@ -592,7 +675,8 @@ echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com
592
675
  if (!validVersion) throw new Error('Version mismatch');
593
676
  }
594
677
  if (options.timezone !== 'none') shellExec(`${baseCommand} run${baseClusterCommand} tz`);
595
- if (options.deployIdCronJobs !== 'none') shellExec(`node bin cron --dev --setup-start --apply`);
678
+ if (options.deployIdCronJobs !== 'none')
679
+ shellExec(`node bin cron${baseClusterCommand}${clusterFlag} --setup-start --git --apply`);
596
680
  }
597
681
 
598
682
  const currentTraffic = isDeployRunnerContext(path, options)
@@ -605,20 +689,25 @@ echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com
605
689
  const cmdString = options.cmd
606
690
  ? ' --cmd ' + (options.cmd.find((c) => c.match('"')) ? '"' + options.cmd + '"' : "'" + options.cmd + "'")
607
691
  : '';
692
+ const gitCleanFlag = options.gitClean ? ' --git-clean' : '';
608
693
 
609
694
  shellExec(
610
- `${baseCommand} deploy --kubeadm --build-manifest --sync --info-router --replicas ${replicas} --node ${node}${
695
+ `${baseCommand} deploy${clusterFlag} --build-manifest --sync --info-router --replicas ${replicas} --node ${node}${
611
696
  image ? ` --image ${image}` : ''
612
697
  }${versions ? ` --versions ${versions}` : ''}${
613
698
  options.namespace ? ` --namespace ${options.namespace}` : ''
614
- }${timeoutFlags}${cmdString} ${deployId} ${env}`,
699
+ }${timeoutFlags}${cmdString}${gitCleanFlag} ${deployId} ${env}`,
615
700
  );
616
701
 
617
702
  if (isDeployRunnerContext(path, options)) {
703
+ // Backup app/services repositories with repo-backup configured
704
+ shellExec(
705
+ `${baseCommand} db ${deployId} ${clusterFlag}${baseClusterCommand} --repo-backup --primary-pod --git --force-clone --preserveUUID ${options.namespace ? ` --ns ${options.namespace}` : ''}`,
706
+ );
618
707
  shellExec(
619
- `${baseCommand} deploy --kubeadm${cmdString} --replicas ${replicas} --disable-update-proxy ${deployId} ${env} --versions ${versions}${
708
+ `${baseCommand} deploy${clusterFlag}${cmdString} --replicas ${replicas} --disable-update-proxy ${deployId} ${env} --versions ${versions}${
620
709
  options.namespace ? ` --namespace ${options.namespace}` : ''
621
- }${timeoutFlags}`,
710
+ }${timeoutFlags}${gitCleanFlag}`,
622
711
  );
623
712
  if (!targetTraffic)
624
713
  targetTraffic = Underpost.deploy.getCurrentTraffic(deployId, { namespace: options.namespace });
@@ -830,6 +919,7 @@ echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com
830
919
  const confInstances = JSON.parse(
831
920
  fs.readFileSync(`./engine-private/conf/${deployId}/conf.instances.json`, 'utf8'),
832
921
  );
922
+ let promotedTraffic = '';
833
923
  for (const instance of confInstances) {
834
924
  let {
835
925
  id: _id,
@@ -849,6 +939,7 @@ echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com
849
939
  namespace: options.namespace,
850
940
  });
851
941
  const targetTraffic = currentTraffic ? (currentTraffic === 'blue' ? 'green' : 'blue') : 'blue';
942
+ promotedTraffic = targetTraffic;
852
943
  let proxyYaml =
853
944
  Underpost.deploy.baseProxyYamlFactory({ host: _host, env: options.tls ? 'production' : env, options }) +
854
945
  Underpost.deploy.deploymentYamlServiceFactory({
@@ -874,6 +965,18 @@ EOF
874
965
  { disableLog: true },
875
966
  );
876
967
  }
968
+ // Refresh the gRPC service to ensure it points to the parent deploy's current traffic.
969
+ if (promotedTraffic) {
970
+ const parentTraffic = Underpost.deploy.getCurrentTraffic(deployId, { namespace: options.namespace }) || 'blue';
971
+ const grpcServicePath = Underpost.deploy.buildGrpcServiceManifest({
972
+ deployId,
973
+ env,
974
+ confServer: loadConfServerJson(`./engine-private/conf/${deployId}/conf.server.json`),
975
+ namespace: options.namespace,
976
+ traffic: [parentTraffic],
977
+ });
978
+ if (grpcServicePath) shellExec(`kubectl apply -f ${grpcServicePath} -n ${options.namespace}`);
979
+ }
877
980
  },
878
981
 
879
982
  /**
@@ -913,12 +1016,12 @@ EOF
913
1016
  // `localhost/rockylinux9-underpost:${Underpost.version}`
914
1017
  if (!_image) _image = `underpost/underpost-engine:${Underpost.version}`;
915
1018
 
916
- if (options.nodeName) {
917
- shellExec(`sudo crictl pull ${_image}`);
918
- } else {
919
- shellExec(`docker pull ${_image}`);
920
- shellExec(`sudo kind load docker-image ${_image}`);
921
- }
1019
+ Underpost.image.pullDockerHubImage({
1020
+ dockerhubImage: _image,
1021
+ kind: options.kind || (!options.nodeName && !options.kubeadm && !options.k3s),
1022
+ kubeadm: options.nodeName || options.kubeadm,
1023
+ k3s: options.k3s,
1024
+ });
922
1025
 
923
1026
  const currentTraffic = Underpost.deploy.getCurrentTraffic(_deployId, {
924
1027
  hostTest: _host,
@@ -927,7 +1030,7 @@ EOF
927
1030
 
928
1031
  const targetTraffic = currentTraffic ? (currentTraffic === 'blue' ? 'green' : 'blue') : 'blue';
929
1032
  const podId = `${_deployId}-${env}-${targetTraffic}`;
930
- const ignorePods = Underpost.deploy.get(podId, 'pods', options.namespace).map((p) => p.NAME);
1033
+ const ignorePods = Underpost.kubectl.get(podId, 'pods', options.namespace).map((p) => p.NAME);
931
1034
  Underpost.deploy.configMap(env, options.namespace);
932
1035
  shellExec(`kubectl delete service ${podId}-service --namespace ${options.namespace} --ignore-not-found`);
933
1036
  shellExec(`kubectl delete deployment ${podId} --namespace ${options.namespace} --ignore-not-found`);
@@ -939,7 +1042,30 @@ EOF
939
1042
  env,
940
1043
  version: targetTraffic,
941
1044
  nodeName: options.nodeName,
1045
+ clusterContext: options.k3s ? 'k3s' : options.kubeadm ? 'kubeadm' : 'kind',
1046
+ gitClean: options.gitClean || false,
942
1047
  });
1048
+ // Regenerate the parent deploy's gRPC ClusterIP service pointing to the
1049
+ // parent's current traffic colour and apply it before the instance pod starts so
1050
+ // DNS is resolvable the moment the pod boots.
1051
+ const parentTraffic = Underpost.deploy.getCurrentTraffic(deployId, { namespace: options.namespace }) || 'blue';
1052
+ const grpcServicePath = Underpost.deploy.buildGrpcServiceManifest({
1053
+ deployId,
1054
+ env,
1055
+ confServer: loadConfServerJson(`./engine-private/conf/${deployId}/conf.server.json`),
1056
+ namespace: options.namespace,
1057
+ traffic: [targetTraffic],
1058
+ host: _host,
1059
+ });
1060
+ if (grpcServicePath) shellExec(`kubectl apply -f ${grpcServicePath} -n ${options.namespace}`);
1061
+
1062
+ const resolvedCmd = _cmd[env].map((c) =>
1063
+ c.replaceAll(
1064
+ '{{grpc-service-dns}}',
1065
+ `${deployId}-grpc-service-${env}-${parentTraffic}.${options.namespace || 'default'}.svc.cluster.local:50051`,
1066
+ ),
1067
+ );
1068
+
943
1069
  let deploymentYaml = `---
944
1070
  ${Underpost.deploy
945
1071
  .deploymentYamlPartsFactory({
@@ -951,7 +1077,7 @@ ${Underpost.deploy
951
1077
  image: _image,
952
1078
  namespace: options.namespace,
953
1079
  volumes: _volumes,
954
- cmd: _cmd[env],
1080
+ cmd: resolvedCmd,
955
1081
  })
956
1082
  .replace('{{ports}}', buildKindPorts(_fromPort, _toPort))}
957
1083
  `;
@@ -997,7 +1123,7 @@ EOF
997
1123
  * @memberof UnderpostRun
998
1124
  */
999
1125
  'ls-deployments': async (path, options = DEFAULT_OPTION) => {
1000
- console.table(await Underpost.deploy.get(path, 'deployments', options.namespace));
1126
+ console.table(await Underpost.kubectl.get(path, 'deployments', options.namespace));
1001
1127
  },
1002
1128
 
1003
1129
  /**
@@ -1091,15 +1217,13 @@ EOF
1091
1217
  'db-client': async (path, options = DEFAULT_OPTION) => {
1092
1218
  const { underpostRoot } = options;
1093
1219
 
1094
- const image = 'adminer:4.7.6-standalone';
1095
-
1096
- if (!options.kubeadm && !options.k3s) {
1097
- // Only load if not kubeadm/k3s (Kind needs it)
1098
- shellExec(`docker pull ${image}`);
1099
- shellExec(`sudo kind load docker-image ${image}`);
1100
- } else if (options.kubeadm || options.k3s)
1101
- // For kubeadm/k3s, ensure it's available for containerd
1102
- shellExec(`sudo crictl pull ${image}`);
1220
+ Underpost.image.pullDockerHubImage({
1221
+ dockerhubImage: 'adminer',
1222
+ version: '4.7.6-standalone',
1223
+ kind: options.kind,
1224
+ kubeadm: options.kubeadm,
1225
+ k3s: options.k3s,
1226
+ });
1103
1227
 
1104
1228
  shellExec(`kubectl delete deployment adminer -n ${options.namespace} --ignore-not-found`);
1105
1229
  shellExec(`kubectl apply -k ${underpostRoot}/manifests/deployment/adminer/. -n ${options.namespace}`);
@@ -1662,7 +1786,7 @@ EOF
1662
1786
  : [
1663
1787
  `npm install -g npm@11.2.0`,
1664
1788
  `npm install -g underpost`,
1665
- `${baseCommand} secret underpost --create-from-file /etc/config/.env.${env}`,
1789
+ `${baseCommand} secret underpost --create-from-env`,
1666
1790
  `${baseCommand} start --build --run ${deployId} ${env}`,
1667
1791
  ];
1668
1792
  shellExec(`node bin run sync${baseClusterCommand} --deploy-id-cron-jobs none dd-test --cmd "${cmd}"`);
@@ -1693,7 +1817,7 @@ EOF
1693
1817
 
1694
1818
  const { close } = await (async () => {
1695
1819
  const checkAwaitPath = '/await';
1696
- while (!Underpost.deploy.existsContainerFile({ podName, path: checkAwaitPath })) {
1820
+ while (!Underpost.kubectl.existsFile({ podName, path: checkAwaitPath })) {
1697
1821
  logger.info('monitor', checkAwaitPath);
1698
1822
  await timer(1000);
1699
1823
  }
@@ -1720,7 +1844,7 @@ EOF
1720
1844
  logger.info('monitor', checkPath);
1721
1845
  {
1722
1846
  const checkAwaitPath = `/home/dd/docs${checkPath}`;
1723
- while (!Underpost.deploy.existsContainerFile({ podName, path: checkAwaitPath })) {
1847
+ while (!Underpost.kubectl.existsFile({ podName, path: checkAwaitPath })) {
1724
1848
  logger.info('waiting for', checkAwaitPath);
1725
1849
  await timer(1000);
1726
1850
  }
@@ -1786,7 +1910,8 @@ EOF
1786
1910
 
1787
1911
  shellCd(dir);
1788
1912
 
1789
- shellExec(`git init && git add . && git commit -m "Base implementation"`);
1913
+ Underpost.repo.initLocalRepo({ path: dir });
1914
+ shellExec(`git add . && git commit -m "Base implementation"`);
1790
1915
  shellExec(`chmod +x ./replace_params.sh`);
1791
1916
  shellExec(`chmod +x ./build.sh`);
1792
1917
 
@@ -1831,11 +1956,46 @@ EOF
1831
1956
  * @param {Object} options - The default underpost runner options for customizing workflow
1832
1957
  * @memberof UnderpostRun
1833
1958
  */
1959
+ /**
1960
+ * @method generate-pass
1961
+ * @description Generates a cryptographically secure random password that satisfies all validatePassword
1962
+ * constraints (lowercase, uppercase, digit, special char, min 8 chars). Logs the plain password
1963
+ * to the console or, when `--copy` is set, copies it to the clipboard via pbcopy.
1964
+ * @param {string} path - Optional password length (default: 16).
1965
+ * @param {Object} options - The default underpost runner options for customizing workflow.
1966
+ * @param {boolean} options.copy - When true, copies to clipboard instead of logging.
1967
+ * @memberof UnderpostRun
1968
+ */
1969
+ 'generate-pass': (path, options = DEFAULT_OPTION) => {
1970
+ const length = path && parseInt(path) > 0 ? parseInt(path) : 16;
1971
+ const lower = 'abcdefghijklmnopqrstuvwxyz';
1972
+ const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
1973
+ const digits = '0123456789';
1974
+ const special = '@#$%^&*()_+';
1975
+ const all = lower + upper + digits + special;
1976
+ const buf = crypto.randomBytes(length + 4);
1977
+ // Guarantee at least one character from each required class
1978
+ const chars = [
1979
+ lower[buf[0] % lower.length],
1980
+ upper[buf[1] % upper.length],
1981
+ digits[buf[2] % digits.length],
1982
+ special[buf[3] % special.length],
1983
+ ];
1984
+ for (let i = 4; i < length; i++) chars.push(all[buf[i] % all.length]);
1985
+ // Fisher-Yates shuffle using an independent random buffer
1986
+ const shuf = crypto.randomBytes(length);
1987
+ for (let i = chars.length - 1; i > 0; i--) {
1988
+ const j = shuf[i % shuf.length] % (i + 1);
1989
+ [chars[i], chars[j]] = [chars[j], chars[i]];
1990
+ }
1991
+ const password = chars.join('');
1992
+ if (options.copy) pbcopy(password);
1993
+ else console.log(password);
1994
+ },
1995
+
1834
1996
  secret: (path, options = DEFAULT_OPTION) => {
1835
1997
  const secretPath = path ? path : `/home/dd/engine/engine-private/conf/dd-cron/.env.production`;
1836
- const command = options.dev
1837
- ? `node bin secret underpost --create-from-file ${secretPath}`
1838
- : `underpost secret underpost --create-from-file ${secretPath}`;
1998
+ const command = `node bin secret underpost --create-from-file ${secretPath}`;
1839
1999
  shellExec(command);
1840
2000
  },
1841
2001
  /**
@@ -8,6 +8,10 @@ import { shellExec } from '../server/process.js';
8
8
  import fs from 'fs-extra';
9
9
  import dotenv from 'dotenv';
10
10
  import Underpost from '../index.js';
11
+ import { loadConf } from '../server/conf.js';
12
+ import { loggerFactory } from '../server/logger.js';
13
+
14
+ const logger = loggerFactory(import.meta);
11
15
 
12
16
  /**
13
17
  * @class UnderpostSecret
@@ -23,11 +27,80 @@ class UnderpostSecret {
23
27
  */
24
28
  underpost: {
25
29
  createFromEnvFile(envPath) {
30
+ Underpost.env.clean();
26
31
  const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
27
32
  for (const key of Object.keys(envObj)) {
28
33
  Underpost.env.set(key, envObj[key]);
29
34
  }
30
35
  },
36
+ /** Reads application secrets from process.env (injected via envFrom: secretRef)
37
+ * and writes them to the underpost .env file, filtering out known system and
38
+ * Kubernetes-injected environment variables. Replaces the fragile shell-based
39
+ * `printenv | grep -vE` pattern with a maintainable Node.js blocklist.
40
+ */
41
+ createFromContainerEnv() {
42
+ Underpost.env.clean();
43
+ const systemKeys = new Set([
44
+ 'HOME',
45
+ 'HOSTNAME',
46
+ 'PATH',
47
+ 'TERM',
48
+ 'SHLVL',
49
+ 'PWD',
50
+ '_',
51
+ 'LANG',
52
+ 'LANGUAGE',
53
+ 'LC_ALL',
54
+ 'container',
55
+ 'SHELL',
56
+ 'USER',
57
+ 'LOGNAME',
58
+ 'MAIL',
59
+ 'OLDPWD',
60
+ 'LESSOPEN',
61
+ 'LESSCLOSE',
62
+ 'LS_COLORS',
63
+ 'DISPLAY',
64
+ 'COLORTERM',
65
+ 'EDITOR',
66
+ 'VISUAL',
67
+ 'TERM_PROGRAM',
68
+ 'TERM_PROGRAM_VERSION',
69
+ 'SSH_AUTH_SOCK',
70
+ 'SSH_CLIENT',
71
+ 'SSH_CONNECTION',
72
+ 'SSH_TTY',
73
+ 'XDG_SESSION_ID',
74
+ 'XDG_RUNTIME_DIR',
75
+ 'XDG_DATA_DIRS',
76
+ 'XDG_CONFIG_DIRS',
77
+ 'DBUS_SESSION_BUS_ADDRESS',
78
+ 'GPG_AGENT_INFO',
79
+ 'WINDOWID',
80
+ 'DESKTOP_SESSION',
81
+ 'SESSION_MANAGER',
82
+ 'XAUTHORITY',
83
+ 'WAYLAND_DISPLAY',
84
+ 'which_declare',
85
+ ]);
86
+ const systemKeyPrefixes = ['KUBERNETES_', 'npm_', 'NODE_'];
87
+ for (const [key, value] of Object.entries(process.env)) {
88
+ if (systemKeys.has(key)) continue;
89
+ if (systemKeyPrefixes.some((prefix) => key.startsWith(prefix))) continue;
90
+ Underpost.env.set(key, value);
91
+ }
92
+ },
93
+ },
94
+
95
+ /**
96
+ * Removes all filesystem traces of secrets after deployment startup.
97
+ * Centralizes the defense-in-depth cleanup performed
98
+ * @memberof UnderpostSecret
99
+ */
100
+ globalSecretClean() {
101
+ loadConf('clean');
102
+ Underpost.repo.cleanupPrivateEngineRepo();
103
+ Underpost.env.clean();
31
104
  },
32
105
  };
33
106
  }
package/src/cli/test.js CHANGED
@@ -81,7 +81,7 @@ class UnderpostTest {
81
81
  return await Underpost.test.statusMonitor(options.podName, options.podStatus, options.kindType);
82
82
 
83
83
  if (options.sh === true || options.logs === true) {
84
- const [pod] = Underpost.deploy.get(deployList);
84
+ const [pod] = Underpost.kubectl.get(deployList);
85
85
  if (pod) {
86
86
  if (options.sh) return pbcopy(`sudo kubectl exec -it ${pod.NAME} -- sh`);
87
87
  if (options.logs) return shellExec(`sudo kubectl logs -f ${pod.NAME}`);
@@ -115,7 +115,7 @@ class UnderpostTest {
115
115
  break;
116
116
  }
117
117
  else {
118
- const pods = Underpost.deploy.get(deployId);
118
+ const pods = Underpost.kubectl.get(deployId);
119
119
  if (pods.length > 0)
120
120
  for (const deployData of pods) {
121
121
  const { NAME } = deployData;
@@ -145,7 +145,7 @@ class UnderpostTest {
145
145
  logger.info(`Loading instance`, { podName, status, kindType, deltaMs, maxAttempts });
146
146
  const _monitor = async () => {
147
147
  await timer(deltaMs);
148
- const pods = Underpost.deploy.get(podName, kindType);
148
+ const pods = Underpost.kubectl.get(podName, kindType);
149
149
  let result = pods.find((p) => p.STATUS === status || (status === 'Running' && p.STATUS === 'Completed'));
150
150
  logger.info(
151
151
  `Testing pod ${podName}... ${result ? 1 : 0}/1 - elapsed time ${deltaMs * (index + 1)}s - attempt ${
@@ -10,10 +10,9 @@ import { MenuCryptokoyn } from './components/cryptokoyn/MenuCryptokoyn.js';
10
10
  import { RouterCryptokoyn } from './components/cryptokoyn/RoutesCryptokoyn.js';
11
11
  import { Worker } from './components/core/Worker.js';
12
12
  import { Keyboard } from './components/core/Keyboard.js';
13
- import { CryptokoynParams } from './components/cryptokoyn/CommonCryptokoyn.js';
14
13
  import { SocketIo } from './components/core/SocketIo.js';
15
14
  import { SocketIoCryptokoyn } from './components/cryptokoyn/SocketIoCryptokoyn.js';
16
- import { ElementsCryptokoyn } from './components/cryptokoyn/ElementsCryptokoyn.js';
15
+ import { AppStoreCryptokoyn } from './components/cryptokoyn/AppStoreCryptokoyn.js';
17
16
  import { CssCryptokoynDark, CssCryptokoynLight } from './components/cryptokoyn/CssCryptokoyn.js';
18
17
 
19
18
  window.onload = () =>
@@ -24,11 +23,11 @@ window.onload = () =>
24
23
  await TranslateCore.Init();
25
24
  await Responsive.Init();
26
25
  await MenuCryptokoyn.Render();
27
- await SocketIo.Init({ channels: ElementsCryptokoyn.Data });
26
+ await SocketIo.Init({ channels: AppStoreCryptokoyn.Data });
28
27
  await SocketIoCryptokoyn.Init();
29
28
  await LogInCryptokoyn();
30
29
  await LogOutCryptokoyn();
31
30
  await SignUpCryptokoyn();
32
- await Keyboard.Init({ callBackTime: CryptokoynParams.EVENT_CALLBACK_TIME });
31
+ await Keyboard.Init();
33
32
  },
34
33
  });
@@ -13,9 +13,8 @@ import { Worker } from './components/core/Worker.js';
13
13
  import { CssCyberiaDark, CssCyberiaLight } from './components/cyberia-portal/CssCyberiaPortal.js';
14
14
  import { SocketIoCyberiaPortal } from './components/cyberia-portal/SocketIoCyberiaPortal.js';
15
15
  import { SocketIo } from './components/core/SocketIo.js';
16
- import { ElementsCyberiaPortal } from './components/cyberia-portal/ElementsCyberiaPortal.js';
16
+ import { AppStoreCyberiaPortal } from './components/cyberia-portal/AppStoreCyberiaPortal.js';
17
17
  import { Keyboard } from './components/core/Keyboard.js';
18
- import { CyberiaPortalParams } from './components/cyberia-portal/CommonCyberiaPortal.js';
19
18
 
20
19
  window.onload = () =>
21
20
  Worker.instance({
@@ -26,11 +25,11 @@ window.onload = () =>
26
25
  await TranslateCyberiaPortal.Init();
27
26
  await Responsive.Init();
28
27
  await MenuCyberiaPortal.Render();
29
- await SocketIo.Init({ channels: ElementsCyberiaPortal.Data });
28
+ await SocketIo.Init({ channels: AppStoreCyberiaPortal.Data });
30
29
  await SocketIoCyberiaPortal.Init();
31
30
  await LogInCyberiaPortal();
32
31
  await LogOutCyberiaPortal();
33
32
  await SignUpCyberiaPortal();
34
- await Keyboard.Init({ callBackTime: CyberiaPortalParams.EVENT_CALLBACK_TIME });
33
+ await Keyboard.Init();
35
34
  },
36
35
  });
@@ -11,10 +11,9 @@ import { RouterDefault } from './components/default/RoutesDefault.js';
11
11
  import { TranslateDefault } from './components/default/TranslateDefault.js';
12
12
  import { Worker } from './components/core/Worker.js';
13
13
  import { Keyboard } from './components/core/Keyboard.js';
14
- import { DefaultParams } from './components/default/CommonDefault.js';
15
14
  import { SocketIo } from './components/core/SocketIo.js';
16
15
  import { SocketIoDefault } from './components/default/SocketIoDefault.js';
17
- import { ElementsDefault } from './components/default/ElementsDefault.js';
16
+ import { AppStoreDefault } from './components/default/AppStoreDefault.js';
18
17
  import { CssDefaultDark, CssDefaultLight } from './components/default/CssDefault.js';
19
18
  import { EventsUI } from './components/core/EventsUI.js';
20
19
  import { Modal } from './components/core/Modal.js';
@@ -71,14 +70,14 @@ window.onload = () =>
71
70
  await Responsive.Init();
72
71
  await MenuDefault.Render({ htmlMainBody });
73
72
  await SocketIo.Init({
74
- channels: ElementsDefault.Data,
73
+ channels: AppStoreDefault.Data,
75
74
  path: `/`,
76
75
  });
77
76
  await SocketIoDefault.Init();
78
77
  await LogInDefault();
79
78
  await LogOutDefault();
80
79
  await SignUpDefault();
81
- await Keyboard.Init({ callBackTime: DefaultParams.EVENT_CALLBACK_TIME });
80
+ await Keyboard.Init();
82
81
  await Modal.RenderSeoSanitizer();
83
82
  },
84
83
  });
@@ -11,10 +11,9 @@ import { RouterItemledger } from './components/itemledger/RoutesItemledger.js';
11
11
  import { TranslateItemledger } from './components/itemledger/TranslateItemledger.js';
12
12
  import { Worker } from './components/core/Worker.js';
13
13
  import { Keyboard } from './components/core/Keyboard.js';
14
- import { ItemledgerParams } from './components/itemledger/CommonItemledger.js';
15
14
  import { SocketIo } from './components/core/SocketIo.js';
16
15
  import { SocketIoItemledger } from './components/itemledger/SocketIoItemledger.js';
17
- import { ElementsItemledger } from './components/itemledger/ElementsItemledger.js';
16
+ import { AppStoreItemledger } from './components/itemledger/AppStoreItemledger.js';
18
17
  import { CssItemledgerDark, CssItemledgerLight } from './components/itemledger/CssItemledger.js';
19
18
  import { s } from './components/core/VanillaJs.js';
20
19
  import { EventsUI } from './components/core/EventsUI.js';
@@ -32,11 +31,11 @@ window.onload = () =>
32
31
  await TranslateItemledger.Init();
33
32
  await Responsive.Init();
34
33
  await MenuItemledger.Render({ htmlMainBody });
35
- await SocketIo.Init({ channels: ElementsItemledger.Data });
34
+ await SocketIo.Init({ channels: AppStoreItemledger.Data });
36
35
  await SocketIoItemledger.Init();
37
36
  await LogInItemledger();
38
37
  await LogOutItemledger();
39
38
  await SignUpItemledger();
40
- await Keyboard.Init({ callBackTime: ItemledgerParams.EVENT_CALLBACK_TIME });
39
+ await Keyboard.Init();
41
40
  },
42
41
  });
@@ -10,11 +10,10 @@ import { MenuUnderpost } from './components/underpost/MenuUnderpost.js';
10
10
  import { RouterUnderpost } from './components/underpost/RoutesUnderpost.js';
11
11
  import { TranslateUnderpost } from './components/underpost/TranslateUnderpost.js';
12
12
  import { Worker } from './components/core/Worker.js';
13
- import { UnderpostParams } from './components/underpost/CommonUnderpost.js';
14
13
  import { Keyboard } from './components/core/Keyboard.js';
15
14
  import { SocketIoUnderpost } from './components/underpost/SocketIoUnderpost.js';
16
15
  import { SocketIo } from './components/core/SocketIo.js';
17
- import { ElementsUnderpost } from './components/underpost/ElementsUnderpost.js';
16
+ import { AppStoreUnderpost } from './components/underpost/AppStoreUnderpost.js';
18
17
  import { CssUnderpostDark, CssUnderpostLight } from './components/underpost/CssUnderpost.js';
19
18
 
20
19
  window.onload = () =>
@@ -26,11 +25,11 @@ window.onload = () =>
26
25
  await TranslateUnderpost.Init();
27
26
  await Responsive.Init();
28
27
  await MenuUnderpost.Render();
29
- await SocketIo.Init({ channels: ElementsUnderpost.Data });
28
+ await SocketIo.Init({ channels: AppStoreUnderpost.Data });
30
29
  await SocketIoUnderpost.Init();
31
30
  await LogInUnderpost();
32
31
  await LogOutUnderpost();
33
32
  await SignUpUnderpost();
34
- await Keyboard.Init({ callBackTime: UnderpostParams.EVENT_CALLBACK_TIME });
33
+ await Keyboard.Init();
35
34
  },
36
35
  });