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,171 @@
1
+ /**
2
+ * Module for process and shell command management.
3
+ * Provides utilities for executing shell commands, managing signals, and handling environment details.
4
+ * @module src/server/process.js
5
+ * @namespace Process
6
+ */
7
+
8
+ // https://nodejs.org/api/process
9
+
10
+ import shell from 'shelljs';
11
+ import dotenv from 'dotenv';
12
+ import { loggerFactory } from './logger.js';
13
+ import clipboard from 'clipboardy';
14
+ import UnderpostRootEnv from '../cli/env.js';
15
+
16
+ dotenv.config();
17
+
18
+ const logger = loggerFactory(import.meta);
19
+
20
+ /**
21
+ * Gets the current working directory, replacing backslashes with forward slashes for consistency.
22
+ * @memberof Process
23
+ * @returns {string} The root directory path.
24
+ */
25
+ const getRootDirectory = () => process.cwd().replace(/\\/g, '/');
26
+
27
+ /**
28
+ * Controls and manages process-level events and signals.
29
+ * @namespace ProcessController
30
+ */
31
+ const ProcessController = {
32
+ /**
33
+ * List of signals to listen for for graceful shutdown/handling.
34
+ * @memberof ProcessController
35
+ * @type {string[]}
36
+ */
37
+ SIG: [
38
+ 'SIGPIPE',
39
+ 'SIGHUP',
40
+ 'SIGTERM',
41
+ 'SIGINT',
42
+ 'SIGBREAK',
43
+ 'SIGWINCH',
44
+ // 'SIGKILL',
45
+ // 'SIGSTOP',
46
+ 'SIGBUS',
47
+ 'SIGFPE',
48
+ 'SIGSEGV',
49
+ 'SIGILL',
50
+ ],
51
+
52
+ /**
53
+ * Sets up listeners for various process signals defined in {@link ProcessController.SIG}.
54
+ * Handles graceful exit on 'SIGINT' (Ctrl+C).
55
+ * @memberof ProcessController
56
+ * @returns {Array<process.Process>} An array of process listener handles.
57
+ */
58
+ onSigListen: function () {
59
+ return this.SIG.map((sig) =>
60
+ process.on(sig, (...args) => {
61
+ this.logger.info(`process on ${sig}`, args);
62
+ switch (sig) {
63
+ case 'SIGINT':
64
+ return process.exit();
65
+
66
+ default:
67
+ break;
68
+ }
69
+ }),
70
+ );
71
+ },
72
+
73
+ /**
74
+ * Initializes the ProcessController.
75
+ * Sets up signal listeners, registers a listener for the 'exit' event, and cleans up temporary deployment environment variables.
76
+ * @memberof ProcessController
77
+ * @param {Object} logger - The logger instance to use for internal logging.
78
+ * @returns {void}
79
+ */
80
+ init: function (logger) {
81
+ this.logger = logger;
82
+ process.on('exit', (...args) => {
83
+ this.logger.info(`process on exit`, args);
84
+ });
85
+ this.onSigListen();
86
+ UnderpostRootEnv.API.delete('await-deploy');
87
+ },
88
+ };
89
+
90
+ /**
91
+ * Executes a shell command using shelljs.
92
+ * @memberof Process
93
+ * @param {string} cmd - The command string to execute.
94
+ * @param {Object} [options] - Options for execution.
95
+ * @param {boolean} [options.silent=false] - Suppress output from shell commands.
96
+ * @param {boolean} [options.async=false] - Run command asynchronously.
97
+ * @param {boolean} [options.stdout=false] - Return stdout content (string) instead of shelljs result object.
98
+ * @param {boolean} [options.disableLog=false] - Prevent logging of the command.
99
+ * @returns {string|shelljs.ShellString} The result of the shell command (string if `stdout: true`, otherwise a ShellString object).
100
+ */
101
+ const shellExec = (cmd, options = { silent: false, async: false, stdout: false, disableLog: false }) => {
102
+ if (!options.disableLog) logger.info(`cmd`, cmd);
103
+ return options.stdout ? shell.exec(cmd, options).stdout : shell.exec(cmd, options);
104
+ };
105
+
106
+ /**
107
+ * Changes the current working directory using shelljs.
108
+ * @memberof Process
109
+ * @param {string} cd - The path to change the directory to.
110
+ * @param {Object} [options] - Options for the CD operation.
111
+ * @param {boolean} [options.disableLog=false] - Prevent logging of the CD command.
112
+ * @returns {shelljs.ShellString} The result of the shelljs cd command.
113
+ */
114
+ const shellCd = (cd, options = { disableLog: false }) => {
115
+ if (!options.disableLog) logger.info(`cd`, cd);
116
+ return shell.cd(cd);
117
+ };
118
+
119
+ /**
120
+ * Opens a new GNOME terminal and executes a command.
121
+ * Note: This function is environment-specific (GNOME/Linux).
122
+ * @memberof Process
123
+ * @param {string} cmd - The command to execute in the new terminal.
124
+ * @param {Object} [options] - Options for the terminal opening.
125
+ * @param {boolean} [options.single=false] - If true, execute as a single session process using `setsid`.
126
+ * @returns {void}
127
+ */
128
+ const openTerminal = (cmd, options = { single: false }) => {
129
+ if (options.single === true) {
130
+ // Run as a single session process
131
+ shellExec(`setsid gnome-terminal -- bash -ic "${cmd}; exec bash" >/dev/null 2>&1 &`);
132
+ return;
133
+ }
134
+ // Run asynchronously and disown
135
+ shellExec(`gnome-terminal -- bash -c "${cmd}; exec bash" & disown`, {
136
+ async: true,
137
+ stdout: true,
138
+ });
139
+ };
140
+
141
+ /**
142
+ * Wraps a command to run it as a daemon process in a shell (keeping the process alive/terminal open).
143
+ * @memberof Process
144
+ * @param {string} cmd - The command to daemonize.
145
+ * @returns {string} The shell command string for the daemon process.
146
+ */
147
+ const daemonProcess = (cmd) => `exec bash -c '${cmd}; exec tail -f /dev/null'`;
148
+
149
+ /**
150
+ * Retrieves the process ID (PID) of the most recently created gnome-terminal instance.
151
+ * Note: This function is environment-specific (GNOME/Linux) and uses `pgrep -n`.
152
+ * @memberof Process
153
+ * @returns {number} The PID of the last gnome-terminal process.
154
+ */
155
+ // list all terminals: pgrep gnome-terminal
156
+ // list last terminal: pgrep -n gnome-terminal
157
+ const getTerminalPid = () => JSON.parse(shellExec(`pgrep -n gnome-terminal`, { stdout: true, silent: true }));
158
+
159
+ /**
160
+ * Copies text content to the system clipboard using clipboardy.
161
+ * Logs the copied content for confirmation.
162
+ * @memberof Process
163
+ * @param {string} [data='🦄'] - The data to copy. Defaults to '🦄'.
164
+ * @returns {void}
165
+ */
166
+ function pbcopy(data) {
167
+ clipboard.writeSync(data || '🦄');
168
+ logger.info(`copied to clipboard`, clipboard.readSync());
169
+ }
170
+
171
+ export { ProcessController, getRootDirectory, shellExec, shellCd, pbcopy, openTerminal, getTerminalPid, daemonProcess };
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Manages the creation and configuration of the reverse proxy server,
3
+ * including handling HTTP/HTTPS listeners and routing based on host configuration.
4
+ * @module src/server/proxy.js
5
+ * @namespace ProxyService
6
+ */
7
+ 'use strict';
8
+
9
+ import express from 'express';
10
+ import dotenv from 'dotenv';
11
+
12
+ import { createProxyMiddleware } from 'http-proxy-middleware';
13
+ import { loggerFactory, loggerMiddleware } from './logger.js';
14
+ import { TLS } from './tls.js';
15
+ import { buildPortProxyRouter, buildProxyRouter } from './conf.js';
16
+ import UnderpostStartUp from './start.js';
17
+
18
+ dotenv.config();
19
+
20
+ const logger = loggerFactory(import.meta);
21
+
22
+ /**
23
+ * Main class for building and running the proxy server.
24
+ * All utility methods are implemented as static to serve as a namespace container.
25
+ * @class Proxy
26
+ * @augments Proxy
27
+ * @memberof ProxyService
28
+ */
29
+ class Proxy {
30
+ /**
31
+ * Initializes and starts the reverse proxy server for all configured ports and hosts.
32
+ * @async
33
+ * @static
34
+ * @memberof ProxyService
35
+ * @returns {Promise<void>}
36
+ * @memberof ProxyService
37
+ */
38
+ static async buildProxy() {
39
+ // Start a default Express listener on process.env.PORT (potentially unused, but ensures Express is initialized)
40
+ express().listen(process.env.PORT);
41
+
42
+ const proxyRouter = buildProxyRouter();
43
+
44
+ for (let port of Object.keys(proxyRouter)) {
45
+ port = parseInt(port);
46
+ const hosts = proxyRouter[port];
47
+ const proxyPath = '/';
48
+ const proxyHost = 'localhost';
49
+ const runningData = { host: proxyHost, path: proxyPath, client: null, runtime: 'nodejs', meta: import.meta };
50
+ const app = express();
51
+
52
+ // Set logger middleware
53
+ app.use(loggerMiddleware(import.meta));
54
+
55
+ // Proxy middleware options
56
+ /** @type {import('http-proxy-middleware/dist/types').Options} */
57
+ const options = {
58
+ ws: true, // Enable websocket proxying
59
+ target: `http://localhost:${process.env.PORT}`, // Default target (should be overridden by router)
60
+ router: {},
61
+ xfwd: true, // Adds x-forward headers (Host, Proto, etc.)
62
+ onProxyReq: (proxyReq, req, res, options) => {
63
+ // Use the static method from the TLS class for redirection logic
64
+ TLS.sslRedirectMiddleware(req, res, port, proxyRouter);
65
+ },
66
+ pathRewrite: {
67
+ // Add path rewrite rules here if necessary
68
+ },
69
+ };
70
+
71
+ options.router = buildPortProxyRouter(port, proxyRouter);
72
+
73
+ const filter = proxyPath; // Use '/' as the general filter
74
+ app.use(proxyPath, createProxyMiddleware(filter, options));
75
+
76
+ // Determine which server to start (HTTP or HTTPS) based on port and environment
77
+ switch (process.env.NODE_ENV) {
78
+ case 'production':
79
+ switch (port) {
80
+ case 443:
81
+ // For port 443 (HTTPS), create the SSL server
82
+ const { ServerSSL } = await TLS.createSslServer(app, hosts);
83
+ await UnderpostStartUp.API.listenPortController(ServerSSL, port, runningData);
84
+ break;
85
+
86
+ default:
87
+ // For other ports in production, use standard HTTP
88
+ await UnderpostStartUp.API.listenPortController(app, port, runningData);
89
+ break;
90
+ }
91
+ break;
92
+
93
+ default:
94
+ // In non-production, always use standard HTTP listener
95
+ await UnderpostStartUp.API.listenPortController(app, port, runningData);
96
+ break;
97
+ }
98
+ logger.info('Proxy running', { port, options });
99
+ }
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Backward compatibility export
105
+ * @type {function(): Promise<void>}
106
+ * @memberof ProxyService
107
+ */
108
+ const buildProxy = Proxy.buildProxy;
109
+
110
+ export { Proxy, buildProxy };
@@ -0,0 +1,170 @@
1
+ /**
2
+ * The main runtime orchestrator responsible for reading configuration,
3
+ * initializing services (Prometheus, Ports, DB, Mailer), and building the
4
+ * specific server runtime for each host/path (e.g., nodejs, lampp).
5
+ * @module src/server/runtime.js
6
+ * @namespace Runtime
7
+ */
8
+
9
+ import fs from 'fs-extra';
10
+ import dotenv from 'dotenv';
11
+ import * as promClient from 'prom-client';
12
+
13
+ import UnderpostStartUp from './start.js';
14
+ import { loggerFactory } from './logger.js';
15
+ import { newInstance } from '../client/components/core/CommonJs.js';
16
+ import { Lampp } from '../runtime/lampp/Lampp.js';
17
+ import { getInstanceContext } from './conf.js';
18
+
19
+ import ExpressService from '../runtime/express/Express.js';
20
+
21
+ dotenv.config();
22
+
23
+ const logger = loggerFactory(import.meta);
24
+
25
+ /**
26
+ * Reads server configurations, sets up Prometheus metrics, and iterates through
27
+ * all defined hosts and paths to build and start the corresponding runtime instances.
28
+ *
29
+ * @memberof Runtime
30
+ * @returns {Promise<void>}
31
+ * @function buildRuntime
32
+ */
33
+ const buildRuntime = async () => {
34
+ const deployId = process.env.DEPLOY_ID;
35
+
36
+ // 1. Initialize Prometheus Metrics
37
+ const collectDefaultMetrics = promClient.collectDefaultMetrics;
38
+ collectDefaultMetrics();
39
+
40
+ const promCounterOption = {
41
+ name: `${deployId.replaceAll('-', '_')}_http_requests_total`,
42
+ help: 'Total number of HTTP requests',
43
+ labelNames: ['instance', 'method', 'status_code'],
44
+ };
45
+
46
+ const requestCounter = new promClient.Counter(promCounterOption);
47
+ const initPort = parseInt(process.env.PORT) + 1;
48
+ let currentPort = initPort;
49
+
50
+ // 2. Load Configuration
51
+ const confServer = JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'));
52
+ const confSSR = JSON.parse(fs.readFileSync(`./conf/conf.ssr.json`, 'utf8'));
53
+ const singleReplicaHosts = [];
54
+
55
+ // 3. Iterate through hosts and paths
56
+ for (const host of Object.keys(confServer)) {
57
+ if (singleReplicaHosts.length > 0)
58
+ currentPort += singleReplicaHosts.reduce((accumulator, currentValue) => accumulator + currentValue.replicas, 0);
59
+
60
+ const rootHostPath = `/public/${host}`;
61
+ for (const path of Object.keys(confServer[host])) {
62
+ confServer[host][path].port = newInstance(currentPort);
63
+ const {
64
+ runtime,
65
+ port,
66
+ client,
67
+ apis,
68
+ origins,
69
+ directory,
70
+ ws,
71
+ mailer,
72
+ db,
73
+ redirect,
74
+ peer,
75
+ singleReplica,
76
+ replicas,
77
+ valkey,
78
+ apiBaseHost,
79
+ useLocalSsl,
80
+ } = confServer[host][path];
81
+
82
+ // Calculate context data
83
+ const { redirectTarget, singleReplicaHost } = await getInstanceContext({
84
+ redirect,
85
+ singleReplicaHosts,
86
+ singleReplica,
87
+ replicas,
88
+ });
89
+
90
+ if (singleReplicaHost) {
91
+ singleReplicaHosts.push({
92
+ host,
93
+ replicas: replicas.length,
94
+ });
95
+ continue;
96
+ }
97
+
98
+ const runningData = {
99
+ host,
100
+ path,
101
+ runtime,
102
+ client,
103
+ meta: import.meta,
104
+ apis,
105
+ };
106
+
107
+ switch (runtime) {
108
+ case 'nodejs':
109
+ logger.info('Build nodejs server runtime', `${host}${path}:${port}`);
110
+
111
+ const { portsUsed } = await ExpressService.createApp({
112
+ host,
113
+ path,
114
+ port,
115
+ client,
116
+ apis,
117
+ origins,
118
+ directory,
119
+ useLocalSsl,
120
+ ws,
121
+ mailer,
122
+ db,
123
+ redirect,
124
+ peer,
125
+ valkey,
126
+ apiBaseHost,
127
+ redirectTarget,
128
+ rootHostPath,
129
+ confSSR,
130
+ promRequestCounter: requestCounter,
131
+ promRegister: promClient.register,
132
+ });
133
+
134
+ // Increment currentPort by any additional ports used by the service (e.g., PeerServer port)
135
+ currentPort += portsUsed;
136
+ break;
137
+
138
+ case 'lampp':
139
+ {
140
+ const { disabled } = await Lampp.createApp({
141
+ port,
142
+ host,
143
+ path,
144
+ directory,
145
+ rootHostPath,
146
+ redirect,
147
+ redirectTarget,
148
+ resetRouter: currentPort === initPort,
149
+ });
150
+ if (disabled) continue;
151
+ await UnderpostStartUp.API.listenPortController(
152
+ UnderpostStartUp.API.listenServerFactory(),
153
+ port,
154
+ runningData,
155
+ );
156
+ }
157
+ break;
158
+ default:
159
+ break;
160
+ }
161
+ currentPort++;
162
+ }
163
+ }
164
+
165
+ if (Lampp.enabled() && Lampp.router) Lampp.initService();
166
+
167
+ UnderpostStartUp.API.logRuntimeRouter();
168
+ };
169
+
170
+ export { buildRuntime };
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Module for managing server side rendering
3
+ * @module src/server/ssr.js
4
+ * @namespace ServerSideRendering
5
+ */
6
+
7
+ import fs from 'fs-extra';
8
+ import dotenv from 'dotenv';
9
+ import vm from 'node:vm';
10
+
11
+ import Underpost from '../index.js';
12
+
13
+ import { srcFormatted, JSONweb } from './client-formatted.js';
14
+ import { loggerFactory } from './logger.js';
15
+ import { getRootDirectory } from './process.js';
16
+
17
+ dotenv.config();
18
+
19
+ const logger = loggerFactory(import.meta);
20
+
21
+ /**
22
+ * Creates a server-side rendering component function from a given file path.
23
+ * It reads the component file, formats it, and executes it in a sandboxed Node.js VM context to extract the component.
24
+ * @param {string} [componentPath='./src/client/ssr/Render.js'] - The path to the SSR component file.
25
+ * @returns {Promise<Function>} A promise that resolves to the SSR component function.
26
+ * @memberof ServerSideRendering
27
+ */
28
+ const ssrFactory = async (componentPath = `./src/client/ssr/Render.js`) => {
29
+ const context = { SrrComponent: () => {}, npm_package_version: Underpost.version };
30
+ vm.createContext(context);
31
+ vm.runInContext(await srcFormatted(fs.readFileSync(componentPath, 'utf8')), context);
32
+ return context.SrrComponent;
33
+ };
34
+
35
+ /**
36
+ * Sanitizes an HTML string by adding a nonce to all script and style tags for Content Security Policy (CSP).
37
+ * The nonce is retrieved from `res.locals.nonce`.
38
+ * @param {object} res - The Express response object.
39
+ * @param {object} req - The Express request object.
40
+ * @param {string} html - The HTML string to sanitize.
41
+ * @returns {string} The sanitized HTML string with nonces.
42
+ * @memberof ServerSideRendering
43
+ */
44
+ const sanitizeHtml = (res, req, html) => {
45
+ const nonce = res.locals.nonce;
46
+
47
+ return html
48
+ .replace(/<script(?=\s|>)/gi, `<script nonce="${nonce}"`)
49
+ .replace(/<style(?=\s|>)/gi, `<style nonce="${nonce}"`);
50
+ };
51
+
52
+ /**
53
+ * Factory function to create Express middleware for handling 404 and 500 errors.
54
+ * It generates server-side rendered HTML for these error pages. If static error pages exist, it redirects to them.
55
+ * @param {object} options - The options for creating the middleware.
56
+ * @param {object} options.app - The Express app instance.
57
+ * @param {string} options.directory - The directory for the instance's static files.
58
+ * @param {string} options.rootHostPath - The root path for the host's public files.
59
+ * @param {string} options.path - The base path for the instance.
60
+ * @returns {Promise<{error500: Function, error400: Function}>} A promise that resolves to an object containing the 500 and 404 error handling middleware.
61
+ * @memberof ServerSideRendering
62
+ */
63
+ const ssrMiddlewareFactory = async ({ app, directory, rootHostPath, path }) => {
64
+ const Render = await ssrFactory();
65
+ const ssrPath = path === '/' ? path : `${path}/`;
66
+
67
+ // Build default html src for 404 and 500
68
+
69
+ const defaultHtmlSrc404 = Render({
70
+ title: '404 Not Found',
71
+ ssrPath,
72
+ ssrHeadComponents: '',
73
+ ssrBodyComponents: (await ssrFactory(`./src/client/ssr/body/404.js`))(),
74
+ renderPayload: {
75
+ apiBasePath: process.env.BASE_API,
76
+ version: Underpost.version,
77
+ },
78
+ renderApi: {
79
+ JSONweb,
80
+ },
81
+ });
82
+ const path404 = `${directory ? directory : `${getRootDirectory()}${rootHostPath}`}/404/index.html`;
83
+ const page404 = fs.existsSync(path404) ? `${path === '/' ? '' : path}/404` : undefined;
84
+
85
+ const defaultHtmlSrc500 = Render({
86
+ title: '500 Server Error',
87
+ ssrPath,
88
+ ssrHeadComponents: '',
89
+ ssrBodyComponents: (await ssrFactory(`./src/client/ssr/body/500.js`))(),
90
+ renderPayload: {
91
+ apiBasePath: process.env.BASE_API,
92
+ version: Underpost.version,
93
+ },
94
+ renderApi: {
95
+ JSONweb,
96
+ },
97
+ });
98
+ const path500 = `${directory ? directory : `${getRootDirectory()}${rootHostPath}`}/500/index.html`;
99
+ const page500 = fs.existsSync(path500) ? `${path === '/' ? '' : path}/500` : undefined;
100
+
101
+ return {
102
+ error500: function (err, req, res, next) {
103
+ logger.error(err, err.stack);
104
+ if (page500) return res.status(500).redirect(page500);
105
+ else {
106
+ res.set('Content-Type', 'text/html');
107
+ return res.status(500).send(sanitizeHtml(res, req, defaultHtmlSrc500));
108
+ }
109
+ },
110
+ error400: function (req, res, next) {
111
+ // if /<path>/home redirect to /<path>
112
+ const homeRedirectPath = `${path === '/' ? '' : path}/home`;
113
+ if (req.url.startsWith(homeRedirectPath)) {
114
+ const redirectUrl = req.url.replace('/home', '');
115
+ return res.redirect(redirectUrl.startsWith('/') ? redirectUrl : `/${redirectUrl}`);
116
+ }
117
+
118
+ if (page404) return res.status(404).redirect(page404);
119
+ else {
120
+ res.set('Content-Type', 'text/html');
121
+ return res.status(404).send(sanitizeHtml(res, req, defaultHtmlSrc404));
122
+ }
123
+ },
124
+ };
125
+ };
126
+
127
+ export { ssrMiddlewareFactory, ssrFactory, sanitizeHtml };