cyberia 2.8.885

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 (525) hide show
  1. package/.dockerignore +15 -0
  2. package/.env.development +45 -0
  3. package/.env.production +50 -0
  4. package/.env.test +45 -0
  5. package/.github/workflows/engine-cyberia.cd.yml +31 -0
  6. package/.github/workflows/engine-cyberia.ci.yml +60 -0
  7. package/.github/workflows/ghpkg.ci.yml +87 -0
  8. package/.github/workflows/npmpkg.ci.yml +72 -0
  9. package/.github/workflows/publish.ci.yml +84 -0
  10. package/.github/workflows/publish.cyberia.ci.yml +84 -0
  11. package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
  12. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  13. package/.github/workflows/release.cd.yml +37 -0
  14. package/.nycrc +9 -0
  15. package/.prettierignore +13 -0
  16. package/.prettierrc +9 -0
  17. package/.vscode/extensions.json +51 -0
  18. package/.vscode/settings.json +87 -0
  19. package/AUTHORS.md +21 -0
  20. package/CHANGELOG.md +205 -0
  21. package/Dockerfile +28 -0
  22. package/LICENSE +21 -0
  23. package/README.md +85 -0
  24. package/bin/build.js +209 -0
  25. package/bin/cron.js +47 -0
  26. package/bin/cyberia.js +145 -0
  27. package/bin/db.js +199 -0
  28. package/bin/deploy.js +1293 -0
  29. package/bin/file.js +197 -0
  30. package/bin/hwt.js +49 -0
  31. package/bin/index.js +145 -0
  32. package/bin/ssl.js +63 -0
  33. package/bin/util.js +80 -0
  34. package/bin/vs.js +74 -0
  35. package/cli.md +714 -0
  36. package/conf.js +204 -0
  37. package/deployment.yaml +138 -0
  38. package/jsconfig.json +7 -0
  39. package/jsdoc.json +32 -0
  40. package/manifests/deployment/adminer/deployment.yaml +32 -0
  41. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  42. package/manifests/deployment/adminer/service.yaml +13 -0
  43. package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
  44. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  45. package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
  46. package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
  47. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  48. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  49. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  50. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  51. package/manifests/deployment/fastapi/initial_data.sh +56 -0
  52. package/manifests/deployment/kafka/deployment.yaml +69 -0
  53. package/manifests/deployment/mongo-express/deployment.yaml +60 -0
  54. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  55. package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
  56. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  57. package/manifests/envoy-service-nodeport.yaml +23 -0
  58. package/manifests/grafana/deployment.yaml +57 -0
  59. package/manifests/grafana/kustomization.yaml +7 -0
  60. package/manifests/grafana/pvc.yaml +12 -0
  61. package/manifests/grafana/service.yaml +14 -0
  62. package/manifests/kind-config-dev.yaml +12 -0
  63. package/manifests/kind-config.yaml +12 -0
  64. package/manifests/kubeadm-calico-config.yaml +119 -0
  65. package/manifests/kubelet-config.yaml +65 -0
  66. package/manifests/letsencrypt-prod.yaml +15 -0
  67. package/manifests/lxd/lxd-admin-profile.yaml +17 -0
  68. package/manifests/lxd/lxd-preseed.yaml +30 -0
  69. package/manifests/lxd/underpost-setup.sh +163 -0
  70. package/manifests/mariadb/config.yaml +10 -0
  71. package/manifests/mariadb/kustomization.yaml +9 -0
  72. package/manifests/mariadb/pv.yaml +12 -0
  73. package/manifests/mariadb/pvc.yaml +10 -0
  74. package/manifests/mariadb/secret.yaml +8 -0
  75. package/manifests/mariadb/service.yaml +10 -0
  76. package/manifests/mariadb/statefulset.yaml +56 -0
  77. package/manifests/mariadb/storage-class.yaml +10 -0
  78. package/manifests/mongodb/backup-access.yaml +16 -0
  79. package/manifests/mongodb/backup-cronjob.yaml +42 -0
  80. package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
  81. package/manifests/mongodb/configmap.yaml +26 -0
  82. package/manifests/mongodb/headless-service.yaml +10 -0
  83. package/manifests/mongodb/kustomization.yaml +11 -0
  84. package/manifests/mongodb/pv-pvc.yaml +23 -0
  85. package/manifests/mongodb/statefulset.yaml +126 -0
  86. package/manifests/mongodb/storage-class.yaml +9 -0
  87. package/manifests/mongodb-4.4/kustomization.yaml +7 -0
  88. package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
  89. package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
  90. package/manifests/mysql/kustomization.yaml +7 -0
  91. package/manifests/mysql/pv-pvc.yaml +27 -0
  92. package/manifests/mysql/statefulset.yaml +55 -0
  93. package/manifests/postgresql/configmap.yaml +9 -0
  94. package/manifests/postgresql/kustomization.yaml +10 -0
  95. package/manifests/postgresql/pv.yaml +15 -0
  96. package/manifests/postgresql/pvc.yaml +13 -0
  97. package/manifests/postgresql/service.yaml +10 -0
  98. package/manifests/postgresql/statefulset.yaml +37 -0
  99. package/manifests/prometheus/deployment.yaml +82 -0
  100. package/manifests/valkey/kustomization.yaml +7 -0
  101. package/manifests/valkey/service.yaml +11 -0
  102. package/manifests/valkey/statefulset.yaml +38 -0
  103. package/nodemon.json +6 -0
  104. package/package.json +118 -0
  105. package/proxy.yaml +35 -0
  106. package/scripts/device-scan.sh +43 -0
  107. package/scripts/gpu-diag.sh +19 -0
  108. package/scripts/maas-setup.sh +120 -0
  109. package/scripts/nat-iptables.sh +26 -0
  110. package/scripts/nvim.sh +91 -0
  111. package/scripts/snap-clean.sh +26 -0
  112. package/scripts/ssh-cluster-info.sh +14 -0
  113. package/scripts/ssl.sh +164 -0
  114. package/src/api/blockchain/blockchain.controller.js +51 -0
  115. package/src/api/blockchain/blockchain.model.js +90 -0
  116. package/src/api/blockchain/blockchain.router.js +21 -0
  117. package/src/api/blockchain/blockchain.service.js +24 -0
  118. package/src/api/core/core.controller.js +69 -0
  119. package/src/api/core/core.model.js +11 -0
  120. package/src/api/core/core.router.js +24 -0
  121. package/src/api/core/core.service.js +35 -0
  122. package/src/api/crypto/crypto.controller.js +51 -0
  123. package/src/api/crypto/crypto.model.js +23 -0
  124. package/src/api/crypto/crypto.router.js +20 -0
  125. package/src/api/crypto/crypto.service.js +64 -0
  126. package/src/api/default/default.controller.js +74 -0
  127. package/src/api/default/default.model.js +20 -0
  128. package/src/api/default/default.router.js +27 -0
  129. package/src/api/default/default.service.js +40 -0
  130. package/src/api/document/document.controller.js +66 -0
  131. package/src/api/document/document.model.js +51 -0
  132. package/src/api/document/document.router.js +24 -0
  133. package/src/api/document/document.service.js +133 -0
  134. package/src/api/file/file.controller.js +67 -0
  135. package/src/api/file/file.model.js +19 -0
  136. package/src/api/file/file.router.js +22 -0
  137. package/src/api/file/file.service.js +100 -0
  138. package/src/api/instance/instance.controller.js +69 -0
  139. package/src/api/instance/instance.model.js +40 -0
  140. package/src/api/instance/instance.router.js +34 -0
  141. package/src/api/instance/instance.service.js +70 -0
  142. package/src/api/ipfs/ipfs.controller.js +51 -0
  143. package/src/api/ipfs/ipfs.model.js +17 -0
  144. package/src/api/ipfs/ipfs.router.js +20 -0
  145. package/src/api/ipfs/ipfs.service.js +25 -0
  146. package/src/api/object-layer/README.md +85 -0
  147. package/src/api/object-layer/object-layer.controller.js +69 -0
  148. package/src/api/object-layer/object-layer.model.js +181 -0
  149. package/src/api/object-layer/object-layer.router.js +29 -0
  150. package/src/api/object-layer/object-layer.service.js +49 -0
  151. package/src/api/test/test.controller.js +59 -0
  152. package/src/api/test/test.model.js +14 -0
  153. package/src/api/test/test.router.js +21 -0
  154. package/src/api/test/test.service.js +35 -0
  155. package/src/api/user/postman_collection.json +216 -0
  156. package/src/api/user/user.build.js +16 -0
  157. package/src/api/user/user.controller.js +35 -0
  158. package/src/api/user/user.model.js +100 -0
  159. package/src/api/user/user.router.js +400 -0
  160. package/src/api/user/user.service.js +500 -0
  161. package/src/api.js +23 -0
  162. package/src/cli/baremetal.js +1310 -0
  163. package/src/cli/cloud-init.js +548 -0
  164. package/src/cli/cluster.js +834 -0
  165. package/src/cli/cron.js +95 -0
  166. package/src/cli/db.js +414 -0
  167. package/src/cli/deploy.js +661 -0
  168. package/src/cli/env.js +101 -0
  169. package/src/cli/fs.js +256 -0
  170. package/src/cli/image.js +156 -0
  171. package/src/cli/index.js +436 -0
  172. package/src/cli/lxd.js +402 -0
  173. package/src/cli/monitor.js +260 -0
  174. package/src/cli/repository.js +274 -0
  175. package/src/cli/run.js +728 -0
  176. package/src/cli/script.js +85 -0
  177. package/src/cli/secrets.js +71 -0
  178. package/src/cli/ssh.js +46 -0
  179. package/src/cli/test.js +159 -0
  180. package/src/client/Cyberia.index.js +50 -0
  181. package/src/client/CyberiaAdmin.index.js +34 -0
  182. package/src/client/CyberiaPortal.index.js +36 -0
  183. package/src/client/Default.index.js +84 -0
  184. package/src/client/components/core/404.js +20 -0
  185. package/src/client/components/core/500.js +20 -0
  186. package/src/client/components/core/Account.js +326 -0
  187. package/src/client/components/core/AgGrid.js +191 -0
  188. package/src/client/components/core/Alert.js +77 -0
  189. package/src/client/components/core/Auth.js +342 -0
  190. package/src/client/components/core/Badge.js +32 -0
  191. package/src/client/components/core/Blockchain.js +41 -0
  192. package/src/client/components/core/Blog.js +9 -0
  193. package/src/client/components/core/BtnIcon.js +111 -0
  194. package/src/client/components/core/CalendarCore.js +464 -0
  195. package/src/client/components/core/Chat.js +64 -0
  196. package/src/client/components/core/ColorPalette.js +5267 -0
  197. package/src/client/components/core/CommonJs.js +1010 -0
  198. package/src/client/components/core/Content.js +196 -0
  199. package/src/client/components/core/Css.js +1099 -0
  200. package/src/client/components/core/CssCore.js +882 -0
  201. package/src/client/components/core/D3Chart.js +44 -0
  202. package/src/client/components/core/Docs.js +376 -0
  203. package/src/client/components/core/DropDown.js +223 -0
  204. package/src/client/components/core/EventsUI.js +133 -0
  205. package/src/client/components/core/FileExplorer.js +707 -0
  206. package/src/client/components/core/FullScreen.js +36 -0
  207. package/src/client/components/core/Input.js +383 -0
  208. package/src/client/components/core/JoyStick.js +80 -0
  209. package/src/client/components/core/Keyboard.js +73 -0
  210. package/src/client/components/core/LoadingAnimation.js +159 -0
  211. package/src/client/components/core/LogIn.js +190 -0
  212. package/src/client/components/core/LogOut.js +63 -0
  213. package/src/client/components/core/Logger.js +29 -0
  214. package/src/client/components/core/Modal.js +2494 -0
  215. package/src/client/components/core/NotificationManager.js +84 -0
  216. package/src/client/components/core/ObjectLayerEngine.js +1229 -0
  217. package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
  218. package/src/client/components/core/Pagination.js +207 -0
  219. package/src/client/components/core/Panel.js +772 -0
  220. package/src/client/components/core/PanelForm.js +627 -0
  221. package/src/client/components/core/Polyhedron.js +162 -0
  222. package/src/client/components/core/Recover.js +207 -0
  223. package/src/client/components/core/Responsive.js +82 -0
  224. package/src/client/components/core/RichText.js +43 -0
  225. package/src/client/components/core/Router.js +317 -0
  226. package/src/client/components/core/Scroll.js +76 -0
  227. package/src/client/components/core/SignUp.js +125 -0
  228. package/src/client/components/core/SocketIo.js +74 -0
  229. package/src/client/components/core/Stream.js +113 -0
  230. package/src/client/components/core/ToggleSwitch.js +101 -0
  231. package/src/client/components/core/ToolTip.js +90 -0
  232. package/src/client/components/core/Translate.js +522 -0
  233. package/src/client/components/core/Validator.js +115 -0
  234. package/src/client/components/core/VanillaJs.js +423 -0
  235. package/src/client/components/core/Wallet.js +106 -0
  236. package/src/client/components/core/WebComponent.js +44 -0
  237. package/src/client/components/core/Webhook.js +25 -0
  238. package/src/client/components/core/Worker.js +371 -0
  239. package/src/client/components/core/windowGetDimensions.js +269 -0
  240. package/src/client/components/cyberia/BagCyberia.js +1253 -0
  241. package/src/client/components/cyberia/BiomeCyberia.js +130 -0
  242. package/src/client/components/cyberia/CharacterCyberia.js +321 -0
  243. package/src/client/components/cyberia/CommonCyberia.js +1834 -0
  244. package/src/client/components/cyberia/CssCyberia.js +816 -0
  245. package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
  246. package/src/client/components/cyberia/ElementsCyberia.js +146 -0
  247. package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
  248. package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
  249. package/src/client/components/cyberia/LogInCyberia.js +68 -0
  250. package/src/client/components/cyberia/LogOutCyberia.js +24 -0
  251. package/src/client/components/cyberia/MainUserCyberia.js +424 -0
  252. package/src/client/components/cyberia/MapCyberia.js +160 -0
  253. package/src/client/components/cyberia/MatrixCyberia.js +147 -0
  254. package/src/client/components/cyberia/MenuCyberia.js +575 -0
  255. package/src/client/components/cyberia/PixiCyberia.js +1639 -0
  256. package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
  257. package/src/client/components/cyberia/QuestCyberia.js +1420 -0
  258. package/src/client/components/cyberia/RoutesCyberia.js +47 -0
  259. package/src/client/components/cyberia/SettingsCyberia.js +16 -0
  260. package/src/client/components/cyberia/SignUpCyberia.js +14 -0
  261. package/src/client/components/cyberia/SkillCyberia.js +124 -0
  262. package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
  263. package/src/client/components/cyberia/TileCyberia.js +685 -0
  264. package/src/client/components/cyberia/TranslateCyberia.js +96 -0
  265. package/src/client/components/cyberia/UniverseCyberia.js +14 -0
  266. package/src/client/components/cyberia/WebhookCyberia.js +13 -0
  267. package/src/client/components/cyberia/WikiCyberia.js +144 -0
  268. package/src/client/components/cyberia/WorldCyberia.js +680 -0
  269. package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
  270. package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
  271. package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
  272. package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
  273. package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
  274. package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
  275. package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
  276. package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
  277. package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
  278. package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
  279. package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
  280. package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
  281. package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
  282. package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
  283. package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
  284. package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
  285. package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
  286. package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
  287. package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
  288. package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
  289. package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
  290. package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
  291. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
  292. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
  293. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
  294. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
  295. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
  296. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
  297. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
  298. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
  299. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  300. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
  301. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
  302. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
  303. package/src/client/components/default/CommonDefault.js +29 -0
  304. package/src/client/components/default/CssDefault.js +27 -0
  305. package/src/client/components/default/ElementsDefault.js +38 -0
  306. package/src/client/components/default/LogInDefault.js +14 -0
  307. package/src/client/components/default/LogOutDefault.js +10 -0
  308. package/src/client/components/default/MenuDefault.js +743 -0
  309. package/src/client/components/default/RoutesDefault.js +48 -0
  310. package/src/client/components/default/SettingsDefault.js +16 -0
  311. package/src/client/components/default/SignUpDefault.js +9 -0
  312. package/src/client/components/default/SocketIoDefault.js +54 -0
  313. package/src/client/components/default/TranslateDefault.js +7 -0
  314. package/src/client/public/default/android-chrome-144x144.png +0 -0
  315. package/src/client/public/default/android-chrome-192x192.png +0 -0
  316. package/src/client/public/default/android-chrome-256x256.png +0 -0
  317. package/src/client/public/default/android-chrome-36x36.png +0 -0
  318. package/src/client/public/default/android-chrome-384x384.png +0 -0
  319. package/src/client/public/default/android-chrome-48x48.png +0 -0
  320. package/src/client/public/default/android-chrome-512x512.png +0 -0
  321. package/src/client/public/default/android-chrome-72x72.png +0 -0
  322. package/src/client/public/default/android-chrome-96x96.png +0 -0
  323. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  324. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  325. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  326. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  327. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  328. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  329. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  330. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  331. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  332. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  333. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  334. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  335. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  336. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  337. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  338. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  339. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  340. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  341. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  342. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  343. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  344. package/src/client/public/default/apple-touch-icon.png +0 -0
  345. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  346. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  347. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  348. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  349. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  350. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  351. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  352. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  353. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  354. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  355. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  356. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  357. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  358. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  359. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  360. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  361. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  362. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  363. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  364. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  365. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  366. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  367. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  368. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  369. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  370. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  371. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  372. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  373. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  374. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  375. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  376. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  377. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  378. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  379. package/src/client/public/default/assets/background/dark.jpg +0 -0
  380. package/src/client/public/default/assets/background/dark.svg +557 -0
  381. package/src/client/public/default/assets/background/white.jpg +0 -0
  382. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  383. package/src/client/public/default/assets/background/white0.jpg +0 -0
  384. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  385. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  386. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  387. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  388. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  389. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  390. package/src/client/public/default/browserconfig.xml +12 -0
  391. package/src/client/public/default/favicon-16x16.png +0 -0
  392. package/src/client/public/default/favicon-32x32.png +0 -0
  393. package/src/client/public/default/favicon-48x48.png +0 -0
  394. package/src/client/public/default/favicon.ico +0 -0
  395. package/src/client/public/default/manifest.webmanifest +69 -0
  396. package/src/client/public/default/mstile-144x144.png +0 -0
  397. package/src/client/public/default/mstile-150x150.png +0 -0
  398. package/src/client/public/default/mstile-310x150.png +0 -0
  399. package/src/client/public/default/mstile-310x310.png +0 -0
  400. package/src/client/public/default/mstile-70x70.png +0 -0
  401. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  402. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  403. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  404. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  405. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  406. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  407. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  408. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  409. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  410. package/src/client/public/default/site.webmanifest +69 -0
  411. package/src/client/public/default/sitemap +148 -0
  412. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  413. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  414. package/src/client/public/doc/favicon.ico +0 -0
  415. package/src/client/public/doc/sitemap +148 -0
  416. package/src/client/public/test/favicon.ico +0 -0
  417. package/src/client/public/test/sitemap +148 -0
  418. package/src/client/services/blockchain/blockchain.service.js +73 -0
  419. package/src/client/services/core/core.service.js +165 -0
  420. package/src/client/services/crypto/crypto.service.js +73 -0
  421. package/src/client/services/default/default.management.js +450 -0
  422. package/src/client/services/default/default.service.js +98 -0
  423. package/src/client/services/document/document.service.js +97 -0
  424. package/src/client/services/file/file.service.js +72 -0
  425. package/src/client/services/instance/instance.management.js +78 -0
  426. package/src/client/services/instance/instance.service.js +97 -0
  427. package/src/client/services/ipfs/ipfs.service.js +73 -0
  428. package/src/client/services/object-layer/object-layer.service.js +93 -0
  429. package/src/client/services/test/test.service.js +73 -0
  430. package/src/client/services/user/user.management.js +56 -0
  431. package/src/client/services/user/user.service.js +108 -0
  432. package/src/client/ssr/Render.js +237 -0
  433. package/src/client/ssr/body/404.js +73 -0
  434. package/src/client/ssr/body/500.js +72 -0
  435. package/src/client/ssr/body/CacheControl.js +114 -0
  436. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
  437. package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
  438. package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
  439. package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
  440. package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
  441. package/src/client/ssr/head/Css.js +241 -0
  442. package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
  443. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  444. package/src/client/ssr/head/CyberiaScripts.js +6 -0
  445. package/src/client/ssr/head/DefaultScripts.js +6 -0
  446. package/src/client/ssr/head/Microdata.js +11 -0
  447. package/src/client/ssr/head/Production.js +1 -0
  448. package/src/client/ssr/head/Pwa.js +146 -0
  449. package/src/client/ssr/head/Seo.js +15 -0
  450. package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
  451. package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
  452. package/src/client/ssr/offline/Maintenance.js +63 -0
  453. package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
  454. package/src/client/ssr/pages/404.js +12 -0
  455. package/src/client/ssr/pages/500.js +12 -0
  456. package/src/client/ssr/pages/Test.js +198 -0
  457. package/src/client/ssr/pages/maintenance.js +14 -0
  458. package/src/client/ssr/pages/offline.js +21 -0
  459. package/src/client/sw/default.sw.js +108 -0
  460. package/src/client/sw/template.sw.js +84 -0
  461. package/src/client.build.js +22 -0
  462. package/src/client.dev.js +24 -0
  463. package/src/db/DataBaseProvider.js +98 -0
  464. package/src/db/mariadb/MariaDB.js +66 -0
  465. package/src/db/mongo/MongooseDB.js +70 -0
  466. package/src/index.js +198 -0
  467. package/src/mailer/EmailRender.js +116 -0
  468. package/src/mailer/MailerProvider.js +213 -0
  469. package/src/monitor.js +24 -0
  470. package/src/proxy.js +22 -0
  471. package/src/runtime/express/Express.js +256 -0
  472. package/src/runtime/lampp/Dockerfile +50 -0
  473. package/src/runtime/lampp/Lampp.js +343 -0
  474. package/src/server/auth.js +689 -0
  475. package/src/server/backup.js +96 -0
  476. package/src/server/client-build-docs.js +205 -0
  477. package/src/server/client-build-live.js +109 -0
  478. package/src/server/client-build.js +690 -0
  479. package/src/server/client-dev-server.js +87 -0
  480. package/src/server/client-formatted.js +87 -0
  481. package/src/server/client-icons.js +108 -0
  482. package/src/server/conf.js +1071 -0
  483. package/src/server/crypto.js +210 -0
  484. package/src/server/dns.js +276 -0
  485. package/src/server/downloader.js +74 -0
  486. package/src/server/json-schema.js +77 -0
  487. package/src/server/logger.js +197 -0
  488. package/src/server/network.js +72 -0
  489. package/src/server/object-layer.js +294 -0
  490. package/src/server/peer.js +69 -0
  491. package/src/server/process.js +171 -0
  492. package/src/server/proxy.js +110 -0
  493. package/src/server/runtime.js +170 -0
  494. package/src/server/ssr.js +127 -0
  495. package/src/server/start.js +161 -0
  496. package/src/server/tls.js +251 -0
  497. package/src/server/valkey.js +293 -0
  498. package/src/server.js +25 -0
  499. package/src/ws/IoInterface.js +139 -0
  500. package/src/ws/IoServer.js +88 -0
  501. package/src/ws/core/channels/core.ws.chat.js +23 -0
  502. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  503. package/src/ws/core/channels/core.ws.stream.js +31 -0
  504. package/src/ws/core/core.ws.connection.js +62 -0
  505. package/src/ws/core/core.ws.emit.js +53 -0
  506. package/src/ws/core/core.ws.server.js +76 -0
  507. package/src/ws/core/management/core.ws.chat.js +8 -0
  508. package/src/ws/core/management/core.ws.mailer.js +16 -0
  509. package/src/ws/core/management/core.ws.stream.js +8 -0
  510. package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
  511. package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
  512. package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
  513. package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
  514. package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
  515. package/src/ws/cyberia/cyberia.ws.server.js +67 -0
  516. package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
  517. package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
  518. package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
  519. package/src/ws/default/channels/default.ws.main.js +16 -0
  520. package/src/ws/default/default.ws.connection.js +22 -0
  521. package/src/ws/default/default.ws.emit.js +14 -0
  522. package/src/ws/default/default.ws.server.js +20 -0
  523. package/src/ws/default/management/default.ws.main.js +8 -0
  524. package/test/api.test.js +53 -0
  525. package/test/crypto.test.js +117 -0
package/bin/deploy.js ADDED
@@ -0,0 +1,1293 @@
1
+ import fs from 'fs-extra';
2
+ import axios from 'axios';
3
+
4
+ import dotenv from 'dotenv';
5
+
6
+ import { pbcopy, shellCd, shellExec } from '../src/server/process.js';
7
+ import { loggerFactory } from '../src/server/logger.js';
8
+ import {
9
+ Config,
10
+ addApiConf,
11
+ addClientConf,
12
+ buildApiSrc,
13
+ buildClientSrc,
14
+ cloneConf,
15
+ loadConf,
16
+ loadReplicas,
17
+ addWsConf,
18
+ buildWsSrc,
19
+ cloneSrcComponents,
20
+ getDataDeploy,
21
+ buildReplicaId,
22
+ Cmd,
23
+ writeEnv,
24
+ buildCliDoc,
25
+ } from '../src/server/conf.js';
26
+ import { buildClient } from '../src/server/client-build.js';
27
+ import { DefaultConf } from '../conf.js';
28
+ import colors from 'colors';
29
+ import { program } from '../src/cli/index.js';
30
+ import { getLocalIPv4Address, ip } from '../src/server/dns.js';
31
+ import { timer } from '../src/client/components/core/CommonJs.js';
32
+
33
+ colors.enable();
34
+
35
+ const logger = loggerFactory(import.meta);
36
+
37
+ logger.info('argv', process.argv);
38
+
39
+ const [exe, dir, operator] = process.argv;
40
+
41
+ try {
42
+ switch (operator) {
43
+ case 'add-nodejs-app-client-conf':
44
+ {
45
+ const toOptions = {
46
+ deployId: process.argv[3],
47
+ clientId: process.argv[4],
48
+ host: process.argv[5],
49
+ path: process.argv[6],
50
+ };
51
+ const fromOptions = { deployId: process.argv[7], clientId: process.argv[8] };
52
+ addClientConf({ toOptions, fromOptions });
53
+ }
54
+ break;
55
+ case 'build-nodejs-conf-app':
56
+ {
57
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
58
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
59
+ cloneConf({ toOptions, fromOptions });
60
+ }
61
+ break;
62
+ case 'clone-nodejs-src-client-components':
63
+ {
64
+ const fromOptions = { componentsFolder: process.argv[3] };
65
+ const toOptions = { componentsFolder: process.argv[4] };
66
+ cloneSrcComponents({ toOptions, fromOptions });
67
+ }
68
+ break;
69
+ case 'build-nodejs-src-app':
70
+ {
71
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
72
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
73
+ buildClientSrc({ toOptions, fromOptions });
74
+ }
75
+ break;
76
+ case 'build-nodejs-conf-api':
77
+ {
78
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
79
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
80
+ addApiConf({ toOptions, fromOptions });
81
+ }
82
+ break;
83
+ case 'build-nodejs-src-api':
84
+ {
85
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
86
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
87
+ buildApiSrc({ toOptions, fromOptions });
88
+ }
89
+ break;
90
+ case 'build-nodejs-conf-ws':
91
+ {
92
+ const toOptions = {
93
+ wsId: process.argv[3],
94
+ deployId: process.argv[4],
95
+ host: process.argv[5],
96
+ paths: process.argv[6],
97
+ };
98
+ const fromOptions = {
99
+ wsId: process.argv[7],
100
+ deployId: process.argv[8],
101
+ host: process.argv[9],
102
+ paths: process.argv[10],
103
+ };
104
+ addWsConf({ toOptions, fromOptions });
105
+ }
106
+ break;
107
+ case 'build-nodejs-src-ws':
108
+ {
109
+ const toOptions = {
110
+ wsId: process.argv[3],
111
+ deployId: process.argv[4],
112
+ host: process.argv[5],
113
+ paths: process.argv[6],
114
+ };
115
+ const fromOptions = {
116
+ wsId: process.argv[7],
117
+ deployId: process.argv[8],
118
+ host: process.argv[9],
119
+ paths: process.argv[10],
120
+ };
121
+ buildWsSrc({ toOptions, fromOptions });
122
+ }
123
+ break;
124
+ case 'conf': {
125
+ let subConf = process.argv[5] ?? '';
126
+
127
+ if (!['current', 'clean'].includes(process.argv[3]))
128
+ dotenv.config({ path: `./engine-private/conf/${process.argv[3]}/.env.${process.argv[4]}`, override: true });
129
+
130
+ loadConf(process.argv[3], subConf);
131
+ break;
132
+ }
133
+
134
+ case 'new-nodejs-app':
135
+ {
136
+ const deployId = process.argv[3];
137
+ const clientId = process.argv[4];
138
+
139
+ shellExec(`node bin/deploy build-nodejs-conf-app ${deployId} ${clientId}`);
140
+
141
+ shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
142
+
143
+ shellExec(`node bin/deploy build-full-client ${deployId}`);
144
+
145
+ shellExec(`npm run dev ${deployId}`);
146
+ }
147
+ break;
148
+ case 'test-new-api':
149
+ {
150
+ const port = process.argv[3];
151
+ const apiId = process.argv[4];
152
+ let url = `http://localhost:${port}/api/${apiId}`;
153
+ {
154
+ logger.info(`POST REQUEST`, url);
155
+ const result = await axios.post(url, {});
156
+ url += '/' + result.data.data._id;
157
+ logger.info(`POST RESULT ${url}`, result.data);
158
+ }
159
+ {
160
+ logger.info(`GET REQUEST`, url);
161
+ const result = await axios.get(url);
162
+ logger.info(`GET RESULT ${url}`, result.data);
163
+ }
164
+ {
165
+ logger.info(`DELETE REQUEST`, url);
166
+ const result = await axios.delete(url);
167
+ logger.info(`DELETE RESULT ${url}`, result.data);
168
+ }
169
+ }
170
+ break;
171
+ case 'new-nodejs-api':
172
+ {
173
+ const apiId = process.argv[3];
174
+ const deployId = process.argv[4];
175
+ const clientId = process.argv[5];
176
+
177
+ shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
178
+
179
+ shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
180
+
181
+ // shellExec(`npm run dev ${deployId}`);
182
+ }
183
+ break;
184
+ case 'new-nodejs-ws':
185
+ {
186
+ const wsId = process.argv[3];
187
+ const deployId = process.argv[4];
188
+ const host = process.argv[5];
189
+ const paths = process.argv[6];
190
+
191
+ shellExec(`node bin/deploy build-nodejs-conf-ws ${wsId} ${deployId} ${host} ${paths}`);
192
+
193
+ shellExec(`node bin/deploy build-nodejs-src-ws ${wsId} ${deployId} ${host} ${paths}`);
194
+
195
+ shellExec(`npm run dev ${deployId}`);
196
+ }
197
+ break;
198
+ case 'build-full-client':
199
+ {
200
+ dotenv.config({ override: true });
201
+ if (!process.argv[3]) process.argv[3] = 'dd-default';
202
+ const { deployId } = loadConf(process.argv[3], process.argv[4] ?? '');
203
+
204
+ let argHost = process.argv[5] ? process.argv[5].split(',') : [];
205
+ let argPath = process.argv[6] ? process.argv[6].split(',') : [];
206
+ let deployIdSingleReplicas = [];
207
+ const serverConf = deployId
208
+ ? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
209
+ : Config.default.server;
210
+ for (const host of Object.keys(serverConf)) {
211
+ for (const path of Object.keys(serverConf[host])) {
212
+ if (argHost.length && argPath.length && (!argHost.includes(host) || !argPath.includes(path))) {
213
+ delete serverConf[host][path];
214
+ } else {
215
+ serverConf[host][path].liteBuild = process.argv.includes('l') ? true : false;
216
+ serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
217
+ if (serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
218
+ deployIdSingleReplicas = deployIdSingleReplicas.concat(
219
+ serverConf[host][path].replicas.map((replica) => buildReplicaId({ deployId, replica })),
220
+ );
221
+ }
222
+ }
223
+ }
224
+ }
225
+ fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
226
+ await buildClient();
227
+
228
+ for (const replicaDeployId of deployIdSingleReplicas) {
229
+ shellExec(Cmd.conf(replicaDeployId, process.env.NODE_ENV));
230
+ shellExec(Cmd.build(replicaDeployId));
231
+ }
232
+ }
233
+ break;
234
+
235
+ case 'update-dependencies':
236
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
237
+ const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
238
+ for (const relativePath of files) {
239
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
240
+ if (filePah.split('/').pop() === 'package.json') {
241
+ const deployPackage = JSON.parse(fs.readFileSync(filePah), 'utf8');
242
+ deployPackage.dependencies = originPackage.dependencies;
243
+ deployPackage.devDependencies = originPackage.devDependencies;
244
+ fs.writeFileSync(filePah, JSON.stringify(deployPackage, null, 4), 'utf8');
245
+ }
246
+ }
247
+ break;
248
+
249
+ case 'sync-env-port':
250
+ const dataDeploy = getDataDeploy({ deployGroupId: process.argv[3], disableSyncEnvPort: true });
251
+ const dataEnv = [
252
+ { env: 'production', port: 3000 },
253
+ { env: 'development', port: 4000 },
254
+ { env: 'test', port: 5000 },
255
+ ];
256
+ let port = 0;
257
+ const singleReplicaHosts = [];
258
+ for (const deployIdObj of dataDeploy) {
259
+ const { deployId, replicaHost } = deployIdObj;
260
+ if (replicaHost && !singleReplicaHosts.includes(replicaHost)) singleReplicaHosts.push(replicaHost);
261
+ const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
262
+ ? `./engine-private/replica`
263
+ : `./engine-private/conf`;
264
+ for (const envInstanceObj of dataEnv) {
265
+ const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
266
+ const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
267
+ envObj.PORT = envInstanceObj.port + port - singleReplicaHosts.length - (replicaHost ? 1 : 0);
268
+
269
+ writeEnv(envPath, envObj);
270
+ }
271
+ const serverConf = loadReplicas(
272
+ JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
273
+ );
274
+ for (const host of Object.keys(serverConf)) port += Object.keys(serverConf[host]).length;
275
+ }
276
+ break;
277
+
278
+ case 'build-single-replica': {
279
+ const deployId = process.argv[3];
280
+ const host = process.argv[4];
281
+ const path = process.argv[5];
282
+ const serverConf = loadReplicas(
283
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
284
+ );
285
+
286
+ if (serverConf[host][path].replicas) {
287
+ {
288
+ let replicaIndex = -1;
289
+ for (const replica of serverConf[host][path].replicas) {
290
+ replicaIndex++;
291
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
292
+ // fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
293
+ await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
294
+ fs.writeFileSync(
295
+ `./engine-private/replica/${replicaDeployId}/package.json`,
296
+ fs
297
+ .readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
298
+ .replaceAll(`${deployId}`, `${replicaDeployId}`),
299
+ 'utf8',
300
+ );
301
+ }
302
+ }
303
+ {
304
+ let replicaIndex = -1;
305
+ for (const replica of serverConf[host][path].replicas) {
306
+ replicaIndex++;
307
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
308
+ let replicaServerConf = JSON.parse(
309
+ fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
310
+ );
311
+
312
+ const singleReplicaConf = replicaServerConf[host][path];
313
+ singleReplicaConf.replicas = undefined;
314
+ singleReplicaConf.singleReplica = undefined;
315
+
316
+ replicaServerConf = {};
317
+ replicaServerConf[host] = {};
318
+ replicaServerConf[host][replica] = singleReplicaConf;
319
+
320
+ fs.writeFileSync(
321
+ `./engine-private/replica/${replicaDeployId}/conf.server.json`,
322
+ JSON.stringify(replicaServerConf, null, 4),
323
+ 'utf8',
324
+ );
325
+ }
326
+ }
327
+ }
328
+ break;
329
+ }
330
+
331
+ case 'rename-package': {
332
+ const name = process.argv[3];
333
+ const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
334
+ originPackage.name = name;
335
+ fs.writeFileSync(`./package.json`, JSON.stringify(originPackage, null, 4), 'utf8');
336
+
337
+ const originPackageLockJson = JSON.parse(fs.readFileSync(`./package-lock.json`, 'utf8'));
338
+ originPackageLockJson.name = name;
339
+ originPackageLockJson.packages[''].name = name;
340
+ fs.writeFileSync(`./package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
341
+
342
+ break;
343
+ }
344
+
345
+ case 'set-repo': {
346
+ const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
347
+ originPackage.repository = {
348
+ type: 'git',
349
+ url: `git+https://github.com/${process.argv[3]}.git`,
350
+ };
351
+ fs.writeFileSync(`./package.json`, JSON.stringify(originPackage, null, 4), 'utf8');
352
+
353
+ break;
354
+ }
355
+
356
+ case 'clean-core-repo': {
357
+ shellCd(`/home/dd/engine`);
358
+ shellExec(`git reset`);
359
+ shellExec(`git checkout .`);
360
+ shellExec(`git clean -f -d`);
361
+ shellCd(`/home/dd/engine/engine-private`);
362
+ shellExec(`git reset`);
363
+ shellExec(`git checkout .`);
364
+ shellExec(`git clean -f -d`);
365
+ shellCd(`/home/dd/engine`);
366
+ break;
367
+ }
368
+
369
+ case 'version-build': {
370
+ shellCd(`/home/dd/engine`);
371
+ shellExec(`node bin/deploy clean-core-repo`);
372
+ shellExec(`node bin pull . ${process.env.GITHUB_USERNAME}/engine`);
373
+ shellExec(`node bin run kill 4001`);
374
+ shellExec(`node bin run kill 4002`);
375
+ shellExec(`node bin run kill 4003`);
376
+ shellExec(`npm run update-template`);
377
+ shellExec(`cd ../pwa-microservices-template && npm install`);
378
+ shellExec(`cd ../pwa-microservices-template && npm run build && timeout 5s npm run dev`, {
379
+ async: true,
380
+ });
381
+ await timer(5500);
382
+ const templateRunnerResult = fs.readFileSync(`../pwa-microservices-template/logs/start.js/all.log`, 'utf8');
383
+ logger.info('Test template runner result');
384
+ console.log(templateRunnerResult);
385
+ if (!templateRunnerResult || templateRunnerResult.toLowerCase().match('error')) {
386
+ logger.error('Test template runner result failed');
387
+ break;
388
+ }
389
+ shellCd(`/home/dd/engine`);
390
+ shellExec(`node bin/deploy clean-core-repo`);
391
+ const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
392
+ const newVersion = process.argv[3] ?? originPackageJson.version;
393
+ const node = process.argv[4] ?? 'kind-control-plane';
394
+ const { version } = originPackageJson;
395
+ originPackageJson.version = newVersion;
396
+ fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
397
+
398
+ const originPackageLockJson = JSON.parse(fs.readFileSync(`package-lock.json`, 'utf8'));
399
+ originPackageLockJson.version = newVersion;
400
+ originPackageLockJson.packages[''].version = newVersion;
401
+ fs.writeFileSync(`package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
402
+
403
+ if (fs.existsSync(`./engine-private/conf`)) {
404
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
405
+ for (const relativePath of files) {
406
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
407
+ if (filePah.split('/').pop() === 'package.json') {
408
+ const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
409
+ originPackage.version = newVersion;
410
+ fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
411
+ }
412
+ if (filePah.split('/').pop() === 'deployment.yaml') {
413
+ fs.writeFileSync(
414
+ filePah,
415
+ fs
416
+ .readFileSync(filePah, 'utf8')
417
+ .replaceAll(`v${version}`, `v${newVersion}`)
418
+ .replaceAll(`engine.version: ${version}`, `engine.version: ${newVersion}`),
419
+ 'utf8',
420
+ );
421
+ }
422
+ }
423
+ }
424
+
425
+ fs.writeFileSync(
426
+ `./manifests/deployment/dd-default-development/deployment.yaml`,
427
+ fs
428
+ .readFileSync(`./manifests/deployment/dd-default-development/deployment.yaml`, 'utf8')
429
+ .replaceAll(`underpost:v${version}`, `underpost:v${newVersion}`),
430
+ 'utf8',
431
+ );
432
+
433
+ if (fs.existsSync(`./.github/workflows/docker-image.ci.yml`))
434
+ fs.writeFileSync(
435
+ `./.github/workflows/docker-image.ci.yml`,
436
+ fs
437
+ .readFileSync(`./.github/workflows/docker-image.ci.yml`, 'utf8')
438
+ .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
439
+ 'utf8',
440
+ );
441
+
442
+ fs.writeFileSync(
443
+ `./src/index.js`,
444
+ fs.readFileSync(`./src/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
445
+ 'utf8',
446
+ );
447
+ shellExec(`node bin/deploy cli-docs ${version} ${newVersion}`);
448
+ shellExec(`node bin/deploy update-dependencies`);
449
+ shellExec(`auto-changelog`);
450
+ shellExec(`node bin/build dd`);
451
+ shellExec(
452
+ `node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd production`,
453
+ );
454
+ shellExec(
455
+ `node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd development `,
456
+ );
457
+ for (const deployId of fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(`,`)) {
458
+ fs.copySync(
459
+ `./engine-private/conf/${deployId}/build/development/deployment.yaml`,
460
+ `./manifests/deployment/${deployId}-development/deployment.yaml`,
461
+ );
462
+ fs.copySync(
463
+ `./engine-private/conf/${deployId}/build/development/proxy.yaml`,
464
+ `./manifests/deployment/${deployId}-development/proxy.yaml`,
465
+ );
466
+ }
467
+ shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
468
+ shellExec(`node bin new --deploy-id dd-default`);
469
+ console.log(fs.existsSync(`./engine-private/conf/dd-default`));
470
+ shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
471
+ shellExec(`node bin/deploy build-env`);
472
+ break;
473
+ }
474
+
475
+ case 'version-deploy': {
476
+ shellExec(
477
+ `underpost secret underpost --create-from-file /home/dd/engine/engine-private/conf/dd-cron/.env.production`,
478
+ );
479
+ shellExec(`node bin/build dd conf`);
480
+ shellExec(`git add . && cd ./engine-private && git add .`);
481
+ shellExec(`node bin cmt . ci package-pwa-microservices-template`);
482
+ shellExec(`node bin cmt ./engine-private ci package-pwa-microservices-template`);
483
+ shellExec(`node bin push . ${process.env.GITHUB_USERNAME}/engine`);
484
+ shellExec(`cd ./engine-private && node ../bin push . ${process.env.GITHUB_USERNAME}/engine-private`);
485
+ break;
486
+ }
487
+
488
+ case 'update-authors': {
489
+ // #### Ordered by first contribution.
490
+ fs.writeFileSync(
491
+ './AUTHORS.md',
492
+ `# Authors
493
+
494
+
495
+ ${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).join(`\n\n\n`)}
496
+
497
+ #### Generated by [underpost.net](https://underpost.net)`,
498
+ 'utf8',
499
+ );
500
+
501
+ break;
502
+ }
503
+
504
+ case 'heb': {
505
+ // https://besu.hyperledger.org/
506
+ // https://github.com/hyperledger/besu/archive/refs/tags/24.9.1.tar.gz
507
+
508
+ switch (process.platform) {
509
+ case 'linux':
510
+ {
511
+ shellCd(`..`);
512
+
513
+ // Download the Linux binary
514
+ shellExec(`wget https://github.com/hyperledger/besu/releases/download/24.9.1/besu-24.9.1.tar.gz`);
515
+
516
+ // Unzip the file:
517
+ shellExec(`tar -xvzf besu-24.9.1.tar.gz`);
518
+
519
+ shellCd(`besu-24.9.1`);
520
+
521
+ shellExec(`bin/besu --help`);
522
+
523
+ // Set env path
524
+ // export PATH=$PATH:/home/dd/besu-24.9.1/bin
525
+
526
+ // Open src
527
+ // shellExec(`sudo code /home/dd/besu-24.9.1 --user-data-dir="/root/.vscode-root" --no-sandbox`);
528
+ }
529
+
530
+ break;
531
+
532
+ default:
533
+ break;
534
+ }
535
+
536
+ break;
537
+ }
538
+ case 'build-env': {
539
+ const buildEnv = (privateEnvPath, originEnv, env) => {
540
+ const privateEnv = dotenv.parse(fs.readFileSync(privateEnvPath, 'utf8'));
541
+ for (const key of Object.keys(privateEnv)) {
542
+ if (key in env) {
543
+ console.warn(`Key ${key} already exists in origin env`);
544
+ continue;
545
+ }
546
+ if (key in originEnv) {
547
+ console.warn(`Key ${key} already exists in origin env`);
548
+ env[key] = originEnv[key];
549
+ continue;
550
+ }
551
+ env[key] =
552
+ `${key}`.toUpperCase().match('API') ||
553
+ `${key}`.toUpperCase().match('KEY') ||
554
+ `${key}`.toUpperCase().match('SECRET') ||
555
+ `${key}`.toUpperCase().match('TOKEN') ||
556
+ `${key}`.toUpperCase().match('PASSWORD') ||
557
+ `${key}`.toUpperCase().match('MAC')
558
+ ? 'changethis'
559
+ : isNaN(parseFloat(privateEnv[key]))
560
+ ? `${privateEnv[key]}`.match(`@`)
561
+ ? 'admin@default.net'
562
+ : 'changethis'
563
+ : privateEnv[key];
564
+ }
565
+ return env;
566
+ };
567
+ for (let envPath of ['.env.development', '.env.production', '.env.test']) {
568
+ const originEnv = dotenv.parse(fs.readFileSync(`./${envPath}`, 'utf8'));
569
+
570
+ let env = {};
571
+ env = buildEnv(`./engine-private/conf/dd-cron/${envPath}`, originEnv, env);
572
+ env = buildEnv(`./engine-private/conf/dd-core/${envPath}`, originEnv, env);
573
+ writeEnv(envPath, env);
574
+ }
575
+ break;
576
+ }
577
+
578
+ case 'update-default-conf': {
579
+ const defaultServer = DefaultConf.server['default.net']['/'];
580
+ let confName = process.argv[3];
581
+ let defaultConf = false;
582
+ if (confName === 'dd-github-pages') {
583
+ const host = `${process.env.GITHUB_USERNAME ?? 'underpostnet'}.github.io`;
584
+ const path = '/pwa-microservices-template-ghpkg';
585
+ DefaultConf.server = {
586
+ [host]: { [path]: defaultServer },
587
+ };
588
+ DefaultConf.server[host][path].apiBaseProxyPath = '/';
589
+ DefaultConf.server[host][path].apiBaseHost = 'www.nexodev.org';
590
+ defaultConf = true;
591
+ } else if (confName === 'template') {
592
+ const host = 'default.net';
593
+ const path = '/';
594
+ DefaultConf.server[host][path].valkey = {
595
+ port: 6379,
596
+ host: 'valkey-service.default.svc.cluster.local',
597
+ };
598
+ // mongodb-0.mongodb-service
599
+ DefaultConf.server[host][path].db.host = 'mongodb://mongodb-service:27017';
600
+ defaultConf = true;
601
+ } else if (confName && fs.existsSync(`./engine-private/conf/${confName}`)) {
602
+ DefaultConf.client = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.client.json`, 'utf8'));
603
+ DefaultConf.server = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.server.json`, 'utf8'));
604
+ DefaultConf.ssr = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.ssr.json`, 'utf8'));
605
+ // DefaultConf.cron = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.cron.json`, 'utf8'));
606
+
607
+ for (const host of Object.keys(DefaultConf.server)) {
608
+ for (const path of Object.keys(DefaultConf.server[host])) {
609
+ DefaultConf.server[host][path].db = defaultServer.db;
610
+ DefaultConf.server[host][path].mailer = defaultServer.mailer;
611
+
612
+ delete DefaultConf.server[host][path]._wp_client;
613
+ delete DefaultConf.server[host][path]._wp_git;
614
+ delete DefaultConf.server[host][path]._wp_directory;
615
+ delete DefaultConf.server[host][path].wp;
616
+ delete DefaultConf.server[host][path].git;
617
+ delete DefaultConf.server[host][path].directory;
618
+ }
619
+ }
620
+ }
621
+ const sepRender = '/**/';
622
+ const confRawPaths = fs.readFileSync('./conf.js', 'utf8').split(sepRender);
623
+ confRawPaths[1] = `${JSON.stringify(DefaultConf)};`;
624
+ const targetConfPath = `./conf${defaultConf ? '' : `.${confName}`}.js`;
625
+ fs.writeFileSync(targetConfPath, confRawPaths.join(sepRender), 'utf8');
626
+ shellExec(`prettier --write ${targetConfPath}`);
627
+
628
+ switch (confName) {
629
+ case 'dd-github-pages':
630
+ {
631
+ if (fs.exists(`./engine-private/conf/${confName}`)) fs.removeSync(`./engine-private/conf/${confName}`);
632
+ shellExec(`node bin new --deploy-id ${confName}`);
633
+ }
634
+ break;
635
+
636
+ default:
637
+ break;
638
+ }
639
+
640
+ break;
641
+ }
642
+
643
+ case 'ssh': {
644
+ // only import + start
645
+ // node bin/deploy ssh root@<host> <password> import
646
+
647
+ // generate + import + start
648
+ // node bin/deploy ssh root@<host> <password>
649
+
650
+ const host = process.argv[3] ?? `root@${await ip.public.ipv4()}`;
651
+ const domain = host.split('@')[1];
652
+ const user = 'root'; // host.split('@')[0];
653
+ const password = process.argv[4] ?? '';
654
+ const port = 22;
655
+
656
+ const setUpSSH = () => {
657
+ // Required port forwarding mapping
658
+ // ssh TCP 2222 22 <local-server-ip>
659
+ // ssh UDP 2222 22 <local-server-ip>
660
+
661
+ // Remote connect via public key
662
+ // ssh -i <key-path> <user>@<host>:2222
663
+
664
+ shellExec(`cat ./engine-private/deploy/id_rsa.pub > ~/.ssh/authorized_keys`);
665
+
666
+ // local trust on first use validator
667
+ // check ~/.ssh/known_hosts
668
+
669
+ // shellExec(`sudo sed -i -e "s@#PasswordAuthentication yes@PasswordAuthentication no@g" /etc/ssh/sshd_config`);
670
+ // shellExec(`sudo sed -i -e "s@#UsePAM no@UsePAM yes@g" /etc/ssh/sshd_config`);
671
+
672
+ // Include /etc/ssh/sshd_config.d/*.conf
673
+ // sudo tee /etc/ssh/sshd_config.d/99-custom.conf
674
+ shellExec(`sudo tee /etc/ssh/sshd_config <<EOF
675
+ PasswordAuthentication no
676
+ ChallengeResponseAuthentication yes
677
+ UsePAM yes
678
+ PubkeyAuthentication Yes
679
+ RSAAuthentication Yes
680
+ PermitRootLogin Yes
681
+ X11Forwarding yes
682
+ X11DisplayOffset 10
683
+ LoginGraceTime 120
684
+ StrictModes yes
685
+ SyslogFacility AUTH
686
+ LogLevel INFO
687
+ #HostKey /etc/ssh/ssh_host_ecdsa_key
688
+ HostKey /etc/ssh/ssh_host_ed25519_key
689
+ #HostKey /etc/ssh/ssh_host_rsa_key
690
+ AuthorizedKeysFile ~/.ssh/authorized_keys
691
+ Subsystem sftp /usr/libexec/openssh/sftp-server
692
+ ListenAddress 0.0.0.0
693
+ ListenAddress ::
694
+ ListenAddress ${domain}
695
+ ListenAddress ${domain}:22
696
+ EOF`);
697
+
698
+ shellExec(`sudo chmod 700 ~/.ssh/`);
699
+ shellExec(`sudo chmod 600 ~/.ssh/authorized_keys`);
700
+ shellExec(`sudo chmod 644 ~/.ssh/known_hosts`);
701
+ shellExec(`sudo chmod 600 ~/.ssh/id_rsa`);
702
+ shellExec(`sudo chmod 600 /etc/ssh/ssh_host_ed25519_key`);
703
+ shellExec(`chown -R ${user}:${user} ~/.ssh`);
704
+
705
+ shellExec(`ufw allow ${port}/tcp`);
706
+ shellExec(`ufw allow ${port}/udp`);
707
+ shellExec(`ufw allow ssh`);
708
+ shellExec(`ufw allow from 192.168.0.0/16 to any port 22`);
709
+
710
+ // active ssh-agent
711
+ shellExec('eval `ssh-agent -s`' + ` && ssh-add ~/.ssh/id_rsa` + ` && ssh-add -l`);
712
+ // remove all
713
+ // shellExec(`ssh-add -D`);
714
+ // remove single
715
+ // shellExec(`ssh-add -d ~/.ssh/id_rsa`);
716
+
717
+ // shellExec(`echo "@${host.split(`@`)[1]} * $(cat ~/.ssh/id_rsa.pub)" > ~/.ssh/known_hosts`);
718
+ shellExec('eval `ssh-agent -s`' + `&& ssh-keyscan -H -t ed25519 ${host.split(`@`)[1]} > ~/.ssh/known_hosts`);
719
+ // shellExec(`sudo echo "" > ~/.ssh/known_hosts`);
720
+
721
+ // ssh-copy-id -i ~/.ssh/id_rsa.pub -p <port_number> <username>@<host>
722
+ // shellExec(`ssh-copy-id -i ~/.ssh/id_rsa.pub -p ${port} ${host}`);
723
+ // debug:
724
+ // shellExec(`ssh -vvv ${host}`);
725
+
726
+ shellExec(`sudo cp ./engine-private/deploy/id_rsa ~/.ssh/id_rsa`);
727
+ shellExec(`sudo cp ./engine-private/deploy/id_rsa.pub ~/.ssh/id_rsa.pub`);
728
+
729
+ shellExec(`sudo echo "" > /etc/ssh/ssh_host_ecdsa_key`);
730
+ shellExec(`sudo cp ./engine-private/deploy/id_rsa /etc/ssh/ssh_host_ed25519_key`);
731
+ shellExec(`sudo echo "" > /etc/ssh/ssh_host_rsa_key`);
732
+
733
+ shellExec(`sudo echo "" > /etc/ssh/ssh_host_ecdsa_key.pub`);
734
+ shellExec(`sudo cp ./engine-private/deploy/id_rsa.pub /etc/ssh/ssh_host_ed25519_key.pub`);
735
+ shellExec(`sudo echo "" > /etc/ssh/ssh_host_rsa_key.pub`);
736
+
737
+ shellExec(`sudo systemctl enable sshd`);
738
+ shellExec(`sudo systemctl restart sshd`);
739
+
740
+ const status = shellExec(`sudo systemctl status sshd`, { silent: true, stdout: true });
741
+ console.log(
742
+ status.match('running') ? status.replaceAll(`running`, `running`.green) : `ssh service not running`.red,
743
+ );
744
+ };
745
+
746
+ if (process.argv.includes('import')) {
747
+ setUpSSH();
748
+ break;
749
+ }
750
+
751
+ shellExec(`sudo rm -rf ./id_rsa`);
752
+ shellExec(`sudo rm -rf ./id_rsa.pub`);
753
+
754
+ if (process.argv.includes('legacy'))
755
+ shellExec(`ssh-keygen -t rsa -b 4096 -f id_rsa -N "${password}" -q -C "${host}"`);
756
+ else shellExec(`ssh-keygen -t ed25519 -f id_rsa -N "${password}" -q -C "${host}"`);
757
+
758
+ shellExec(`sudo cp ./id_rsa ~/.ssh/id_rsa`);
759
+ shellExec(`sudo cp ./id_rsa.pub ~/.ssh/id_rsa.pub`);
760
+
761
+ shellExec(`sudo cp ./id_rsa ./engine-private/deploy/id_rsa`);
762
+ shellExec(`sudo cp ./id_rsa.pub ./engine-private/deploy/id_rsa.pub`);
763
+
764
+ shellExec(`sudo rm -rf ./id_rsa`);
765
+ shellExec(`sudo rm -rf ./id_rsa.pub`);
766
+ setUpSSH();
767
+ break;
768
+ }
769
+
770
+ case 'maas-db': {
771
+ // DROP, ALTER, CREATE, WITH ENCRYPTED
772
+ // sudo -u <user> -h <host> psql <db-name>
773
+ shellExec(`DB_PG_MAAS_NAME=${process.env.DB_PG_MAAS_NAME}`);
774
+ shellExec(`DB_PG_MAAS_PASS=${process.env.DB_PG_MAAS_PASS}`);
775
+ shellExec(`DB_PG_MAAS_USER=${process.env.DB_PG_MAAS_USER}`);
776
+ shellExec(`DB_PG_MAAS_HOST=${process.env.DB_PG_MAAS_HOST}`);
777
+ shellExec(
778
+ `sudo -i -u postgres psql -c "CREATE USER \"$DB_PG_MAAS_USER\" WITH ENCRYPTED PASSWORD '$DB_PG_MAAS_PASS'"`,
779
+ );
780
+ shellExec(
781
+ `sudo -i -u postgres psql -c "ALTER USER \"$DB_PG_MAAS_USER\" WITH ENCRYPTED PASSWORD '$DB_PG_MAAS_PASS'"`,
782
+ );
783
+ const actions = ['LOGIN', 'SUPERUSER', 'INHERIT', 'CREATEDB', 'CREATEROLE', 'REPLICATION'];
784
+ shellExec(`sudo -i -u postgres psql -c "ALTER USER \"$DB_PG_MAAS_USER\" WITH ${actions.join(' ')}"`);
785
+ shellExec(`sudo -i -u postgres psql -c "\\du"`);
786
+
787
+ shellExec(`sudo -i -u postgres createdb -O "$DB_PG_MAAS_USER" "$DB_PG_MAAS_NAME"`);
788
+
789
+ shellExec(`sudo -i -u postgres psql -c "\\l"`);
790
+ break;
791
+ }
792
+
793
+ case 'cli-docs': {
794
+ buildCliDoc(program, process.argv[3], process.argv[4]);
795
+ break;
796
+ }
797
+
798
+ case 'postgresql': {
799
+ if (process.argv.includes('install')) {
800
+ shellExec(`sudo dnf install -y postgresql-server postgresql`);
801
+ shellExec(`sudo postgresql-setup --initdb`);
802
+ shellExec(`chown postgres /var/lib/pgsql/data`);
803
+ shellExec(`sudo systemctl enable postgresql.service`);
804
+ shellExec(`sudo systemctl start postgresql.service`);
805
+ } else {
806
+ shellExec(`sudo systemctl enable postgresql.service`);
807
+ shellExec(`sudo systemctl restart postgresql.service`);
808
+ }
809
+
810
+ shellExec(`sudo systemctl status postgresql.service`);
811
+
812
+ // sudo systemctl stop postgresql
813
+ // sudo systemctl disable postgresql
814
+
815
+ // psql login
816
+ // psql -U <user> -h 127.0.0.1 -W <db-name>
817
+
818
+ // gedit /var/lib/pgsql/data/pg_hba.conf
819
+ // host <db-name> <db-user> <db-host> md5
820
+ // local all postgres trust
821
+ // # "local" is for Unix domain socket connections only
822
+ // local all all md5
823
+ // # IPv4 local connections:
824
+ // host all all 127.0.0.1/32 md5
825
+ // # IPv6 local connections:
826
+ // host all all ::1/128 md5
827
+
828
+ // gedit /var/lib/pgsql/data/postgresql.conf
829
+ // listen_addresses = '*'
830
+
831
+ break;
832
+ }
833
+
834
+ case 'postgresql-17': {
835
+ if (process.argv.includes('install')) {
836
+ shellExec(`sudo dnf module reset postgresql -y`);
837
+ shellExec(`sudo dnf -qy module disable postgresql`);
838
+ shellExec(
839
+ `sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm`,
840
+ );
841
+ shellExec(`sudo dnf -qy module disable postgresql`);
842
+ shellExec(`sudo dnf install -y postgresql17 postgresql17-server postgresql17-contrib`);
843
+
844
+ shellExec(`sudo /usr/pgsql-17/bin/postgresql-17-setup initdb`);
845
+ }
846
+ if (process.argv.includes('uninstall')) {
847
+ shellExec(`sudo systemctl stop postgresql-17`);
848
+ shellExec(`sudo systemctl disable postgresql-17`);
849
+
850
+ // Remove PostgreSQL 17 packages and repo
851
+ shellExec(`sudo dnf remove -y postgresql17 postgresql17-server postgresql17-contrib`);
852
+ shellExec(`sudo rpm -e pgdg-redhat-repo-$(rpm -q pgdg-redhat-repo --qf '%{VERSION}-%{RELEASE}') || true`);
853
+ shellExec(`sudo rm -f /etc/yum.repos.d/pgdg-redhat-*.repo`);
854
+
855
+ // Clean up data, logs, config, and the postgres user
856
+ shellExec(`sudo rm -rf /var/lib/pgsql/17 /var/log/pgsql`);
857
+ shellExec(`sudo rm -rf /etc/postgresql`);
858
+ } else {
859
+ shellExec(`sudo systemctl enable postgresql-17`);
860
+ shellExec(`sudo systemctl start postgresql-17`);
861
+ }
862
+ break;
863
+ }
864
+
865
+ case 'postgresql-14': {
866
+ if (process.argv.includes('install')) {
867
+ shellExec(`sudo dnf module reset postgresql -y`);
868
+ shellExec(`sudo dnf -qy module disable postgresql`);
869
+
870
+ shellExec(`sudo systemctl stop postgresql-14`);
871
+ shellExec(`sudo systemctl disable postgresql-14`);
872
+
873
+ shellExec(`sudo dnf remove -y postgresql14 postgresql14-server postgresql14-contrib`);
874
+ shellExec(`sudo rm -rf /var/lib/pgsql`);
875
+
876
+ shellExec(`sudo dnf install postgresql14 postgresql14-server postgresql14-contrib -y`);
877
+ }
878
+ if (process.argv.includes('uninstall')) {
879
+ shellExec(`sudo systemctl stop postgresql-14`);
880
+ shellExec(`sudo systemctl disable postgresql-14`);
881
+ shellExec(`sudo dnf remove -y postgresql14 postgresql14-server postgresql14-contrib`);
882
+ shellExec(`sudo rm -rf /var/lib/pgsql /var/log/pgsql /etc/postgresql`);
883
+ } else {
884
+ shellExec(`sudo /usr/pgsql-14/bin/postgresql-14-setup initdb`);
885
+ shellExec(`sudo systemctl start postgresql-14`);
886
+ shellExec(`sudo systemctl enable postgresql-14`);
887
+ shellExec(`sudo systemctl status postgresql-14`);
888
+ // sudo dnf install postgresql14-contrib
889
+ }
890
+
891
+ break;
892
+ }
893
+
894
+ case 'pg-stop': {
895
+ shellExec(`sudo systemctl stop postgresql-14`);
896
+ shellExec(`sudo systemctl disable postgresql-14`);
897
+ break;
898
+ }
899
+ case 'pg-start': {
900
+ shellExec(`sudo systemctl enable postgresql-14`);
901
+ shellExec(`sudo systemctl restart postgresql-14`);
902
+ break;
903
+ }
904
+
905
+ case 'pg-list-db': {
906
+ shellExec(`sudo -i -u postgres psql -c "\\l"`);
907
+ break;
908
+ }
909
+
910
+ case 'pg-list-table': {
911
+ shellExec(`sudo -i -u postgres psql -c "\\dt *.*"`);
912
+ // schema_name.*
913
+ break;
914
+ }
915
+ case 'pg-drop-db': {
916
+ shellExec(`sudo -i -u postgres psql -c "DROP DATABASE ${process.argv[3]} WITH (FORCE)"`);
917
+ shellExec(`sudo -i -u postgres psql -c "DROP USER ${process.argv[4]}"`);
918
+ break;
919
+ }
920
+
921
+ case 'maas-stop': {
922
+ shellExec(`sudo snap stop maas`);
923
+ break;
924
+ }
925
+
926
+ case 'mount': {
927
+ const mounts = shellExec(`mount`).split(`\n`);
928
+ console.table(
929
+ mounts
930
+ .filter((l) => l.trim())
931
+ .map(
932
+ (o) => (
933
+ (o = o.split(' ')),
934
+ {
935
+ path: o[2],
936
+ type: o[4],
937
+ permissions: o[5],
938
+ }
939
+ ),
940
+ ),
941
+ );
942
+ break;
943
+ }
944
+
945
+ case 'create-ports': {
946
+ const cmd = [];
947
+ const commissioningDeviceIp = getLocalIPv4Address();
948
+ for (const port of ['5240']) {
949
+ const name = 'maas';
950
+ cmd.push(`${name}:${port}-${port}:${commissioningDeviceIp}`);
951
+ }
952
+ pbcopy(`node engine-private/r create-port ${cmd}`);
953
+ break;
954
+ }
955
+
956
+ case 'fastapi-models': {
957
+ shellExec(`chmod +x ../full-stack-fastapi-template/backend/initial_data.sh`);
958
+ shellExec(`../full-stack-fastapi-template/backend/initial_data.sh`);
959
+ shellExec(`../full-stack-fastapi-template/backend/initial_data.sh`);
960
+ break;
961
+ }
962
+
963
+ case 'fastapi': {
964
+ // node bin/deploy fastapi reset
965
+ // node bin/deploy fastapi reset build-back build-front secret run-back run-front
966
+ // https://github.com/NonsoEchendu/full-stack-fastapi-project
967
+ // https://github.com/fastapi/full-stack-fastapi-template
968
+ const path = `../full-stack-fastapi-template`;
969
+ const VITE_API_URL = `http://localhost:8000`;
970
+
971
+ if (process.argv.includes('reset')) shellExec(`sudo rm -rf ${path}`);
972
+
973
+ if (!fs.existsSync(path))
974
+ shellExec(`cd .. && git clone https://github.com/fastapi/full-stack-fastapi-template.git`);
975
+
976
+ shellExec(`cd ${path} && git checkout . && git clean -f -d`);
977
+ const password = fs.readFileSync(`/home/dd/engine/engine-private/postgresql-password`, 'utf8');
978
+
979
+ fs.writeFileSync(
980
+ `${path}/.env`,
981
+ fs
982
+ .readFileSync(`${path}/.env`, 'utf8')
983
+ .replace(`FIRST_SUPERUSER=admin@example.com`, `FIRST_SUPERUSER=development@underpost.net`)
984
+ .replace(`FIRST_SUPERUSER_PASSWORD=changethis`, `FIRST_SUPERUSER_PASSWORD=${password}`)
985
+ .replace(`SECRET_KEY=changethis`, `SECRET_KEY=${password}`)
986
+ .replace(`POSTGRES_DB=app`, `POSTGRES_DB=postgresdb`)
987
+ .replace(`POSTGRES_USER=postgres`, `POSTGRES_USER=admin`)
988
+ .replace(`POSTGRES_PASSWORD=changethis`, `POSTGRES_PASSWORD=${password}`),
989
+ 'utf8',
990
+ );
991
+ fs.writeFileSync(
992
+ `${path}/backend/app/core/db.py`,
993
+ fs
994
+ .readFileSync(`${path}/backend/app/core/db.py`, 'utf8')
995
+ .replace(` # from sqlmodel import SQLModel`, ` from sqlmodel import SQLModel`)
996
+ .replace(` # SQLModel.metadata.create_all(engine)`, ` SQLModel.metadata.create_all(engine)`),
997
+
998
+ 'utf8',
999
+ );
1000
+
1001
+ fs.copySync(`./manifests/deployment/fastapi/initial_data.sh`, `${path}/backend/initial_data.sh`);
1002
+
1003
+ fs.writeFileSync(
1004
+ `${path}/frontend/Dockerfile`,
1005
+ fs
1006
+ .readFileSync(`${path}/frontend/Dockerfile`, 'utf8')
1007
+ .replace('ARG VITE_API_URL=${VITE_API_URL}', `ARG VITE_API_URL='${VITE_API_URL}'`),
1008
+ 'utf8',
1009
+ );
1010
+
1011
+ fs.writeFileSync(
1012
+ `${path}/frontend/.env`,
1013
+ fs
1014
+ .readFileSync(`${path}/frontend/.env`, 'utf8')
1015
+ .replace(`VITE_API_URL=http://localhost:8000`, `VITE_API_URL=${VITE_API_URL}`)
1016
+ .replace(`MAILCATCHER_HOST=http://localhost:1080`, `MAILCATCHER_HOST=http://localhost:1081`),
1017
+
1018
+ 'utf8',
1019
+ );
1020
+
1021
+ if (process.argv.includes('models')) {
1022
+ shellExec(`node bin/deploy fastapi-models`);
1023
+ break;
1024
+ }
1025
+
1026
+ if (process.argv.includes('build-back')) {
1027
+ const imageName = `fastapi-backend:latest`;
1028
+ shellExec(`sudo podman pull docker.io/library/python:3.10`);
1029
+ shellExec(`sudo podman pull ghcr.io/astral-sh/uv:0.5.11`);
1030
+ shellExec(`sudo rm -rf ${path}/${imageName.replace(':', '_')}.tar`);
1031
+ const args = [
1032
+ `node bin dockerfile-image-build --path ${path}/backend/`,
1033
+ `--image-name=${imageName} --image-path=${path}`,
1034
+ `--podman-save --${process.argv.includes('kubeadm') ? 'kubeadm' : 'kind'}-load --reset`,
1035
+ ];
1036
+ shellExec(args.join(' '));
1037
+ }
1038
+ if (process.argv.includes('build-front')) {
1039
+ const imageName = `fastapi-frontend:latest`;
1040
+ shellExec(`sudo podman pull docker.io/library/node:20`);
1041
+ shellExec(`sudo podman pull docker.io/library/nginx:1`);
1042
+ shellExec(`sudo rm -rf ${path}/${imageName.replace(':', '_')}.tar`);
1043
+ const args = [
1044
+ `node bin dockerfile-image-build --path ${path}/frontend/`,
1045
+ `--image-name=${imageName} --image-path=${path}`,
1046
+ `--podman-save --${process.argv.includes('kubeadm') ? 'kubeadm' : 'kind'}-load --reset`,
1047
+ ];
1048
+ shellExec(args.join(' '));
1049
+ }
1050
+ if (process.argv.includes('secret')) {
1051
+ {
1052
+ const secretSelector = `fastapi-postgres-credentials`;
1053
+ shellExec(`sudo kubectl delete secret ${secretSelector}`);
1054
+ shellExec(
1055
+ `sudo kubectl create secret generic ${secretSelector}` +
1056
+ ` --from-literal=POSTGRES_DB=postgresdb` +
1057
+ ` --from-literal=POSTGRES_USER=admin` +
1058
+ ` --from-file=POSTGRES_PASSWORD=/home/dd/engine/engine-private/postgresql-password`,
1059
+ );
1060
+ }
1061
+ {
1062
+ const secretSelector = `fastapi-backend-config-secret`;
1063
+ shellExec(`sudo kubectl delete secret ${secretSelector}`);
1064
+ shellExec(
1065
+ `sudo kubectl create secret generic ${secretSelector}` +
1066
+ ` --from-file=SECRET_KEY=/home/dd/engine/engine-private/postgresql-password` +
1067
+ ` --from-literal=FIRST_SUPERUSER=development@underpost.net` +
1068
+ ` --from-file=FIRST_SUPERUSER_PASSWORD=/home/dd/engine/engine-private/postgresql-password`,
1069
+ );
1070
+ }
1071
+ }
1072
+ if (process.argv.includes('run-back')) {
1073
+ shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/backend-deployment.yml`);
1074
+ shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/backend-service.yml`);
1075
+ }
1076
+ if (process.argv.includes('run-front')) {
1077
+ shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/frontend-deployment.yml`);
1078
+ shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/frontend-service.yml`);
1079
+ }
1080
+ break;
1081
+ }
1082
+
1083
+ case 'conda': {
1084
+ // set -e
1085
+ // ENV_NAME="${1:-cuda_env}"
1086
+ // eval "$(conda shell.bash hook)"
1087
+ // conda activate "${ENV_NAME}"
1088
+ shellExec(
1089
+ `export PATH="/root/miniconda3/bin:$PATH" && conda init && conda config --set auto_activate_base false`,
1090
+ );
1091
+ shellExec(`conda env list`);
1092
+ break;
1093
+ }
1094
+
1095
+ case 'kafka': {
1096
+ // https://medium.com/@martin.hodges/deploying-kafka-on-a-kind-kubernetes-cluster-for-development-and-testing-purposes-ed7adefe03cb
1097
+ const imageName = `doughgle/kafka-kraft`;
1098
+ shellExec(`docker pull ${imageName}`);
1099
+ if (!process.argv.includes('kubeadm'))
1100
+ shellExec(
1101
+ `${process.argv.includes('kubeadm') ? `ctr -n k8s.io images import` : `kind load docker-image`} ${imageName}`,
1102
+ );
1103
+ shellExec(`kubectl create namespace kafka`);
1104
+ shellExec(`kubectl apply -f ./manifests/deployment/kafka/deployment.yaml`);
1105
+ // kubectl logs kafka-0 -n kafka | grep STARTED
1106
+ // kubectl logs kafka-1 -n kafka | grep STARTED
1107
+ // kubectl logs kafka-2 -n kafka | grep STARTED
1108
+
1109
+ // kafka-topics.sh --create --topic my-topic --bootstrap-server kafka-svc:9092
1110
+ // kafka-topics.sh --list --topic my-topic --bootstrap-server kafka-svc:9092
1111
+ // kafka-topics.sh --delete --topic my-topic --bootstrap-server kafka-svc:9092
1112
+
1113
+ // kafka-console-producer.sh --bootstrap-server kafka-svc:9092 --topic my-topic
1114
+ // kafka-console-consumer.sh --bootstrap-server kafka-svc:9092 --topic my-topic
1115
+ break;
1116
+ }
1117
+
1118
+ case 'nvidia-gpu-operator': {
1119
+ // https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
1120
+ shellExec(`curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
1121
+ sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo`);
1122
+
1123
+ const NVIDIA_CONTAINER_TOOLKIT_VERSION = '1.17.8-1';
1124
+
1125
+ shellExec(`sudo dnf install -y \
1126
+ nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
1127
+ nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
1128
+ libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
1129
+ libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}`);
1130
+
1131
+ // https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html
1132
+
1133
+ shellExec(`kubectl create ns gpu-operator`);
1134
+ shellExec(`kubectl label --overwrite ns gpu-operator pod-security.kubernetes.io/enforce=privileged`);
1135
+
1136
+ shellExec(`helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
1137
+ && helm repo update`);
1138
+
1139
+ // shellExec(`helm install --wait --generate-name \
1140
+ // -n gpu-operator --create-namespace \
1141
+ // nvidia/gpu-operator \
1142
+ // --version=v25.3.1 \
1143
+ // --set toolkit.version=v1.16.1-ubi8`);
1144
+
1145
+ shellExec(`helm install --wait --generate-name \
1146
+ -n gpu-operator --create-namespace \
1147
+ nvidia/gpu-operator \
1148
+ --version=v25.3.1 \
1149
+ --set driver.enabled=false \
1150
+ --set driver.repository=nvcr.io/nvidia \
1151
+ --set cdi.enabled=true \
1152
+ --set cdi.default=true \
1153
+ --set toolkit.env[0].name=CONTAINERD_CONFIG \
1154
+ --set toolkit.env[0].value=/etc/containerd/config.toml \
1155
+ --set toolkit.env[1].name=CONTAINERD_SOCKET \
1156
+ --set toolkit.env[1].value=/run/containerd/containerd.sock \
1157
+ --set toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS \
1158
+ --set toolkit.env[2].value=nvidia \
1159
+ --set-string toolkit.env[3].name=CONTAINERD_SET_AS_DEFAULT \
1160
+ --set-string toolkit.env[3].value=true`);
1161
+
1162
+ // Check gpu drivers
1163
+ shellExec(
1164
+ `break;kubectl get nodes -o json | jq '.items[].metadata.labels | keys | any(startswith("feature.node.kubernetes.io"))'`,
1165
+ );
1166
+ break;
1167
+ }
1168
+
1169
+ case 'kubeflow-spark-operator': {
1170
+ // Use case:
1171
+ // Data Processing Pipelines: Used for ETL tasks where Spark can handle large data volumes efficiently.
1172
+ // Real-Time Analytics: Processing data from streaming sources (e.g., Kafka) for real-time analytics.
1173
+ // Machine Learning and Data Science: Training and deploying machine learning models at scale using Spark MLlib.
1174
+
1175
+ shellExec(`helm repo add spark-operator https://kubeflow.github.io/spark-operator`);
1176
+ shellExec(`helm install spark-operator spark-operator/spark-operator \
1177
+ --namespace spark-operator \
1178
+ --create-namespace \
1179
+ --wait`);
1180
+
1181
+ const image = `spark:3.5.5`;
1182
+ shellExec(`sudo docker pull ${image}`);
1183
+ if (!process.argv.includes('kubeadm'))
1184
+ shellExec(
1185
+ `sudo ${
1186
+ process.argv.includes('kubeadm') ? `ctr -n k8s.io images import` : `kind load docker-image`
1187
+ } ${image}`,
1188
+ );
1189
+ shellExec(`kubectl apply -f ./manifests/deployment/spark/spark-pi-py.yaml`);
1190
+
1191
+ // Check the status of the Spark job:
1192
+ // kubectl get sparkapplications.sparkoperator.k8s.io -n default
1193
+ // kubectl get sparkapplication
1194
+
1195
+ // Check case log:
1196
+ // kubectl logs -f spark-pi-python-driver
1197
+ // kubectl logs -f spark-pi-python-driver | grep Pi
1198
+ // kubectl describe sparkapplication spark-gpu-test
1199
+
1200
+ // Uninstall:
1201
+ // kubectl delete sparkapplications.sparkoperator.k8s.io spark-pi-python -n default
1202
+ // helm delete spark-operator -n spark-operator
1203
+
1204
+ // Gpu plugins:
1205
+ // https://github.com/NVIDIA/spark-rapids
1206
+ // RAPIDS Accelerator
1207
+ break;
1208
+ }
1209
+
1210
+ case 'udpate-version-files': {
1211
+ const oldNpmVersion = process.argv[3];
1212
+ const oldNodeVersion = process.argv[4];
1213
+ const oldNodeMajorVersion = oldNodeVersion.split('.')[0];
1214
+ const nodeVersion = shellExec(`node --version`, { stdout: true }).trim().replace('v', '');
1215
+ const newNodeMajorVersion = nodeVersion.split('.')[0];
1216
+ const npmVersion = shellExec(`npm --version`, { stdout: true }).trim();
1217
+
1218
+ fs.writeFileSync(
1219
+ `README.md`,
1220
+ fs
1221
+ .readFileSync(`README.md`, 'utf8')
1222
+ .replaceAll(oldNodeVersion, nodeVersion)
1223
+ .replaceAll(oldNpmVersion, npmVersion),
1224
+ );
1225
+ fs.writeFileSync(
1226
+ `manifests/lxd/underpost-setup.sh`,
1227
+ fs
1228
+ .readFileSync(`manifests/lxd/underpost-setup.sh`, 'utf8')
1229
+ .replaceAll(oldNodeVersion, nodeVersion)
1230
+ .replaceAll(oldNpmVersion, npmVersion),
1231
+ );
1232
+ fs.writeFileSync(
1233
+ `src/client/public/nexodev/docs/references/Getting started.md`,
1234
+ fs
1235
+ .readFileSync(`src/client/public/nexodev/docs/references/Getting started.md`, 'utf8')
1236
+ .replaceAll(oldNodeVersion, nodeVersion)
1237
+ .replaceAll(oldNpmVersion, npmVersion),
1238
+ );
1239
+
1240
+ const workflowFiles = [
1241
+ `./.github/workflows/coverall.ci.yml`,
1242
+
1243
+ `./.github/workflows/engine-core.ci.yml`,
1244
+
1245
+ `./.github/workflows/engine-cyberia.ci.yml`,
1246
+
1247
+ `./.github/workflows/engine-lampp.ci.yml`,
1248
+
1249
+ `./.github/workflows/engine-test.ci.yml`,
1250
+
1251
+ `./.github/workflows/ghpkg.ci.yml`,
1252
+
1253
+ `./.github/workflows/npmpkg.ci.yml`,
1254
+
1255
+ `./.github/workflows/publish.ci.yml`,
1256
+
1257
+ `./.github/workflows/pwa-microservices-template-page.cd.yml`,
1258
+
1259
+ `./.github/workflows/pwa-microservices-template-test.ci.yml`,
1260
+
1261
+ `./.github/workflows/test-api-rest.cd.yml`,
1262
+
1263
+ `./src/runtime/lampp/Dockerfile`,
1264
+
1265
+ `./Dockerfile`,
1266
+ ];
1267
+
1268
+ workflowFiles.forEach((file) => {
1269
+ fs.writeFileSync(
1270
+ file,
1271
+ fs
1272
+ .readFileSync(file, 'utf8')
1273
+ .replaceAll(oldNodeMajorVersion + '.x', newNodeMajorVersion + '.x')
1274
+ .replaceAll(oldNodeVersion, nodeVersion)
1275
+ .replaceAll(oldNpmVersion, npmVersion),
1276
+ );
1277
+ });
1278
+ pbcopy(`nvm alias default v${nodeVersion}`);
1279
+ break;
1280
+ }
1281
+
1282
+ case 'tls': {
1283
+ fs.mkdirSync(`./engine-private/ssl/localhost`, { recursive: true });
1284
+ const targetDir = `./engine-private/ssl/localhost`;
1285
+ const domains = ['localhost', '127.0.0.1', '::1'];
1286
+ shellExec(`chmod +x ./scripts/ssl.sh`);
1287
+ shellExec(`./scripts/ssl.sh ${targetDir} "${domains.join(' ')}"`);
1288
+ break;
1289
+ }
1290
+ }
1291
+ } catch (error) {
1292
+ logger.error(error, error.stack);
1293
+ }