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
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Module for managing crypto operations
3
+ * @module src/server/crypto.js
4
+ * @namespace Crypto
5
+ */
6
+
7
+ import crypto from 'crypto';
8
+
9
+ /* ----------------------------- SymmetricCrypto ----------------------------- */
10
+
11
+ class SymmetricCrypto {
12
+ #encryptionKey;
13
+
14
+ /**
15
+ * @param {object} [options]
16
+ * @param {Buffer | string} [options.encryptionKey] - 32-byte key as Buffer or hex string. If not provided, a new random key is generated.
17
+ */
18
+ /** @memberof Crypto */
19
+ constructor(options = {}) {
20
+ const { encryptionKey } = options;
21
+
22
+ if (encryptionKey) {
23
+ this.#encryptionKey = typeof encryptionKey === 'string' ? Buffer.from(encryptionKey, 'hex') : encryptionKey;
24
+ } else {
25
+ this.#encryptionKey = crypto.randomBytes(32);
26
+ }
27
+
28
+ if (!Buffer.isBuffer(this.#encryptionKey) || this.#encryptionKey.length !== 32) {
29
+ throw new Error('Encryption key must be a 32-byte Buffer or 64-length hex string.');
30
+ }
31
+
32
+ // Provide a compatibility IV property expected by some test suites / legacy code.
33
+ // This IV is not reused for each encryption operation (encryptData will generate its own IV).
34
+ // It exists so tests that expect an ivHex on the instance (16 bytes) continue to work.
35
+ this.ivHex = crypto.randomBytes(16).toString('hex'); // 16 bytes -> 32 hex chars
36
+ }
37
+
38
+ /** Returns encryption key as hex. */
39
+ /** @memberof Crypto */
40
+ get encryptionKeyHex() {
41
+ return this.#encryptionKey.toString('hex');
42
+ }
43
+
44
+ /**
45
+ * Encrypts plaintext using AES-256-GCM and returns `iv_hex:ciphertext_hex:authTag_hex`.
46
+ *
47
+ * @param {string} [plaintext='']
48
+ * @returns {string}
49
+ * @memberof Crypto
50
+ */
51
+ encryptData(plaintext = '') {
52
+ // GCM recommended IV size is 12 bytes
53
+ const iv = crypto.randomBytes(12);
54
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.#encryptionKey, iv);
55
+
56
+ const encryptedPart = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
57
+ const authTag = cipher.getAuthTag();
58
+
59
+ return `${iv.toString('hex')}:${encryptedPart.toString('hex')}:${authTag.toString('hex')}`;
60
+ }
61
+
62
+ /**
63
+ * Decrypts data. Supports two formats:
64
+ * - AES-256-GCM: `iv_hex:ciphertext_hex:authTag_hex` (preferred)
65
+ * - Legacy AES-256-CBC: `iv_hex:ciphertext_hex` (fallback for backward compatibility)
66
+ *
67
+ * @param {string} [ciphertext='']
68
+ * @returns {string} plaintext
69
+ * @throws {Error} Generic error on failure (to avoid leaking details).
70
+ * @memberof Crypto
71
+ */
72
+ decryptData(ciphertext = '') {
73
+ try {
74
+ const parts = ciphertext.split(':');
75
+
76
+ if (parts.length === 3) {
77
+ // AES-256-GCM
78
+ const [ivHex, encryptedHex, tagHex] = parts;
79
+ const iv = Buffer.from(ivHex, 'hex');
80
+ const encrypted = Buffer.from(encryptedHex, 'hex');
81
+ const authTag = Buffer.from(tagHex, 'hex');
82
+
83
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.#encryptionKey, iv);
84
+ decipher.setAuthTag(authTag);
85
+
86
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
87
+ return decrypted.toString('utf8');
88
+ }
89
+
90
+ if (parts.length === 2) {
91
+ // Legacy: AES-256-CBC (no authentication). Provided for compatibility only.
92
+ const [ivHex, encryptedHex] = parts;
93
+ const iv = Buffer.from(ivHex, 'hex');
94
+ const encrypted = encryptedHex;
95
+
96
+ const decipher = crypto.createDecipheriv('aes-256-cbc', this.#encryptionKey, iv);
97
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
98
+ decrypted += decipher.final('utf8');
99
+ return decrypted;
100
+ }
101
+
102
+ throw new Error('Invalid ciphertext format.');
103
+ } catch (err) {
104
+ // Do not leak internal error details (stack, key material, etc.).
105
+ // Optional: instrument monitoring/logging but avoid logging sensitive inputs.
106
+ throw new Error('Decryption failed. Check key, IV, or ciphertext integrity.');
107
+ }
108
+ }
109
+ }
110
+
111
+ /* ---------------------------- AsymmetricCrypto ---------------------------- */
112
+
113
+ class AsymmetricCrypto {
114
+ #publicKey;
115
+ #privateKey;
116
+ #modulusLength;
117
+
118
+ /**
119
+ * @param {object} [options]
120
+ * @param {string|Buffer} [options.publicKey] - PEM-formatted public key
121
+ * @param {string|Buffer} [options.privateKey] - PEM-formatted private key
122
+ * @param {number} [options.modulusLength=2048] - If keys are not provided, generates a new key pair of this size (bits). Consider 3072 for long-lived keys.
123
+ */
124
+ /** @memberof Crypto */
125
+ constructor(options = {}) {
126
+ const { publicKey, privateKey } = options;
127
+ this.#modulusLength = options.modulusLength || 2048;
128
+
129
+ if (!publicKey || !privateKey) {
130
+ // Generate an in-memory key pair. No file I/O; keys remain in process memory only.
131
+ const { publicKey: pub, privateKey: priv } = crypto.generateKeyPairSync('rsa', {
132
+ modulusLength: this.#modulusLength,
133
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
134
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
135
+ });
136
+ this.#publicKey = pub;
137
+ this.#privateKey = priv;
138
+ } else {
139
+ // Accept provided keys (string or Buffer)
140
+ this.#publicKey = typeof publicKey === 'string' || Buffer.isBuffer(publicKey) ? publicKey : String(publicKey);
141
+ this.#privateKey =
142
+ typeof privateKey === 'string' || Buffer.isBuffer(privateKey) ? privateKey : String(privateKey);
143
+
144
+ // Basic validation: ensure PEM headers exist. This is intentionally lightweight.
145
+ const pubStr = String(this.#publicKey);
146
+ const privStr = String(this.#privateKey);
147
+ if (!pubStr.includes('BEGIN PUBLIC KEY') || !privStr.includes('BEGIN')) {
148
+ throw new Error('Provided keys do not appear to be valid PEM-formatted keys.');
149
+ }
150
+ }
151
+ }
152
+
153
+ /** @memberof Crypto */
154
+ get publicKey() {
155
+ return this.#publicKey;
156
+ }
157
+
158
+ /** @memberof Crypto */
159
+ get privateKey() {
160
+ return this.#privateKey;
161
+ }
162
+
163
+ /**
164
+ * Encrypts plaintext using RSA-OAEP with SHA-256. Returns hex-encoded ciphertext.
165
+ * Note: RSA encryption is intended for small payloads. For larger data use hybrid encryption (encrypt a symmetric key and then use AES-GCM).
166
+ * @param {string} plaintext
167
+ * @returns {string} hex ciphertext
168
+ * @memberof Crypto
169
+ */
170
+ encryptData(plaintext) {
171
+ const buffer = Buffer.from(plaintext, 'utf8');
172
+ const encrypted = crypto.publicEncrypt(
173
+ {
174
+ key: this.#publicKey,
175
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
176
+ oaepHash: 'sha256',
177
+ },
178
+ buffer,
179
+ );
180
+
181
+ return encrypted.toString('hex');
182
+ }
183
+
184
+ /**
185
+ * Decrypts RSA-OAEP hex ciphertext and returns utf8 plaintext.
186
+ * @param {string} ciphertextHex
187
+ * @returns {string}
188
+ * @memberof Crypto
189
+ */
190
+ decryptData(ciphertextHex) {
191
+ try {
192
+ const buffer = Buffer.from(ciphertextHex, 'hex');
193
+ const decrypted = crypto.privateDecrypt(
194
+ {
195
+ key: this.#privateKey,
196
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
197
+ oaepHash: 'sha256',
198
+ },
199
+ buffer,
200
+ );
201
+
202
+ return decrypted.toString('utf8');
203
+ } catch (err) {
204
+ // Avoid leaking details about keys or ciphertext
205
+ throw new Error('Decryption failed. Check private key or ciphertext integrity.');
206
+ }
207
+ }
208
+ }
209
+
210
+ export { SymmetricCrypto, AsymmetricCrypto };
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Provides a comprehensive set of DNS and IP management utilities,
3
+ * primarily focused on dynamic DNS (DDNS) updates and network checks.
4
+ * @module src/server/dns.js
5
+ * @namespace DnsManager
6
+ */
7
+ import axios from 'axios';
8
+ import dotenv from 'dotenv';
9
+ import fs from 'fs';
10
+ import validator from 'validator';
11
+ import { publicIp, publicIpv4, publicIpv6 } from 'public-ip';
12
+ import { loggerFactory } from './logger.js';
13
+ import UnderpostRootEnv from '../cli/env.js';
14
+ import dns from 'node:dns';
15
+ import os from 'node:os';
16
+ import { shellExec } from './process.js';
17
+
18
+ dotenv.config();
19
+
20
+ const logger = loggerFactory(import.meta);
21
+
22
+ /**
23
+ * Main class for handling DNS and IP related operations.
24
+ * All utility methods are implemented as static to serve as a namespace container.
25
+ * @class Dns
26
+ * @augments Dns
27
+ * @memberof DnsManager
28
+ */
29
+ class Dns {
30
+ /**
31
+ * Retrieves the current public IP address (IPv4 or IPv6).
32
+ * @async
33
+ * @static
34
+ * @memberof DnsManager
35
+ * @returns {Promise<string>} The public IP address.
36
+ */
37
+ static async getPublicIp() {
38
+ return await publicIp();
39
+ }
40
+
41
+ /**
42
+ * Retrieves the current public IPv4 address.
43
+ * @async
44
+ * @static
45
+ * @memberof DnsManager
46
+ * @returns {Promise<string>} The public IPv4 address.
47
+ */
48
+ static async getPublicIpv4() {
49
+ return await publicIpv4();
50
+ }
51
+
52
+ /**
53
+ * Retrieves the current public IPv6 address.
54
+ * @async
55
+ * @static
56
+ * @memberof DnsManager
57
+ * @returns {Promise<string>} The public IPv6 address.
58
+ */
59
+ static async getPublicIpv6() {
60
+ return await publicIpv6();
61
+ }
62
+
63
+ /**
64
+ * Checks for active internet connection by performing a DNS lookup on a specified domain.
65
+ * @static
66
+ * @memberof DnsManager
67
+ * @param {string} [domain='google.com'] The domain to check the connection against.
68
+ * @returns {Promise<boolean>} True if connected, false otherwise.
69
+ */
70
+ static isInternetConnection(domain = 'google.com') {
71
+ return new Promise((resolve) => dns.lookup(domain, {}, (err) => resolve(err ? false : true)));
72
+ }
73
+
74
+ /**
75
+ * Gets the local device's IPv4 address by determining the active network interface.
76
+ * This relies on shell execution (`ip route`) and is primarily intended for Linux environments.
77
+ * @static
78
+ * @memberof DnsManager
79
+ * @returns {string} The local IPv4 address.
80
+ */
81
+ static getLocalIPv4Address() {
82
+ // Determine the default network interface name using shell command
83
+ const interfaceName = shellExec(`ip route | grep default | cut -d ' ' -f 5`, {
84
+ stdout: true,
85
+ silent: true,
86
+ disableLog: true,
87
+ }).trim();
88
+
89
+ // Find the IPv4 address associated with the determined interface
90
+ const networkInfo = os.networkInterfaces()[interfaceName];
91
+
92
+ if (!networkInfo) {
93
+ logger.error(`Could not find network interface: ${interfaceName}`);
94
+ return null;
95
+ }
96
+
97
+ const ipv4 = networkInfo.find((i) => i.family === 'IPv4');
98
+
99
+ if (!ipv4) {
100
+ logger.error(`Could not find IPv4 address for interface: ${interfaceName}`);
101
+ return null;
102
+ }
103
+
104
+ return ipv4.address;
105
+ }
106
+
107
+ /**
108
+ * Performs the dynamic DNS update logic.
109
+ * It checks if the public IP has changed and, if so, updates the configured DNS records.
110
+ * @async
111
+ * @static
112
+ * @memberof DnsManager
113
+ * @param {string} deployList Comma-separated string of deployment IDs to process.
114
+ * @returns {Promise<void>}
115
+ */
116
+ static async callback(deployList) {
117
+ const isOnline = await Dns.isInternetConnection();
118
+
119
+ if (!isOnline) return;
120
+
121
+ let testIp;
122
+
123
+ try {
124
+ testIp = await Dns.getPublicIpv4();
125
+ } catch (error) {
126
+ logger.error(error, { testIp, stack: error.stack });
127
+ }
128
+
129
+ const currentIp = UnderpostRootEnv.API.get('ip');
130
+
131
+ if (validator.isIP(testIp) && currentIp !== testIp) {
132
+ logger.info(`New IP detected`, testIp);
133
+ UnderpostRootEnv.API.set('monitor-input', 'pause');
134
+
135
+ for (const _deployId of deployList.split(',')) {
136
+ const deployId = _deployId.trim();
137
+ const privateCronConfPath = `./engine-private/conf/${deployId}/conf.cron.json`;
138
+ const confCronPath = fs.existsSync(privateCronConfPath) ? privateCronConfPath : './conf/conf.cron.json';
139
+
140
+ if (!fs.existsSync(confCronPath)) {
141
+ logger.warn(`Cron config file not found for deployId: ${deployId} at ${confCronPath}`);
142
+ continue;
143
+ }
144
+
145
+ const confCronData = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
146
+
147
+ if (!confCronData.records) {
148
+ logger.warn(`'records' field missing in cron config for deployId: ${deployId}`);
149
+ continue;
150
+ }
151
+
152
+ // Iterate through DNS record types (A, AAAA, etc.)
153
+ for (const recordType of Object.keys(confCronData.records)) {
154
+ switch (recordType) {
155
+ case 'A':
156
+ // Process A records for IPv4 update
157
+ for (const dnsProvider of confCronData.records[recordType]) {
158
+ if (typeof Dns.services.updateIp[dnsProvider.dns] === 'function')
159
+ await Dns.services.updateIp[dnsProvider.dns]({ ...dnsProvider, ip: testIp });
160
+ }
161
+ break;
162
+
163
+ // Add other record types (e.g., AAAA) here if needed
164
+ default:
165
+ break;
166
+ }
167
+ }
168
+
169
+ // Verify the IP update externally
170
+ try {
171
+ const ipUrlTest = `https://${process.env.DEFAULT_DEPLOY_HOST}`;
172
+ const response = await axios.get(ipUrlTest);
173
+ const verifyIp = response.request.socket.remoteAddress;
174
+ logger.info(ipUrlTest + ' verify ip', verifyIp);
175
+ if (verifyIp === testIp) {
176
+ logger.info('IP updated successfully and verified', testIp);
177
+ UnderpostRootEnv.API.set('ip', testIp);
178
+ UnderpostRootEnv.API.delete('monitor-input');
179
+ } else {
180
+ logger.error('IP not updated or verification failed', { expected: testIp, received: verifyIp });
181
+ }
182
+ } catch (error) {
183
+ logger.error('Error during IP update verification step', {
184
+ error: error.message,
185
+ stack: error.stack,
186
+ testIp,
187
+ });
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Internal collection of external DNS service update functions.
195
+ * @static
196
+ * @memberof DnsManager
197
+ * @property {object} updateIp - Functions keyed by DNS provider name to update A/AAAA records.
198
+ */
199
+ static services = {
200
+ updateIp: {
201
+ /**
202
+ * Updates the IP address for a dondominio.com DNS record.
203
+ * @memberof DnsManager
204
+ * @param {object} options
205
+ * @param {string} options.user - The dondominio DDNS username.
206
+ * @param {string} options.api_key - The dondominio DDNS password/API key.
207
+ * @param {string} options.host - The hostname to update.
208
+ * @param {string} options.dns - The name of the DNS provider ('dondominio').
209
+ * @param {string} options.ip - The new IPv4 address to set.
210
+ * @returns {Promise<boolean>} True on success, false on failure.
211
+ */
212
+ dondominio: (options) => {
213
+ const { user, api_key, host, dns, ip } = options;
214
+ const url = `https://dondns.dondominio.com/json/?user=${user}&password=${api_key}&host=${host}&ip=${ip}`;
215
+ logger.info(`${dns} update ip url`, url);
216
+
217
+ // Prevent live IP update in non-production environments
218
+ if (process.env.NODE_ENV !== 'production') {
219
+ logger.warn('Skipping dondominio update in non-production environment.');
220
+ return Promise.resolve(false);
221
+ }
222
+
223
+ return new Promise((resolve) => {
224
+ axios
225
+ .get(url)
226
+ .then((response) => {
227
+ logger.info(`${dns} update ip success`, response.data);
228
+ return resolve(true);
229
+ })
230
+ .catch((error) => {
231
+ logger.error(error, `${dns} update ip error: ${error.message}`);
232
+ return resolve(false);
233
+ });
234
+ });
235
+ },
236
+ // Add other DNS provider update functions here
237
+ },
238
+ };
239
+ }
240
+
241
+ /**
242
+ * @namespace Dns
243
+ * @description Exported IP object for backward compatibility, mapping to Dns static methods.
244
+ */
245
+ const ip = {
246
+ public: {
247
+ /** @type {function(): Promise<string>} */
248
+ get: Dns.getPublicIp,
249
+ /** @type {function(): Promise<string>} */
250
+ ipv4: Dns.getPublicIpv4,
251
+ /** @type {function(): Promise<string>} */
252
+ ipv6: Dns.getPublicIpv6,
253
+ },
254
+ };
255
+
256
+ /**
257
+ * @function isInternetConnection
258
+ * @memberof DnsManager
259
+ * @description Exported function for backward compatibility.
260
+ * @param {string} [domain='google.com']
261
+ * @returns {Promise<boolean>}
262
+ */
263
+ const isInternetConnection = Dns.isInternetConnection;
264
+
265
+ /**
266
+ * @function getLocalIPv4Address
267
+ * @memberof DnsManager
268
+ * @description Exported function for backward compatibility.
269
+ * @returns {string}
270
+ */
271
+ const getLocalIPv4Address = Dns.getLocalIPv4Address;
272
+
273
+ // Export the class as default and all original identifiers for backward compatibility.
274
+ export default Dns;
275
+
276
+ export { Dns, ip, isInternetConnection, getLocalIPv4Address };
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Provides a utility class for downloading files from a URL and saving them to the local filesystem.
3
+ * @module src/server/downloader.js
4
+ * @namespace Downloader
5
+ */
6
+
7
+ import axios from 'axios';
8
+ import fs from 'fs';
9
+ import { loggerFactory } from './logger.js';
10
+ import dotenv from 'dotenv';
11
+ dotenv.config();
12
+
13
+ const logger = loggerFactory(import.meta);
14
+
15
+ /**
16
+ * Main class for handling file downloading operations.
17
+ * All utility methods are implemented as static to serve as a namespace container.
18
+ * @class Downloader
19
+ * @augments Downloader
20
+ * @memberof Downloader
21
+ */
22
+ class Downloader {
23
+ /**
24
+ * Downloads a file from a given URL and pipes the stream to a local file path.
25
+ * @static
26
+ * @memberof Downloader
27
+ * @param {string} url The URL of the file to download.
28
+ * @param {string} fullPath The full local path where the file should be saved.
29
+ * @param {object} [options] Axios request configuration options.
30
+ * @param {string} [options.method='get'] HTTP method.
31
+ * @param {string} [options.responseType='stream'] Expected response type.
32
+ * @returns {Promise<string>} Resolves with the full path of the saved file on success.
33
+ * @memberof Downloader
34
+ */
35
+ static downloadFile(url, fullPath, options = { method: 'get', responseType: 'stream' }) {
36
+ return new Promise((resolve, reject) =>
37
+ axios({
38
+ url,
39
+ ...options,
40
+ })
41
+ .then((response) => {
42
+ // Create a write stream to save the file to the specified path
43
+ const writer = fs.createWriteStream(fullPath);
44
+ response.data.pipe(writer);
45
+ writer.on('finish', () => {
46
+ logger.info('Download complete. File saved at', fullPath);
47
+ return resolve(fullPath);
48
+ });
49
+ writer.on('error', (error) => {
50
+ logger.error(error, 'Error downloading the file');
51
+ // Cleanup incomplete file if possible
52
+ if (fs.existsSync(fullPath)) fs.unlinkSync(fullPath);
53
+ return reject(error);
54
+ });
55
+ })
56
+ .catch((error) => {
57
+ logger.error(error, 'Error in the request');
58
+ return reject(error);
59
+ }),
60
+ );
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Backward compatibility export
66
+ * @type {function(string, string, object): Promise<string>}
67
+ * @memberof Downloader
68
+ */
69
+
70
+ const downloadFile = Downloader.downloadFile;
71
+
72
+ export default Downloader;
73
+
74
+ export { Downloader, downloadFile };
@@ -0,0 +1,77 @@
1
+ function isPlainObject(obj) {
2
+ return obj ? typeof obj === 'object' && Object.getPrototypeOf(obj) === Object.prototype : false;
3
+ }
4
+
5
+ const supportType = ['string', 'number', 'array', 'object', 'boolean', 'integer'];
6
+
7
+ function getType(type) {
8
+ if (!type) type = 'string';
9
+ if (supportType.indexOf(type) !== -1) {
10
+ return type;
11
+ }
12
+ return typeof type;
13
+ }
14
+
15
+ function isSchema(object) {
16
+ if (supportType.indexOf(object.type) !== -1) {
17
+ return true;
18
+ }
19
+ return false;
20
+ }
21
+
22
+ function handleSchema(json, schema) {
23
+ Object.assign(schema, json);
24
+ if (schema.type === 'object') {
25
+ delete schema.properties;
26
+ parse(json.properties, schema);
27
+ }
28
+ if (schema.type === 'array') {
29
+ delete schema.items;
30
+ schema.items = {};
31
+ parse(json.items, schema.items);
32
+ }
33
+ }
34
+
35
+ function handleArray(arr, schema) {
36
+ schema.type = 'array';
37
+ let props = (schema.items = {});
38
+ parse(arr[0], props);
39
+ }
40
+
41
+ function handleObject(json, schema) {
42
+ if (isSchema(json)) {
43
+ return handleSchema(json, schema);
44
+ }
45
+ schema.type = 'object';
46
+ schema.required = [];
47
+ let props = (schema.properties = {});
48
+ for (let key in json) {
49
+ let item = json[key];
50
+ let curSchema = (props[key] = {});
51
+ if (key[0] === '*') {
52
+ delete props[key];
53
+ key = key.substr(1);
54
+ schema.required.push(key);
55
+ curSchema = props[key] = {};
56
+ }
57
+ parse(item, curSchema);
58
+ }
59
+ }
60
+
61
+ function parse(json, schema) {
62
+ if (Array.isArray(json)) {
63
+ handleArray(json, schema);
64
+ } else if (isPlainObject(json)) {
65
+ handleObject(json, schema);
66
+ } else {
67
+ schema.type = getType(json);
68
+ }
69
+ }
70
+
71
+ function ejs(data) {
72
+ let JsonSchema = {};
73
+ parse(data, JsonSchema);
74
+ return JsonSchema;
75
+ }
76
+
77
+ export { ejs };