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,256 @@
1
+ /**
2
+ * A service dedicated to creating and configuring an Express.js application
3
+ * instance based on server configuration data.
4
+ * @module src/runtime/express/Express.js
5
+ * @namespace ExpressService
6
+ */
7
+
8
+ import fs from 'fs-extra';
9
+ import express from 'express';
10
+ import fileUpload from 'express-fileupload';
11
+ import swaggerUi from 'swagger-ui-express';
12
+ import compression from 'compression';
13
+ import { createServer } from 'http';
14
+
15
+ import UnderpostStartUp from '../../server/start.js';
16
+ import { loggerFactory, loggerMiddleware } from '../../server/logger.js';
17
+ import { getCapVariableName, newInstance } from '../../client/components/core/CommonJs.js';
18
+ import { MailerProvider } from '../../mailer/MailerProvider.js';
19
+ import { DataBaseProvider } from '../../db/DataBaseProvider.js';
20
+ import { createPeerServer } from '../../server/peer.js';
21
+ import { createValkeyConnection } from '../../server/valkey.js';
22
+ import { applySecurity, authMiddlewareFactory } from '../../server/auth.js';
23
+ import { ssrMiddlewareFactory } from '../../server/ssr.js';
24
+ import { TLS } from '../../server/tls.js';
25
+ import { shellExec } from '../../server/process.js';
26
+
27
+ const logger = loggerFactory(import.meta);
28
+
29
+ /**
30
+ * @class ExpressService
31
+ * @description A service dedicated to creating and configuring an Express.js application
32
+ * instance based on server configuration data.
33
+ * @memberof ExpressService
34
+ */
35
+ class ExpressService {
36
+ /**
37
+ * Creates and configures a complete Express application instance for a specific host/path configuration.
38
+ *
39
+ * @method createApp
40
+ * @memberof ExpressService
41
+ * @param {string} config.host - The host name for the instance (e.g., 'www.example.com').
42
+ * @param {string} config.path - The URL path for the instance (e.g., '/', '/api/v1').
43
+ * @param {number} config.port - The primary listening port for the instance.
44
+ * @param {string} config.client - The client associated with the instance (used for SSR/Mailer configuration lookup).
45
+ * @param {string[]} [config.apis] - A list of API names to load and attach routers for.
46
+ * @param {string[]} config.origins - Allowed origins for CORS.
47
+ * @param {string} [config.directory] - The directory for static files (if overriding default).
48
+ * @param {boolean} [config.useLocalSsl] - Whether to use local SSL for the instance.
49
+ * @param {string} [config.ws] - The WebSocket server name to use.
50
+ * @param {object} [config.mailer] - Mailer configuration.
51
+ * @param {object} [config.db] - Database configuration.
52
+ * @param {string} [config.redirect] - URL or flag to indicate an HTTP redirect should be configured.
53
+ * @param {boolean} [config.peer] - Whether to enable the peer server.
54
+ * @param {object} [config.valkey] - Valkey connection configuration.
55
+ * @param {string} [config.apiBaseHost] - Base host for the API (if running separate API).
56
+ * @param {string} config.redirectTarget - The full target URL for redirection (used if `redirect` is true).
57
+ * @param {string} config.rootHostPath - The root path for public host assets (e.g., `/public/hostname`).
58
+ * @param {object} config.confSSR - The SSR configuration object, used to look up Mailer templates.
59
+ * @param {import('prom-client').Counter<string>} config.promRequestCounter - Prometheus request counter instance.
60
+ * @param {import('prom-client').Registry} config.promRegister - Prometheus register instance for metrics.
61
+ * @returns {Promise<{portsUsed: number}>} An object indicating how many additional ports were used (e.g., for PeerServer).
62
+ */
63
+ async createApp({
64
+ host,
65
+ path,
66
+ port,
67
+ client,
68
+ apis,
69
+ origins,
70
+ directory,
71
+ useLocalSsl,
72
+ ws,
73
+ mailer,
74
+ db,
75
+ redirect,
76
+ peer,
77
+ valkey,
78
+ apiBaseHost,
79
+ redirectTarget,
80
+ rootHostPath,
81
+ confSSR,
82
+ promRequestCounter,
83
+ promRegister,
84
+ }) {
85
+ let portsUsed = 0;
86
+ const runningData = {
87
+ host,
88
+ path,
89
+ runtime: 'nodejs',
90
+ client,
91
+ meta: import.meta,
92
+ apis,
93
+ };
94
+
95
+ const app = express();
96
+
97
+ if (process.env.NODE_ENV === 'production') app.set('trust proxy', true);
98
+
99
+ app.use((req, res, next) => {
100
+ res.on('finish', () => {
101
+ promRequestCounter.inc({
102
+ instance: `${host}:${port}${path}`,
103
+ method: req.method,
104
+ status_code: res.statusCode,
105
+ });
106
+ });
107
+ return next();
108
+ });
109
+
110
+ // Metrics endpoint
111
+ app.get(`${path === '/' ? '' : path}/metrics`, async (req, res) => {
112
+ res.set('Content-Type', promRegister.contentType);
113
+ return res.end(await promRegister.metrics());
114
+ });
115
+
116
+ // Logging, Compression, and Body Parsers
117
+ app.use(loggerMiddleware(import.meta));
118
+ app.use(compression({ filter: (req, res) => !req.headers['x-no-compression'] && compression.filter(req, res) }));
119
+ app.use(express.json({ limit: '100MB' }));
120
+ app.use(express.urlencoded({ extended: true, limit: '20MB' }));
121
+ app.use(fileUpload());
122
+
123
+ if (process.env.NODE_ENV === 'development') app.set('json spaces', 2);
124
+
125
+ // Language handling middleware
126
+ app.use((req, res, next) => {
127
+ const lang = req.headers['accept-language'] || 'en';
128
+ req.lang = typeof lang === 'string' && lang.toLowerCase().match('es') ? 'es' : 'en';
129
+ return next();
130
+ });
131
+
132
+ // Static file serving
133
+ app.use('/', express.static(directory ? directory : `.${rootHostPath}`));
134
+
135
+ // Handle redirection-only instances
136
+ if (redirect) {
137
+ app.use((req, res, next) => {
138
+ if (process.env.NODE_ENV === 'production' && !req.url.startsWith(`/.well-known/acme-challenge`)) {
139
+ return res.status(302).redirect(redirectTarget + req.url);
140
+ }
141
+ return next();
142
+ });
143
+ await UnderpostStartUp.API.listenPortController(app, port, runningData);
144
+ return { portsUsed };
145
+ }
146
+
147
+ // Create HTTP server for regular instances (required for WebSockets)
148
+ const server = createServer({}, app);
149
+
150
+ if (!apiBaseHost) {
151
+ // Swagger path definition
152
+ const swaggerJsonPath = `./public/${host}${path === '/' ? path : `${path}/`}swagger-output.json`;
153
+ const swaggerPath = `${path === '/' ? `/api-docs` : `${path}/api-docs`}`;
154
+
155
+ // Flag swagger requests before security middleware
156
+ if (fs.existsSync(swaggerJsonPath)) {
157
+ app.use(swaggerPath, (req, res, next) => {
158
+ res.locals.isSwagger = true;
159
+ next();
160
+ });
161
+ }
162
+
163
+ // Swagger UI setup
164
+ if (fs.existsSync(swaggerJsonPath)) {
165
+ const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
166
+ // Reusing swaggerPath defined outside, removing unnecessary redeclaration
167
+ app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc));
168
+ }
169
+
170
+ // Security and CORS
171
+ if (process.env.NODE_ENV === 'development' && useLocalSsl)
172
+ origins = origins.map((origin) => origin.replace('http', 'https'));
173
+
174
+ applySecurity(app, {
175
+ origin: origins,
176
+ });
177
+
178
+ // Database and Valkey connections
179
+ if (db && apis) await DataBaseProvider.load({ apis, host, path, db });
180
+ if (valkey) await createValkeyConnection({ host, path }, valkey);
181
+
182
+ // Mailer setup
183
+ if (mailer) {
184
+ const mailerSsrConf = confSSR[getCapVariableName(client)];
185
+ await MailerProvider.load({
186
+ id: `${host}${path}`,
187
+ meta: `mailer-${host}${path}`,
188
+ host,
189
+ path,
190
+ ...mailer,
191
+ templates: mailerSsrConf ? mailerSsrConf.mailer : {},
192
+ });
193
+ }
194
+
195
+ // API router loading
196
+ if (apis && apis.length > 0) {
197
+ const authMiddleware = authMiddlewareFactory({ host, path });
198
+ const apiPath = `${path === '/' ? '' : path}/${process.env.BASE_API}`;
199
+ for (const api of apis) {
200
+ logger.info(`Build api server`, `${host}${apiPath}/${api}`);
201
+ const { ApiRouter } = await import(`../../api/${api}/${api}.router.js`);
202
+ const router = ApiRouter({ host, path, apiPath, mailer, db, authMiddleware, origins });
203
+ app.use(`${apiPath}/${api}`, router);
204
+ }
205
+ }
206
+
207
+ // WebSocket server setup
208
+ if (ws) {
209
+ const { createIoServer } = await import(`../../ws/${ws}/${ws}.ws.server.js`);
210
+ const { options, meta, ioServer } = await createIoServer(server, { host, path, db, port, origins });
211
+
212
+ // Listen on the main port for the WS server
213
+ await UnderpostStartUp.API.listenPortController(ioServer, port, {
214
+ runtime: 'nodejs',
215
+ client: null,
216
+ host,
217
+ path: options.path,
218
+ meta,
219
+ });
220
+ }
221
+
222
+ // Peer server setup
223
+ if (peer) {
224
+ portsUsed++; // Peer server uses one additional port
225
+ const peerPort = newInstance(port + portsUsed); // portsUsed is 1 here
226
+ const { options, meta, peerServer } = await createPeerServer({
227
+ port: peerPort,
228
+ origins,
229
+ path,
230
+ });
231
+ await UnderpostStartUp.API.listenPortController(peerServer, peerPort, {
232
+ runtime: 'nodejs',
233
+ client: null,
234
+ host,
235
+ path: options.path,
236
+ meta,
237
+ });
238
+ }
239
+ }
240
+
241
+ // SSR middleware loading
242
+ const ssr = await ssrMiddlewareFactory({ app, directory, rootHostPath, path });
243
+ for (const [_, ssrMiddleware] of Object.entries(ssr)) app.use(ssrMiddleware);
244
+
245
+ // Start listening on the main port
246
+ if (useLocalSsl && process.env.NODE_ENV === 'development') {
247
+ if (!TLS.validateSecureContext()) shellExec(`node bin/deploy tls`);
248
+ const { ServerSSL } = await TLS.createSslServer(app);
249
+ await UnderpostStartUp.API.listenPortController(ServerSSL, port, runningData);
250
+ } else await UnderpostStartUp.API.listenPortController(server, port, runningData);
251
+
252
+ return { portsUsed };
253
+ }
254
+ }
255
+
256
+ export default new ExpressService();
@@ -0,0 +1,50 @@
1
+ FROM rockylinux:9
2
+
3
+ # --- Update and install required packages
4
+ RUN dnf -y update && \
5
+ dnf -y install epel-release && \
6
+ dnf -y install --allowerasing \
7
+ bzip2 \
8
+ sudo \
9
+ curl \
10
+ net-tools \
11
+ openssh-server \
12
+ nano \
13
+ vim-enhanced \
14
+ less \
15
+ openssl-devel \
16
+ wget \
17
+ git \
18
+ gnupg2 \
19
+ libnsl \
20
+ perl && \
21
+ dnf clean all
22
+
23
+ # --- Download and install XAMPP
24
+ RUN curl -L -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/7.4.33/xampp-linux-x64-7.4.33-0-installer.run" && \
25
+ chmod +x /tmp/xampp-linux-installer.run && \
26
+ bash -c "/tmp/xampp-linux-installer.run --mode unattended" && \
27
+ ln -sf /opt/lampp/lampp /usr/bin/lampp
28
+
29
+ # --- Create /xampp/htdocs (static root) and set permissions
30
+ RUN mkdir -p /opt/lampp/htdocs && \
31
+ chown -R root:root /opt/lampp/htdocs && \
32
+ chmod -R a+rX /opt/lampp/htdocs
33
+
34
+ # Install Node.js
35
+ RUN curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
36
+ RUN dnf install nodejs -y
37
+ RUN dnf clean all
38
+
39
+ # Verify Node.js and npm versions
40
+ RUN node --version
41
+ RUN npm --version
42
+
43
+ # Set working directory
44
+ WORKDIR /home/dd
45
+
46
+ EXPOSE 22
47
+ EXPOSE 80
48
+ EXPOSE 443
49
+ EXPOSE 3000-3100
50
+ EXPOSE 4000-4100
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Exported singleton instance of the LamppService class.
3
+ * This object is used to interact with the Lampp configuration and service.
4
+ * @module src/runtime/lampp/Lampp.js
5
+ * @namespace LamppService
6
+ */
7
+
8
+ import fs from 'fs-extra';
9
+ import { getRootDirectory, shellCd, shellExec } from '../../server/process.js';
10
+ import { loggerFactory } from '../../server/logger.js';
11
+
12
+ const logger = loggerFactory(import.meta);
13
+
14
+ /**
15
+ * @class LamppService
16
+ * @description Provides utilities for managing the XAMPP (Lampp) service on Linux,
17
+ * including initialization, router configuration, and virtual host creation.
18
+ * It manages the server's configuration files and controls the service process.
19
+ * @memberof LamppService
20
+ */
21
+ class LamppService {
22
+ /**
23
+ * @private
24
+ * @type {string | undefined}
25
+ * @description Stores the accumulated Apache virtual host configuration (router definition).
26
+ * @memberof LamppService
27
+ */
28
+ router;
29
+
30
+ /**
31
+ * @public
32
+ * @type {number[]}
33
+ * @description A list of ports currently configured and listened to by the Lampp service.
34
+ * @memberof LamppService
35
+ */
36
+ ports;
37
+
38
+ /**
39
+ * Creates an instance of LamppService.
40
+ * Initializes the router configuration and ports list.
41
+ * @method constructor
42
+ * @memberof LamppService
43
+ */
44
+ constructor() {
45
+ this.router = undefined;
46
+ this.ports = [];
47
+ }
48
+
49
+ /**
50
+ * Checks if the XAMPP (Lampp) service appears to be installed based on the presence of its main configuration file.
51
+ *
52
+ * @method enabled
53
+ * @memberof LamppService
54
+ * @returns {boolean} True if the configuration file exists, indicating Lampp is likely installed.
55
+ * @throws {Error} If the configuration file does not exist.
56
+ * @memberof LamppService
57
+ */
58
+ enabled() {
59
+ return fs.existsSync('/opt/lampp/etc/httpd.conf');
60
+ }
61
+
62
+ /**
63
+ * Initializes or restarts the Lampp Apache service.
64
+ * This method configures virtual hosts, disables default ports (80/443) in the main config
65
+ * to avoid conflicts, and starts or stops the service using shell commands.
66
+ *
67
+ * @method initService
68
+ * @param {object} [options={daemon: false}] - Options for service initialization.
69
+ * @param {boolean} [options.daemon=false] - Flag to indicate if the service should be run as a daemon (currently unused in logic).
70
+ * @returns {Promise<void>}
71
+ * @memberof LamppService
72
+ */
73
+ async initService(options = { daemon: false }) {
74
+ let cmd;
75
+
76
+ // 1. Write the current virtual host router configuration
77
+ fs.writeFileSync(`/opt/lampp/etc/extra/httpd-vhosts.conf`, this.router || '', 'utf8');
78
+
79
+ // 2. Ensure the vhosts file is included in the main httpd.conf
80
+ const httpdConfPath = `/opt/lampp/etc/httpd.conf`;
81
+ fs.writeFileSync(
82
+ httpdConfPath,
83
+ fs
84
+ .readFileSync(httpdConfPath, 'utf8')
85
+ .replace(`#Include etc/extra/httpd-vhosts.conf`, `Include etc/extra/httpd-vhosts.conf`),
86
+ 'utf8',
87
+ );
88
+
89
+ // 3. Stop the service before making port changes
90
+ cmd = `sudo /opt/lampp/lampp stop`;
91
+ shellExec(cmd);
92
+
93
+ // 4. Comment out default port Listen directives (80 and 443) to prevent conflicts
94
+ // Modify httpd.conf (port 80)
95
+ if (!fs.readFileSync(httpdConfPath, 'utf8').match(/# Listen 80/))
96
+ fs.writeFileSync(
97
+ httpdConfPath,
98
+ fs.readFileSync(httpdConfPath, 'utf8').replace(`Listen 80`, `# Listen 80`),
99
+ 'utf8',
100
+ );
101
+
102
+ // Modify httpd-ssl.conf (port 443)
103
+ const httpdSslConfPath = `/opt/lampp/etc/extra/httpd-ssl.conf`;
104
+ if (fs.existsSync(httpdSslConfPath) && !fs.readFileSync(httpdSslConfPath, 'utf8').match(/# Listen 443/))
105
+ fs.writeFileSync(
106
+ httpdSslConfPath,
107
+ fs.readFileSync(httpdSslConfPath, 'utf8').replace(`Listen 443`, `# Listen 443`),
108
+ 'utf8',
109
+ );
110
+
111
+ // 5. Modify the lampp startup script to bypass port checking for 80 and 443
112
+ const lamppScriptPath = `/opt/lampp/lampp`;
113
+ if (!fs.readFileSync(lamppScriptPath, 'utf8').match(/testport 443 && false/))
114
+ fs.writeFileSync(
115
+ lamppScriptPath,
116
+ fs.readFileSync(lamppScriptPath, 'utf8').replace(`testport 443`, `testport 443 && false`),
117
+ 'utf8',
118
+ );
119
+ if (!fs.readFileSync(lamppScriptPath, 'utf8').match(/testport 80 && false/))
120
+ fs.writeFileSync(
121
+ lamppScriptPath,
122
+ fs.readFileSync(lamppScriptPath, 'utf8').replace(`testport 80`, `testport 80 && false`),
123
+ 'utf8',
124
+ );
125
+
126
+ // 6. Start the service
127
+ cmd = `sudo /opt/lampp/lampp start`;
128
+ if (this.router) fs.writeFileSync(`./tmp/lampp-router.conf`, this.router, 'utf-8');
129
+ shellExec(cmd);
130
+ }
131
+
132
+ /**
133
+ * Appends new Apache VirtualHost configuration content to the internal router string.
134
+ * If a router config file exists from a previous run, it loads it first.
135
+ *
136
+ * @method appendRouter
137
+ * @param {string} render - The new VirtualHost configuration string to append.
138
+ * @returns {string} The complete, updated router configuration string.
139
+ * @memberof LamppService
140
+ */
141
+ appendRouter(render) {
142
+ if (!this.router) {
143
+ if (fs.existsSync(`./tmp/lampp-router.conf`)) {
144
+ this.router = fs.readFileSync(`./tmp/lampp-router.conf`, 'utf-8');
145
+ return this.router + render;
146
+ }
147
+ return (this.router = render);
148
+ }
149
+ return (this.router += render);
150
+ }
151
+
152
+ /**
153
+ * Resets the internal router configuration and removes the temporary configuration file.
154
+ *
155
+ * @memberof LamppService
156
+ * @returns {void}
157
+ */
158
+ removeRouter() {
159
+ this.router = undefined;
160
+ if (fs.existsSync(`./tmp/lampp-router.conf`)) fs.rmSync(`./tmp/lampp-router.conf`);
161
+ }
162
+
163
+ /**
164
+ * Installs and configures the Lampp service on Linux.
165
+ * This includes downloading the installer, running it, and setting up initial configurations.
166
+ * Only runs on the 'linux' platform.
167
+ *
168
+ * @method install
169
+ * @returns {Promise<void>}
170
+ * @memberof LamppService
171
+ */
172
+ async install() {
173
+ if (process.platform === 'linux') {
174
+ if (!fs.existsSync(`./engine-private/setup`)) fs.mkdirSync(`./engine-private/setup`, { recursive: true });
175
+
176
+ shellCd(`./engine-private/setup`);
177
+
178
+ if (!process.argv.includes(`server`)) {
179
+ // Download and run the XAMPP installer
180
+ shellExec(
181
+ `curl -Lo xampp-linux-installer.run https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/7.4.30/xampp-linux-x64-7.4.30-1-installer.run?from_af=true`,
182
+ );
183
+ shellExec(`sudo chmod +x xampp-linux-installer.run`);
184
+ shellExec(
185
+ `sudo ./xampp-linux-installer.run --mode unattended && \\` +
186
+ // Create symlink for easier access
187
+ `ln -sf /opt/lampp/lampp /usr/bin/lampp && \\` +
188
+ // Allow all access to xampp config (security measure override)
189
+ `sed -i.bak s'/Require local/Require all granted/g' /opt/lampp/etc/extra/httpd-xampp.conf && \\` +
190
+ // Enable display errors in PHP
191
+ `sed -i.bak s'/display_errors=Off/display_errors=On/g' /opt/lampp/etc/php.ini && \\` +
192
+ // Allow including custom Apache configuration files
193
+ `mkdir /opt/lampp/apache2/conf.d && \\` +
194
+ `echo "IncludeOptional /opt/lampp/apache2/conf.d/*.conf" >> /opt/lampp/etc/httpd.conf && \\` +
195
+ // Create /www directory and symlink it to htdocs
196
+ `mkdir /www && \\` +
197
+ `ln -s /www /opt/lampp/htdocs`,
198
+ );
199
+ }
200
+
201
+ // Copy log files to standard names for easier consumption
202
+ if (fs.existsSync(`/opt/lampp/logs/access_log`))
203
+ fs.copySync(`/opt/lampp/logs/access_log`, `/opt/lampp/logs/access.log`);
204
+ if (fs.existsSync(`/opt/lampp/logs/error_log`))
205
+ fs.copySync(`/opt/lampp/logs/error_log`, `/opt/lampp/logs/error.log`);
206
+ if (fs.existsSync(`/opt/lampp/logs/php_error_log`))
207
+ fs.copySync(`/opt/lampp/logs/php_error_log`, `/opt/lampp/logs/php_error.log`);
208
+ if (fs.existsSync(`/opt/lampp/logs/ssl_request_log`))
209
+ fs.copySync(`/opt/lampp/logs/ssl_request_log`, `/opt/lampp/logs/ssl_request.log`);
210
+
211
+ // Initialize the service after installation
212
+ await this.initService({ daemon: true });
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Creates and appends a new Apache VirtualHost entry to the router configuration for a web application.
218
+ * The router is then applied by calling {@link LamppService#initService}.
219
+ *
220
+ * @method createApp
221
+ * @param {object} options - Configuration options for the new web application.
222
+ * @param {number} options.port - The port the VirtualHost should listen on.
223
+ * @param {string} options.host - The ServerName/host for the VirtualHost.
224
+ * @param {string} options.path - The base path for error documents (e.g., '/app').
225
+ * @param {string} [options.directory] - Optional absolute path to the document root.
226
+ * @param {string} [options.rootHostPath] - Relative path from the root directory to the document root, used if `directory` is not provided.
227
+ * @param {boolean} [options.redirect] - If true, enables RewriteEngine for redirection.
228
+ * @param {string} [options.redirectTarget] - The target URL for redirection.
229
+ * @param {boolean} [options.resetRouter] - If true, clears the existing router configuration before appending the new one.
230
+ * @returns {{disabled: boolean}} An object indicating if the service is disabled.
231
+ * @memberof LamppService
232
+ */
233
+ createApp({ port, host, path, directory, rootHostPath, redirect, redirectTarget, resetRouter }) {
234
+ if (!this.enabled()) return { disabled: true };
235
+
236
+ if (!this.ports.includes(port)) this.ports.push(port);
237
+ if (resetRouter) this.removeRouter();
238
+
239
+ const documentRoot = directory ? directory : `${getRootDirectory()}${rootHostPath}`;
240
+
241
+ // Append the new VirtualHost configuration
242
+ this.appendRouter(`
243
+ Listen ${port}
244
+
245
+ <VirtualHost *:${port}>
246
+ DocumentRoot "${documentRoot}"
247
+ ServerName ${host}:${port}
248
+
249
+ <Directory "${documentRoot}">
250
+ Options Indexes FollowSymLinks MultiViews
251
+ AllowOverride All
252
+ Require all granted
253
+ </Directory>
254
+
255
+ ${
256
+ redirect
257
+ ? `
258
+ RewriteEngine on
259
+
260
+ # Exclude the ACME challenge path for certificate renewals
261
+ RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge
262
+ RewriteRule ^(.*)$ ${redirectTarget}%{REQUEST_URI} [R=302,L]
263
+ `
264
+ : ''
265
+ }
266
+
267
+ # Custom Error Documents
268
+ ErrorDocument 400 ${path === '/' ? '' : path}/400.html
269
+ ErrorDocument 404 ${path === '/' ? '' : path}/400.html
270
+ ErrorDocument 500 ${path === '/' ? '' : path}/500.html
271
+ ErrorDocument 502 ${path === '/' ? '' : path}/500.html
272
+ ErrorDocument 503 ${path === '/' ? '' : path}/500.html
273
+ ErrorDocument 504 ${path === '/' ? '' : path}/500.html
274
+
275
+ </VirtualHost>
276
+
277
+ `);
278
+
279
+ return { disabled: false };
280
+ }
281
+ }
282
+
283
+ /**
284
+ * @description Exported singleton instance of the LamppService class.
285
+ * This object is used to interact with the Lampp configuration and service.
286
+ * @memberof LamppService
287
+ * @type {LamppService}
288
+ */
289
+ const Lampp = new LamppService();
290
+
291
+ export { Lampp };
292
+
293
+ // -- helper info --
294
+
295
+ // ERR too many redirects:
296
+ // Check: SELECT * FROM database.wp_options where option_name = 'siteurl' or option_name = 'home';
297
+ // Check: wp-config.php
298
+ // if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
299
+ // $_SERVER['HTTPS'] = 'on';
300
+ // }
301
+ // For plugins:
302
+ // define( 'FS_METHOD', 'direct' );
303
+
304
+ // ErrorDocument 404 /custom_404.html
305
+ // ErrorDocument 500 /custom_50x.html
306
+ // ErrorDocument 502 /custom_50x.html
307
+ // ErrorDocument 503 /custom_50x.html
308
+ // ErrorDocument 504 /custom_50x.html
309
+
310
+ // Respond When Error Pages are Directly Requested
311
+
312
+ // <Files "custom_404.html">
313
+ // <If "-z %{ENV:REDIRECT_STATUS}">
314
+ // RedirectMatch 404 ^/custom_404.html$
315
+ // </If>
316
+ // </Files>
317
+
318
+ // <Files "custom_50x.html">
319
+ // <If "-z %{ENV:REDIRECT_STATUS}">
320
+ // RedirectMatch 404 ^/custom_50x.html$
321
+ // </If>
322
+ // </Files>
323
+
324
+ // Add www or https with htaccess rewrite
325
+
326
+ // Options +FollowSymLinks
327
+ // RewriteEngine On
328
+ // RewriteCond %{HTTP_HOST} ^example.com [NC]
329
+ // RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
330
+
331
+ // Redirect http to https with htaccess rewrite
332
+
333
+ // RewriteEngine On
334
+ // RewriteCond %{SERVER_PORT} 80
335
+ // RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
336
+
337
+ // Redirect to HTTPS with www subdomain
338
+
339
+ // RewriteEngine On
340
+ // RewriteCond %{HTTPS} off [OR]
341
+ // RewriteCond %{HTTP_HOST} ^www\. [NC]
342
+ // RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
343
+ // RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]