cyberia 3.2.5 → 3.2.12

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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -1,59 +1,44 @@
1
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').
2
+ * Progressive Web App (PWA) worker integration: service worker lifecycle,
3
+ * cache management, and the bootstrap path that wires the app's router,
4
+ * shell, translation, sockets, and session components together.
5
+ *
6
+ * The public surface is a single `PwaWorker` class with one shared instance,
7
+ * re-exported as `Worker` for backward compatibility.
8
+ *
5
9
  * @module src/client/components/core/Worker.js
6
10
  * @namespace PwaWorker
7
11
  */
8
12
 
9
13
  import { BtnIcon } from './BtnIcon.js';
10
- import { s4 } from './CommonJs.js';
11
14
  import { EventsUI } from './EventsUI.js';
12
15
  import { LoadingAnimation } from './LoadingAnimation.js';
13
16
  import { loggerFactory } from './Logger.js';
14
- import { LoadRouter } from './Router.js';
15
- import { Translate } from './Translate.js';
17
+ import { LoadRouter, registerRoutes, getProxyPath } from './Router.js';
18
+ import { Translate, TranslateCore } from './Translate.js';
16
19
  import { s } from './VanillaJs.js';
17
- import { getProxyPath } from './Router.js';
20
+ import { Css } from './Css.js';
21
+ import { Responsive } from './Responsive.js';
22
+ import { SocketIo } from './SocketIo.js';
23
+ import { Keyboard } from './Keyboard.js';
24
+
18
25
  const logger = loggerFactory(import.meta);
19
26
 
27
+ const SW_URL = () => `${getProxyPath()}sw.js`;
28
+
20
29
  /**
21
- * Manages the PWA lifecycle, service workers, and related client-side events.
22
30
  * @memberof PwaWorker
23
31
  */
24
32
  class PwaWorker {
25
- /**
26
- * The application title, usually from the <title> tag content.
27
- * @type {string}
28
- */
33
+ /** App title sourced from <title>. @type {string} */
29
34
  title = '';
30
35
 
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
- */
36
+ /** Router instance reference, set during bootstrap. @type {object | null} */
48
37
  RouterInstance = null;
49
38
 
50
- /**
51
- * Creates an instance of PwaWorker and initializes the application title.
52
- * @memberof PwaWorker
53
- */
54
39
  constructor() {
55
40
  this.title = `${s('title').textContent}`;
56
- if (!window.renderPayload.dev) {
41
+ if (!window.renderPayload?.dev) {
57
42
  console.log = () => null;
58
43
  console.error = () => null;
59
44
  console.info = () => null;
@@ -61,36 +46,47 @@ class PwaWorker {
61
46
  }
62
47
  }
63
48
 
49
+ /** @returns {boolean} True when running on localhost or with renderPayload.dev. */
50
+ devMode() {
51
+ return Boolean(
52
+ window.renderPayload?.dev || location.origin.match('localhost') || location.origin.match('127.0.0.1'),
53
+ );
54
+ }
55
+
64
56
  /**
65
- * Checks if the application is running in development mode (localhost or 127.0.0.1).
66
- * @method devMode
67
- * @memberof PwaWorker
68
- * @returns {boolean} True if in development mode.
57
+ * Awaits a component's `instance()` method, a plain function, or an array of either.
58
+ * Used by `instance()` to keep the bootstrap declarative.
59
+ * @private
69
60
  */
70
- devMode() {
71
- return window.renderPayload.dev || location.origin.match('localhost') || location.origin.match('127.0.0.1');
61
+ async #initComponent(component, options) {
62
+ if (!component) return;
63
+ if (Array.isArray(component)) {
64
+ for (const item of component) await this.#initComponent(item, options);
65
+ return;
66
+ }
67
+ if (typeof component.instance === 'function') return void (await component.instance(options));
68
+ if (typeof component === 'function') await component(options);
72
69
  }
73
70
 
74
71
  /**
75
- * Initializes the PWA worker, registers global/worker event listeners,
76
- * checks service worker status, and renders the initial content.
77
- * This is the main entry point for the worker setup.
78
- * @memberof PwaWorker
79
- * @param {object} options - Configuration options.
80
- * @param {function(): object} options.router - Function to get the router instance.
81
- * @param {function(): Promise<void>} options.render - Function to render the application's UI.
72
+ * Bootstraps the app with a declarative options object. Shared core inits
73
+ * (Css, TranslateCore, Responsive, SocketIo, Keyboard) run in the correct
74
+ * order so per-app entrypoints only declare what's app-specific.
75
+ *
76
+ * @param {object} options
77
+ * @param {function|object} options.router Router class (with static `instance()`) or factory.
78
+ * @param {function(): Promise<string>} [options.template] Async function returning the landing HTML body.
79
+ * @param {Array} [options.themes] CSS theme list passed to `Css.loadThemes()`.
80
+ * @param {object|Array} [options.translate] App-level translation class(es).
81
+ * @param {object} [options.render] AppShell class with `instance({ htmlMainBody })`.
82
+ * @param {string} [options.socketPath] Socket.IO path override.
83
+ * @param {object} [options.appStore] AppStore whose `.Data` supplies socket channels.
84
+ * @param {object} [options.session] `{ socket, login, signout|logout, signup, account }`.
82
85
  * @returns {Promise<void>}
83
86
  */
84
- async instance({ router, render }) {
85
- window.ononline = async () => {
86
- logger.warn('ononline');
87
- };
88
- window.onoffline = async () => {
89
- logger.warn('onoffline');
90
- };
91
- setTimeout(() => {
92
- if ('onLine' in navigator && navigator.onLine) window.ononline();
93
- });
87
+ async instance({ router, template, themes, translate, render, socketPath, appStore, session }) {
88
+ window.ononline = () => logger.warn('ononline');
89
+ window.onoffline = () => logger.warn('onoffline');
94
90
 
95
91
  if ('serviceWorker' in navigator) {
96
92
  navigator.serviceWorker.addEventListener('controllerchange', () => {
@@ -98,281 +94,220 @@ class PwaWorker {
98
94
  });
99
95
  navigator.serviceWorker.ready.then((worker) => {
100
96
  logger.info('Service Worker Ready', worker);
101
-
102
- // event message listener
103
97
  navigator.serviceWorker.addEventListener('message', (event) => {
104
98
  logger.info('Received event message', event.data);
105
- const { status } = event.data;
99
+ if (event.data?.status === 'loader') LoadingAnimation.RenderCurrentSrcLoad(event);
100
+ });
101
+ });
102
+ }
106
103
 
107
- switch (status) {
108
- case 'loader':
109
- {
110
- LoadingAnimation.RenderCurrentSrcLoad(event);
111
- }
112
- break;
104
+ this.RouterInstance = typeof router?.instance === 'function' ? router.instance() : router();
105
+ if (this.RouterInstance?.Routes) registerRoutes(this.RouterInstance.Routes);
113
106
 
114
- default:
115
- break;
116
- }
117
- });
107
+ // Defer SW registration out of the render critical path. Firefox in
108
+ // particular pays a non-trivial IPC cost for SW registration; running it
109
+ // after `load` keeps first paint unblocked across all engines.
110
+ this.#registerDeferred();
118
111
 
119
- // if (navigator.serviceWorker.controller)
120
- // navigator.serviceWorker.controller.postMessage({
121
- // title: 'Hello from Client event message',
122
- // });
112
+ // Shared core inits — keep order: theme → translation → responsive → shell.
113
+ if (themes) await Css.loadThemes(themes);
114
+ await this.#initComponent(TranslateCore);
115
+ await this.#initComponent(translate);
116
+ await this.#initComponent(Responsive);
123
117
 
124
- // broadcast message
125
- // const channel = new BroadcastChannel('sw-messages');
126
- // channel.addEventListener('message', (event) => {
127
- // logger.info('Received broadcast message', event.data);
128
- // });
129
- // channel.postMessage({ title: 'Hello from Client broadcast message' });
130
- // channel.close();
131
- });
118
+ if (render && typeof render.instance === 'function') {
119
+ const htmlMainBody = typeof template === 'function' ? template : undefined;
120
+ await this.#initComponent(render, htmlMainBody ? { htmlMainBody } : undefined);
132
121
  }
133
122
 
134
- this.RouterInstance = router();
135
- const isInstall = await this.status();
136
- if (!isInstall) await this.install();
137
- await render();
123
+ const channels = appStore?.Data ?? session?.socket?.Data;
124
+ await this.#initComponent(SocketIo, { channels, path: socketPath });
125
+
126
+ if (session) {
127
+ await this.#initComponent(session.socket);
128
+ await this.#initComponent(session.login);
129
+ await this.#initComponent(session.logout || session.signout);
130
+ await this.#initComponent(session.signup);
131
+ await this.#initComponent(session.account);
132
+ }
133
+
134
+ await this.#initComponent(Keyboard);
138
135
  await LoadRouter(this.RouterInstance);
139
136
  LoadingAnimation.removeSplashScreen();
140
- if (this.devMode()) {
141
- // const delayLiveReload = 1250;
142
- // window.addEventListener('visibilitychange', () => {
143
- // if (document.visibilityState === 'visible') {
144
- // this.reload(delayLiveReload);
145
- // }
146
- // });
147
- // window.addEventListener('focus', () => {
148
- // this.reload(delayLiveReload);
149
- // });
150
- }
151
137
  window.serviceWorkerReady = true;
152
138
  }
153
139
 
154
140
  /**
155
- * Gets the current service worker registration.
156
- * @memberof PwaWorker
157
- * @returns {Promise<ServiceWorkerRegistration | undefined>} The service worker registration object, or undefined.
141
+ * Schedules SW registration to run after page `load` (or immediately if
142
+ * the page is already loaded). Idempotent: existing registrations are
143
+ * left alone; missing ones are registered.
144
+ * @private
158
145
  */
159
- async getRegistration() {
160
- return navigator.serviceWorker.getRegistration();
146
+ #registerDeferred() {
147
+ if (!('serviceWorker' in navigator)) {
148
+ logger.warn('Service Worker disabled in browser');
149
+ return;
150
+ }
151
+ const run = async () => {
152
+ const registration = await this.getRegistration();
153
+ if (!registration) await this.register();
154
+ };
155
+ if (document.readyState === 'complete') run();
156
+ else window.addEventListener('load', run, { once: true });
161
157
  }
162
158
 
163
- /**
164
- * Forces the current service worker to skip waiting and reloads the page
165
- * to apply the new service worker immediately.
166
- * @memberof PwaWorker
167
- * @param {number} [timeOut=3000] - Delay in milliseconds before reloading the page.
168
- * @returns {Promise<void>} A promise that resolves after the page is reloaded.
169
- */
170
- async reload(timeOut = 3000) {
171
- return new Promise((resolve) => {
172
- if (navigator.serviceWorker && navigator.serviceWorker.controller) {
173
- navigator.serviceWorker.controller.postMessage({
174
- status: 'skipWaiting',
175
- });
176
- }
177
- setTimeout(() => resolve(location.reload()), timeOut);
178
- });
159
+ /** Returns the current service worker registration, if any. */
160
+ getRegistration() {
161
+ return 'serviceWorker' in navigator ? navigator.serviceWorker.getRegistration() : Promise.resolve(undefined);
179
162
  }
180
163
 
181
- /**
182
- * Updates the application by clearing specific caches and running the service worker update logic.
183
- * Cache names matching 'components/', 'services/', or '.index.js' are deleted.
184
- * @memberof PwaWorker
185
- * @returns {Promise<void>}
186
- */
187
- async update() {
188
- const isInstall = await this.status();
189
- if (isInstall) {
190
- const cacheNames = await caches.keys();
191
- for (const cacheName of cacheNames) {
192
- if (cacheName.match('components/') || cacheName.match('services/') || cacheName.match('.index.js')) {
193
- await caches.delete(cacheName);
194
- }
195
- }
196
- await this.updateServiceWorker();
164
+ /** Registers `sw.js` with the browser. Resolves with the registration (or `null` on failure). */
165
+ async register() {
166
+ if (!('serviceWorker' in navigator)) {
167
+ logger.warn('Service Worker disabled in browser');
168
+ return null;
169
+ }
170
+ try {
171
+ const registration = await navigator.serviceWorker.register(SW_URL());
172
+ logger.warn('Service Worker registered', registration);
173
+ return registration;
174
+ } catch (error) {
175
+ logger.error('Error registering service worker:', error);
176
+ return null;
197
177
  }
198
178
  }
199
179
 
200
180
  /**
201
- * Checks the current status of all service worker registrations and sets the
202
- * `updateServiceWorker` function reference if an active worker is found.
203
- * @memberof PwaWorker
204
- * @returns {Promise<boolean>} True if at least one service worker is registered.
181
+ * Reloads the page, asking the active SW to skip waiting first so the
182
+ * new version takes effect on the next load.
183
+ * @param {number} [delay=3000] Milliseconds before reload.
205
184
  */
206
- status() {
207
- let status = false;
208
- return new Promise((resolve) => {
209
- if ('serviceWorker' in navigator) {
210
- navigator.serviceWorker
211
- .getRegistrations()
212
- .then((registrations) => {
213
- for (const registration of registrations) {
214
- if (registration.installing) logger.info('installing', registration);
215
- else if (registration.waiting) logger.info('waiting', registration);
216
- else if (registration.active) {
217
- logger.info('active', registration);
218
- // Dynamically set the update function
219
- this.updateServiceWorker = async () => await registration.update();
220
- }
221
- }
222
- if (registrations.length > 0) status = true;
223
- resolve(status);
224
- })
225
- .catch((...args) => {
226
- logger.error('Error getting service worker registrations:', ...args);
227
- resolve(false);
228
- });
229
- } else {
230
- logger.warn('Service Worker Disabled in browser');
231
- resolve(false);
232
- }
233
- });
185
+ async reload(delay = 3000) {
186
+ navigator.serviceWorker?.controller?.postMessage({ status: 'skipWaiting' });
187
+ return new Promise((resolve) => setTimeout(() => resolve(location.reload()), delay));
188
+ }
189
+
190
+ /** Deletes every cache visible to the SW. Returns the number of caches removed. */
191
+ async clearAllCaches() {
192
+ const names = await caches.keys();
193
+ await Promise.all(names.map((name) => caches.delete(name)));
194
+ return names.length;
234
195
  }
235
196
 
236
197
  /**
237
- * Registers the service worker (`sw.js`) with the browser.
238
- * @memberof PwaWorker
239
- * @returns {Promise<Array<any>>} A promise that resolves with the registration arguments.
198
+ * Deletes Workbox/background-sync IndexedDB databases that may pin stale state
199
+ * across reloads. Safe no-op in browsers without `indexedDB.databases`.
240
200
  */
241
- install() {
242
- return new Promise((resolve) => {
243
- if ('serviceWorker' in navigator) {
244
- navigator.serviceWorker
245
- .register(`${getProxyPath()}sw.js`, {
246
- type: 'module',
247
- })
248
- .then((...args) => {
249
- logger.warn('Service Worker Registered', args);
250
- resolve(args);
251
- })
252
- .catch((...args) => {
253
- logger.error('Error registering service worker:', ...args);
254
- resolve(args);
255
- });
256
- } else {
257
- logger.warn('Service Worker Disabled in browser');
258
- resolve([]);
259
- }
260
- });
201
+ async clearWorkboxIndexedDb() {
202
+ if (!('indexedDB' in window) || typeof indexedDB.databases !== 'function') return 0;
203
+ const databases = await indexedDB.databases();
204
+ const targets = databases
205
+ .map((db) => db.name)
206
+ .filter(
207
+ (name) =>
208
+ typeof name === 'string' &&
209
+ (name.toLowerCase().includes('workbox') ||
210
+ name.toLowerCase().includes('background-sync') ||
211
+ name.includes('api-mutation-queue')),
212
+ );
213
+
214
+ await Promise.all(
215
+ targets.map(
216
+ (name) =>
217
+ new Promise((resolve) => {
218
+ const req = indexedDB.deleteDatabase(name);
219
+ req.onsuccess = () => resolve(true);
220
+ req.onerror = () => resolve(false);
221
+ req.onblocked = () => resolve(false);
222
+ }),
223
+ ),
224
+ );
225
+ return targets.length;
261
226
  }
262
227
 
263
228
  /**
264
- * Unregisters all service workers and deletes all application caches.
265
- * @memberof PwaWorker
266
- * @returns {Promise<Array<any>>} A promise that resolves after uninstallation.
229
+ * Asks the active SW to drop its caches and confirm. Resolves `false`
230
+ * after 1500 ms if the SW does not reply.
267
231
  */
268
- uninstall() {
269
- return new Promise(async (resolve) => {
270
- if ('serviceWorker' in navigator) {
271
- try {
272
- const registrations = await navigator.serviceWorker.getRegistrations();
273
- const cacheNames = await caches.keys();
274
- for (const cacheName of cacheNames) await caches.delete(cacheName);
275
- for (const registration of registrations) {
276
- logger.info('Removing service worker registration', registration);
277
- registration.unregister();
278
- }
279
- resolve([]);
280
- } catch (error) {
281
- logger.error('Error during service worker uninstallation:', error);
282
- resolve([error]);
283
- }
284
- } else {
285
- logger.warn('Service Worker Disabled in browser');
286
- resolve([]);
287
- }
232
+ async requestWorkboxReset() {
233
+ if (!navigator.serviceWorker?.controller) return false;
234
+ return new Promise((resolve) => {
235
+ const channel = new MessageChannel();
236
+ const timeoutId = setTimeout(() => resolve(false), 1500);
237
+ channel.port1.onmessage = (event) => {
238
+ clearTimeout(timeoutId);
239
+ resolve(event.data?.status === 'workbox-reset-done');
240
+ };
241
+ navigator.serviceWorker.controller.postMessage({ status: 'workbox-reset' }, [channel.port2]);
288
242
  });
289
243
  }
290
244
 
291
245
  /**
292
- * Requests permission from the user to display notifications.
293
- * Sets the internal `notificationActive` state.
294
- * @memberof PwaWorker
295
- * @returns {Promise<boolean>} True if permission is granted, false otherwise.
246
+ * Targeted cache invalidation: removes app-shell entries for components,
247
+ * services, and index bundles, then forces the SW registration to update.
248
+ * Cheaper than a full reset; used as the default "Update" action.
296
249
  */
297
- notificationRequestPermission() {
298
- return new Promise((resolve) =>
299
- Notification.requestPermission().then((result) => {
300
- if (result === 'granted') {
301
- this.notificationActive = true;
302
- resolve(true);
303
- } else {
304
- this.notificationActive = false;
305
- resolve(false);
306
- }
307
- }),
308
- );
250
+ async update() {
251
+ const registration = await this.getRegistration();
252
+ if (!registration) return;
253
+ const names = await caches.keys();
254
+ for (const name of names) {
255
+ if (name.match('components/') || name.match('services/') || name.match('.index.js')) {
256
+ await caches.delete(name);
257
+ }
258
+ }
259
+ await registration.update();
309
260
  }
310
261
 
311
- /**
312
- * Shows a sample notification if permission is granted.
313
- * @memberof PwaWorker
314
- * @returns {void}
315
- */
316
- notificationShow() {
317
- Notification.requestPermission().then((result) => {
318
- if (result === 'granted') {
319
- navigator.serviceWorker.ready.then((registration) => {
320
- registration.showNotification('Vibration Sample', {
321
- body: 'Buzz! Buzz!',
322
- icon: '../images/touch/chrome-touch-icon.png',
323
- vibrate: [200, 100, 200, 100, 200, 100, 200],
324
- tag: 'vibration-sample',
325
- requireInteraction: true,
326
- });
327
- });
262
+ /** Unregisters all SWs and drops every cache. */
263
+ async unregister() {
264
+ if (!('serviceWorker' in navigator)) {
265
+ logger.warn('Service Worker disabled in browser');
266
+ return;
267
+ }
268
+ try {
269
+ const registrations = await navigator.serviceWorker.getRegistrations();
270
+ await this.clearAllCaches();
271
+ for (const registration of registrations) {
272
+ logger.info('Removing service worker registration', registration);
273
+ registration.unregister();
328
274
  }
329
- });
275
+ } catch (error) {
276
+ logger.error('Error during service worker unregistration:', error);
277
+ }
330
278
  }
331
279
 
332
- /**
333
- * Renders the UI for PWA settings, including buttons for cleaning cache and worker management.
334
- * It also attaches the click handler for the 'clean-cache' button.
335
- * @memberof PwaWorker
336
- * @returns {Promise<string>} The HTML string for the settings section.
337
- */
280
+ /** Full reset: workbox runtime + SW + client storage. Use when caches are visibly stale. */
281
+ async resetAndRestart() {
282
+ localStorage.clear();
283
+ sessionStorage.clear();
284
+ await this.requestWorkboxReset();
285
+ await this.unregister();
286
+ await this.clearAllCaches();
287
+ await this.clearWorkboxIndexedDb();
288
+ await this.register();
289
+ await this.reload(600);
290
+ }
291
+
292
+ /** Settings panel UI: a single "clean cache" action wired to `resetAndRestart`. */
338
293
  async RenderSetting() {
339
294
  setTimeout(() => {
340
- // Event listener for the clean cache button
341
295
  EventsUI.onClick(`.btn-clean-cache`, async (e) => {
342
296
  e.preventDefault();
343
- // Clear local storage, uninstall the worker, and reload
344
- localStorage.clear();
345
- await this.uninstall();
346
- await this.reload();
297
+ await this.resetAndRestart();
347
298
  });
348
299
  });
349
300
  return html` <div class="in">
350
- ${await BtnIcon.Render({
351
- class: 'inl section-mp btn-custom btn-install-service-controller hide',
352
- label: html`<i class="fas fa-download"></i> ${Translate.Render('Install control service')}`,
353
- })}
354
- ${await BtnIcon.Render({
355
- class: 'inl section-mp btn-custom btn-uninstall-service-controller hide',
356
- label: html`<i class="far fa-trash-alt"></i> ${Translate.Render('Uninstall control service')}`,
357
- })}
358
- ${await BtnIcon.Render({
301
+ ${await BtnIcon.instance({
359
302
  class: 'inl section-mp btn-custom btn-clean-cache',
360
- label: html`<i class="fa-solid fa-broom"></i> ${Translate.Render('clean-cache')}`,
361
- })}
362
- ${await BtnIcon.Render({
363
- class: 'inl section-mp btn-custom btn-reload hide',
364
- label: html`<i class="fas fa-sync-alt"></i> ${Translate.Render('Reload')}`,
303
+ label: html`<i class="fa-solid fa-broom"></i> ${Translate.instance('clean-cache')}`,
365
304
  })}
366
305
  </div>`;
367
306
  }
368
307
  }
369
308
 
370
- // Create the singleton instance
371
309
  const PwaWorkerInstance = new PwaWorker();
372
310
 
373
- // Export the new class name for modern usage
374
311
  export { PwaWorker };
375
-
376
- // Export the instance with the old name (`Worker`) for backward compatibility,
377
- // ensuring existing code consuming the module continues to work.
312
+ // Backward-compat alias — older code imports the singleton as `Worker`.
378
313
  export { PwaWorkerInstance as Worker };
@@ -149,23 +149,23 @@ export class PwaWindowDimensions {
149
149
  * Get the best-available viewport height in pixels.
150
150
  *
151
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)
152
+ * 1. document.documentElement.clientHeight (Layout viewport, default — stable against iframe scrolls)
153
+ * 2. window.innerHeight (Window size)
154
+ * 3. document.body.clientHeight (Body size)
155
+ * 4. window.visualViewport.height (if `preferVisualViewport` is true; first priority; or last before screen fallbacks)
156
+ * 5. window.visualViewport.height (if `preferVisualViewport` is false — used as fallback after layout values)
157
157
  * 6. window.screen.availHeight / window.screen.height (Physical screen)
158
158
  * 7. window.outerHeight (Last resort)
159
159
  *
160
160
  * @memberof PwaWindowDimensions
161
161
  * @static
162
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).
163
+ * @param {boolean} [options.preferVisualViewport=false] - When true, visualViewport is checked first (best for visible screen size, e.g., above mobile keyboard). Defaults to false to use stable layout viewport height, preventing Chrome iframe scroll from causing transient visualViewport changes that affect modal sizing.
164
164
  * @returns {number|null} Height in px (rounded integer) or null if none found.
165
165
  * @memberof PwaWindowDimensions
166
166
  */
167
167
  static getH(options = {}) {
168
- const { preferVisualViewport = true } = options;
168
+ const { preferVisualViewport = false } = options;
169
169
 
170
170
  const vv = PwaWindowDimensions.#getFromVisualViewport();
171
171
  const de = PwaWindowDimensions.#getFromDocumentElement();