cyberia 3.2.5 → 3.2.12

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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -27,6 +27,13 @@ const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
27
27
  */
28
28
  const srcFormatted = (src) => src.replace(/(?<=[\s({[,;=+!?:^])(html|css)`/g, '`');
29
29
 
30
+ const resolveBrowserImportPath = (basePrefix, relativePath) => {
31
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(basePrefix)) {
32
+ return new URL(relativePath, basePrefix.endsWith('/') ? basePrefix : `${basePrefix}/`).toString();
33
+ }
34
+ return path.posix.normalize(`${basePrefix}${relativePath}`);
35
+ };
36
+
30
37
  /**
31
38
  * Converts a JavaScript object into a string that can be embedded in client-side code
32
39
  * and parsed back into an object (e.g., 'JSON.parse(`{...}`)').
@@ -52,7 +59,14 @@ const JSONweb = (data) => {
52
59
  * @returns {import('esbuild').Plugin}
53
60
  * @memberof clientFormatted
54
61
  */
55
- const importRewritePlugin = ({ dists = [], proxyPath, basePath = '', module = '', baseHost = '' }) => ({
62
+ const importRewritePlugin = ({
63
+ dists = [],
64
+ proxyPath,
65
+ basePath = '',
66
+ module = '',
67
+ baseHost = '',
68
+ externalizeBareImports = true,
69
+ }) => ({
56
70
  name: 'import-rewrite',
57
71
  setup(build) {
58
72
  const prefix = `${baseHost}${proxyPath !== '/' ? `${proxyPath}/` : '/'}`;
@@ -69,26 +83,35 @@ const importRewritePlugin = ({ dists = [], proxyPath, basePath = '', module = ''
69
83
  }
70
84
  }
71
85
 
72
- // Rewrite relative imports to absolute paths based on proxy path and module
86
+ // Rewrite app-relative imports to absolute paths based on proxy path and module.
87
+ // Do not touch node_modules relative imports so esbuild can bundle package internals.
73
88
  build.onResolve({ filter: /^\.\.?\// }, (args) => {
74
- const basePrefix = `${prefix}${basePath ? `${basePath}/` : ''}`;
75
- if (args.path.startsWith('./')) {
76
- return {
77
- path: `${basePrefix}${module ? `${module}/` : ''}${args.path.slice(2)}`,
78
- external: true,
79
- };
89
+ const normalizedImporter = (args.importer || '').replace(/\\/g, '/');
90
+ if (!normalizedImporter.includes('/src/client/')) {
91
+ return;
80
92
  }
81
- if (args.path.startsWith('../')) {
82
- return {
83
- path: `${basePrefix}${args.path.slice(3)}`,
84
- external: true,
85
- };
93
+
94
+ // Extract the path relative to /src/client/
95
+ // Handle cases where the path might have duplicates or be in various formats
96
+ const srcClientIndex = normalizedImporter.lastIndexOf('/src/client/');
97
+ if (srcClientIndex === -1) {
98
+ return;
86
99
  }
100
+ const importerFromClientRoot = normalizedImporter.substring(srcClientIndex + '/src/client/'.length);
101
+ const importerDir = path.posix.dirname(importerFromClientRoot);
102
+ const resolvedFromClientRoot = path.posix.normalize(path.posix.join(importerDir, args.path));
103
+ const result = resolveBrowserImportPath(prefix, resolvedFromClientRoot);
104
+
105
+ return {
106
+ path: result,
107
+ external: true,
108
+ };
87
109
  });
88
110
 
89
- // Mark any remaining imports as external
111
+ // For client app modules we externalize bare imports; for SW builds we let esbuild bundle them.
90
112
  build.onResolve({ filter: /.*/ }, (args) => {
91
113
  if (args.kind === 'entry-point') return;
114
+ if (!externalizeBareImports) return;
92
115
  return { path: args.path, external: true };
93
116
  });
94
117
  },
@@ -111,7 +134,15 @@ const importRewritePlugin = ({ dists = [], proxyPath, basePath = '', module = ''
111
134
  */
112
135
  const transformClientJs = async (
113
136
  srcPath,
114
- { dists = [], proxyPath, basePath = '', module = '', baseHost = '', minify: shouldMinify = false } = {},
137
+ {
138
+ dists = [],
139
+ proxyPath,
140
+ basePath = '',
141
+ module = '',
142
+ baseHost = '',
143
+ minify: shouldMinify = false,
144
+ externalizeBareImports = true,
145
+ } = {},
115
146
  ) => {
116
147
  const src = fs.readFileSync(srcPath, 'utf8');
117
148
  const stripped = srcFormatted(src);
@@ -130,7 +161,7 @@ const transformClientJs = async (
130
161
  target: 'esnext',
131
162
  minify: shouldMinify,
132
163
  logLevel: 'warning',
133
- plugins: [importRewritePlugin({ dists, proxyPath, basePath, module, baseHost })],
164
+ plugins: [importRewritePlugin({ dists, proxyPath, basePath, module, baseHost, externalizeBareImports })],
134
165
  });
135
166
 
136
167
  return result.outputFiles[0].text;
@@ -41,6 +41,20 @@ const logger = loggerFactory(import.meta);
41
41
  */
42
42
  const ENV_REF_PREFIX = 'env:';
43
43
 
44
+ /**
45
+ * Resolves a standardized context key from host/path descriptors.
46
+ * The key is used across DB, WS, mailer, and cache registries.
47
+ *
48
+ * @method resolveHostKeyContext
49
+ * @param {{host?: string, path?: string}|string} [context={ host: '', path: '' }] - Context object or prebuilt key.
50
+ * @returns {string} Host key context string.
51
+ * @memberof ServerConfBuilder
52
+ */
53
+ const resolveHostKeyContext = (context = { host: '', path: '' }) => {
54
+ if (typeof context === 'string') return context;
55
+ return `${context.host || ''}${context.path || ''}`;
56
+ };
57
+
44
58
  /**
45
59
  * Recursively walks a configuration object and replaces every string value that
46
60
  * starts with {@link ENV_REF_PREFIX} (`"env:"`) with the corresponding
@@ -320,25 +334,29 @@ const Config = {
320
334
 
321
335
  if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
322
336
 
323
- const envTemplate = fs.existsSync('./.env.example')
337
+ const sharedEnvTemplate = fs.existsSync('./.env.example')
324
338
  ? fs.readFileSync('./.env.example', 'utf8')
325
339
  : fs.existsSync('./.env.production')
326
340
  ? fs.readFileSync('./.env.production', 'utf8')
327
341
  : '';
328
342
 
329
- if (envTemplate) {
330
- const prodEnv = envTemplate.replaceAll('dd-default', deployId);
331
- fs.writeFileSync(`${folder}/.env.production`, prodEnv, 'utf8');
332
- fs.writeFileSync(
333
- `${folder}/.env.development`,
334
- prodEnv.replace('NODE_ENV=production', 'NODE_ENV=development').replace('PORT=3000', 'PORT=4000'),
335
- 'utf8',
336
- );
337
- fs.writeFileSync(
338
- `${folder}/.env.test`,
339
- prodEnv.replace('NODE_ENV=production', 'NODE_ENV=test').replace('PORT=3000', 'PORT=5000'),
340
- 'utf8',
341
- );
343
+ const envTemplates = {
344
+ production: fs.existsSync('./.env.production') ? fs.readFileSync('./.env.production', 'utf8') : sharedEnvTemplate,
345
+ development: fs.existsSync('./.env.development')
346
+ ? fs.readFileSync('./.env.development', 'utf8')
347
+ : sharedEnvTemplate
348
+ ? sharedEnvTemplate.replace('NODE_ENV=production', 'NODE_ENV=development').replace('PORT=3000', 'PORT=4000')
349
+ : '',
350
+ test: fs.existsSync('./.env.test')
351
+ ? fs.readFileSync('./.env.test', 'utf8')
352
+ : sharedEnvTemplate
353
+ ? sharedEnvTemplate.replace('NODE_ENV=production', 'NODE_ENV=test').replace('PORT=3000', 'PORT=5000')
354
+ : '',
355
+ };
356
+
357
+ for (const [envName, envTemplate] of Object.entries(envTemplates)) {
358
+ if (!envTemplate) continue;
359
+ fs.writeFileSync(`${folder}/.env.${envName}`, envTemplate.replaceAll('dd-default', deployId), 'utf8');
342
360
  }
343
361
 
344
362
  fs.writeFileSync(
@@ -457,7 +475,7 @@ const loadConf = (deployId = DEFAULT_DEPLOY_ID, subConf) => {
457
475
  fs.removeSync(`${path}/.env.production`);
458
476
  fs.removeSync(`${path}/.env.development`);
459
477
  fs.removeSync(`${path}/.env.test`);
460
- if (fs.existsSync(`${path}/jsdoc.json`)) shellExec(`git checkout ${path}/jsdoc.json`);
478
+ if (fs.existsSync(`${path}/typedoc.json`)) shellExec(`git checkout ${path}/typedoc.json`);
461
479
  shellExec(`git checkout ${path}/package.json`);
462
480
  shellExec(`git checkout ${path}/package-lock.json`);
463
481
  return;
@@ -1156,6 +1174,7 @@ const getDataDeploy = async (
1156
1174
 
1157
1175
  let buildDataDeploy = [];
1158
1176
  for (const deployObj of dataDeploy) {
1177
+ const isReplicaDeploy = fs.existsSync(`./engine-private/replica/${deployObj.deployId}`);
1159
1178
  const serverConf = loadReplicas(
1160
1179
  deployObj.deployId,
1161
1180
  loadConfServerJson(`./engine-private/conf/${deployObj.deployId}/conf.server.json`),
@@ -1163,7 +1182,7 @@ const getDataDeploy = async (
1163
1182
  let replicaDataDeploy = [];
1164
1183
  for (const host of Object.keys(serverConf))
1165
1184
  for (const path of Object.keys(serverConf[host])) {
1166
- if (serverConf[host][path].replicas && serverConf[host][path].singleReplica) {
1185
+ if (!isReplicaDeploy && serverConf[host][path].replicas && serverConf[host][path].singleReplica) {
1167
1186
  if (options && options.buildSingleReplica)
1168
1187
  await Underpost.repo.client(deployObj.deployId, '', host, path, {
1169
1188
  singleReplica: true,
@@ -1207,11 +1226,15 @@ const validateTemplatePath = (absolutePath = '') => {
1207
1226
  const confSsr = DefaultConf.ssr[ssr];
1208
1227
  const clients = DefaultConf.client.default.services;
1209
1228
 
1210
- if (absolutePath.match('src/api') && !confServer.apis.find((p) => absolutePath.match(`src/api/${p}/`))) {
1229
+ if (
1230
+ absolutePath.match('src/api') &&
1231
+ !absolutePath.match('src/api/types.js') &&
1232
+ !confServer.apis.find((p) => absolutePath.match(`src/api/${p}/`))
1233
+ ) {
1211
1234
  return false;
1212
1235
  }
1213
1236
  if (absolutePath.match('conf.dd-') && absolutePath.match('.js')) return false;
1214
- if (absolutePath.match('jsdoc.dd-') && absolutePath.match('.json')) return false;
1237
+ if (absolutePath.match('typedoc.dd-') && absolutePath.match('.json')) return false;
1215
1238
  if (
1216
1239
  absolutePath.match('src/client/services/') &&
1217
1240
  !clients.find((p) => absolutePath.match(`src/client/services/${p}/`))
@@ -1227,7 +1250,7 @@ const validateTemplatePath = (absolutePath = '') => {
1227
1250
  ) {
1228
1251
  return false;
1229
1252
  }
1230
- if (absolutePath.match('src/client/sw/') && !clients.find((p) => absolutePath.match(`src/client/sw/${p}.sw.js`))) {
1253
+ if (absolutePath.match('src/client/sw/') && !absolutePath.match('src/client/sw/core.sw.js')) {
1231
1254
  return false;
1232
1255
  }
1233
1256
  if (
@@ -1249,14 +1272,8 @@ const validateTemplatePath = (absolutePath = '') => {
1249
1272
  return false;
1250
1273
  }
1251
1274
  if (
1252
- absolutePath.match('src/client/ssr/offline') &&
1253
- !confSsr.offline.find((p) => absolutePath.match(`src/client/ssr/offline/${p.client}.js`))
1254
- ) {
1255
- return false;
1256
- }
1257
- if (
1258
- absolutePath.match('src/client/ssr/pages') &&
1259
- !confSsr.pages.find((p) => absolutePath.match(`src/client/ssr/pages/${p.client}.js`))
1275
+ absolutePath.match('src/client/ssr/views') &&
1276
+ !(confSsr.views || []).find((p) => absolutePath.match(`src/client/ssr/views/${p.client}.js`))
1260
1277
  ) {
1261
1278
  return false;
1262
1279
  }
@@ -1278,15 +1295,17 @@ const validateTemplatePath = (absolutePath = '') => {
1278
1295
  /**
1279
1296
  * @method awaitDeployMonitor
1280
1297
  * @description Waits for the deploy monitor.
1281
- * @param {boolean} [init=false] - The init flag.
1298
+ * @param {boolean} [isFinal=false] - If true, logs when the final (non-replica) deployment completes.
1282
1299
  * @param {number} [deltaMs=1000] - The delta ms.
1283
1300
  * @returns {Promise<void>} - The await deploy monitor.
1284
1301
  * @memberof ServerConfBuilder
1285
1302
  */
1286
- const awaitDeployMonitor = async (init = false, deltaMs = 1000) => {
1287
- if (init) Underpost.env.set('await-deploy', new Date().toISOString());
1303
+ const awaitDeployMonitor = async (isFinal = false, deltaMs = 1000) => {
1304
+ Underpost.env.set('await-deploy', new Date().toISOString());
1305
+ if (isFinal) logger.info('Final deployment running (no replica)');
1288
1306
  await timer(deltaMs);
1289
- if (Underpost.env.get('await-deploy')) return await awaitDeployMonitor();
1307
+ if (Underpost.env.get('container-status') === 'error') throw new Error('Container status error');
1308
+ if (Underpost.env.get('await-deploy')) return await awaitDeployMonitor(isFinal, deltaMs);
1290
1309
  };
1291
1310
 
1292
1311
  /**
@@ -1311,59 +1330,6 @@ const mergeFile = async (parts = [], outputFilePath) => {
1311
1330
  });
1312
1331
  };
1313
1332
 
1314
- /**
1315
- * @method rebuildConfFactory
1316
- * @description Rebuilds the conf factory.
1317
- * @param {object} options - The options.
1318
- * @param {string} options.deployId - The deploy ID.
1319
- * @param {string} options.valkey - The valkey.
1320
- * @param {boolean} [options.mongo=false] - The mongo.
1321
- * @returns {object} - The rebuild conf factory.
1322
- * @memberof ServerConfBuilder
1323
- */
1324
- const rebuildConfFactory = ({ deployId, valkey, mongo }) => {
1325
- const confServer = loadReplicas(deployId, loadConfServerJson(`./engine-private/conf/${deployId}/conf.server.json`));
1326
- const hosts = {};
1327
- for (const host of Object.keys(confServer)) {
1328
- hosts[host] = {};
1329
- for (const path of Object.keys(confServer[host])) {
1330
- if (!confServer[host][path].db) continue;
1331
- const { singleReplica, replicas, db } = confServer[host][path];
1332
- const { provider } = db;
1333
- if (singleReplica) {
1334
- for (const replica of replicas) {
1335
- const deployIdReplica = buildReplicaId({ replica, deployId });
1336
- const confServerReplica = loadConfServerJson(`./engine-private/replica/${deployIdReplica}/conf.server.json`);
1337
- for (const _host of Object.keys(confServerReplica)) {
1338
- for (const _path of Object.keys(confServerReplica[_host])) {
1339
- hosts[host][_path] = { replica: { host, path } };
1340
- confServerReplica[_host][_path].valkey = valkey;
1341
- switch (provider) {
1342
- case 'mongoose':
1343
- confServerReplica[_host][_path].db.host = mongo.host;
1344
- break;
1345
- }
1346
- }
1347
- }
1348
- fs.writeFileSync(
1349
- `./engine-private/replica/${deployIdReplica}/conf.server.json`,
1350
- JSON.stringify(confServerReplica, null, 4),
1351
- 'utf8',
1352
- );
1353
- }
1354
- } else hosts[host][path] = {};
1355
- confServer[host][path].valkey = valkey;
1356
- switch (provider) {
1357
- case 'mongoose':
1358
- confServer[host][path].db.host = mongo.host;
1359
- break;
1360
- }
1361
- }
1362
- }
1363
- fs.writeFileSync(`./engine-private/conf/${deployId}/conf.server.json`, JSON.stringify(confServer, null, 4), 'utf8');
1364
- return { hosts };
1365
- };
1366
-
1367
1333
  /**
1368
1334
  * @method getPathsSSR
1369
1335
  * @description Gets the paths SSR.
@@ -1376,8 +1342,7 @@ const getPathsSSR = (conf) => {
1376
1342
  for (const o of conf.head) paths.push(`src/client/ssr/head/${o}.js`);
1377
1343
  for (const o of conf.body) paths.push(`src/client/ssr/body/${o}.js`);
1378
1344
  for (const o of Object.keys(conf.mailer)) paths.push(`src/client/ssr/mailer/${conf.mailer[o]}.js`);
1379
- for (const o of conf.offline) paths.push(`src/client/ssr/mailer/${o.client}.js`);
1380
- for (const o of conf.pages) paths.push(`src/client/ssr/pages/${o.client}.js`);
1345
+ for (const o of conf.views || []) paths.push(`src/client/ssr/views/${o.client}.js`);
1381
1346
  return paths;
1382
1347
  };
1383
1348
 
@@ -1745,6 +1710,44 @@ const loadConfServerJson = (jsonPath, options) => {
1745
1710
  return options && options.resolve === true ? resolveConfSecrets(raw) : raw;
1746
1711
  };
1747
1712
 
1713
+ /**
1714
+ * Creates and writes the /etc/hosts file for a deployment.
1715
+ * @method etcHostFactory
1716
+ * @param {Array<string>} hosts - List of hosts to be added to the hosts file.
1717
+ * @param {object} options - Options for the hosts file creation.
1718
+ * @param {boolean} options.append - Whether to append to the existing hosts file.
1719
+ * @returns {object} - Object containing the rendered hosts file.
1720
+ * @memberof ServerConfBuilder
1721
+ */
1722
+ const etcHostFactory = (hosts = [], options = { append: false }) => {
1723
+ hosts = hosts.map((host) => {
1724
+ try {
1725
+ if (!host.startsWith('http')) host = `http://${host}`;
1726
+ const hostname = new URL(host).hostname;
1727
+ logger.info('Hostname extract valid', { host, hostname });
1728
+ return hostname;
1729
+ } catch (e) {
1730
+ logger.warn('No hostname extract valid', host);
1731
+ return host;
1732
+ }
1733
+ });
1734
+ const renderHosts = `127.0.0.1 ${hosts.join(
1735
+ ' ',
1736
+ )} localhost localhost.localdomain localhost4 localhost4.localdomain4
1737
+ ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6`;
1738
+
1739
+ if (options && options.append && fs.existsSync(`/etc/hosts`)) {
1740
+ fs.writeFileSync(
1741
+ `/etc/hosts`,
1742
+ fs.readFileSync(`/etc/hosts`, 'utf8') +
1743
+ `
1744
+ ${renderHosts}`,
1745
+ 'utf8',
1746
+ );
1747
+ } else fs.writeFileSync(`/etc/hosts`, renderHosts, 'utf8');
1748
+ return { renderHosts };
1749
+ };
1750
+
1748
1751
  export {
1749
1752
  Config,
1750
1753
  loadConf,
@@ -1773,7 +1776,6 @@ export {
1773
1776
  pathPortAssignmentFactory,
1774
1777
  deployRangePortFactory,
1775
1778
  awaitDeployMonitor,
1776
- rebuildConfFactory,
1777
1779
  buildCliDoc,
1778
1780
  getInstanceContext,
1779
1781
  buildApiConf,
@@ -1783,6 +1785,7 @@ export {
1783
1785
  devProxyHostFactory,
1784
1786
  isTlsDevProxy,
1785
1787
  getTlsHosts,
1788
+ resolveHostKeyContext,
1786
1789
  resolveConfSecrets,
1787
1790
  loadConfServerJson,
1788
1791
  getConfFolder,
@@ -1791,4 +1794,5 @@ export {
1791
1794
  DEFAULT_DEPLOY_ID,
1792
1795
  loadCronDeployEnv,
1793
1796
  cronDeployIdResolve,
1797
+ etcHostFactory,
1794
1798
  };
@@ -5,7 +5,16 @@
5
5
  * @namespace DataQuery
6
6
  */
7
7
 
8
- export const DataQuery = {
8
+ /**
9
+ * @class DataQuery
10
+ * @description Utility class for parsing request query parameters into Mongoose query options,
11
+ * including support for AG Grid filterModel and sortModel. Provides a static `parse`
12
+ * method that takes in request query parameters and returns an object containing the MongoDB
13
+ * query, sort options, pagination skip/limit, and page number. Designed to be used in API
14
+ * controllers to handle complex querying needs from the frontend.
15
+ * @memberof DataQuery
16
+ */
17
+ class DataQuery {
9
18
  /**
10
19
  * Parse request query parameters into Mongoose query options
11
20
  * @param {Object} params - The request query parameters (req.query)
@@ -20,7 +29,7 @@ export const DataQuery = {
20
29
  * @memberof DataQuery
21
30
  * @returns {Object} { query, sort, skip, limit, page }
22
31
  */
23
- parse: (params = {}) => {
32
+ static parse(params = {}) {
24
33
  let { filterModel, sortModel, page, limit, sort: sortParam, asc, order, query: defaultQuery } = params;
25
34
 
26
35
  // === 1. Pagination ===
@@ -35,7 +44,7 @@ export const DataQuery = {
35
44
  const query = DataQuery._parseFilter(filterModel, defaultQuery);
36
45
 
37
46
  return { query, sort, skip, limit, page };
38
- },
47
+ }
39
48
 
40
49
  /**
41
50
  * Parse sort parameters from AG Grid sortModel or simple sort params
@@ -47,7 +56,7 @@ export const DataQuery = {
47
56
  * @return {Object} sort object for Mongoose
48
57
  * @memberof DataQuery
49
58
  */
50
- _parseSort: (sortModel, sortParam, asc, order) => {
59
+ static _parseSort(sortModel, sortParam, asc, order) {
51
60
  const sort = {};
52
61
 
53
62
  // Parse sortModel from string if needed
@@ -90,7 +99,7 @@ export const DataQuery = {
90
99
  }
91
100
 
92
101
  return sort;
93
- },
102
+ }
94
103
 
95
104
  /**
96
105
  * Parse filter parameters from AG Grid filterModel
@@ -100,7 +109,7 @@ export const DataQuery = {
100
109
  * @return {Object} query object for Mongoose
101
110
  * @memberof DataQuery
102
111
  */
103
- _parseFilter: (filterModel, defaultQuery) => {
112
+ static _parseFilter(filterModel, defaultQuery) {
104
113
  let query = defaultQuery ? { ...defaultQuery } : {};
105
114
 
106
115
  // Parse filterModel from string if needed
@@ -127,7 +136,7 @@ export const DataQuery = {
127
136
  });
128
137
 
129
138
  return query;
130
- },
139
+ }
131
140
 
132
141
  /**
133
142
  * Parse a single field filter
@@ -137,7 +146,7 @@ export const DataQuery = {
137
146
  * @return {Object|null} query condition for the field or null if invalid
138
147
  * @memberof DataQuery
139
148
  */
140
- _parseFieldFilter: (field, filter) => {
149
+ static _parseFieldFilter(field, filter) {
141
150
  if (!filter || !filter.filterType) {
142
151
  return null;
143
152
  }
@@ -158,7 +167,7 @@ export const DataQuery = {
158
167
  default:
159
168
  return null;
160
169
  }
161
- },
170
+ }
162
171
 
163
172
  /**
164
173
  * Parse text filter
@@ -168,7 +177,7 @@ export const DataQuery = {
168
177
  * @return {Object|null} query condition for the text field or null if invalid
169
178
  * @memberof DataQuery
170
179
  */
171
- _parseTextFilter: (field, filter) => {
180
+ static _parseTextFilter(field, filter) {
172
181
  const { type, filter: filterValue } = filter;
173
182
 
174
183
  if (filterValue === null || filterValue === undefined || filterValue === '') {
@@ -219,7 +228,7 @@ export const DataQuery = {
219
228
  }
220
229
 
221
230
  return query;
222
- },
231
+ }
223
232
 
224
233
  /**
225
234
  * Parse number filter
@@ -229,7 +238,7 @@ export const DataQuery = {
229
238
  * @return {Object|null} query condition for the number field or null if invalid
230
239
  * @memberof DataQuery
231
240
  */
232
- _parseNumberFilter: (field, filter) => {
241
+ static _parseNumberFilter(field, filter) {
233
242
  const { type, filter: filterValue, filterTo } = filter;
234
243
 
235
244
  if (filterValue === null || filterValue === undefined) {
@@ -281,7 +290,7 @@ export const DataQuery = {
281
290
  }
282
291
 
283
292
  return query;
284
- },
293
+ }
285
294
 
286
295
  /**
287
296
  * Parse date filter
@@ -291,7 +300,7 @@ export const DataQuery = {
291
300
  * @return {Object|null} query condition for the date field or null if invalid
292
301
  * @memberof DataQuery
293
302
  */
294
- _parseDateFilter: (field, filter) => {
303
+ static _parseDateFilter(field, filter) {
295
304
  const { type, dateFrom, dateTo } = filter;
296
305
 
297
306
  // Handle blank/notBlank without dates
@@ -391,7 +400,7 @@ export const DataQuery = {
391
400
  }
392
401
 
393
402
  return query;
394
- },
403
+ }
395
404
 
396
405
  /**
397
406
  * Parse set filter
@@ -401,7 +410,7 @@ export const DataQuery = {
401
410
  * @return {Object|null} query condition for the set field or null if invalid
402
411
  * @memberof DataQuery
403
412
  */
404
- _parseSetFilter: (field, filter) => {
413
+ static _parseSetFilter(field, filter) {
405
414
  const { values } = filter;
406
415
 
407
416
  if (!Array.isArray(values) || values.length === 0) {
@@ -409,7 +418,7 @@ export const DataQuery = {
409
418
  }
410
419
 
411
420
  return { [field]: { $in: values } };
412
- },
421
+ }
413
422
 
414
423
  /**
415
424
  * Parse multi filter (combines multiple filters with AND/OR)
@@ -419,7 +428,7 @@ export const DataQuery = {
419
428
  * @return {Object|null} query condition for the multi filter or null if invalid
420
429
  * @memberof DataQuery
421
430
  */
422
- _parseMultiFilter: (field, filter) => {
431
+ static _parseMultiFilter(field, filter) {
423
432
  const { filterModels, operator } = filter;
424
433
 
425
434
  if (!Array.isArray(filterModels) || filterModels.length === 0) {
@@ -445,5 +454,8 @@ export const DataQuery = {
445
454
  // AND operator (default)
446
455
  return { $and: conditions };
447
456
  }
448
- },
449
- };
457
+ }
458
+ }
459
+
460
+ export { DataQuery };
461
+ export default DataQuery;
package/src/server/dns.js CHANGED
@@ -101,6 +101,22 @@ class Dns {
101
101
  return ipv4.address;
102
102
  }
103
103
 
104
+ /**
105
+ * Gets the MAC address of the main (default route) network interface.
106
+ * @static
107
+ * @memberof UnderpostDns
108
+ * @returns {string|null} The MAC address, or null if not found.
109
+ */
110
+ static getMainInterfaceMac() {
111
+ const interfaceName = Dns.getDefaultNetworkInterface();
112
+ const networkInfo = os.networkInterfaces()[interfaceName];
113
+ if (!networkInfo || networkInfo.length === 0) {
114
+ logger.error(`Could not find network interface: ${interfaceName}`);
115
+ return null;
116
+ }
117
+ return networkInfo[0].mac;
118
+ }
119
+
104
120
  /**
105
121
  * Setup nftables tables and chains if they don't exist.
106
122
  * @static
@@ -491,6 +507,12 @@ class Dns {
491
507
  });
492
508
  }
493
509
 
510
+ if (options.mac) {
511
+ const mac = Dns.getMainInterfaceMac();
512
+ console.log(mac);
513
+ return mac;
514
+ }
515
+
494
516
  let ip;
495
517
  if (options.dhcp) ip = Dns.getLocalIPv4Address();
496
518
  else ip = await Dns.getPublicIp();