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,371 @@
1
+ /**
2
+ * Utility class for managing Progressive Web App (PWA) worker functionalities,
3
+ * including service worker registration, caching, and notification management.
4
+ * This class is designed to be used as a singleton instance (exported as 'Worker').
5
+ * @module src/client/components/core/Worker.js
6
+ * @namespace PwaWorker
7
+ */
8
+
9
+ import { BtnIcon } from './BtnIcon.js';
10
+ import { s4 } from './CommonJs.js';
11
+ import { EventsUI } from './EventsUI.js';
12
+ import { LoadingAnimation } from './LoadingAnimation.js';
13
+ import { loggerFactory } from './Logger.js';
14
+ import { LoadRouter } from './Router.js';
15
+ import { Translate } from './Translate.js';
16
+ import { s } from './VanillaJs.js';
17
+ import { getProxyPath } from './Router.js';
18
+ const logger = loggerFactory(import.meta);
19
+
20
+ /**
21
+ * Manages the PWA lifecycle, service workers, and related client-side events.
22
+ * @memberof PwaWorker
23
+ */
24
+ class PwaWorker {
25
+ /**
26
+ * The application title, usually from the <title> tag content.
27
+ * @type {string}
28
+ */
29
+ title = '';
30
+
31
+ /**
32
+ * Tracks if notification permission has been granted and is active.
33
+ * @type {boolean}
34
+ */
35
+ notificationActive = false;
36
+
37
+ /**
38
+ * A function reference to the service worker's update method (registration.update()),
39
+ * dynamically set upon successful registration status check.
40
+ * @type {function(): Promise<void>}
41
+ */
42
+ updateServiceWorker = async () => {};
43
+
44
+ /**
45
+ * Router instance reference, initialized during the `instance` call.
46
+ * @type {object | null}
47
+ */
48
+ RouterInstance = null;
49
+
50
+ /**
51
+ * Creates an instance of PwaWorker and initializes the application title.
52
+ * @memberof PwaWorker
53
+ */
54
+ constructor() {
55
+ this.title = `${s('title').textContent}`;
56
+ }
57
+
58
+ /**
59
+ * Checks if the application is running in development mode (localhost or 127.0.0.1).
60
+ * @memberof PwaWorker
61
+ * @returns {boolean} True if in development mode.
62
+ */
63
+ devMode() {
64
+ return location.origin.match('localhost') || location.origin.match('127.0.0.1');
65
+ }
66
+
67
+ /**
68
+ * Initializes the PWA worker, registers global/worker event listeners,
69
+ * checks service worker status, and renders the initial content.
70
+ * This is the main entry point for the worker setup.
71
+ * @memberof PwaWorker
72
+ * @param {object} options - Configuration options.
73
+ * @param {function(): object} options.router - Function to get the router instance.
74
+ * @param {function(): Promise<void>} options.render - Function to render the application's UI.
75
+ * @returns {Promise<void>}
76
+ */
77
+ async instance({ router, render }) {
78
+ window.ononline = async () => {
79
+ logger.warn('ononline');
80
+ };
81
+ window.onoffline = async () => {
82
+ logger.warn('onoffline');
83
+ };
84
+ setTimeout(() => {
85
+ if ('onLine' in navigator && navigator.onLine) window.ononline();
86
+ });
87
+
88
+ if ('serviceWorker' in navigator) {
89
+ navigator.serviceWorker.addEventListener('controllerchange', () => {
90
+ logger.info('The controller of current browsing context has changed.');
91
+ });
92
+ navigator.serviceWorker.ready.then((worker) => {
93
+ logger.info('Service Worker Ready', worker);
94
+
95
+ // event message listener
96
+ navigator.serviceWorker.addEventListener('message', (event) => {
97
+ logger.info('Received event message', event.data);
98
+ const { status } = event.data;
99
+
100
+ switch (status) {
101
+ case 'loader':
102
+ {
103
+ LoadingAnimation.RenderCurrentSrcLoad(event);
104
+ }
105
+ break;
106
+
107
+ default:
108
+ break;
109
+ }
110
+ });
111
+
112
+ // if (navigator.serviceWorker.controller)
113
+ // navigator.serviceWorker.controller.postMessage({
114
+ // title: 'Hello from Client event message',
115
+ // });
116
+
117
+ // broadcast message
118
+ // const channel = new BroadcastChannel('sw-messages');
119
+ // channel.addEventListener('message', (event) => {
120
+ // logger.info('Received broadcast message', event.data);
121
+ // });
122
+ // channel.postMessage({ title: 'Hello from Client broadcast message' });
123
+ // channel.close();
124
+ });
125
+ }
126
+
127
+ this.RouterInstance = router();
128
+ const isInstall = await this.status();
129
+ if (!isInstall) await this.install();
130
+ await render();
131
+ LoadRouter(this.RouterInstance);
132
+ LoadingAnimation.removeSplashScreen();
133
+ if (this.devMode()) {
134
+ // const delayLiveReload = 1250;
135
+ // window.addEventListener('visibilitychange', () => {
136
+ // if (document.visibilityState === 'visible') {
137
+ // this.reload(delayLiveReload);
138
+ // }
139
+ // });
140
+ // window.addEventListener('focus', () => {
141
+ // this.reload(delayLiveReload);
142
+ // });
143
+ }
144
+ window.serviceWorkerReady = true;
145
+ }
146
+
147
+ /**
148
+ * Gets the current service worker registration.
149
+ * @memberof PwaWorker
150
+ * @returns {Promise<ServiceWorkerRegistration | undefined>} The service worker registration object, or undefined.
151
+ */
152
+ async getRegistration() {
153
+ return navigator.serviceWorker.getRegistration();
154
+ }
155
+
156
+ /**
157
+ * Forces the current service worker to skip waiting and reloads the page
158
+ * to apply the new service worker immediately.
159
+ * @memberof PwaWorker
160
+ * @param {number} [timeOut=3000] - Delay in milliseconds before reloading the page.
161
+ * @returns {Promise<void>} A promise that resolves after the page is reloaded.
162
+ */
163
+ async reload(timeOut = 3000) {
164
+ return new Promise((resolve) => {
165
+ if (navigator.serviceWorker && navigator.serviceWorker.controller) {
166
+ navigator.serviceWorker.controller.postMessage({
167
+ status: 'skipWaiting',
168
+ });
169
+ }
170
+ setTimeout(() => resolve(location.reload()), timeOut);
171
+ });
172
+ }
173
+
174
+ /**
175
+ * Updates the application by clearing specific caches and running the service worker update logic.
176
+ * Cache names matching 'components/', 'services/', or '.index.js' are deleted.
177
+ * @memberof PwaWorker
178
+ * @returns {Promise<void>}
179
+ */
180
+ async update() {
181
+ const isInstall = await this.status();
182
+ if (isInstall) {
183
+ const cacheNames = await caches.keys();
184
+ for (const cacheName of cacheNames) {
185
+ if (cacheName.match('components/') || cacheName.match('services/') || cacheName.match('.index.js')) {
186
+ await caches.delete(cacheName);
187
+ }
188
+ }
189
+ await this.updateServiceWorker();
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Checks the current status of all service worker registrations and sets the
195
+ * `updateServiceWorker` function reference if an active worker is found.
196
+ * @memberof PwaWorker
197
+ * @returns {Promise<boolean>} True if at least one service worker is registered.
198
+ */
199
+ status() {
200
+ let status = false;
201
+ return new Promise((resolve) => {
202
+ if ('serviceWorker' in navigator) {
203
+ navigator.serviceWorker
204
+ .getRegistrations()
205
+ .then((registrations) => {
206
+ for (const registration of registrations) {
207
+ if (registration.installing) logger.info('installing', registration);
208
+ else if (registration.waiting) logger.info('waiting', registration);
209
+ else if (registration.active) {
210
+ logger.info('active', registration);
211
+ // Dynamically set the update function
212
+ this.updateServiceWorker = async () => await registration.update();
213
+ }
214
+ }
215
+ if (registrations.length > 0) status = true;
216
+ resolve(status);
217
+ })
218
+ .catch((...args) => {
219
+ logger.error('Error getting service worker registrations:', ...args);
220
+ resolve(false);
221
+ });
222
+ } else {
223
+ logger.warn('Service Worker Disabled in browser');
224
+ resolve(false);
225
+ }
226
+ });
227
+ }
228
+
229
+ /**
230
+ * Registers the service worker (`sw.js`) with the browser.
231
+ * @memberof PwaWorker
232
+ * @returns {Promise<Array<any>>} A promise that resolves with the registration arguments.
233
+ */
234
+ install() {
235
+ return new Promise((resolve) => {
236
+ if ('serviceWorker' in navigator) {
237
+ navigator.serviceWorker
238
+ .register(`${getProxyPath()}sw.js`, {
239
+ type: 'module',
240
+ })
241
+ .then((...args) => {
242
+ logger.warn('Service Worker Registered', args);
243
+ resolve(args);
244
+ })
245
+ .catch((...args) => {
246
+ logger.error('Error registering service worker:', ...args);
247
+ resolve(args);
248
+ });
249
+ } else {
250
+ logger.warn('Service Worker Disabled in browser');
251
+ resolve([]);
252
+ }
253
+ });
254
+ }
255
+
256
+ /**
257
+ * Unregisters all service workers and deletes all application caches.
258
+ * @memberof PwaWorker
259
+ * @returns {Promise<Array<any>>} A promise that resolves after uninstallation.
260
+ */
261
+ uninstall() {
262
+ return new Promise(async (resolve) => {
263
+ if ('serviceWorker' in navigator) {
264
+ try {
265
+ const registrations = await navigator.serviceWorker.getRegistrations();
266
+ const cacheNames = await caches.keys();
267
+ for (const cacheName of cacheNames) await caches.delete(cacheName);
268
+ for (const registration of registrations) {
269
+ logger.info('Removing service worker registration', registration);
270
+ registration.unregister();
271
+ }
272
+ resolve([]);
273
+ } catch (error) {
274
+ logger.error('Error during service worker uninstallation:', error);
275
+ resolve([error]);
276
+ }
277
+ } else {
278
+ logger.warn('Service Worker Disabled in browser');
279
+ resolve([]);
280
+ }
281
+ });
282
+ }
283
+
284
+ /**
285
+ * Requests permission from the user to display notifications.
286
+ * Sets the internal `notificationActive` state.
287
+ * @memberof PwaWorker
288
+ * @returns {Promise<boolean>} True if permission is granted, false otherwise.
289
+ */
290
+ notificationRequestPermission() {
291
+ return new Promise((resolve) =>
292
+ Notification.requestPermission().then((result) => {
293
+ if (result === 'granted') {
294
+ this.notificationActive = true;
295
+ resolve(true);
296
+ } else {
297
+ this.notificationActive = false;
298
+ resolve(false);
299
+ }
300
+ }),
301
+ );
302
+ }
303
+
304
+ /**
305
+ * Shows a sample notification if permission is granted.
306
+ * @memberof PwaWorker
307
+ * @returns {void}
308
+ */
309
+ notificationShow() {
310
+ Notification.requestPermission().then((result) => {
311
+ if (result === 'granted') {
312
+ navigator.serviceWorker.ready.then((registration) => {
313
+ registration.showNotification('Vibration Sample', {
314
+ body: 'Buzz! Buzz!',
315
+ icon: '../images/touch/chrome-touch-icon.png',
316
+ vibrate: [200, 100, 200, 100, 200, 100, 200],
317
+ tag: 'vibration-sample',
318
+ requireInteraction: true,
319
+ });
320
+ });
321
+ }
322
+ });
323
+ }
324
+
325
+ /**
326
+ * Renders the UI for PWA settings, including buttons for cleaning cache and worker management.
327
+ * It also attaches the click handler for the 'clean-cache' button.
328
+ * @memberof PwaWorker
329
+ * @returns {Promise<string>} The HTML string for the settings section.
330
+ */
331
+ async RenderSetting() {
332
+ setTimeout(() => {
333
+ // Event listener for the clean cache button
334
+ EventsUI.onClick(`.btn-clean-cache`, async (e) => {
335
+ e.preventDefault();
336
+ // Clear local storage, uninstall the worker, and reload
337
+ localStorage.clear();
338
+ await this.uninstall();
339
+ await this.reload();
340
+ });
341
+ });
342
+ return html` <div class="in">
343
+ ${await BtnIcon.Render({
344
+ class: 'inl section-mp btn-custom btn-install-service-controller hide',
345
+ label: html`<i class="fas fa-download"></i> ${Translate.Render('Install control service')}`,
346
+ })}
347
+ ${await BtnIcon.Render({
348
+ class: 'inl section-mp btn-custom btn-uninstall-service-controller hide',
349
+ label: html`<i class="far fa-trash-alt"></i> ${Translate.Render('Uninstall control service')}`,
350
+ })}
351
+ ${await BtnIcon.Render({
352
+ class: 'inl section-mp btn-custom btn-clean-cache',
353
+ label: html`<i class="fa-solid fa-broom"></i> ${Translate.Render('clean-cache')}`,
354
+ })}
355
+ ${await BtnIcon.Render({
356
+ class: 'inl section-mp btn-custom btn-reload hide',
357
+ label: html`<i class="fas fa-sync-alt"></i> ${Translate.Render('Reload')}`,
358
+ })}
359
+ </div>`;
360
+ }
361
+ }
362
+
363
+ // Create the singleton instance
364
+ const PwaWorkerInstance = new PwaWorker();
365
+
366
+ // Export the new class name for modern usage
367
+ export { PwaWorker };
368
+
369
+ // Export the instance with the old name (`Worker`) for backward compatibility,
370
+ // ensuring existing code consuming the module continues to work.
371
+ export { PwaWorkerInstance as Worker };
@@ -0,0 +1,269 @@
1
+ /**
2
+ * This module exports utility functions (`windowGetH`, `windowGetW`) for reliably
3
+ * determining the browser viewport dimensions, refactored into a class structure
4
+ * for encapsulation and better organization.
5
+ *
6
+ * @module src/client/components/core/windowGetDimensions.js
7
+ * @namespace PwaWindowDimensions
8
+ */
9
+
10
+ // --- Internal Helper Functions ---
11
+
12
+ /**
13
+ * Helper: coerce a candidate value to a finite integer (or null if not usable).
14
+ * @private
15
+ * @param {*} v - The value to coerce (e.g., height/width from a window object).
16
+ * @returns {number|null} The rounded positive integer, or null if invalid.
17
+ * @memberof PwaWindowDimensions
18
+ */
19
+ const toInt = (v) => {
20
+ const n = Number(v);
21
+ return Number.isFinite(n) && n > 0 ? Math.round(n) : null;
22
+ };
23
+
24
+ /**
25
+ * Helper: Merge candidates in priority order and return first valid value.
26
+ * @private
27
+ * @param {...(number|null)[]} candidates - A list of number or null values.
28
+ * @returns {number|null} The first finite, positive integer found, or null.
29
+ * @memberof PwaWindowDimensions
30
+ */
31
+ const pickFirst = (...candidates) => {
32
+ for (const c of candidates) {
33
+ if (Number.isFinite(c) && c > 0) return Math.round(c);
34
+ }
35
+ return null;
36
+ };
37
+
38
+ // --- Core Dimension Class ---
39
+
40
+ /**
41
+ * @namespace PwaWindowDimensions
42
+ * @class
43
+ * @classdesc Utility class containing static methods for reliably determining the
44
+ * browser viewport dimensions, prioritizing visual viewport, then layout viewport,
45
+ * and finally screen dimensions as fallbacks.
46
+ *
47
+ * Usage:
48
+ * import PwaWindowDimensions from './windowGetDimensions.js';
49
+ * const h = PwaWindowDimensions.getH();
50
+ * @memberof PwaWindowDimensions
51
+ */
52
+ export class PwaWindowDimensions {
53
+ // --- Private Static Getters (Encapsulating browser APIs) ---
54
+
55
+ /**
56
+ * @private
57
+ * @static
58
+ * Try visualViewport values (most accurate for "what's actually visible").
59
+ * @returns {{height: number|null, width: number|null}}
60
+ * @memberof PwaWindowDimensions
61
+ */
62
+ static #getFromVisualViewport() {
63
+ if (typeof window !== 'undefined' && window.visualViewport) {
64
+ const { height, width } = window.visualViewport;
65
+ return { height: toInt(height), width: toInt(width) };
66
+ }
67
+ return { height: null, width: null };
68
+ }
69
+
70
+ /**
71
+ * @private
72
+ * @static
73
+ * Try layout viewport (doctype-root) measurements.
74
+ * document.documentElement.clientHeight/clientWidth are stable and widely used.
75
+ * @returns {{height: number|null, width: number|null}}
76
+ * @memberof PwaWindowDimensions
77
+ */
78
+ static #getFromDocumentElement() {
79
+ if (typeof document !== 'undefined' && document.documentElement) {
80
+ const { clientHeight, clientWidth } = document.documentElement;
81
+ return { height: toInt(clientHeight), width: toInt(clientWidth) };
82
+ }
83
+ return { height: null, width: null };
84
+ }
85
+
86
+ /**
87
+ * @private
88
+ * @static
89
+ * Try window.* measurements (innerHeight/innerWidth are widely supported).
90
+ * @returns {{height: number|null, width: number|null}}
91
+ * @memberof PwaWindowDimensions
92
+ */
93
+ static #getFromWindowInner() {
94
+ if (typeof window !== 'undefined') {
95
+ return { height: toInt(window.innerHeight), width: toInt(window.innerWidth) };
96
+ }
97
+ return { height: null, width: null };
98
+ }
99
+
100
+ /**
101
+ * @private
102
+ * @static
103
+ * Try body measurements (less reliable, used as a fallback).
104
+ * @returns {{height: number|null, width: number|null}}
105
+ * @memberof PwaWindowDimensions
106
+ */
107
+ static #getFromBody() {
108
+ if (typeof document !== 'undefined' && document.body) {
109
+ return { height: toInt(document.body.clientHeight), width: toInt(document.body.clientWidth) };
110
+ }
111
+ return { height: null, width: null };
112
+ }
113
+
114
+ /**
115
+ * @private
116
+ * @static
117
+ * Try screen measurements (physical screen/last-resort fallback).
118
+ * @returns {{height: number|null, width: number|null}}
119
+ * @memberof PwaWindowDimensions
120
+ */
121
+ static #getFromScreen() {
122
+ if (typeof window !== 'undefined' && window.screen) {
123
+ const { availHeight, availWidth, height, width } = window.screen;
124
+ return {
125
+ height: toInt(availHeight) || toInt(height) || null,
126
+ width: toInt(availWidth) || toInt(width) || null,
127
+ };
128
+ }
129
+ return { height: null, width: null };
130
+ }
131
+
132
+ /**
133
+ * @private
134
+ * @static
135
+ * Try outer dimensions (less reliable, sometimes available fallback).
136
+ * @returns {{height: number|null, width: number|null}}
137
+ * @memberof PwaWindowDimensions
138
+ */
139
+ static #getFromOuter() {
140
+ if (typeof window !== 'undefined') {
141
+ return { height: toInt(window.outerHeight), width: toInt(window.outerWidth) };
142
+ }
143
+ return { height: null, width: null };
144
+ }
145
+
146
+ // --- Public Static Methods ---
147
+
148
+ /**
149
+ * Get the best-available viewport height in pixels.
150
+ *
151
+ * Priority (from most reliable for "visible" to least):
152
+ * 1. window.visualViewport.height (if `preferVisualViewport` is true)
153
+ * 2. document.documentElement.clientHeight (Layout viewport)
154
+ * 3. window.innerHeight (Window size)
155
+ * 4. document.body.clientHeight (Body size)
156
+ * 5. window.visualViewport.height (if `preferVisualViewport` is false)
157
+ * 6. window.screen.availHeight / window.screen.height (Physical screen)
158
+ * 7. window.outerHeight (Last resort)
159
+ *
160
+ * @memberof PwaWindowDimensions
161
+ * @static
162
+ * @param {Object} [options]
163
+ * @param {boolean} [options.preferVisualViewport=true] - When true, visualViewport is checked first (best for visible screen size, e.g., above mobile keyboard).
164
+ * @returns {number|null} Height in px (rounded integer) or null if none found.
165
+ * @memberof PwaWindowDimensions
166
+ */
167
+ static getH(options = {}) {
168
+ const { preferVisualViewport = true } = options;
169
+
170
+ const vv = PwaWindowDimensions.#getFromVisualViewport();
171
+ const de = PwaWindowDimensions.#getFromDocumentElement();
172
+ const wi = PwaWindowDimensions.#getFromWindowInner();
173
+ const bd = PwaWindowDimensions.#getFromBody();
174
+ const sc = PwaWindowDimensions.#getFromScreen();
175
+ const ot = PwaWindowDimensions.#getFromOuter();
176
+
177
+ // Determine the prioritized list of height candidates
178
+ let candidates = [de.height, wi.height, bd.height];
179
+ if (preferVisualViewport) {
180
+ candidates = [vv.height, ...candidates]; // vv first
181
+ } else {
182
+ candidates.push(vv.height); // vv later
183
+ }
184
+
185
+ // Add final fallbacks
186
+ candidates.push(sc.height, ot.height);
187
+
188
+ return pickFirst(...candidates) || null;
189
+ }
190
+
191
+ /**
192
+ * Get the best-available viewport width in pixels.
193
+ *
194
+ * Priority (from most reliable for "visible" to least):
195
+ * 1. window.visualViewport.width (if `preferVisualViewport` is true)
196
+ * 2. document.documentElement.clientWidth (Layout viewport)
197
+ * 3. window.innerWidth (Window size)
198
+ * 4. document.body.clientWidth (Body size)
199
+ * 5. window.visualViewport.width (if `preferVisualViewport` is false)
200
+ * 6. window.screen.availWidth / window.screen.width (Physical screen)
201
+ * 7. window.outerWidth (Last resort)
202
+ *
203
+ * @memberof PwaWindowDimensions
204
+ * @static
205
+ * @param {Object} [options]
206
+ * @param {boolean} [options.preferVisualViewport=true] - When true, visualViewport is checked first.
207
+ * @returns {number|null} Width in px (rounded integer) or null if none found.
208
+ * @memberof PwaWindowDimensions
209
+ */
210
+ static getW(options = {}) {
211
+ const { preferVisualViewport = true } = options;
212
+
213
+ const vv = PwaWindowDimensions.#getFromVisualViewport();
214
+ const de = PwaWindowDimensions.#getFromDocumentElement();
215
+ const wi = PwaWindowDimensions.#getFromWindowInner();
216
+ const bd = PwaWindowDimensions.#getFromBody();
217
+ const sc = PwaWindowDimensions.#getFromScreen();
218
+ const ot = PwaWindowDimensions.#getFromOuter();
219
+
220
+ // Determine the prioritized list of width candidates
221
+ let candidates = [de.width, wi.width, bd.width];
222
+ if (preferVisualViewport) {
223
+ candidates = [vv.width, ...candidates]; // vv first
224
+ } else {
225
+ candidates.push(vv.width); // vv later
226
+ }
227
+
228
+ // Add final fallbacks
229
+ candidates.push(sc.width, ot.width);
230
+
231
+ return pickFirst(...candidates) || null;
232
+ }
233
+ }
234
+
235
+ // --- Backward Compatibility Exports (Legacy API) ---
236
+
237
+ /**
238
+ * Get the best-available viewport height in pixels.
239
+ * This function exists for backward compatibility; it wraps PwaWindowDimensions.getH().
240
+ *
241
+ * @function windowGetH
242
+ * @memberof PwaWindowDimensions
243
+ * @param {Object} [options]
244
+ * @param {boolean} [options.preferVisualViewport=true] - When true, visualViewport is checked first.
245
+ * @returns {number|null} Height in px (rounded integer) or null if none found.
246
+ * @memberof PwaWindowDimensions
247
+ */
248
+ export const windowGetH = (options = {}) => PwaWindowDimensions.getH(options);
249
+
250
+ /**
251
+ * Get the best-available viewport width in pixels.
252
+ * This function exists for backward compatibility; it wraps PwaWindowDimensions.getW().
253
+ *
254
+ * @function windowGetW
255
+ * @memberof PwaWindowDimensions
256
+ * @param {Object} [options]
257
+ * @param {boolean} [options.preferVisualViewport=true] - When true, prefer visualViewport if present
258
+ * @returns {number|null} Width in px (rounded integer) or null if none found.
259
+ * @memberof PwaWindowDimensions
260
+ */
261
+ export const windowGetW = (options = {}) => PwaWindowDimensions.getW(options);
262
+
263
+ // --- Default Export ---
264
+
265
+ /**
266
+ * @typedef {PwaWindowDimensions} PwaWindowDimensions
267
+ * @memberof PwaWindowDimensions
268
+ */
269
+ export default PwaWindowDimensions;