cyberia 3.2.22 → 3.2.70

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 (185) hide show
  1. package/.env.example +127 -68
  2. package/.github/workflows/cyberia-client.cd.yml +40 -0
  3. package/.github/workflows/cyberia-server.cd.yml +40 -0
  4. package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
  5. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
  6. package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
  7. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
  8. package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
  9. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
  10. package/.github/workflows/engine-cyberia.cd.yml +33 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +13 -3
  12. package/.github/workflows/ghpkg.ci.yml +88 -1
  13. package/.github/workflows/gitlab.ci.yml +1 -1
  14. package/.github/workflows/hardhat.ci.yml +1 -1
  15. package/.github/workflows/npmpkg.ci.yml +10 -7
  16. package/.github/workflows/publish.ci.yml +2 -2
  17. package/.github/workflows/publish.cyberia.ci.yml +5 -16
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
  19. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  20. package/CHANGELOG.md +301 -1
  21. package/CLI-HELP.md +71 -6
  22. package/Dockerfile +141 -43
  23. package/Dockerfile.dev +143 -0
  24. package/Dockerfile.test +165 -0
  25. package/README.md +1 -1
  26. package/baremetal/commission-workflows.json +1 -0
  27. package/bin/build.js +31 -0
  28. package/bin/cyberia.js +1080 -184
  29. package/bin/deploy.js +2 -2
  30. package/bin/index.js +1080 -184
  31. package/bump.config.js +1 -0
  32. package/compose.env +131 -0
  33. package/conf.js +18 -1
  34. package/deployment.yaml +2 -2
  35. package/docker-compose.yml +316 -0
  36. package/hardhat/hardhat.config.js +2 -2
  37. package/hardhat/package-lock.json +620 -2041
  38. package/hardhat/package.json +7 -5
  39. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  40. package/hardhat/test/ObjectLayerToken.js +378 -274
  41. package/ipfs/configure-ipfs.sh +13 -0
  42. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  44. package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
  45. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  46. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  47. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  48. package/mongodb/entrypoint.sh +76 -0
  49. package/nginx.conf +87 -0
  50. package/package.json +31 -19
  51. package/pv-pvc.yaml +32 -0
  52. package/scripts/disk-clean.sh +85 -60
  53. package/scripts/kubeadm-node-setup.sh +317 -0
  54. package/scripts/rocky-kickstart.sh +877 -185
  55. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  56. package/scripts/test-monitor.sh +3 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  59. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  60. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  61. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  62. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  65. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  66. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  67. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  68. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  71. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  72. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  73. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  74. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  75. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  77. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  78. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  79. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  80. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  81. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  82. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  83. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  84. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  85. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
  86. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  87. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  88. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  89. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  90. package/src/api/ipfs/ipfs.service.js +28 -15
  91. package/src/api/object-layer/object-layer.router.js +25 -15
  92. package/src/api/object-layer/object-layer.service.js +15 -20
  93. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  94. package/src/cli/baremetal.js +717 -16
  95. package/src/cli/cluster.js +80 -5
  96. package/src/cli/deploy.js +127 -11
  97. package/src/cli/docker-compose.js +648 -0
  98. package/src/cli/env.js +11 -2
  99. package/src/cli/fs.js +75 -30
  100. package/src/cli/image.js +129 -51
  101. package/src/cli/index.js +110 -6
  102. package/src/cli/kickstart.js +142 -20
  103. package/src/cli/release.js +46 -4
  104. package/src/cli/repository.js +238 -33
  105. package/src/cli/run.js +520 -114
  106. package/src/cli/secrets.js +82 -48
  107. package/src/cli/ssh.js +234 -0
  108. package/src/cli/static.js +2 -2
  109. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  110. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  111. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  112. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  113. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  114. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  115. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  116. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  117. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  118. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  119. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
  120. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  121. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  122. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  123. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  124. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
  125. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  126. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
  127. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  128. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  129. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  130. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  131. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  132. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  133. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  134. package/src/client/services/object-layer/object-layer.management.js +6 -6
  135. package/src/{server → client-builder}/client-build-docs.js +15 -5
  136. package/src/{server → client-builder}/client-build-live.js +3 -3
  137. package/src/{server → client-builder}/client-build.js +25 -22
  138. package/src/{server → client-builder}/client-dev-server.js +3 -3
  139. package/src/{server → client-builder}/client-icons.js +2 -2
  140. package/src/{server → client-builder}/ssr.js +5 -5
  141. package/src/client.build.js +1 -3
  142. package/src/client.dev.js +1 -1
  143. package/src/db/mongo/MongoBootstrap.js +12 -12
  144. package/src/grpc/cyberia/grpc-server.js +255 -70
  145. package/src/index.js +12 -1
  146. package/src/mailer/EmailRender.js +1 -1
  147. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  148. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  149. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  150. package/src/projects/cyberia/gemini-client.js +175 -0
  151. package/src/projects/cyberia/generate-saga.js +2107 -0
  152. package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
  153. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  154. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  155. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  156. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  157. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  158. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  159. package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
  160. package/src/runtime/cyberia-client/Dockerfile +27 -61
  161. package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
  162. package/src/runtime/cyberia-server/Dockerfile +21 -20
  163. package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
  164. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  165. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  166. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  167. package/src/runtime/engine-cyberia/compose.env +131 -0
  168. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  169. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  170. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  171. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  172. package/src/runtime/express/Express.js +2 -2
  173. package/src/runtime/nginx/Nginx.js +250 -0
  174. package/src/server/catalog.js +9 -14
  175. package/src/server/conf.js +3 -6
  176. package/src/server/runtime-status.js +18 -1
  177. package/src/server/start.js +12 -2
  178. package/src/server.js +6 -2
  179. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  180. package/test/deploy-monitor.test.js +26 -10
  181. package/test/shape-generator.test.js +7 -1
  182. package/typedoc.dd-cyberia.json +3 -1
  183. package/typedoc.json +3 -1
  184. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  185. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -0,0 +1,99 @@
1
+ import { Auth } from '../../components/core/Auth.js';
2
+ import { loggerFactory } from '../../components/core/Logger.js';
3
+ import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
4
+ const logger = loggerFactory(import.meta);
5
+ logger.info('Load service');
6
+ const endpoint = 'cyberia-saga';
7
+ class CyberiaSagaService {
8
+ static post = (options = { id: '', body: {} }) =>
9
+ new Promise((resolve, reject) =>
10
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
11
+ method: 'POST',
12
+ headers: headersFactory(),
13
+ credentials: 'include',
14
+ body: payloadFactory(options.body),
15
+ })
16
+ .then(async (res) => {
17
+ return await res.json();
18
+ })
19
+ .then((res) => {
20
+ logger.info(res);
21
+ return resolve(res);
22
+ })
23
+ .catch((error) => {
24
+ logger.error(error);
25
+ return reject(error);
26
+ }),
27
+ );
28
+ static put = (options = { id: '', body: {} }) =>
29
+ new Promise((resolve, reject) =>
30
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
31
+ method: 'PUT',
32
+ headers: headersFactory(),
33
+ credentials: 'include',
34
+ body: payloadFactory(options.body),
35
+ })
36
+ .then(async (res) => {
37
+ return await res.json();
38
+ })
39
+ .then((res) => {
40
+ logger.info(res);
41
+ return resolve(res);
42
+ })
43
+ .catch((error) => {
44
+ logger.error(error);
45
+ return reject(error);
46
+ }),
47
+ );
48
+ static get = (options = {}) => {
49
+ const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
50
+ const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
51
+ page,
52
+ limit,
53
+ filterModel,
54
+ sortModel,
55
+ sort,
56
+ asc,
57
+ order,
58
+ });
59
+ return new Promise((resolve, reject) =>
60
+ fetch(url.toString(), {
61
+ method: 'GET',
62
+ headers: headersFactory(),
63
+ credentials: 'include',
64
+ })
65
+ .then(async (res) => {
66
+ return await res.json();
67
+ })
68
+ .then((res) => {
69
+ logger.info(res);
70
+ return resolve(res);
71
+ })
72
+ .catch((error) => {
73
+ logger.error(error);
74
+ return reject(error);
75
+ }),
76
+ );
77
+ };
78
+ static delete = (options = { id: '', body: {} }) =>
79
+ new Promise((resolve, reject) =>
80
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
81
+ method: 'DELETE',
82
+ headers: headersFactory(),
83
+ credentials: 'include',
84
+ body: payloadFactory(options.body),
85
+ })
86
+ .then(async (res) => {
87
+ return await res.json();
88
+ })
89
+ .then((res) => {
90
+ logger.info(res);
91
+ return resolve(res);
92
+ })
93
+ .catch((error) => {
94
+ logger.error(error);
95
+ return reject(error);
96
+ }),
97
+ );
98
+ }
99
+ export { CyberiaSagaService };
@@ -0,0 +1,99 @@
1
+ import { Auth } from '../../components/core/Auth.js';
2
+ import { loggerFactory } from '../../components/core/Logger.js';
3
+ import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
4
+ const logger = loggerFactory(import.meta);
5
+ logger.info('Load service');
6
+ const endpoint = 'cyberia-skill';
7
+ class CyberiaSkillService {
8
+ static post = (options = { id: '', body: {} }) =>
9
+ new Promise((resolve, reject) =>
10
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
11
+ method: 'POST',
12
+ headers: headersFactory(),
13
+ credentials: 'include',
14
+ body: payloadFactory(options.body),
15
+ })
16
+ .then(async (res) => {
17
+ return await res.json();
18
+ })
19
+ .then((res) => {
20
+ logger.info(res);
21
+ return resolve(res);
22
+ })
23
+ .catch((error) => {
24
+ logger.error(error);
25
+ return reject(error);
26
+ }),
27
+ );
28
+ static put = (options = { id: '', body: {} }) =>
29
+ new Promise((resolve, reject) =>
30
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
31
+ method: 'PUT',
32
+ headers: headersFactory(),
33
+ credentials: 'include',
34
+ body: payloadFactory(options.body),
35
+ })
36
+ .then(async (res) => {
37
+ return await res.json();
38
+ })
39
+ .then((res) => {
40
+ logger.info(res);
41
+ return resolve(res);
42
+ })
43
+ .catch((error) => {
44
+ logger.error(error);
45
+ return reject(error);
46
+ }),
47
+ );
48
+ static get = (options = {}) => {
49
+ const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
50
+ const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
51
+ page,
52
+ limit,
53
+ filterModel,
54
+ sortModel,
55
+ sort,
56
+ asc,
57
+ order,
58
+ });
59
+ return new Promise((resolve, reject) =>
60
+ fetch(url.toString(), {
61
+ method: 'GET',
62
+ headers: headersFactory(),
63
+ credentials: 'include',
64
+ })
65
+ .then(async (res) => {
66
+ return await res.json();
67
+ })
68
+ .then((res) => {
69
+ logger.info(res);
70
+ return resolve(res);
71
+ })
72
+ .catch((error) => {
73
+ logger.error(error);
74
+ return reject(error);
75
+ }),
76
+ );
77
+ };
78
+ static delete = (options = { id: '', body: {} }) =>
79
+ new Promise((resolve, reject) =>
80
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
81
+ method: 'DELETE',
82
+ headers: headersFactory(),
83
+ credentials: 'include',
84
+ body: payloadFactory(options.body),
85
+ })
86
+ .then(async (res) => {
87
+ return await res.json();
88
+ })
89
+ .then((res) => {
90
+ logger.info(res);
91
+ return resolve(res);
92
+ })
93
+ .catch((error) => {
94
+ logger.error(error);
95
+ return reject(error);
96
+ }),
97
+ );
98
+ }
99
+ export { CyberiaSkillService };
@@ -283,10 +283,10 @@ class ObjectLayerManagement {
283
283
  {
284
284
  field: 'data.item.id',
285
285
  headerName: 'Item ID',
286
- editable: role === 'user',
286
+ editable: commonModeratorGuard(role),
287
287
  },
288
- { field: 'data.item.type', headerName: 'Item Type', editable: role === 'user' },
289
- { field: 'data.item.description', headerName: 'Description', flex: 1, editable: role === 'user' },
288
+ { field: 'data.item.type', headerName: 'Item Type', editable: commonModeratorGuard(role) },
289
+ { field: 'data.item.description', headerName: 'Description', flex: 1, editable: commonModeratorGuard(role) },
290
290
  {
291
291
  field: 'data.ledger.type',
292
292
  headerName: 'Ledger Type',
@@ -306,7 +306,7 @@ class ObjectLayerManagement {
306
306
  },
307
307
  {
308
308
  field: 'data.render.cid',
309
- headerName: 'instance CID',
309
+ headerName: 'render CID',
310
310
  width: 160,
311
311
  cellRenderer: AtlasCidRenderer,
312
312
  editable: false,
@@ -315,7 +315,7 @@ class ObjectLayerManagement {
315
315
  },
316
316
  {
317
317
  field: 'data.render.metadataCid',
318
- headerName: 'instance Metadata CID',
318
+ headerName: 'render Metadata CID',
319
319
  width: 160,
320
320
  cellRenderer: MetadataCidRenderer,
321
321
  editable: false,
@@ -369,7 +369,7 @@ class ObjectLayerManagement {
369
369
  serviceId,
370
370
  entity: 'object-layer',
371
371
  permissions: {
372
- add: commonUserGuard(role),
372
+ add: commonModeratorGuard(role),
373
373
  remove: false,
374
374
  reload: commonUserGuard(role),
375
375
  },
@@ -2,13 +2,13 @@
2
2
 
3
3
  /**
4
4
  * Module for building project documentation (JSDoc, Swagger, Coverage).
5
- * @module src/server/client-build-docs.js
5
+ * @module src/client-builder/client-build-docs.js
6
6
  * @namespace clientBuildDocs
7
7
  */
8
8
 
9
9
  import fs from 'fs-extra';
10
- import { shellExec } from './process.js';
11
- import { loggerFactory } from './logger.js';
10
+ import { shellExec } from '../server/process.js';
11
+ import { loggerFactory } from '../server/logger.js';
12
12
  import { JSONweb } from './client-formatted.js';
13
13
  import { ssrFactory } from './ssr.js';
14
14
 
@@ -396,10 +396,20 @@ const buildCoverage = async ({ docs, docsDestination }) => {
396
396
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
397
397
  if (pkg.scripts && pkg.scripts.coverage) {
398
398
  logger.info('generating coverage report', coveragePath);
399
- shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
399
+ try {
400
+ await shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
401
+ } catch (err) {
402
+ logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
403
+ return;
404
+ }
400
405
  } else if (pkg.scripts && pkg.scripts.test) {
401
406
  logger.info('generating coverage via test', coveragePath);
402
- shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
407
+ try {
408
+ await shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
409
+ } catch (err) {
410
+ logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
411
+ return;
412
+ }
403
413
  }
404
414
  }
405
415
  }
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Module for live building client-side code
3
- * @module src/server/client-build-live.js
3
+ * @module src/client-builder/client-build-live.js
4
4
  * @namespace clientLiveBuild
5
5
  */
6
6
 
7
7
  import fs from 'fs-extra';
8
- import { Config, loadConf, readConfJson } from './conf.js';
9
- import { loggerFactory } from './logger.js';
8
+ import { Config, loadConf, readConfJson } from '../server/conf.js';
9
+ import { loggerFactory } from '../server/logger.js';
10
10
  import { buildClient } from './client-build.js';
11
11
 
12
12
  const logger = loggerFactory(import.meta);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Manages the client-side build process, including full builds and incremental builds.
3
- * @module server/client-build.js
3
+ * @module src/client-builder/client-build.js
4
4
  * @namespace clientBuild
5
5
  */
6
6
 
@@ -8,18 +8,18 @@
8
8
 
9
9
  import fs from 'fs-extra';
10
10
  import { transformClientJs, JSONweb } from './client-formatted.js';
11
- import { loggerFactory } from './logger.js';
11
+ import { loggerFactory } from '../server/logger.js';
12
12
  import {
13
13
  getCapVariableName,
14
14
  newInstance,
15
15
  orderArrayFromAttrInt,
16
16
  uniqueArray,
17
17
  } from '../client/components/core/CommonJs.js';
18
- import { readConfJson } from './conf.js';
18
+ import { readConfJson } from '../server/conf.js';
19
19
  import { minify } from 'html-minifier-terser';
20
20
  import AdmZip from 'adm-zip';
21
21
  import * as dir from 'path';
22
- import { shellExec } from './process.js';
22
+ import { shellExec } from '../server/process.js';
23
23
  import { SitemapStream, streamToPromise } from 'sitemap';
24
24
  import { Readable } from 'stream';
25
25
  import { buildIcons } from './client-icons.js';
@@ -751,8 +751,9 @@ const buildClient = async (
751
751
  )
752
752
  )
753
753
  for (const view of views) {
754
- const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
755
- }${view.path === '/' ? view.path : `${view.path}/`}`;
754
+ const buildPath = `${
755
+ rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
756
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
756
757
 
757
758
  if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
758
759
 
@@ -768,8 +769,9 @@ const buildClient = async (
768
769
  fs.writeFileSync(`${buildPath}${buildId}.js`, jsSrc, 'utf8');
769
770
  const title = metadata.title ? metadata.title : title;
770
771
 
771
- const canonicalURL = `https://${host}${path}${view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
772
- }`;
772
+ const canonicalURL = `https://${host}${path}${
773
+ view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
774
+ }`;
773
775
 
774
776
  let ssrHeadComponents = ``;
775
777
  let ssrBodyComponents = ``;
@@ -903,12 +905,12 @@ const buildClient = async (
903
905
  `${buildPath}index.html`,
904
906
  minifyBuild
905
907
  ? await minify(htmlSrc, {
906
- minifyCSS: true,
907
- minifyJS: true,
908
- collapseBooleanAttributes: true,
909
- collapseInlineTagWhitespace: true,
910
- collapseWhitespace: true,
911
- })
908
+ minifyCSS: true,
909
+ minifyJS: true,
910
+ collapseBooleanAttributes: true,
911
+ collapseInlineTagWhitespace: true,
912
+ collapseWhitespace: true,
913
+ })
912
914
  : htmlSrc,
913
915
  'utf8',
914
916
  );
@@ -997,8 +999,9 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
997
999
  renderApi: { JSONweb },
998
1000
  });
999
1001
 
1000
- const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
1001
- }${view.path === '/' ? view.path : `${view.path}/`}`;
1002
+ const buildPath = `${
1003
+ rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
1004
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
1002
1005
 
1003
1006
  const indexUrl = buildIndexUrl(view.path);
1004
1007
  if (view.offlineDefault) {
@@ -1018,12 +1021,12 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1018
1021
  buildHtmlPath,
1019
1022
  minifyBuild
1020
1023
  ? await minify(htmlSrc, {
1021
- minifyCSS: true,
1022
- minifyJS: true,
1023
- collapseBooleanAttributes: true,
1024
- collapseInlineTagWhitespace: true,
1025
- collapseWhitespace: true,
1026
- })
1024
+ minifyCSS: true,
1025
+ minifyJS: true,
1026
+ collapseBooleanAttributes: true,
1027
+ collapseInlineTagWhitespace: true,
1028
+ collapseWhitespace: true,
1029
+ })
1027
1030
  : htmlSrc,
1028
1031
  'utf8',
1029
1032
  );
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Module for creating a client-side development server
3
- * @module src/server/client-dev-server.js
3
+ * @module src/client-builder/client-dev-server.js
4
4
  * @namespace clientDevServer
5
5
  */
6
6
  import fs from 'fs-extra';
7
7
  import nodemon from 'nodemon';
8
8
  import dotenv from 'dotenv';
9
- import { shellExec } from './process.js';
10
- import { loggerFactory } from './logger.js';
9
+ import { shellExec } from '../server/process.js';
10
+ import { loggerFactory } from '../server/logger.js';
11
11
  import Underpost from '../index.js';
12
12
 
13
13
  const logger = loggerFactory(import.meta);
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Module for building client-side icons
3
- * @module src/server/client-icons.js
3
+ * @module src/client-builder/client-icons.js
4
4
  * @namespace clientIcons
5
5
  */
6
6
  import { favicons } from 'favicons';
7
- import { loggerFactory } from './logger.js';
7
+ import { loggerFactory } from '../server/logger.js';
8
8
  import fs from 'fs-extra';
9
9
  import { getCapVariableName } from '../client/components/core/CommonJs.js';
10
10
 
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Module for managing server side rendering
3
- * @module src/server/ssr.js
3
+ * @module src/client-builder/ssr.js
4
4
  * @namespace ServerSideRendering
5
5
  */
6
6
 
@@ -10,19 +10,19 @@ import vm from 'node:vm';
10
10
  import Underpost from '../index.js';
11
11
 
12
12
  import { srcFormatted, JSONweb } from './client-formatted.js';
13
- import { loggerFactory } from './logger.js';
14
- import { getRootDirectory } from './process.js';
13
+ import { loggerFactory } from '../server/logger.js';
14
+ import { getRootDirectory } from '../server/process.js';
15
15
 
16
16
  const logger = loggerFactory(import.meta);
17
17
 
18
18
  /**
19
19
  * Creates a server-side rendering component function from a given file path.
20
20
  * It reads the component file, formats it, and executes it in a sandboxed Node.js VM context to extract the component.
21
- * @param {string} [componentPath='./src/client/ssr/Render.js'] - The path to the SSR component file.
21
+ * @param {string} [componentPath='./src/client/ssr/RootDocument.js'] - The path to the SSR component file.
22
22
  * @returns {Promise<Function>} A promise that resolves to the SSR component function.
23
23
  * @memberof ServerSideRendering
24
24
  */
25
- const ssrFactory = async (componentPath = `./src/client/ssr/Render.js`) => {
25
+ const ssrFactory = async (componentPath = `./src/client/ssr/RootDocument.js`) => {
26
26
  const context = { SrrComponent: () => {}, npm_package_version: Underpost.version };
27
27
  vm.createContext(context);
28
28
  vm.runInContext(await srcFormatted(fs.readFileSync(componentPath, 'utf8')), context);
@@ -6,7 +6,7 @@
6
6
  import { loggerFactory } from './server/logger.js';
7
7
  import { Config } from './server/conf.js';
8
8
  import { ProcessController } from './server/process.js';
9
- import { clientLiveBuild } from './server/client-build-live.js';
9
+ import { clientLiveBuild } from './client-builder/client-build-live.js';
10
10
 
11
11
  await Config.build();
12
12
 
@@ -15,5 +15,3 @@ const logger = loggerFactory(import.meta);
15
15
  await logger.setUpInfo();
16
16
 
17
17
  await clientLiveBuild();
18
-
19
- // ProcessController.init(logger);
package/src/client.dev.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { loggerFactory } from './server/logger.js';
7
7
  import { ProcessController } from './server/process.js';
8
8
  import { Config, buildClientStaticConf } from './server/conf.js';
9
- import { createClientDevServer } from './server/client-dev-server.js';
9
+ import { createClientDevServer } from './client-builder/client-dev-server.js';
10
10
 
11
11
  const logger = loggerFactory(import.meta);
12
12
 
@@ -290,19 +290,16 @@ class MongoBootstrap {
290
290
  * @returns {Promise<number>} Number of pods that failed to become ready (0 = all good).
291
291
  */
292
292
  static async waitForPods(namespace, replicaCount) {
293
- const { default: Underpost } = await import('../../index.js');
294
- const results = await Promise.all(
295
- Array.from({ length: replicaCount }, async (_, i) => {
296
- const podName = `${MONGODB_STATEFULSET_NAME}-${i}`;
297
- const ready = await Underpost.test.statusMonitor(podName, 'Running', 'pods', 1000, 60 * 10);
298
- return { index: i, ready };
299
- }),
300
- );
301
- const failed = results.filter((r) => !r.ready).map((r) => `${MONGODB_STATEFULSET_NAME}-${r.index}`);
302
- if (failed.length > 0) {
303
- logger.error('MongoDB pods did not become ready', { failed });
293
+ let failedCount = 0;
294
+ for (let i = 0; i < replicaCount; i++) {
295
+ const podName = `${MONGODB_STATEFULSET_NAME}-${i}`;
296
+ const result = shellExec(`kubectl wait --for=condition=Ready pod/${podName} -n ${namespace} --timeout=60s`);
297
+ if (result.code !== 0) {
298
+ logger.error(`Pod ${podName} did not become ready`);
299
+ failedCount++;
300
+ }
304
301
  }
305
- return failed.length;
302
+ return failedCount;
306
303
  }
307
304
 
308
305
  /**
@@ -620,6 +617,9 @@ class MongoBootstrap {
620
617
  process.env.DB_PASSWORD ||
621
618
  readTrimmedFile('./engine-private/mongodb-password');
622
619
 
620
+ // Ensure the pod is ready before querying
621
+ shellExec(`kubectl wait --for=condition=Ready pod/${podName} -n ${namespace} --timeout=60s`);
622
+
623
623
  const evalExpr = 'rs.status().members.filter(m=>m.stateStr=="PRIMARY").map(m=>m.name)';
624
624
 
625
625
  const cli = disableAuth ? 'mongo' : 'mongosh';