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,317 @@
1
+ /**
2
+ * Router module for handling routing in a PWA application.
3
+ * @module src/client/components/core/Router.js
4
+ * @namespace PwaRouter
5
+ */
6
+
7
+ import { titleFormatted } from './CommonJs.js';
8
+ import { loggerFactory } from './Logger.js';
9
+ import { htmls, s } from './VanillaJs.js';
10
+ import { Modal, subMenuHandler } from './Modal.js';
11
+ import { Worker } from './Worker.js';
12
+
13
+ const logger = loggerFactory(import.meta, { trace: true });
14
+
15
+ /**
16
+ * @type {Object.<string, function>}
17
+ * @description Holds event listeners for router changes.
18
+ * @memberof PwaRouter
19
+ */
20
+ const RouterEvents = {};
21
+
22
+ /**
23
+ * @type {string[]}
24
+ * @description Array of core UI component IDs that should not trigger modal close route changes.
25
+ * @memberof PwaRouter
26
+ */
27
+ const coreUI = ['modal-menu', 'main-body', 'main-body-top', 'bottom-bar', 'board-notification'];
28
+ /**
29
+ * @type {Object.<string, function>}
30
+ * @description Holds event listeners for route changes that should close a modal.
31
+ * @memberof PwaRouter
32
+ */
33
+ const closeModalRouteChangeEvents = {};
34
+
35
+ /**
36
+ * Determines the base path for the application, often used for routing within a sub-directory.
37
+ * It checks the current URL's pathname and `window.Routes` to return the appropriate proxy path.
38
+ *
39
+ * @returns {string} The calculated proxy path. Returns `/<first-segment>/` if a segment exists,
40
+ * otherwise `/`. If `window.Routes` indicates the path is a root route, it returns `/`.
41
+ * @memberof PwaRouter
42
+ */
43
+ const getProxyPath = () => {
44
+ let path = location.pathname.split('/')[1] ? `/${location.pathname.split('/')[1]}/` : '/';
45
+ if (window.Routes && path !== '/' && path.slice(0, -1) in window.Routes()) path = '/';
46
+ return path;
47
+ };
48
+
49
+ /**
50
+ * Sets the browser's path using the History API. It sanitizes the path, handles query strings and hashes,
51
+ * and prevents pushing the same state twice.
52
+ * @param {string} [path='/'] - The new path to set. Can include query strings and hashes.
53
+ * @param {object} [options={ removeSearch: false, removeHash: false }] - Options for path manipulation.
54
+ * @param {boolean} [options.removeSearch=false] - If true, removes the search part of the URL.
55
+ * @param {boolean} [options.removeHash=false] - If true, removes the hash part of the URL. Defaults to `false`.
56
+ * @param {object} [stateStorage={}] - State object to associate with the history entry.
57
+ * @param {string} [title=''] - The title for the new history entry.
58
+ * @memberof PwaRouter
59
+ * @returns {void | undefined} Returns `undefined` if the new path is the same as the current path, otherwise `void` (result of `history.pushState`).
60
+ */
61
+ const setPath = (path = '/', options = { removeSearch: false, removeHash: false }, stateStorage = {}, title = '') => {
62
+ // logger.warn(`Set path input`, `${path}`);
63
+ if (!path) path = '/';
64
+
65
+ let [inputPath, inputSearchHash] = `${path}`.split('?');
66
+ let [inputSearch, inputHash] = inputSearchHash ? inputSearchHash.split('#') : [];
67
+
68
+ let sanitizedPath = (inputPath[0] !== '/' ? `/${inputPath}` : inputPath)
69
+ .trim()
70
+ .replaceAll('//', '/')
71
+ .replaceAll(`\\`, '/');
72
+
73
+ if (sanitizedPath.length > 1 && sanitizedPath[sanitizedPath.length - 1] === '/')
74
+ sanitizedPath = sanitizedPath.slice(0, -1);
75
+
76
+ const newFullPath = `${sanitizedPath}${inputSearch && !options.removeSearch ? `?${inputSearch}` : ''}${
77
+ inputHash && !options.removeHash ? `#${inputHash}` : ''
78
+ }`;
79
+ const currentFullPath = `${window.location.pathname}${location.search}${location.hash}`;
80
+ // logger.warn(`Set path output`, {
81
+ // inputPath: inputPath,
82
+ // inputSearch: inputSearch,
83
+ // inputHash: inputHash,
84
+ // sanitizedPath: sanitizedPath,
85
+ // currentLocationSearch: location.search,
86
+ // currentLocationHash: location.hash,
87
+ // currentFullPath,
88
+ // newFullPath,
89
+ // });
90
+ if (currentFullPath === newFullPath) {
91
+ // logger.warn('Prevent overwriting same path', { currentFullPath, newFullPath });
92
+ return;
93
+ }
94
+ return history.pushState.call(history, stateStorage, title, newFullPath);
95
+ };
96
+
97
+ /**
98
+ * Extracts query parameters from the current URL's search string and returns them as an object.
99
+ * @returns An object containing the query parameters from the current URL is being returned.
100
+ * @memberof PwaRouter
101
+ */
102
+ const getQueryParams = () => {
103
+ const params = new URLSearchParams(window.location.search);
104
+ let queries = {};
105
+ for (const param of params) {
106
+ queries[param[0]] = param[1];
107
+ }
108
+ return queries;
109
+ };
110
+
111
+ /**
112
+ * Sanitizes a route string for use in CSS classes or other identifiers.
113
+ * Defaults to 'home' for empty, '/', or '\' routes.
114
+ * @param {string} route - The route string to sanitize.
115
+ * @returns {string} The sanitized route string.
116
+ * @memberof PwaRouter
117
+ */
118
+ const sanitizeRoute = (route) =>
119
+ !route || route === '/' || route === `\\`
120
+ ? 'home'
121
+ : route.toLowerCase().replaceAll('/', '').replaceAll(`\\`, '').replaceAll(' ', '-');
122
+
123
+ /**
124
+ * Sets the document title and updates the active state of the main menu button corresponding to the route.
125
+ * The title is formatted and appended with the main application title from `Worker.title` if it's not already present.
126
+ * @param {string} route - The current route string.
127
+ * @memberof PwaRouter
128
+ */
129
+ const setDocTitle = (route) => {
130
+ const _route = sanitizeRoute(route);
131
+ // logger.warn('setDocTitle', _route);
132
+ const title = titleFormatted(_route);
133
+ htmls('title', html`${title}${title.match(Worker.title.toLowerCase()) ? '' : ` | ${Worker.title}`}`);
134
+ if (s(`.main-btn-${_route}`)) {
135
+ if (s(`.main-btn-menu-active`)) s(`.main-btn-menu-active`).classList.remove(`main-btn-menu-active`);
136
+ if (s(`.main-btn-${_route}`)) s(`.main-btn-${_route}`).classList.add(`main-btn-menu-active`);
137
+ }
138
+ };
139
+
140
+ /**
141
+ * Main router function. It matches the current URL path against the provided routes configuration
142
+ * and renders the corresponding component. It also fires registered router events.
143
+ * @param {object} [options={ Routes: () => {}, e: new PopStateEvent() }] - The router options.
144
+ * @param {function} options.Routes - A function that returns the routes object.
145
+ * @param {PopStateEvent} options.e - The popstate event object.
146
+ * @memberof PwaRouter
147
+ */
148
+ const Router = function (options = { Routes: () => {}, e: new PopStateEvent() }) {
149
+ const { e, Routes } = options;
150
+ const proxyPath = getProxyPath();
151
+ let path = window.location.pathname;
152
+ // logger.info(options);
153
+
154
+ for (let route of Object.keys(Routes())) {
155
+ route = route.slice(1);
156
+ let pushPath = `${proxyPath}${route}`;
157
+
158
+ if (path[path.length - 1] !== '/') path = `${path}/`;
159
+ if (pushPath[pushPath.length - 1] !== '/') pushPath = `${pushPath}/`;
160
+
161
+ const routerEvent = { path, pushPath, route };
162
+
163
+ if (path === pushPath) {
164
+ for (const event of Object.keys(RouterEvents)) RouterEvents[event](routerEvent);
165
+ subMenuHandler(Object.keys(Routes()), route);
166
+ setDocTitle(route);
167
+ return Routes()[`/${route}`].render();
168
+ }
169
+ }
170
+ };
171
+
172
+ /**
173
+ * Initializes the router and sets up the `onpopstate` event listener to handle browser
174
+ * back/forward navigation.
175
+ * @param {object} RouterInstance - The router instance configuration, including the `Routes` function.
176
+ * @memberof PwaRouter
177
+ */
178
+ const LoadRouter = function (RouterInstance) {
179
+ Router(RouterInstance);
180
+ window.onpopstate = (e) => Router({ ...RouterInstance, e });
181
+ };
182
+
183
+ /**
184
+ * Sets the URL path with a specific query parameter, commonly used for content IDs.
185
+ * This function constructs a new URI based on the proxy path, a given path, and an optional query parameter.
186
+ * @param {object} [options={ path: '', queryPath: '' }] - The path options.
187
+ * @param {string} [options.path=''] - The base path segment.
188
+ * @memberof PwaRouter
189
+ */
190
+ const setQueryPath = (options = { path: '', queryPath: '' }, queryKey = 'cid') => {
191
+ const { queryPath, path } = options;
192
+ const newUri = `${getProxyPath()}${path === 'home' ? '' : `${path}/`}${
193
+ typeof queryPath === 'string' && queryPath ? `?${queryKey}=${queryPath}` : ''
194
+ }`;
195
+ const currentUri = `${window.location.pathname}${location.search}`;
196
+ if (currentUri !== newUri && currentUri !== `${newUri}/`) setPath(newUri, {}, '');
197
+ };
198
+
199
+ /**
200
+ * Registers a listener for route changes that specifically watches for a `queryKey` parameter
201
+ * on a matching `routeId`. The provided event callback is triggered with the query parameter's value.
202
+ * @param {object} options - The listener options.
203
+ * @param {string} options.id - A unique ID for the listener.
204
+ * @param {string} options.routeId - The route ID to listen for.
205
+ * @param {function(string): void} options.event - The callback function to execute with the query path value (or an empty string if not found).
206
+ * @param {string} [queryKey='cid'] - The query parameter key to look for.
207
+ * @memberof PwaRouter
208
+ */
209
+ const listenQueryPathInstance = ({ id, routeId, event }, queryKey = 'cid') => {
210
+ RouterEvents[id] = ({ path, pushPath, proxyPath, route }) => {
211
+ if ((route === '' && routeId === 'home') || (route && routeId && route === routeId)) {
212
+ setTimeout(() => {
213
+ const path = getQueryParams()[queryKey];
214
+ if (path) event(path);
215
+ else event('');
216
+ });
217
+ }
218
+ };
219
+ if (routeId && routeId !== 'home')
220
+ setTimeout(() => {
221
+ RouterEvents[id]({ route: routeId });
222
+ });
223
+ };
224
+
225
+ /**
226
+ * Handles the logic for changing the route when a modal is closed. It determines the next URL
227
+ * based on the remaining open modals or falls back to a home URL.
228
+ * @param {object} [options={}] - Options for the modal close event.
229
+ * @param {string} options.closedId - The ID of the modal that was just closed.
230
+ * @memberof PwaRouter
231
+ */
232
+ const closeModalRouteChangeEvent = (options = {}) => {
233
+ // logger.warn('closeModalRouteChangeEvent', options);
234
+ const { closedId } = options;
235
+ if (!closedId) return;
236
+ if (coreUI.find((id) => closedId.startsWith(id))) {
237
+ // logger.warn('prevent core ui component close');
238
+ return;
239
+ }
240
+
241
+ const remainingModals = Object.keys(Modal.Data).filter(
242
+ (id) => id !== closedId && (Modal.Data[id]?.options?.route || Modal.Data[id]?.options?.query),
243
+ );
244
+
245
+ const topModalId = remainingModals.reverse().find((id) => Modal.Data[id]);
246
+
247
+ for (const event of Object.keys(closeModalRouteChangeEvents)) closeModalRouteChangeEvents[event]();
248
+ if (topModalId) Modal.setTopModalCallback(topModalId);
249
+ setPath(`${getProxyPath()}${Modal.Data[topModalId]?.options?.route ?? ''}`);
250
+ setDocTitle(Modal.Data[topModalId]?.options?.route ?? '');
251
+ };
252
+
253
+ /**
254
+ * Handles routing for modals that are meant to be displayed as a "view" (e.g., a full-page modal).
255
+ * It updates the URL to reflect the modal's route.
256
+ * @param {object} [options={ route: 'home' }] - The options for handling the modal view route.
257
+ * @param {string} options.route - The route associated with the modal view.
258
+ * @memberof PwaRouter
259
+ */
260
+ const handleModalViewRoute = (options = { RouterInstance: { Routes: () => {} }, route: '' }) => {
261
+ const { route, RouterInstance } = options;
262
+ if (!route) return;
263
+
264
+ let path = window.location.pathname;
265
+ if (path !== '/' && path[path.length - 1] === '/') path = path.slice(0, -1);
266
+ const proxyPath = getProxyPath();
267
+ const newPath = `${proxyPath}${route}`;
268
+ if (RouterInstance && RouterInstance.Routes) subMenuHandler(Object.keys(RouterInstance.Routes()), route);
269
+
270
+ if (path !== newPath) {
271
+ setPath(newPath);
272
+ setDocTitle(newPath);
273
+ }
274
+ };
275
+
276
+ /**
277
+ * Sets or updates query parameters in the URL.
278
+ * It preserves the existing path, hash, and other query parameters.
279
+ *
280
+ * @param {Object.<string, string|number>} newParams - An object of query parameters to set or update.
281
+ * If a value is `null` or `undefined`, the parameter will be removed.
282
+ * @param {object} [options={ replace: true }] - Options for history manipulation.
283
+ * @param {boolean} [options.replace=true] - If true, uses `history.replaceState` instead of `history.pushState`.
284
+ * @memberof PwaRouter
285
+ */
286
+ const setQueryParams = (newParams, options = { replace: true }) => {
287
+ const url = new URL(window.location.href);
288
+ Object.entries(newParams).forEach(([key, value]) => {
289
+ if (value === null || value === undefined) {
290
+ url.searchParams.delete(key);
291
+ } else {
292
+ url.searchParams.set(key, value);
293
+ }
294
+ });
295
+
296
+ const newPath = url.pathname + url.search + url.hash;
297
+
298
+ history.pushState(history.state, '', newPath);
299
+ };
300
+
301
+ export {
302
+ RouterEvents,
303
+ closeModalRouteChangeEvents,
304
+ coreUI,
305
+ Router,
306
+ setDocTitle,
307
+ LoadRouter,
308
+ setQueryPath,
309
+ listenQueryPathInstance,
310
+ closeModalRouteChangeEvent,
311
+ handleModalViewRoute,
312
+ getQueryParams,
313
+ getProxyPath,
314
+ setPath,
315
+ setQueryParams,
316
+ sanitizeRoute,
317
+ };
@@ -0,0 +1,76 @@
1
+ import { s } from './VanillaJs.js';
2
+
3
+ class Scroll {
4
+ /**
5
+ * Attach scroll listener to an element (resolved with s(selector)).
6
+ * @param {string} selector - selector passed to s(selector)
7
+ * @param {function} [callback] - callback function to be called on scroll
8
+ * @param {object} options
9
+ * @param {number} [options.threshold=1] - px margin to treat as bottom
10
+ * @param {number} [options.precision=3] - decimal places for percentages
11
+ */
12
+ static setEvent(selector, callback = async () => {}, options = { threshold: 1, precision: 3 }) {
13
+ const el = s(selector);
14
+ if (!el) return;
15
+
16
+ const threshold = options.threshold ?? 1; // px tolerance for bottom detection
17
+ const precision = options.precision ?? 3;
18
+ let ticking = false;
19
+
20
+ const round = (v) => {
21
+ const m = Math.pow(10, precision);
22
+ return Math.round(v * m) / m;
23
+ };
24
+
25
+ const listener = (event) => {
26
+ if (ticking) return;
27
+ ticking = true;
28
+
29
+ requestAnimationFrame(() => {
30
+ const scrollHeight = el.scrollHeight;
31
+ const clientHeight = el.clientHeight;
32
+ const scrollTop = el.scrollTop;
33
+
34
+ // pixels left to scroll (clamped to >= 0)
35
+ const remaining = Math.max(0, scrollHeight - clientHeight - scrollTop);
36
+
37
+ // maximum possible remaining (0 if content fits without scrolling)
38
+ const maxRemaining = Math.max(0, scrollHeight - clientHeight);
39
+
40
+ // percentRemaining: 1 = top (all remaining), 0 = bottom (none remaining)
41
+ let percentRemaining = maxRemaining === 0 ? 0 : remaining / maxRemaining;
42
+ percentRemaining = Math.max(0, Math.min(1, percentRemaining));
43
+
44
+ // percentScrolled: complementary value (0 = top, 1 = bottom)
45
+ let percentScrolled = 1 - percentRemaining;
46
+ percentScrolled = Math.max(0, Math.min(1, percentScrolled));
47
+
48
+ const payload = {
49
+ scrollHeight,
50
+ clientHeight,
51
+ scrollTop,
52
+ remaining, // px left (>= 0)
53
+ scrollBottom: remaining <= threshold ? 0 : remaining,
54
+ atBottom: remaining <= threshold,
55
+ percentRemaining: round(percentRemaining), // 0..1
56
+ percentScrolled: round(percentScrolled), // 0..1
57
+ };
58
+
59
+ // replace this with an event dispatch or callback if you prefer
60
+ // console.warn('scroll', event, JSON.stringify(payload, null, 2));
61
+ callback(payload);
62
+
63
+ ticking = false;
64
+ });
65
+ };
66
+
67
+ el.addEventListener('scroll', listener, { passive: true });
68
+
69
+ return {
70
+ removeEvent: () => el.removeEventListener('scroll', listener),
71
+ };
72
+ }
73
+ }
74
+
75
+ export { Scroll };
76
+ export default Scroll;
@@ -0,0 +1,125 @@
1
+ import { UserService } from '../../services/user/user.service.js';
2
+ import { Auth } from './Auth.js';
3
+ import { BtnIcon } from './BtnIcon.js';
4
+ import { EventsUI } from './EventsUI.js';
5
+ import { Input } from './Input.js';
6
+ import { NotificationManager } from './NotificationManager.js';
7
+ import { Translate } from './Translate.js';
8
+ import { Validator } from './Validator.js';
9
+ import { s } from './VanillaJs.js';
10
+
11
+ const SignUp = {
12
+ Event: {},
13
+ Trigger: async function (options) {
14
+ for (const eventKey of Object.keys(this.Event)) await this.Event[eventKey](options);
15
+ },
16
+ Render: async function (options = { bottomRender: async () => '' }) {
17
+ setTimeout(async () => {
18
+ const formData = [
19
+ {
20
+ model: 'username',
21
+ id: `sign-up-username`,
22
+ rules: [{ type: 'isEmpty' }, { type: 'isLength', options: { min: 2, max: 20 } }],
23
+ },
24
+ { model: 'email', id: `sign-up-email`, rules: [{ type: 'isEmpty' }, { type: 'isEmail' }] },
25
+ {
26
+ model: 'password',
27
+ id: `sign-up-password`,
28
+ rules: [{ type: 'isStrongPassword' }],
29
+ },
30
+ {
31
+ id: `sign-up-repeat-password`,
32
+ rules: [{ type: 'isEmpty' }, { type: 'passwordMismatch', options: `sign-up-password` }],
33
+ },
34
+ ];
35
+ const validators = await Validator.instance(formData);
36
+
37
+ EventsUI.onClick(`.btn-sign-up`, async (e) => {
38
+ e.preventDefault();
39
+ const { errorMessage } = await validators();
40
+ if (errorMessage) return;
41
+ const body = {};
42
+ for (const inputData of formData) {
43
+ if ('model' in inputData) body[inputData.model] = s(`.${inputData.id}`).value;
44
+ }
45
+ const result = await UserService.post({ body });
46
+ NotificationManager.Push({
47
+ html:
48
+ typeof result.data === 'string'
49
+ ? result.data
50
+ : result.status === 'success'
51
+ ? Translate.Render(`success-register-user`)
52
+ : Translate.Render(`no-valid-register`),
53
+ status: result.status,
54
+ });
55
+ if (result.status === 'success') {
56
+ await Auth.sessionIn(result);
57
+ s(`.btn-close-${options.idModal}`).click();
58
+ }
59
+ });
60
+ s(`.btn-sign-up-i-have-account`).onclick = () => {
61
+ s(`.main-btn-log-in`).click();
62
+ };
63
+ });
64
+ return html`
65
+ ${await BtnIcon.Render({
66
+ class: 'in section-mp form-button btn-sign-up-i-have-account',
67
+ label: html`<i class="fas fa-sign-in-alt"></i> ${Translate.Render('i-have-account')}<br />${Translate.Render(
68
+ 'log-in',
69
+ )}`,
70
+ type: 'button',
71
+ })}
72
+ <form class="in">
73
+ <div class="in">
74
+ ${await Input.Render({
75
+ id: `sign-up-username`,
76
+ type: 'text',
77
+ label: html`<i class="fa-solid fa-pen-to-square"></i> ${Translate.Render('username')}`,
78
+ containerClass: 'inl section-mp width-mini-box input-container',
79
+ placeholder: true,
80
+ })}
81
+ </div>
82
+ <div class="in">
83
+ ${await Input.Render({
84
+ id: `sign-up-email`,
85
+ type: 'email',
86
+ label: html`<i class="fa-solid fa-envelope"></i> ${Translate.Render('email')}`,
87
+ containerClass: 'inl section-mp width-mini-box input-container',
88
+ placeholder: true,
89
+ autocomplete: 'email',
90
+ })}
91
+ </div>
92
+ <div class="in">
93
+ ${await Input.Render({
94
+ id: `sign-up-password`,
95
+ type: 'password',
96
+ autocomplete: 'new-password',
97
+ label: html`<i class="fa-solid fa-lock"></i> ${Translate.Render('password')}`,
98
+ containerClass: 'inl section-mp width-mini-box input-container',
99
+ placeholder: true,
100
+ })}
101
+ </div>
102
+ <div class="in">
103
+ ${await Input.Render({
104
+ id: `sign-up-repeat-password`,
105
+ type: 'password',
106
+ autocomplete: 'new-password',
107
+ label: html`<i class="fa-solid fa-lock"></i> ${Translate.Render('repeat')} ${Translate.Render('password')}`,
108
+ containerClass: 'inl section-mp width-mini-box input-container',
109
+ placeholder: true,
110
+ })}
111
+ </div>
112
+ ${options?.bottomRender ? await options.bottomRender() : ``}
113
+ <div class="in">
114
+ ${await BtnIcon.Render({
115
+ class: 'in section-mp form-button btn-sign-up',
116
+ label: Translate.Render('sign-up'),
117
+ type: 'submit',
118
+ })}
119
+ </div>
120
+ </form>
121
+ `;
122
+ },
123
+ };
124
+
125
+ export { SignUp };
@@ -0,0 +1,74 @@
1
+ import { io } from 'socket.io/client-dist/socket.io.esm.min.js';
2
+ import { loggerFactory } from './Logger.js';
3
+ import { getWsBasePath, getWsBaseUrl } from '../../services/core/core.service.js';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ const SocketIo = {
8
+ Event: {
9
+ connect: {},
10
+ connect_error: {},
11
+ disconnect: {},
12
+ },
13
+ /** @type {import('socket.io').Socket} */
14
+ socket: null,
15
+ Emit: function (channel = '', payload = {}) {
16
+ try {
17
+ this.socket.emit(channel, JSON.stringify(payload));
18
+ } catch (error) {
19
+ logger.error(error);
20
+ }
21
+ },
22
+ Init: async function (options) {
23
+ if (this.socket) this.socket.disconnect();
24
+ this.host = options.host ?? getWsBaseUrl({ wsBasePath: '' });
25
+ logger.info(`ws host:`, this.host);
26
+ const path = typeof options.path === 'string' ? options.path : getWsBasePath();
27
+ const connectOptions = {
28
+ path: path === '/' ? undefined : path,
29
+ // auth: {
30
+ // token: '',
31
+ // },
32
+ // query: {
33
+ // 'my-key': 'my-value',
34
+ // },
35
+ // forceNew: true,
36
+ // reconnectionAttempts: 'Infinity',
37
+ // timeout: 10000,
38
+ // withCredentials: true,
39
+ // autoConnect: 5000,
40
+ transports: ['websocket', 'polling', 'flashsocket'],
41
+ };
42
+ // logger.error(`connect options:`, JSON.stringify(connectOptions, null, 4));
43
+ this.socket = io(this.host, connectOptions);
44
+
45
+ this.socket.on('connect', () => {
46
+ logger.info(`event: connect | session id: ${this.socket.id}`);
47
+ Object.keys(this.Event.connect).map((keyEvent) => this.Event.connect[keyEvent]());
48
+ });
49
+
50
+ this.socket.on('connect_error', (err) => {
51
+ logger.info(`event: connect_error | reason: ${err.message}`);
52
+ Object.keys(this.Event.connect_error).map((keyEvent) => this.Event.connect_error[keyEvent](err));
53
+ });
54
+
55
+ this.socket.on('disconnect', (reason) => {
56
+ logger.info(`event: disconnect | reason: ${reason}`);
57
+ Object.keys(this.Event.disconnect).map((keyEvent) => this.Event.disconnect[keyEvent](reason));
58
+ });
59
+
60
+ if (options && 'channels' in options) this.setChannels(options.channels);
61
+ },
62
+ setChannels: function (channels) {
63
+ Object.keys(channels).map((type) => {
64
+ logger.info(`load chanel`, type);
65
+ this.Event[type] = {};
66
+ this.socket.on(type, (...args) => {
67
+ // logger.info(`event: ${type} | ${JSON.stringify(args, null, 4)}`);
68
+ Object.keys(this.Event[type]).map((keyEvent) => this.Event[type][keyEvent](args));
69
+ });
70
+ });
71
+ },
72
+ };
73
+
74
+ export { SocketIo };