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
@@ -182,29 +182,66 @@ const ObjectLayerService = {
182
182
  return objectLayer;
183
183
  }
184
184
 
185
- // create object layer from body
185
+ // create object layer from body – cut-over consistency: stage all CIDs before writing to DB
186
186
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
187
187
  const ObjectLayerRenderFrames =
188
188
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
189
- let newObjectLayer = await new ObjectLayer(req.body).save();
190
189
 
191
- // Generate atlas sprite sheet – this sets data.render.cid and saves
190
+ const bodyData = { ...req.body };
191
+ if (!bodyData.data) bodyData.data = {};
192
+ if (!bodyData.data.render) bodyData.data.render = {};
193
+ bodyData.data.render.cid = '';
194
+ bodyData.data.render.metadataCid = '';
195
+
196
+ // If has render frames, generate atlas + CIDs BEFORE creating the ObjectLayer
197
+ if (bodyData.objectLayerRenderFramesId) {
198
+ const renderFramesDoc = await ObjectLayerRenderFrames.findById(bodyData.objectLayerRenderFramesId);
199
+ if (renderFramesDoc) {
200
+ try {
201
+ const stagingOL = {
202
+ data: bodyData.data,
203
+ objectLayerRenderFramesId: renderFramesDoc,
204
+ };
205
+ const result = await AtlasSpriteSheetService.generate(
206
+ { objectLayer: stagingOL, auth: req.auth },
207
+ res,
208
+ options,
209
+ { skipObjectLayerSave: true },
210
+ );
211
+ bodyData.data.render.cid = result.atlasCid;
212
+ bodyData.data.render.metadataCid = result.atlasMetadataCid;
213
+ bodyData.atlasSpriteSheetId = result.atlasDoc._id;
214
+ } catch (atlasError) {
215
+ logger.error('Failed to auto-generate atlas for new ObjectLayer:', atlasError);
216
+ }
217
+ }
218
+ }
219
+
220
+ // Compute final SHA-256 with all CIDs
221
+ bodyData.sha256 = ObjectLayerEngine.computeSha256(bodyData.data);
222
+
223
+ // Pin data JSON to IPFS
192
224
  try {
193
- await AtlasSpriteSheetService.generate({ params: { id: newObjectLayer._id }, auth: req.auth }, res, options);
194
- } catch (atlasError) {
195
- logger.error('Failed to auto-generate atlas for new ObjectLayer:', atlasError);
225
+ const itemId = bodyData.data.item.id;
226
+ const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
227
+ const ipfsResult = await IpfsClient.addJsonToIpfs(bodyData.data, `${itemId}_data.json`, mfsPath);
228
+ if (ipfsResult) {
229
+ bodyData.cid = ipfsResult.cid;
230
+ await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
231
+ }
232
+ } catch (ipfsError) {
233
+ logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
196
234
  }
197
235
 
198
- // Re-read so data.render.cid is up-to-date, then recompute SHA-256 & IPFS CID
199
- newObjectLayer = await ObjectLayer.findById(newObjectLayer._id).populate('objectLayerRenderFramesId');
200
- if (newObjectLayer) {
201
- newObjectLayer = await ObjectLayerEngine.computeAndSaveFinalSha256({
202
- objectLayer: newObjectLayer,
203
- ipfsClient: IpfsClient,
204
- createPinRecord,
205
- userId: req.auth && req.auth.user ? req.auth.user._id : undefined,
206
- options,
207
- });
236
+ // Atomic create/replace ObjectLayer is fully populated with all CIDs
237
+ let newObjectLayer;
238
+ const existingByItemId = await ObjectLayer.findOne({ 'data.item.id': bodyData.data.item.id });
239
+ if (existingByItemId) {
240
+ newObjectLayer = await ObjectLayer.findByIdAndUpdate(existingByItemId._id, bodyData, {
241
+ returnDocument: 'after',
242
+ }).populate('objectLayerRenderFramesId');
243
+ } else {
244
+ newObjectLayer = await (await new ObjectLayer(bodyData).save()).populate('objectLayerRenderFramesId');
208
245
  }
209
246
 
210
247
  return newObjectLayer;
@@ -235,6 +272,22 @@ const ObjectLayerService = {
235
272
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
236
273
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
237
274
 
275
+ // GET /search-item-ids?q=<partial> - Fast partial match search on data.item.id
276
+ if (req.path.startsWith('/search-item-ids')) {
277
+ const q = (req.query.q || '').trim();
278
+ if (!q) return { itemIds: [] };
279
+ // Escape regex special characters for safe partial matching
280
+ const escaped = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
281
+ const results = await ObjectLayer.find(
282
+ { 'data.item.id': { $regex: escaped, $options: 'i' } },
283
+ { 'data.item.id': 1, _id: 0 },
284
+ )
285
+ .limit(20)
286
+ .lean();
287
+ const itemIds = [...new Set(results.map((r) => r.data.item.id))];
288
+ return { itemIds };
289
+ }
290
+
238
291
  // GET /frame-counts/:id - Get frame counts for each direction using numeric codes
239
292
  if (req.path.startsWith('/frame-counts/')) {
240
293
  const objectLayer = await ObjectLayer.findById(req.params.id)
@@ -667,30 +720,60 @@ const ObjectLayerService = {
667
720
  return objectLayer;
668
721
  }
669
722
 
670
- // PUT /:id - Standard update
671
- let updatedObjectLayer = await ObjectLayer.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
723
+ // PUT /:id - Standard update with cut-over consistency
724
+ const existingOL = await ObjectLayer.findById(req.params.id).populate('objectLayerRenderFramesId');
725
+ if (!existingOL) {
726
+ throw new Error('ObjectLayer not found');
727
+ }
728
+
729
+ // Apply body updates to staging data in memory
730
+ const updateData = { ...req.body };
731
+ const stagingData = updateData.data || existingOL.data.toObject();
732
+ if (!stagingData.render) stagingData.render = {};
672
733
 
673
- if (updatedObjectLayer) {
674
- // Generate atlas sprite sheet – this sets data.render.cid and saves
734
+ // Use existing render frames if available
735
+ const renderFramesData = existingOL.objectLayerRenderFramesId;
736
+ if (renderFramesData) {
675
737
  try {
676
- await AtlasSpriteSheetService.generate({ params: { id: req.params.id }, auth: req.auth }, res, options);
738
+ const stagingOL = {
739
+ data: stagingData,
740
+ objectLayerRenderFramesId: renderFramesData,
741
+ };
742
+ const result = await AtlasSpriteSheetService.generate(
743
+ { objectLayer: stagingOL, auth: req.auth },
744
+ res,
745
+ options,
746
+ { skipObjectLayerSave: true },
747
+ );
748
+ stagingData.render.cid = result.atlasCid;
749
+ stagingData.render.metadataCid = result.atlasMetadataCid;
750
+ updateData.atlasSpriteSheetId = result.atlasDoc._id;
677
751
  } catch (atlasError) {
678
752
  logger.error('Failed to auto-update atlas for ObjectLayer:', atlasError);
679
753
  }
754
+ }
680
755
 
681
- // Re-read so data.render.cid is up-to-date, then recompute SHA-256 & IPFS CID
682
- updatedObjectLayer = await ObjectLayer.findById(req.params.id).populate('objectLayerRenderFramesId');
683
- if (updatedObjectLayer) {
684
- updatedObjectLayer = await ObjectLayerEngine.computeAndSaveFinalSha256({
685
- objectLayer: updatedObjectLayer,
686
- ipfsClient: IpfsClient,
687
- createPinRecord,
688
- userId: req.auth && req.auth.user ? req.auth.user._id : undefined,
689
- options,
690
- });
756
+ updateData.data = stagingData;
757
+ updateData.sha256 = ObjectLayerEngine.computeSha256(stagingData);
758
+
759
+ // Pin data JSON to IPFS
760
+ try {
761
+ const itemId = stagingData.item.id;
762
+ const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
763
+ const ipfsResult = await IpfsClient.addJsonToIpfs(stagingData, `${itemId}_data.json`, mfsPath);
764
+ if (ipfsResult) {
765
+ updateData.cid = ipfsResult.cid;
766
+ await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
691
767
  }
768
+ } catch (ipfsError) {
769
+ logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
692
770
  }
693
771
 
772
+ // Atomic update with all CIDs populated
773
+ let updatedObjectLayer = await ObjectLayer.findByIdAndUpdate(req.params.id, updateData, {
774
+ returnDocument: 'after',
775
+ }).populate('objectLayerRenderFramesId');
776
+
694
777
  return updatedObjectLayer;
695
778
  },
696
779
 
@@ -13,8 +13,7 @@ import {
13
13
  validatePasswordMiddleware,
14
14
  } from '../../server/auth.js';
15
15
  import { MailerProvider } from '../../mailer/MailerProvider.js';
16
- import { CoreWsMailerManagement } from '../../ws/core/management/core.ws.mailer.js';
17
- import { CoreWsEmit } from '../../ws/core/core.ws.emit.js';
16
+ import { CoreWsEmitter } from '../../ws/core/core.ws.emit.js';
18
17
  import { CoreWsMailerChannel } from '../../ws/core/channels/core.ws.mailer.js';
19
18
  import validator from 'validator';
20
19
  import { DataBaseProvider } from '../../db/DataBaseProvider.js';
@@ -319,11 +318,13 @@ const UserService = {
319
318
  {
320
319
  const user = await User.findByIdAndUpdate(_id, { emailConfirmed: true }, { runValidators: true });
321
320
  }
322
- const userWsId = CoreWsMailerManagement.getUserWsId(`${options.host}${options.path}`, user._id.toString());
323
- CoreWsEmit(CoreWsMailerChannel.channel, CoreWsMailerChannel.client[userWsId], {
324
- status: 'email-confirmed',
325
- id: userWsId,
326
- });
321
+ const userWsId = CoreWsMailerChannel.getUserWsId(`${options.host}${options.path}`, user._id.toString());
322
+ if (userWsId && CoreWsMailerChannel.client[userWsId]) {
323
+ CoreWsEmitter.emit(CoreWsMailerChannel.channel, CoreWsMailerChannel.client[userWsId], {
324
+ status: 'email-confirmed',
325
+ id: userWsId,
326
+ });
327
+ }
327
328
  options.png.header(res, req);
328
329
  return options.png.buffer['check'];
329
330
  } else {
@@ -111,7 +111,7 @@ class UnderpostCluster {
111
111
  const npmRoot = getNpmRootPath();
112
112
  const underpostRoot = options.dev ? '.' : `${npmRoot}/underpost`;
113
113
 
114
- if (options.listPods) return console.table(Underpost.deploy.get(podName ?? undefined));
114
+ if (options.listPods) return console.table(Underpost.kubectl.get(podName ?? undefined));
115
115
  // Set default namespace if not specified
116
116
  if (!options.namespace) options.namespace = 'default';
117
117
 
@@ -146,10 +146,10 @@ class UnderpostCluster {
146
146
  }
147
147
 
148
148
  // Check if a cluster (Kind, Kubeadm, or K3s) is already initialized
149
- const alreadyKubeadmCluster = Underpost.deploy.get('calico-kube-controllers')[0];
150
- const alreadyKindCluster = Underpost.deploy.get('kube-apiserver-kind-control-plane')[0];
149
+ const alreadyKubeadmCluster = Underpost.kubectl.get('calico-kube-controllers')[0];
150
+ const alreadyKindCluster = Underpost.kubectl.get('kube-apiserver-kind-control-plane')[0];
151
151
  // K3s pods often contain 'svclb-traefik' in the kube-system namespace
152
- const alreadyK3sCluster = Underpost.deploy.get('svclb-traefik')[0];
152
+ const alreadyK3sCluster = Underpost.kubectl.get('svclb-traefik')[0];
153
153
 
154
154
  // --- Kubeadm/Kind/K3s Cluster Initialization ---
155
155
  if (!alreadyKubeadmCluster && !alreadyKindCluster && !alreadyK3sCluster) {
@@ -299,7 +299,7 @@ EOF
299
299
  members: [{ _id: 0, host: `${options.mongoDbHost}:27017` }],
300
300
  };
301
301
 
302
- const [pod] = Underpost.deploy.get(deploymentName);
302
+ const [pod] = Underpost.kubectl.get(deploymentName);
303
303
 
304
304
  shellExec(
305
305
  `sudo kubectl exec -i ${pod.NAME} -- mongo --quiet \
@@ -351,7 +351,7 @@ EOF
351
351
  }
352
352
 
353
353
  if (options.certManager) {
354
- if (!Underpost.deploy.get('cert-manager').find((p) => p.STATUS === 'Running')) {
354
+ if (!Underpost.kubectl.get('cert-manager').find((p) => p.STATUS === 'Running')) {
355
355
  shellExec(`helm repo add jetstack https://charts.jetstack.io --force-update`);
356
356
  shellExec(
357
357
  `helm install cert-manager jetstack/cert-manager \
@@ -641,7 +641,7 @@ net.ipv4.ip_forward = 1' | sudo tee ${iptableConfPath}`,
641
641
  const resources = {};
642
642
  const nodeName = node
643
643
  ? node
644
- : Underpost.deploy.get('kind-control-plane', 'node').length > 0
644
+ : Underpost.kubectl.get('kind-control-plane', 'node').length > 0
645
645
  ? 'kind-control-plane'
646
646
  : os.hostname();
647
647
  const info = shellExec(`kubectl describe node ${nodeName} | grep -E '(Allocatable:|Capacity:)' -A 6`, {