@underpostnet/cyberia 3.2.80

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 (821) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.example +144 -0
  3. package/.github/workflows/cyberia-client.cd.yml +40 -0
  4. package/.github/workflows/cyberia-server.cd.yml +40 -0
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +71 -0
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +70 -0
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +71 -0
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +71 -0
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +53 -0
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +53 -0
  11. package/.github/workflows/engine-cyberia.cd.yml +157 -0
  12. package/.github/workflows/engine-cyberia.ci.yml +125 -0
  13. package/.github/workflows/ghpkg.ci.yml +160 -0
  14. package/.github/workflows/gitlab.ci.yml +20 -0
  15. package/.github/workflows/hardhat.ci.yml +82 -0
  16. package/.github/workflows/npmpkg.ci.yml +126 -0
  17. package/.github/workflows/publish.ci.yml +87 -0
  18. package/.github/workflows/publish.cyberia.ci.yml +79 -0
  19. package/.github/workflows/pwa-microservices-template-page.cd.yml +65 -0
  20. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  21. package/.github/workflows/release.cd.yml +46 -0
  22. package/.nycrc +9 -0
  23. package/.prettierignore +12 -0
  24. package/.prettierrc +9 -0
  25. package/.vscode/extensions.json +10 -0
  26. package/.vscode/settings.json +26 -0
  27. package/CHANGELOG.md +2516 -0
  28. package/CLI-HELP.md +1099 -0
  29. package/Dockerfile +161 -0
  30. package/Dockerfile.dev +161 -0
  31. package/Dockerfile.test +165 -0
  32. package/LICENSE +21 -0
  33. package/README.md +259 -0
  34. package/baremetal/commission-workflows.json +211 -0
  35. package/baremetal/packer-workflows.json +24 -0
  36. package/bin/build.js +261 -0
  37. package/bin/build.template.js +33 -0
  38. package/bin/cyberia.js +5627 -0
  39. package/bin/deploy.js +1547 -0
  40. package/bin/index.js +5627 -0
  41. package/bump.config.js +27 -0
  42. package/compose.env +144 -0
  43. package/conf.js +952 -0
  44. package/deployment.yaml +418 -0
  45. package/docker-compose.yml +434 -0
  46. package/examples/static-page/README.md +150 -0
  47. package/examples/static-page/ssr-components/CustomPage.js +554 -0
  48. package/examples/static-page/static-config-example.json +57 -0
  49. package/hardhat/.env.example +31 -0
  50. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  51. package/hardhat/deployments/.gitkeep +0 -0
  52. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  53. package/hardhat/hardhat.config.js +136 -0
  54. package/hardhat/ignition/modules/.gitkeep +0 -0
  55. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  56. package/hardhat/networks/besu-object-layer.network.json +138 -0
  57. package/hardhat/package-lock.json +2871 -0
  58. package/hardhat/package.json +43 -0
  59. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  60. package/hardhat/test/ObjectLayerToken.js +696 -0
  61. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  62. package/hardhat/types/ethers-contracts/common.ts +92 -0
  63. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  64. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  65. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  66. package/hardhat/types/ethers-contracts/index.ts +6 -0
  67. package/ipfs/configure-ipfs.sh +13 -0
  68. package/jsconfig.json +9 -0
  69. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +48 -0
  70. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +48 -0
  71. package/manifests/deployment/adminer/deployment.yaml +32 -0
  72. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  73. package/manifests/deployment/adminer/service.yaml +13 -0
  74. package/manifests/deployment/dd-cyberia-development/deployment.yaml +418 -0
  75. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  76. package/manifests/deployment/dd-cyberia-development/proxy.yaml +189 -0
  77. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +164 -0
  78. package/manifests/deployment/dd-default-development/deployment.yaml +163 -0
  79. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  80. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  81. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  82. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  83. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  84. package/manifests/deployment/fastapi/initial_data.sh +8 -0
  85. package/manifests/deployment/kafka/deployment.yaml +67 -0
  86. package/manifests/deployment/mongo-express/deployment.yaml +62 -0
  87. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  88. package/manifests/deployment/playwright/deployment.yaml +52 -0
  89. package/manifests/deployment/spark/spark-pi-py.yaml +20 -0
  90. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +63 -0
  91. package/manifests/envoy-service-nodeport.yaml +22 -0
  92. package/manifests/grafana/deployment.yaml +64 -0
  93. package/manifests/grafana/kustomization.yaml +7 -0
  94. package/manifests/grafana/pvc.yaml +12 -0
  95. package/manifests/grafana/service.yaml +14 -0
  96. package/manifests/grafana/storage-class.yaml +9 -0
  97. package/manifests/ipfs/configmap.yaml +64 -0
  98. package/manifests/ipfs/headless-service.yaml +35 -0
  99. package/manifests/ipfs/kustomization.yaml +8 -0
  100. package/manifests/ipfs/statefulset.yaml +149 -0
  101. package/manifests/ipfs/storage-class.yaml +9 -0
  102. package/manifests/kind-config-dev.yaml +20 -0
  103. package/manifests/kind-config.yaml +12 -0
  104. package/manifests/kubeadm-calico-config.yaml +14 -0
  105. package/manifests/letsencrypt-prod.yaml +14 -0
  106. package/manifests/lxd/lxd-admin-profile.yaml +26 -0
  107. package/manifests/lxd/lxd-preseed.yaml +30 -0
  108. package/manifests/mariadb/kustomization.yaml +9 -0
  109. package/manifests/mariadb/pv.yaml +12 -0
  110. package/manifests/mariadb/pvc.yaml +10 -0
  111. package/manifests/mariadb/service.yaml +10 -0
  112. package/manifests/mariadb/statefulset.yaml +56 -0
  113. package/manifests/mariadb/storage-class.yaml +10 -0
  114. package/manifests/mongodb/headless-service.yaml +10 -0
  115. package/manifests/mongodb/kustomization.yaml +11 -0
  116. package/manifests/mongodb/pv-pvc.yaml +59 -0
  117. package/manifests/mongodb/statefulset.yaml +113 -0
  118. package/manifests/mongodb/storage-class.yaml +9 -0
  119. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  120. package/manifests/mongodb-4.4/kustomization.yaml +9 -0
  121. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  122. package/manifests/mongodb-4.4/pv-pvc.yaml +19 -0
  123. package/manifests/mongodb-4.4/service-deployment.yaml +61 -0
  124. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  125. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  126. package/manifests/mysql/kustomization.yaml +7 -0
  127. package/manifests/mysql/pv-pvc.yaml +27 -0
  128. package/manifests/mysql/statefulset.yaml +55 -0
  129. package/manifests/postgresql/configmap.yaml +9 -0
  130. package/manifests/postgresql/kustomization.yaml +10 -0
  131. package/manifests/postgresql/pv.yaml +15 -0
  132. package/manifests/postgresql/pvc.yaml +13 -0
  133. package/manifests/postgresql/service.yaml +10 -0
  134. package/manifests/postgresql/statefulset.yaml +37 -0
  135. package/manifests/prometheus/deployment.yaml +82 -0
  136. package/manifests/pv-pvc-dd.yaml +34 -0
  137. package/manifests/valkey/kustomization.yaml +7 -0
  138. package/manifests/valkey/service.yaml +10 -0
  139. package/manifests/valkey/statefulset.yaml +37 -0
  140. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  141. package/mongodb/entrypoint.sh +76 -0
  142. package/nginx.conf +128 -0
  143. package/nodemon.json +6 -0
  144. package/package.json +101 -0
  145. package/packer/images/Rocky9Amd64/Makefile +62 -0
  146. package/packer/images/Rocky9Amd64/QUICKSTART.md +113 -0
  147. package/packer/images/Rocky9Amd64/README.md +122 -0
  148. package/packer/images/Rocky9Amd64/http/rocky9.ks.pkrtpl.hcl +114 -0
  149. package/packer/images/Rocky9Amd64/rocky9.pkr.hcl +164 -0
  150. package/packer/images/Rocky9Arm64/Makefile +69 -0
  151. package/packer/images/Rocky9Arm64/README.md +122 -0
  152. package/packer/images/Rocky9Arm64/http/rocky9.ks.pkrtpl.hcl +114 -0
  153. package/packer/images/Rocky9Arm64/rocky9.pkr.hcl +171 -0
  154. package/packer/scripts/fuse-nbd +64 -0
  155. package/packer/scripts/fuse-tar-root +63 -0
  156. package/proxy.yaml +189 -0
  157. package/pv-pvc.yaml +164 -0
  158. package/scripts/device-scan.sh +65 -0
  159. package/scripts/disk-clean.sh +182 -0
  160. package/scripts/disk-devices.sh +13 -0
  161. package/scripts/gen-fqdns.sh +14 -0
  162. package/scripts/gpu-diag.sh +19 -0
  163. package/scripts/ip-info.sh +118 -0
  164. package/scripts/ipxe-setup.sh +200 -0
  165. package/scripts/k3s-node-setup.sh +124 -0
  166. package/scripts/kubeadm-node-setup.sh +317 -0
  167. package/scripts/link-local-underpost-cli.sh +6 -0
  168. package/scripts/lxd-vm-setup.sh +208 -0
  169. package/scripts/maas-nat-firewalld.sh +145 -0
  170. package/scripts/maas-setup.sh +135 -0
  171. package/scripts/maas-upload-boot-resource.sh +183 -0
  172. package/scripts/nat-iptables.sh +111 -0
  173. package/scripts/nvim.sh +91 -0
  174. package/scripts/packer-init-vars-file.sh +40 -0
  175. package/scripts/packer-setup.sh +289 -0
  176. package/scripts/ports-ls.sh +33 -0
  177. package/scripts/quick-tftp.sh +19 -0
  178. package/scripts/rhel-grpc-setup.sh +56 -0
  179. package/scripts/rocky-kickstart.sh +986 -0
  180. package/scripts/rocky-pwa.sh +200 -0
  181. package/scripts/rocky-setup.sh +106 -0
  182. package/scripts/rpmfusion-ffmpeg-setup.sh +32 -0
  183. package/scripts/ssl.sh +170 -0
  184. package/scripts/test-monitor.sh +248 -0
  185. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +30 -0
  186. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +155 -0
  187. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +39 -0
  188. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +382 -0
  189. package/src/api/core/core.controller.js +8 -0
  190. package/src/api/core/core.model.js +11 -0
  191. package/src/api/core/core.router.js +23 -0
  192. package/src/api/core/core.service.js +30 -0
  193. package/src/api/crypto/crypto.controller.js +10 -0
  194. package/src/api/crypto/crypto.model.js +23 -0
  195. package/src/api/crypto/crypto.router.js +23 -0
  196. package/src/api/crypto/crypto.service.js +64 -0
  197. package/src/api/cyberia-action/cyberia-action.controller.js +8 -0
  198. package/src/api/cyberia-action/cyberia-action.model.js +79 -0
  199. package/src/api/cyberia-action/cyberia-action.router.js +21 -0
  200. package/src/api/cyberia-action/cyberia-action.service.js +58 -0
  201. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +27 -0
  202. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +100 -0
  203. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +70 -0
  204. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  205. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +8 -0
  206. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  207. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +20 -0
  208. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +57 -0
  209. package/src/api/cyberia-entity/cyberia-entity.controller.js +6 -0
  210. package/src/api/cyberia-entity/cyberia-entity.model.js +25 -0
  211. package/src/api/cyberia-entity/cyberia-entity.router.js +17 -0
  212. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  213. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +6 -0
  214. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  215. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -0
  216. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  217. package/src/api/cyberia-instance/cyberia-fallback-world.js +337 -0
  218. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +57 -0
  219. package/src/api/cyberia-instance/cyberia-instance-map.service.js +583 -0
  220. package/src/api/cyberia-instance/cyberia-instance.controller.js +42 -0
  221. package/src/api/cyberia-instance/cyberia-instance.model.js +117 -0
  222. package/src/api/cyberia-instance/cyberia-instance.router.js +75 -0
  223. package/src/api/cyberia-instance/cyberia-instance.service.js +190 -0
  224. package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
  225. package/src/api/cyberia-instance/cyberia-world-generator.js +618 -0
  226. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +6 -0
  227. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +200 -0
  228. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +17 -0
  229. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
  230. package/src/api/cyberia-map/cyberia-map.controller.js +6 -0
  231. package/src/api/cyberia-map/cyberia-map.model.js +33 -0
  232. package/src/api/cyberia-map/cyberia-map.router.js +19 -0
  233. package/src/api/cyberia-map/cyberia-map.service.js +76 -0
  234. package/src/api/cyberia-quest/cyberia-quest.controller.js +9 -0
  235. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  236. package/src/api/cyberia-quest/cyberia-quest.router.js +26 -0
  237. package/src/api/cyberia-quest/cyberia-quest.service.js +97 -0
  238. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +6 -0
  239. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  240. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +21 -0
  241. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  242. package/src/api/cyberia-saga/cyberia-saga.controller.js +6 -0
  243. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  244. package/src/api/cyberia-saga/cyberia-saga.router.js +17 -0
  245. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  246. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +1076 -0
  247. package/src/api/cyberia-skill/cyberia-skill.controller.js +6 -0
  248. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  249. package/src/api/cyberia-skill/cyberia-skill.router.js +17 -0
  250. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  251. package/src/api/default/default.controller.js +6 -0
  252. package/src/api/default/default.model.js +20 -0
  253. package/src/api/default/default.router.js +21 -0
  254. package/src/api/default/default.service.js +42 -0
  255. package/src/api/document/document.controller.js +9 -0
  256. package/src/api/document/document.model.js +95 -0
  257. package/src/api/document/document.router.js +32 -0
  258. package/src/api/document/document.service.js +633 -0
  259. package/src/api/file/file.controller.js +15 -0
  260. package/src/api/file/file.model.js +127 -0
  261. package/src/api/file/file.ref.json +39 -0
  262. package/src/api/file/file.router.js +36 -0
  263. package/src/api/file/file.service.js +499 -0
  264. package/src/api/instance/instance.controller.js +8 -0
  265. package/src/api/instance/instance.model.js +34 -0
  266. package/src/api/instance/instance.router.js +27 -0
  267. package/src/api/instance/instance.service.js +75 -0
  268. package/src/api/ipfs/ipfs.controller.js +8 -0
  269. package/src/api/ipfs/ipfs.model.js +77 -0
  270. package/src/api/ipfs/ipfs.router.js +26 -0
  271. package/src/api/ipfs/ipfs.service.js +145 -0
  272. package/src/api/object-layer/object-layer.controller.js +18 -0
  273. package/src/api/object-layer/object-layer.model.js +200 -0
  274. package/src/api/object-layer/object-layer.router.js +729 -0
  275. package/src/api/object-layer/object-layer.service.js +894 -0
  276. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +6 -0
  277. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +93 -0
  278. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +17 -0
  279. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +46 -0
  280. package/src/api/test/test.controller.js +14 -0
  281. package/src/api/test/test.model.js +14 -0
  282. package/src/api/test/test.router.js +23 -0
  283. package/src/api/test/test.service.js +35 -0
  284. package/src/api/types.js +24 -0
  285. package/src/api/user/guest.service.js +100 -0
  286. package/src/api/user/postman_collection.json +216 -0
  287. package/src/api/user/user.build.js +16 -0
  288. package/src/api/user/user.controller.js +35 -0
  289. package/src/api/user/user.model.js +142 -0
  290. package/src/api/user/user.router.js +367 -0
  291. package/src/api/user/user.service.js +582 -0
  292. package/src/api.js +23 -0
  293. package/src/cli/baremetal.js +3947 -0
  294. package/src/cli/cloud-init.js +673 -0
  295. package/src/cli/cluster.js +1395 -0
  296. package/src/cli/db.js +1533 -0
  297. package/src/cli/deploy.js +1542 -0
  298. package/src/cli/docker-compose.js +802 -0
  299. package/src/cli/env.js +177 -0
  300. package/src/cli/fs.js +380 -0
  301. package/src/cli/image.js +389 -0
  302. package/src/cli/index.js +1059 -0
  303. package/src/cli/ipfs.js +182 -0
  304. package/src/cli/kickstart.js +271 -0
  305. package/src/cli/kubectl.js +214 -0
  306. package/src/cli/lxd.js +1232 -0
  307. package/src/cli/monitor.js +659 -0
  308. package/src/cli/release.js +595 -0
  309. package/src/cli/repository.js +1969 -0
  310. package/src/cli/run.js +3326 -0
  311. package/src/cli/secrets.js +151 -0
  312. package/src/cli/ssh.js +975 -0
  313. package/src/cli/static.js +653 -0
  314. package/src/cli/system.js +332 -0
  315. package/src/cli/test.js +176 -0
  316. package/src/client/Cryptokoyn.index.js +30 -0
  317. package/src/client/CyberiaPortal.index.js +31 -0
  318. package/src/client/Default.index.js +77 -0
  319. package/src/client/Itemledger.index.js +35 -0
  320. package/src/client/Underpost.index.js +31 -0
  321. package/src/client/components/core/404.js +20 -0
  322. package/src/client/components/core/500.js +20 -0
  323. package/src/client/components/core/Account.js +630 -0
  324. package/src/client/components/core/AgGrid.js +238 -0
  325. package/src/client/components/core/Alert.js +76 -0
  326. package/src/client/components/core/AppStore.js +69 -0
  327. package/src/client/components/core/Auth.js +353 -0
  328. package/src/client/components/core/Badge.js +26 -0
  329. package/src/client/components/core/Blockchain.js +41 -0
  330. package/src/client/components/core/Blog.js +9 -0
  331. package/src/client/components/core/BtnIcon.js +109 -0
  332. package/src/client/components/core/CalendarCore.js +437 -0
  333. package/src/client/components/core/Chat.js +62 -0
  334. package/src/client/components/core/ClientEvents.js +163 -0
  335. package/src/client/components/core/ColorPaletteElement.js +309 -0
  336. package/src/client/components/core/CommonJs.js +1014 -0
  337. package/src/client/components/core/Content.js +349 -0
  338. package/src/client/components/core/Css.js +1134 -0
  339. package/src/client/components/core/CssCore.js +881 -0
  340. package/src/client/components/core/D3Chart.js +44 -0
  341. package/src/client/components/core/Docs.js +478 -0
  342. package/src/client/components/core/DropDown.js +321 -0
  343. package/src/client/components/core/EventBus.js +96 -0
  344. package/src/client/components/core/EventsUI.js +130 -0
  345. package/src/client/components/core/FileExplorer.js +1406 -0
  346. package/src/client/components/core/FullScreen.js +201 -0
  347. package/src/client/components/core/Input.js +537 -0
  348. package/src/client/components/core/Keyboard.js +80 -0
  349. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  350. package/src/client/components/core/LoadingAnimation.js +152 -0
  351. package/src/client/components/core/LogIn.js +212 -0
  352. package/src/client/components/core/LogOut.js +72 -0
  353. package/src/client/components/core/Logger.js +22 -0
  354. package/src/client/components/core/Modal.js +2956 -0
  355. package/src/client/components/core/NotificationManager.js +80 -0
  356. package/src/client/components/core/Pagination.js +252 -0
  357. package/src/client/components/core/Panel.js +1308 -0
  358. package/src/client/components/core/PanelForm.js +915 -0
  359. package/src/client/components/core/Polyhedron.js +947 -0
  360. package/src/client/components/core/PublicProfile.js +895 -0
  361. package/src/client/components/core/Recover.js +211 -0
  362. package/src/client/components/core/Responsive.js +146 -0
  363. package/src/client/components/core/RichText.js +33 -0
  364. package/src/client/components/core/Router.js +523 -0
  365. package/src/client/components/core/Scroll.js +76 -0
  366. package/src/client/components/core/SearchBox.js +1007 -0
  367. package/src/client/components/core/SignUp.js +153 -0
  368. package/src/client/components/core/SocketIo.js +163 -0
  369. package/src/client/components/core/SocketIoHandler.js +75 -0
  370. package/src/client/components/core/Stream.js +161 -0
  371. package/src/client/components/core/ToggleSwitch.js +89 -0
  372. package/src/client/components/core/ToolTip.js +78 -0
  373. package/src/client/components/core/Translate.js +694 -0
  374. package/src/client/components/core/Validator.js +140 -0
  375. package/src/client/components/core/VanillaJs.js +485 -0
  376. package/src/client/components/core/Wallet.js +95 -0
  377. package/src/client/components/core/WebComponent.js +44 -0
  378. package/src/client/components/core/Webhook.js +58 -0
  379. package/src/client/components/core/Worker.js +313 -0
  380. package/src/client/components/core/windowGetDimensions.js +269 -0
  381. package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +352 -0
  382. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  383. package/src/client/components/cryptokoyn/CssCryptokoyn.js +212 -0
  384. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +16 -0
  385. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +12 -0
  386. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  387. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +16 -0
  388. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +11 -0
  389. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +6 -0
  390. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  391. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  392. package/src/client/components/cyberia/InstanceEngineCyberia.js +1088 -0
  393. package/src/client/components/cyberia/InstanceSelectionView.js +900 -0
  394. package/src/client/components/cyberia/MapEngineCyberia.js +1976 -0
  395. package/src/client/components/cyberia/ObjectLayerEngine.js +1540 -0
  396. package/src/client/components/cyberia/ObjectLayerEngineModal.js +2420 -0
  397. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +1522 -0
  398. package/src/client/components/cyberia/SharedDefaultsCyberia.js +528 -0
  399. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +772 -0
  400. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  401. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +254 -0
  402. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +21 -0
  403. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +16 -0
  404. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +518 -0
  405. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +72 -0
  406. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  407. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +13 -0
  408. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +6 -0
  409. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +48 -0
  410. package/src/client/components/default/AppShellDefault.js +765 -0
  411. package/src/client/components/default/AppStoreDefault.js +5 -0
  412. package/src/client/components/default/CommonDefault.js +29 -0
  413. package/src/client/components/default/CssDefault.js +27 -0
  414. package/src/client/components/default/LogInDefault.js +16 -0
  415. package/src/client/components/default/LogOutDefault.js +12 -0
  416. package/src/client/components/default/RouterDefault.js +47 -0
  417. package/src/client/components/default/SettingsDefault.js +16 -0
  418. package/src/client/components/default/SignUpDefault.js +11 -0
  419. package/src/client/components/default/SocketIoDefault.js +6 -0
  420. package/src/client/components/default/TranslateDefault.js +7 -0
  421. package/src/client/components/itemledger/AppShellItemledger.js +353 -0
  422. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  423. package/src/client/components/itemledger/CssItemledger.js +212 -0
  424. package/src/client/components/itemledger/LogInItemledger.js +17 -0
  425. package/src/client/components/itemledger/LogOutItemledger.js +12 -0
  426. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  427. package/src/client/components/itemledger/SettingsItemledger.js +16 -0
  428. package/src/client/components/itemledger/SignUpItemledger.js +11 -0
  429. package/src/client/components/itemledger/SocketIoItemledger.js +6 -0
  430. package/src/client/components/itemledger/TranslateItemledger.js +7 -0
  431. package/src/client/components/underpost/AppShellUnderpost.js +691 -0
  432. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  433. package/src/client/components/underpost/CssUnderpost.js +281 -0
  434. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +879 -0
  435. package/src/client/components/underpost/DocumentSearchProvider.js +448 -0
  436. package/src/client/components/underpost/LabGalleryUnderpost.js +79 -0
  437. package/src/client/components/underpost/LogInUnderpost.js +25 -0
  438. package/src/client/components/underpost/LogOutUnderpost.js +17 -0
  439. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  440. package/src/client/components/underpost/SettingsUnderpost.js +16 -0
  441. package/src/client/components/underpost/SignUpUnderpost.js +11 -0
  442. package/src/client/components/underpost/SocketIoUnderpost.js +6 -0
  443. package/src/client/components/underpost/TranslateUnderpost.js +10 -0
  444. package/src/client/public/cryptokoyn/assets/banner/koyn-social.png +0 -0
  445. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  446. package/src/client/public/cryptokoyn/assets/logo/cryptokoyn.png +0 -0
  447. package/src/client/public/cryptokoyn/assets/splash/android-chrome-144x144.png +0 -0
  448. package/src/client/public/cryptokoyn/assets/splash/android-chrome-192x192.png +0 -0
  449. package/src/client/public/cryptokoyn/assets/splash/android-chrome-256x256.png +0 -0
  450. package/src/client/public/cryptokoyn/assets/splash/android-chrome-36x36.png +0 -0
  451. package/src/client/public/cryptokoyn/assets/splash/android-chrome-48x48.png +0 -0
  452. package/src/client/public/cryptokoyn/assets/splash/android-chrome-72x72.png +0 -0
  453. package/src/client/public/cryptokoyn/assets/splash/android-chrome-96x96.png +0 -0
  454. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114-precomposed.png +0 -0
  455. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114.png +0 -0
  456. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120-precomposed.png +0 -0
  457. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120.png +0 -0
  458. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144-precomposed.png +0 -0
  459. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144.png +0 -0
  460. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152-precomposed.png +0 -0
  461. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152.png +0 -0
  462. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180-precomposed.png +0 -0
  463. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180.png +0 -0
  464. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57-precomposed.png +0 -0
  465. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57.png +0 -0
  466. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60-precomposed.png +0 -0
  467. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60.png +0 -0
  468. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72-precomposed.png +0 -0
  469. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72.png +0 -0
  470. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76-precomposed.png +0 -0
  471. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76.png +0 -0
  472. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-precomposed.png +0 -0
  473. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon.png +0 -0
  474. package/src/client/public/cryptokoyn/assets/splash/favicon-16x16.png +0 -0
  475. package/src/client/public/cryptokoyn/assets/splash/favicon-32x32.png +0 -0
  476. package/src/client/public/cryptokoyn/assets/splash/mstile-144x144.png +0 -0
  477. package/src/client/public/cryptokoyn/assets/splash/mstile-150x150.png +0 -0
  478. package/src/client/public/cryptokoyn/assets/splash/mstile-310x150.png +0 -0
  479. package/src/client/public/cryptokoyn/assets/splash/mstile-310x310.png +0 -0
  480. package/src/client/public/cryptokoyn/assets/splash/mstile-70x70.png +0 -0
  481. package/src/client/public/cryptokoyn/assets/splash/safari-pinned-tab.svg +42 -0
  482. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  483. package/src/client/public/cryptokoyn/favicon.ico +0 -0
  484. package/src/client/public/cryptokoyn/microdata.json +85 -0
  485. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  486. package/src/client/public/cryptokoyn/sitemap +148 -0
  487. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +307 -0
  488. package/src/client/public/cyberia-docs/ARCHITECTURE.md +309 -0
  489. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  490. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +341 -0
  491. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +84 -0
  492. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  493. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +294 -0
  494. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  495. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +242 -0
  496. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  497. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +309 -0
  498. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +228 -0
  499. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  500. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  501. package/src/client/public/cyberia-docs/WHITE-PAPER.md +740 -0
  502. package/src/client/public/default/android-chrome-144x144.png +0 -0
  503. package/src/client/public/default/android-chrome-192x192.png +0 -0
  504. package/src/client/public/default/android-chrome-256x256.png +0 -0
  505. package/src/client/public/default/android-chrome-36x36.png +0 -0
  506. package/src/client/public/default/android-chrome-384x384.png +0 -0
  507. package/src/client/public/default/android-chrome-48x48.png +0 -0
  508. package/src/client/public/default/android-chrome-512x512.png +0 -0
  509. package/src/client/public/default/android-chrome-72x72.png +0 -0
  510. package/src/client/public/default/android-chrome-96x96.png +0 -0
  511. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  512. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  513. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  514. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  515. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  516. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  517. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  518. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  519. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  520. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  521. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  522. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  523. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  524. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  525. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  526. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  527. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  528. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  529. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  530. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  531. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  532. package/src/client/public/default/apple-touch-icon.png +0 -0
  533. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  534. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  535. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  536. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  537. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  538. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  539. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  540. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  541. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  542. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  543. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  544. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  545. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  546. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  547. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  548. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  549. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  550. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  551. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  552. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  553. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  554. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  555. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  556. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  557. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  558. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  559. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  560. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  561. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  562. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  563. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  564. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  565. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  566. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  567. package/src/client/public/default/assets/background/dark.jpg +0 -0
  568. package/src/client/public/default/assets/background/dark.svg +557 -0
  569. package/src/client/public/default/assets/background/white.jpg +0 -0
  570. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  571. package/src/client/public/default/assets/background/white0.jpg +0 -0
  572. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  573. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  574. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  575. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  576. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  577. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  578. package/src/client/public/default/browserconfig.xml +12 -0
  579. package/src/client/public/default/favicon-16x16.png +0 -0
  580. package/src/client/public/default/favicon-32x32.png +0 -0
  581. package/src/client/public/default/favicon-48x48.png +0 -0
  582. package/src/client/public/default/favicon.ico +0 -0
  583. package/src/client/public/default/manifest.webmanifest +69 -0
  584. package/src/client/public/default/mstile-144x144.png +0 -0
  585. package/src/client/public/default/mstile-150x150.png +0 -0
  586. package/src/client/public/default/mstile-310x150.png +0 -0
  587. package/src/client/public/default/mstile-310x310.png +0 -0
  588. package/src/client/public/default/mstile-70x70.png +0 -0
  589. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  590. package/src/client/public/default/site.webmanifest +69 -0
  591. package/src/client/public/default/sitemap +148 -0
  592. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  593. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  594. package/src/client/public/doc/favicon.ico +0 -0
  595. package/src/client/public/doc/sitemap +148 -0
  596. package/src/client/public/itemledger/android-chrome-144x144.png +0 -0
  597. package/src/client/public/itemledger/android-chrome-192x192.png +0 -0
  598. package/src/client/public/itemledger/android-chrome-256x256.png +0 -0
  599. package/src/client/public/itemledger/android-chrome-36x36.png +0 -0
  600. package/src/client/public/itemledger/android-chrome-384x384.png +0 -0
  601. package/src/client/public/itemledger/android-chrome-48x48.png +0 -0
  602. package/src/client/public/itemledger/android-chrome-512x512.png +0 -0
  603. package/src/client/public/itemledger/android-chrome-72x72.png +0 -0
  604. package/src/client/public/itemledger/android-chrome-96x96.png +0 -0
  605. package/src/client/public/itemledger/apple-touch-icon-1024x1024.png +0 -0
  606. package/src/client/public/itemledger/apple-touch-icon-114x114.png +0 -0
  607. package/src/client/public/itemledger/apple-touch-icon-120x120.png +0 -0
  608. package/src/client/public/itemledger/apple-touch-icon-144x144.png +0 -0
  609. package/src/client/public/itemledger/apple-touch-icon-152x152.png +0 -0
  610. package/src/client/public/itemledger/apple-touch-icon-167x167.png +0 -0
  611. package/src/client/public/itemledger/apple-touch-icon-180x180.png +0 -0
  612. package/src/client/public/itemledger/apple-touch-icon-57x57.png +0 -0
  613. package/src/client/public/itemledger/apple-touch-icon-60x60.png +0 -0
  614. package/src/client/public/itemledger/apple-touch-icon-72x72.png +0 -0
  615. package/src/client/public/itemledger/apple-touch-icon-76x76.png +0 -0
  616. package/src/client/public/itemledger/apple-touch-icon-precomposed.png +0 -0
  617. package/src/client/public/itemledger/apple-touch-icon.png +0 -0
  618. package/src/client/public/itemledger/apple-touch-startup-image-1125x2436.png +0 -0
  619. package/src/client/public/itemledger/apple-touch-startup-image-1136x640.png +0 -0
  620. package/src/client/public/itemledger/apple-touch-startup-image-1170x2532.png +0 -0
  621. package/src/client/public/itemledger/apple-touch-startup-image-1179x2556.png +0 -0
  622. package/src/client/public/itemledger/apple-touch-startup-image-1242x2208.png +0 -0
  623. package/src/client/public/itemledger/apple-touch-startup-image-1242x2688.png +0 -0
  624. package/src/client/public/itemledger/apple-touch-startup-image-1284x2778.png +0 -0
  625. package/src/client/public/itemledger/apple-touch-startup-image-1290x2796.png +0 -0
  626. package/src/client/public/itemledger/apple-touch-startup-image-1334x750.png +0 -0
  627. package/src/client/public/itemledger/apple-touch-startup-image-1488x2266.png +0 -0
  628. package/src/client/public/itemledger/apple-touch-startup-image-1536x2048.png +0 -0
  629. package/src/client/public/itemledger/apple-touch-startup-image-1620x2160.png +0 -0
  630. package/src/client/public/itemledger/apple-touch-startup-image-1640x2160.png +0 -0
  631. package/src/client/public/itemledger/apple-touch-startup-image-1668x2224.png +0 -0
  632. package/src/client/public/itemledger/apple-touch-startup-image-1668x2388.png +0 -0
  633. package/src/client/public/itemledger/apple-touch-startup-image-1792x828.png +0 -0
  634. package/src/client/public/itemledger/apple-touch-startup-image-2048x1536.png +0 -0
  635. package/src/client/public/itemledger/apple-touch-startup-image-2048x2732.png +0 -0
  636. package/src/client/public/itemledger/apple-touch-startup-image-2160x1620.png +0 -0
  637. package/src/client/public/itemledger/apple-touch-startup-image-2160x1640.png +0 -0
  638. package/src/client/public/itemledger/apple-touch-startup-image-2208x1242.png +0 -0
  639. package/src/client/public/itemledger/apple-touch-startup-image-2224x1668.png +0 -0
  640. package/src/client/public/itemledger/apple-touch-startup-image-2266x1488.png +0 -0
  641. package/src/client/public/itemledger/apple-touch-startup-image-2388x1668.png +0 -0
  642. package/src/client/public/itemledger/apple-touch-startup-image-2436x1125.png +0 -0
  643. package/src/client/public/itemledger/apple-touch-startup-image-2532x1170.png +0 -0
  644. package/src/client/public/itemledger/apple-touch-startup-image-2556x1179.png +0 -0
  645. package/src/client/public/itemledger/apple-touch-startup-image-2688x1242.png +0 -0
  646. package/src/client/public/itemledger/apple-touch-startup-image-2732x2048.png +0 -0
  647. package/src/client/public/itemledger/apple-touch-startup-image-2778x1284.png +0 -0
  648. package/src/client/public/itemledger/apple-touch-startup-image-2796x1290.png +0 -0
  649. package/src/client/public/itemledger/apple-touch-startup-image-640x1136.png +0 -0
  650. package/src/client/public/itemledger/apple-touch-startup-image-750x1334.png +0 -0
  651. package/src/client/public/itemledger/apple-touch-startup-image-828x1792.png +0 -0
  652. package/src/client/public/itemledger/assets/logo/base-icon.png +0 -0
  653. package/src/client/public/itemledger/browserconfig.xml +12 -0
  654. package/src/client/public/itemledger/favicon-16x16.png +0 -0
  655. package/src/client/public/itemledger/favicon-32x32.png +0 -0
  656. package/src/client/public/itemledger/favicon-48x48.png +0 -0
  657. package/src/client/public/itemledger/favicon.ico +0 -0
  658. package/src/client/public/itemledger/manifest.webmanifest +69 -0
  659. package/src/client/public/itemledger/microdata.json +71 -0
  660. package/src/client/public/itemledger/mstile-144x144.png +0 -0
  661. package/src/client/public/itemledger/mstile-150x150.png +0 -0
  662. package/src/client/public/itemledger/mstile-310x150.png +0 -0
  663. package/src/client/public/itemledger/mstile-310x310.png +0 -0
  664. package/src/client/public/itemledger/mstile-70x70.png +0 -0
  665. package/src/client/public/itemledger/sitemap +148 -0
  666. package/src/client/public/itemledger/yandex-browser-50x50.png +0 -0
  667. package/src/client/public/itemledger/yandex-browser-manifest.json +9 -0
  668. package/src/client/public/test/favicon.ico +0 -0
  669. package/src/client/public/test/sitemap +148 -0
  670. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +137 -0
  671. package/src/client/services/core/core.service.js +309 -0
  672. package/src/client/services/crypto/crypto.service.js +68 -0
  673. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  674. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  675. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
  676. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  677. package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
  678. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  679. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  680. package/src/client/services/cyberia-instance/cyberia-instance.service.js +137 -0
  681. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
  682. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  683. package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
  684. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  685. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  686. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  687. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  688. package/src/client/services/default/default.management.js +1015 -0
  689. package/src/client/services/default/default.service.js +99 -0
  690. package/src/client/services/document/document.service.js +134 -0
  691. package/src/client/services/file/file.service.js +94 -0
  692. package/src/client/services/instance/instance.management.js +78 -0
  693. package/src/client/services/instance/instance.service.js +107 -0
  694. package/src/client/services/ipfs/ipfs.service.js +118 -0
  695. package/src/client/services/object-layer/object-layer.management.js +414 -0
  696. package/src/client/services/object-layer/object-layer.service.js +208 -0
  697. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +99 -0
  698. package/src/client/services/test/test.service.js +68 -0
  699. package/src/client/services/user/guest.service.js +86 -0
  700. package/src/client/services/user/user.management.js +51 -0
  701. package/src/client/services/user/user.service.js +106 -0
  702. package/src/client/ssr/RootDocument.js +237 -0
  703. package/src/client/ssr/body/404.js +77 -0
  704. package/src/client/ssr/body/500.js +76 -0
  705. package/src/client/ssr/body/CacheControl.js +117 -0
  706. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +97 -0
  707. package/src/client/ssr/body/DefaultSplashScreen.js +97 -0
  708. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  709. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +90 -0
  710. package/src/client/ssr/head/CryptokoynScripts.js +4 -0
  711. package/src/client/ssr/head/Css.js +241 -0
  712. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  713. package/src/client/ssr/head/DefaultScripts.js +6 -0
  714. package/src/client/ssr/head/ItemledgerScripts.js +4 -0
  715. package/src/client/ssr/head/Microdata.js +11 -0
  716. package/src/client/ssr/head/Production.js +1 -0
  717. package/src/client/ssr/head/Pwa.js +146 -0
  718. package/src/client/ssr/head/PwaItemledger.js +197 -0
  719. package/src/client/ssr/head/Seo.js +15 -0
  720. package/src/client/ssr/head/UnderpostScripts.js +6 -0
  721. package/src/client/ssr/mailer/DefaultRecoverEmail.js +20 -0
  722. package/src/client/ssr/mailer/DefaultVerifyEmail.js +16 -0
  723. package/src/client/ssr/views/Cyberia404.js +328 -0
  724. package/src/client/ssr/views/CyberiaServerMetrics.js +1070 -0
  725. package/src/client/ssr/views/Maintenance.js +64 -0
  726. package/src/client/ssr/views/NoNetworkConnection.js +68 -0
  727. package/src/client/ssr/views/Test.js +199 -0
  728. package/src/client/sw/core.sw.js +274 -0
  729. package/src/client-builder/client-build-docs.js +493 -0
  730. package/src/client-builder/client-build-live.js +100 -0
  731. package/src/client-builder/client-build.js +1092 -0
  732. package/src/client-builder/client-dev-server.js +88 -0
  733. package/src/client-builder/client-formatted.js +170 -0
  734. package/src/client-builder/client-icons.js +108 -0
  735. package/src/client-builder/ssr.js +124 -0
  736. package/src/client.build.js +17 -0
  737. package/src/client.dev.js +21 -0
  738. package/src/db/DataBaseProvider.js +213 -0
  739. package/src/db/mariadb/MariaDB.js +72 -0
  740. package/src/db/mongo/MongoBootstrap.js +657 -0
  741. package/src/db/mongo/MongooseDB.js +199 -0
  742. package/src/grpc/cyberia/grpc-server.js +162 -0
  743. package/src/index.js +357 -0
  744. package/src/mailer/EmailRender.js +116 -0
  745. package/src/mailer/MailerProvider.js +213 -0
  746. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +413 -0
  747. package/src/projects/cyberia/besu-genesis-generator.js +1630 -0
  748. package/src/projects/cyberia/catalog-cyberia.js +90 -0
  749. package/src/projects/cyberia/gemini-client.js +175 -0
  750. package/src/projects/cyberia/generate-saga.js +2137 -0
  751. package/src/projects/cyberia/hot-reload-trigger.js +163 -0
  752. package/src/projects/cyberia/instance-data.js +719 -0
  753. package/src/projects/cyberia/ipfs-client.js +599 -0
  754. package/src/projects/cyberia/map-preview-generator.js +304 -0
  755. package/src/projects/cyberia/object-layer.js +978 -0
  756. package/src/projects/cyberia/semantic-layer-generator-floor.js +319 -0
  757. package/src/projects/cyberia/semantic-layer-generator-resource.js +259 -0
  758. package/src/projects/cyberia/semantic-layer-generator-skin.js +1164 -0
  759. package/src/projects/cyberia/semantic-layer-generator.js +753 -0
  760. package/src/projects/cyberia/shape-generator.js +1060 -0
  761. package/src/projects/underpost/catalog-underpost.js +60 -0
  762. package/src/proxy.js +19 -0
  763. package/src/runtime/cyberia-client/Dockerfile +49 -0
  764. package/src/runtime/cyberia-client/Dockerfile.dev +75 -0
  765. package/src/runtime/cyberia-server/Dockerfile +43 -0
  766. package/src/runtime/cyberia-server/Dockerfile.dev +56 -0
  767. package/src/runtime/engine-cyberia/Dockerfile +161 -0
  768. package/src/runtime/engine-cyberia/Dockerfile.dev +161 -0
  769. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  770. package/src/runtime/engine-cyberia/compose.env +144 -0
  771. package/src/runtime/engine-cyberia/docker-compose.yml +434 -0
  772. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  773. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  774. package/src/runtime/engine-cyberia/nginx.conf +128 -0
  775. package/src/runtime/express/Dockerfile +45 -0
  776. package/src/runtime/express/Express.js +285 -0
  777. package/src/runtime/lampp/Dockerfile +62 -0
  778. package/src/runtime/lampp/Lampp.js +359 -0
  779. package/src/runtime/nginx/Nginx.js +250 -0
  780. package/src/runtime/wp/Dockerfile +62 -0
  781. package/src/runtime/wp/Wp.js +642 -0
  782. package/src/server/auth.js +713 -0
  783. package/src/server/backup.js +102 -0
  784. package/src/server/catalog.js +72 -0
  785. package/src/server/conf.js +2316 -0
  786. package/src/server/cron.js +476 -0
  787. package/src/server/crypto.js +210 -0
  788. package/src/server/data-query.js +461 -0
  789. package/src/server/dns.js +553 -0
  790. package/src/server/downloader.js +73 -0
  791. package/src/server/logger.js +229 -0
  792. package/src/server/middlewares.js +152 -0
  793. package/src/server/peer.js +75 -0
  794. package/src/server/process.js +299 -0
  795. package/src/server/proxy.js +139 -0
  796. package/src/server/runtime-status.js +252 -0
  797. package/src/server/runtime.js +183 -0
  798. package/src/server/start.js +272 -0
  799. package/src/server/tls.js +254 -0
  800. package/src/server/valkey.js +201 -0
  801. package/src/server.js +25 -0
  802. package/src/ws/IoInterface.js +129 -0
  803. package/src/ws/IoServer.js +68 -0
  804. package/src/ws/core/channels/core.ws.chat.js +68 -0
  805. package/src/ws/core/channels/core.ws.mailer.js +116 -0
  806. package/src/ws/core/channels/core.ws.stream.js +90 -0
  807. package/src/ws/core/core.ws.connection.js +41 -0
  808. package/src/ws/core/core.ws.emit.js +37 -0
  809. package/src/ws/core/core.ws.server.js +44 -0
  810. package/src/ws/default/channels/default.ws.main.js +57 -0
  811. package/src/ws/default/default.ws.connection.js +35 -0
  812. package/src/ws/default/default.ws.emit.js +14 -0
  813. package/src/ws/default/default.ws.server.js +39 -0
  814. package/test/api.test.js +53 -0
  815. package/test/crypto.test.js +117 -0
  816. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  817. package/test/deploy-monitor.test.js +267 -0
  818. package/test/shape-generator.test.js +463 -0
  819. package/tsconfig.docs.json +15 -0
  820. package/typedoc.dd-cyberia.json +31 -0
  821. package/typedoc.json +31 -0
@@ -0,0 +1,713 @@
1
+ /**
2
+ * Module for managing identity and authorization
3
+ * @module src/server/auth.js
4
+ * @namespace Auth
5
+ */
6
+
7
+ import jwt from 'jsonwebtoken';
8
+ import { loggerFactory } from './logger.js';
9
+ import crypto from 'crypto';
10
+ import { promisify } from 'util';
11
+ import { UserDto } from '../api/user/user.model.js';
12
+ import {
13
+ commonAdminGuard,
14
+ commonModeratorGuard,
15
+ commonUserGuard,
16
+ validatePassword,
17
+ } from '../client/components/core/CommonJs.js';
18
+ import helmet from 'helmet';
19
+ import rateLimit from 'express-rate-limit';
20
+ import slowDown from 'express-slow-down';
21
+ import cors from 'cors';
22
+ import cookieParser from 'cookie-parser';
23
+ import { DataBaseProviderService } from '../db/DataBaseProvider.js';
24
+ import { isDevProxyContext } from './conf.js';
25
+
26
+ const logger = loggerFactory(import.meta);
27
+
28
+ // Promisified crypto functions
29
+ const pbkdf2 = promisify(crypto.pbkdf2);
30
+
31
+ // Config with sane defaults and parsing
32
+ const config = {
33
+ hashBytes: Number(process.env.PBKDF2_HASH_BYTES) || 32,
34
+ saltBytes: Number(process.env.PBKDF2_SALT_BYTES) || 16,
35
+ iterations: Number(process.env.PBKDF2_ITERATIONS) || 150_000,
36
+ digest: process.env.PBKDF2_DIGEST || 'sha512',
37
+ refreshTokenBytes: Number(process.env.REFRESH_TOKEN_BYTES) || 48,
38
+ jwtAlgorithm: process.env.JWT_ALGORITHM || 'HS512', // consider RS256 with keys
39
+ };
40
+
41
+ // ---------- Password hashing (async) ----------
42
+ /**
43
+ * Hash password asynchronously using PBKDF2.
44
+ * Stored format: iterations$salt$hash
45
+ * @param {string} password The password to hash.
46
+ * @returns {Promise<string>} The hashed password string.
47
+ * @memberof Auth
48
+ */
49
+ async function hashPassword(password) {
50
+ const salt = crypto.randomBytes(config.saltBytes).toString('hex');
51
+ const derived = await pbkdf2(password, salt, config.iterations, config.hashBytes, config.digest);
52
+ return `${config.iterations}$${salt}$${derived.toString('hex')}`;
53
+ }
54
+
55
+ /**
56
+ * Verify password using constant-time comparison
57
+ * @param {string} password The password to verify.
58
+ * @param {string} combined The stored hashed password string (iterations$salt$hash).
59
+ * @returns {Promise<boolean>} True if the password is valid, false otherwise.
60
+ * @memberof Auth
61
+ */
62
+ async function verifyPassword(password, combined) {
63
+ if (!combined) return false;
64
+ const parts = combined.split('$');
65
+ if (parts.length !== 3) return false;
66
+ const [itersStr, salt, originalHex] = parts;
67
+ const iterations = parseInt(itersStr, 10);
68
+ const derived = await pbkdf2(password, salt, iterations, Buffer.from(originalHex, 'hex').length, config.digest);
69
+ const original = Buffer.from(originalHex, 'hex');
70
+ const ok = crypto.timingSafeEqual(derived, original);
71
+ return ok;
72
+ }
73
+
74
+ // ---------- Token hashing & utilities ----------
75
+ /**
76
+ * Hashes a token using SHA256.
77
+ * @param {string} token The token to hash.
78
+ * @returns {string|null} The hashed token as a hex string, or null if token is falsy.
79
+ * @memberof Auth
80
+ */
81
+ function hashToken(token) {
82
+ if (!token) return null;
83
+ return crypto.createHash('sha256').update(token).digest('hex');
84
+ }
85
+
86
+ /**
87
+ * Generates a cryptographically secure random hex string.
88
+ * @param {number} [bytes=config.refreshTokenBytes] The number of bytes to generate.
89
+ * @returns {string} The random hex string.
90
+ * @memberof Auth
91
+ */
92
+ function generateRandomHex(bytes = config.refreshTokenBytes) {
93
+ return crypto.randomBytes(bytes).toString('hex');
94
+ }
95
+
96
+ /**
97
+ * Generates a JWT issuer and audience based on the host and path.
98
+ * @param {object} options The options object.
99
+ * @param {string} options.host The host name.
100
+ * @param {string} options.path The path name.
101
+ * @returns {object} The issuer and audience.
102
+ * @memberof Auth
103
+ */
104
+ function jwtIssuerAudienceFactory(options = { host: '', path: '' }) {
105
+ const audience = `${options.host}${options.path === '/' ? '' : options.path}`;
106
+ const issuer = `${audience}/api`;
107
+ return { issuer, audience };
108
+ }
109
+
110
+ // ---------- JWT helpers ----------
111
+ /**
112
+ * Signs a JWT payload.
113
+ * @param {object} payload The payload to sign.
114
+ * @param {object} [options={}] Additional JWT sign options.
115
+ * @param {string} options.host The host name.
116
+ * @param {string} options.path The path name.
117
+ * @param {number} accessExpireMinutes The access token expiration in minutes.
118
+ * @param {number} refreshExpireMinutes The refresh token expiration in minutes.
119
+ * @returns {string} The signed JWT.
120
+ * @throws {Error} If JWT key is not configured.
121
+ * @memberof Auth
122
+ */
123
+ function jwtSign(
124
+ payload,
125
+ options = { host: '', path: '' },
126
+ accessExpireMinutes = process.env.ACCESS_EXPIRE_MINUTES,
127
+ refreshExpireMinutes = process.env.REFRESH_EXPIRE_MINUTES,
128
+ ) {
129
+ const { issuer, audience } = jwtIssuerAudienceFactory(options);
130
+ const signOptions = {
131
+ algorithm: config.jwtAlgorithm,
132
+ expiresIn: `${accessExpireMinutes}m`,
133
+ issuer,
134
+ audience,
135
+ };
136
+
137
+ if (!payload.jwtid) signOptions.jwtid = generateRandomHex();
138
+
139
+ if (!process.env.JWT_SECRET) throw new Error('JWT key not configured');
140
+
141
+ // Add refreshExpiresAt to the payload, which is the same as the token's own expiry.
142
+ const now = Date.now();
143
+ payload.refreshExpiresAt = now + refreshExpireMinutes * 60 * 1000;
144
+
145
+ logger.info('JWT signed', { payload, signOptions, accessExpireMinutes, refreshExpireMinutes });
146
+
147
+ return jwt.sign(payload, process.env.JWT_SECRET, signOptions);
148
+ }
149
+
150
+ /**
151
+ * Verifies a JWT.
152
+ * @param {string} token The JWT to verify.
153
+ * @param {object} [options={}] Additional JWT verify options.
154
+ * @param {string} options.host The host name.
155
+ * @param {string} options.path The path name.
156
+ * @returns {object} The decoded payload.
157
+ * @throws {jwt.JsonWebTokenError} If the token is invalid or expired.
158
+ * @memberof Auth
159
+ */
160
+ function jwtVerify(token, options = { host: '', path: '' }) {
161
+ try {
162
+ const { issuer, audience } = jwtIssuerAudienceFactory(options);
163
+ const verifyOptions = {
164
+ algorithms: [config.jwtAlgorithm],
165
+ issuer,
166
+ audience,
167
+ };
168
+ return jwt.verify(token, process.env.JWT_SECRET, verifyOptions);
169
+ } catch (err) {
170
+ throw err;
171
+ }
172
+ }
173
+
174
+ // ---------- Request helpers ----------
175
+ /**
176
+ * Extracts the Bearer token from the request headers.
177
+ * @param {import('express').Request} req The Express request object.
178
+ * @returns {string} The token, or an empty string if not found.
179
+ * @memberof Auth
180
+ */
181
+ const getBearerToken = (req) => {
182
+ const header = String(req.headers['authorization'] || req.headers['Authorization'] || '');
183
+ if (header.startsWith('Bearer ')) return header.slice(7).trim();
184
+ return '';
185
+ };
186
+
187
+ /**
188
+ * Checks if the request is a refresh token request.
189
+ * @param {import('express').Request} req The Express request object.
190
+ * @returns {boolean} True if the request is a refresh token request, false otherwise.
191
+ * @memberof Auth
192
+ */
193
+ const isRefreshTokenReq = (req) => req.method === 'GET' && req.params.id === 'auth';
194
+
195
+ // ---------- Middleware ----------
196
+ /**
197
+ * Creates a middleware to authenticate requests using a JWT Bearer token.
198
+ * @param {object} options The options object.
199
+ * @param {string} options.host The host name.
200
+ * @param {string} options.path The path name.
201
+ * @returns {function} The middleware function.
202
+ * @memberof Auth
203
+ */
204
+ const authMiddlewareFactory = (options = { host: '', path: '' }) => {
205
+ /**
206
+ * Express middleware to authenticate requests using a JWT Bearer token.
207
+ * @param {import('express').Request} req The Express request object.
208
+ * @param {import('express').Response} res The Express response object.
209
+ * @param {import('express').NextFunction} next The next middleware function.
210
+ * @memberof Auth
211
+ */
212
+ const authMiddleware = async (req, res, next) => {
213
+ try {
214
+ const token = getBearerToken(req);
215
+ if (!token) return res.status(401).json({ status: 'error', message: 'unauthorized: token missing' });
216
+
217
+ const payload = jwtVerify(token, options);
218
+
219
+ // Validate IP and User-Agent to mitigate token theft
220
+ if (payload.ip && payload.ip !== req.ip) {
221
+ logger.warn(`IP mismatch for ${payload._id}: jwt(${payload.ip}) !== req(${req.ip})`);
222
+ return res.status(401).json({ status: 'error', message: 'unauthorized: ip mismatch' });
223
+ }
224
+
225
+ if (payload.userAgent && payload.userAgent !== req.headers['user-agent']) {
226
+ logger.warn(`UA mismatch for ${payload._id}`);
227
+ return res.status(401).json({ status: 'error', message: 'unauthorized device' });
228
+ }
229
+
230
+ // Non-guest verify session exists
231
+ if (payload.jwtid && payload.role !== 'guest') {
232
+ const User = DataBaseProviderService.getModel('user', { host: payload.host, path: payload.path });
233
+ const user = await User.findOne({ _id: payload._id, 'activeSessions._id': payload.jwtid }).lean();
234
+
235
+ if (!user) {
236
+ return res.status(401).json({ status: 'error', message: 'unauthorized: invalid session' });
237
+ }
238
+ const session = user.activeSessions.find((s) => s._id.toString() === payload.jwtid);
239
+
240
+ if (!session) {
241
+ return res.status(401).json({ status: 'error', message: 'unauthorized: invalid session' });
242
+ }
243
+
244
+ // check session ip
245
+ if (session.ip !== req.ip) {
246
+ logger.warn(`IP mismatch for ${payload._id}: jwt(${session.ip}) !== req(${req.ip})`);
247
+ return res.status(401).json({ status: 'error', message: 'unauthorized: ip mismatch' });
248
+ }
249
+
250
+ // check session userAgent
251
+ if (session.userAgent !== req.headers['user-agent']) {
252
+ logger.warn(`UA mismatch for ${payload._id}`);
253
+ return res.status(401).json({ status: 'error', message: 'unauthorized device' });
254
+ }
255
+
256
+ // compare payload host and path with session host and path
257
+ if (payload.host !== session.host || payload.path !== session.path) {
258
+ logger.warn(`Host or path mismatch for ${payload._id}`);
259
+ return res.status(401).json({ status: 'error', message: 'unauthorized: host or path mismatch' });
260
+ }
261
+
262
+ if (!isRefreshTokenReq(req) && session.expiresAt < new Date()) {
263
+ return res.status(401).json({ status: 'error', message: 'unauthorized: session expired' });
264
+ }
265
+ }
266
+
267
+ req.auth = { user: payload };
268
+ return next();
269
+ } catch (err) {
270
+ logger.warn('authMiddleware error', err && err.message);
271
+ return res.status(401).json({ status: 'error', message: 'unauthorized' });
272
+ }
273
+ };
274
+ return authMiddleware;
275
+ };
276
+
277
+ /**
278
+ * Express middleware to guard routes for admin users.
279
+ * @param {import('express').Request} req The Express request object.
280
+ * @param {import('express').Response} res The Express response object.
281
+ * @param {import('express').NextFunction} next The next middleware function.
282
+ * @memberof Auth
283
+ */
284
+ const adminGuard = (req, res, next) => {
285
+ try {
286
+ if (!req.auth || !commonAdminGuard(req.auth.user.role))
287
+ return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
288
+ return next();
289
+ } catch (err) {
290
+ logger.error(err);
291
+ return res.status(400).json({ status: 'error', message: 'bad request' });
292
+ }
293
+ };
294
+ /**
295
+ * Express middleware to guard routes for moderator or admin users.
296
+ * @param {import('express').Request} req The Express request object.
297
+ * @param {import('express').Response} res The Express response object.
298
+ * @param {import('express').NextFunction} next The next middleware function.
299
+ * @memberof Auth
300
+ */
301
+ const moderatorGuard = (req, res, next) => {
302
+ try {
303
+ if (!req.auth || !commonModeratorGuard(req.auth.user.role))
304
+ return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
305
+ return next();
306
+ } catch (err) {
307
+ logger.error(err);
308
+ return res.status(400).json({ status: 'error', message: 'bad request' });
309
+ }
310
+ };
311
+ /**
312
+ * Express middleware to guard routes for authenticated users (any non-guest role).
313
+ * @param {import('express').Request} req The Express request object.
314
+ * @param {import('express').Response} res The Express response object.
315
+ * @param {import('express').NextFunction} next The next middleware function.
316
+ * @memberof Auth
317
+ */
318
+ const userGuard = (req, res, next) => {
319
+ try {
320
+ if (!req.auth || !commonUserGuard(req.auth.user.role))
321
+ return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
322
+ return next();
323
+ } catch (err) {
324
+ logger.error(err);
325
+ return res.status(400).json({ status: 'error', message: 'bad request' });
326
+ }
327
+ };
328
+
329
+ // ---------- Password validation middleware (server-side) ----------
330
+ /**
331
+ * Validates the password from the request body.
332
+ * @param {import('express').Request} req The Express request object.
333
+ * @returns {{status: 'success'}|{status: 'error', message: string}} Validation result.
334
+ * @memberof Auth
335
+ */
336
+ const validatePasswordMiddleware = (req) => {
337
+ const errors = req.body && 'password' in req.body ? validatePassword(req.body.password) : [];
338
+ if (errors.length) {
339
+ return { status: 'error', message: 'Password: ' + errors.map((e) => e[req.lang] || e.en || e).join(', ') };
340
+ }
341
+ return { status: 'success' };
342
+ };
343
+
344
+ // ---------- Session & Refresh token management ----------
345
+
346
+ /**
347
+ * Creates cookie options for the refresh token.
348
+ * @param {import('express').Request} req The Express request object.
349
+ * @param {string} host The host name.
350
+ * @returns {object} Cookie options.
351
+ * @memberof Auth
352
+ */
353
+ const cookieOptionsFactory = (req, host) => {
354
+ const isProduction = process.env.NODE_ENV === 'production';
355
+
356
+ // Determine if request is secure: respect X-Forwarded-Proto when behind proxy
357
+ const forwardedProto = (req.headers && req.headers['x-forwarded-proto']) || '';
358
+ const reqIsSecure = Boolean(req.secure || forwardedProto.split(',')[0] === 'https');
359
+
360
+ // secure must be true for SameSite=None to work across sites
361
+ const secure = isProduction ? reqIsSecure : req.protocol === 'https';
362
+ const sameSite = secure ? 'None' : 'Lax';
363
+
364
+ // Safe parse of maxAge minutes
365
+ const maxAge = parseInt(process.env.ACCESS_EXPIRE_MINUTES) * 60 * 1000;
366
+
367
+ const opts = {
368
+ httpOnly: true,
369
+ secure,
370
+ sameSite,
371
+ path: '/',
372
+ domain: process.env.NODE_ENV === 'production' || isDevProxyContext() ? host : 'localhost',
373
+ maxAge,
374
+ };
375
+
376
+ return opts;
377
+ };
378
+
379
+ /**
380
+ * Create session and set refresh cookie. Rotating and hashed stored token.
381
+ * @param {object} user The user object.
382
+ * @param {import('mongoose').Model} User The Mongoose User model.
383
+ * @param {import('express').Request} req The Express request object.
384
+ * @param {import('express').Response} res The Express response object.
385
+ * @param {object} options Additional options.
386
+ * @param {string} options.host The host name.
387
+ * @param {string} options.path The path name.
388
+ * @returns {Promise<{jwtid: string}>} The session ID.
389
+ * @memberof Auth
390
+ */
391
+ async function createSessionAndUserToken(user, User, req, res, options = { host: '', path: '' }) {
392
+ const refreshToken = hashToken(generateRandomHex());
393
+ const now = Date.now();
394
+ const expiresAt = new Date(now + parseInt(process.env.REFRESH_EXPIRE_MINUTES) * 60 * 1000);
395
+
396
+ const newSession = {
397
+ tokenHash: refreshToken,
398
+ ip: req.ip,
399
+ userAgent: req.headers['user-agent'],
400
+ host: options.host,
401
+ path: options.path,
402
+ createdAt: new Date(now),
403
+ expiresAt,
404
+ };
405
+
406
+ // push session
407
+ const updatedUser = await User.findByIdAndUpdate(
408
+ user._id,
409
+ { $push: { activeSessions: newSession } },
410
+ { returnDocument: 'after' },
411
+ );
412
+ const session = updatedUser.activeSessions[updatedUser.activeSessions.length - 1];
413
+ const jwtid = session._id.toString();
414
+
415
+ // Secure cookie settings
416
+ res.cookie('refreshToken', refreshToken, cookieOptionsFactory(req, options.host));
417
+
418
+ return { jwtid };
419
+ }
420
+
421
+ /**
422
+ * Removes a session by its ID for a given user.
423
+ * @param {import('mongoose').Model} User The Mongoose User model.
424
+ * @param {string} userId The ID of the user.
425
+ * @param {string} sessionId The ID of the session to remove.
426
+ * @returns {Promise<void>}
427
+ * @memberof Auth
428
+ */
429
+ async function removeSession(User, userId, sessionId) {
430
+ return await User.updateOne({ _id: userId }, { $pull: { activeSessions: { _id: sessionId } } });
431
+ }
432
+
433
+ /**
434
+ * Logs out a user session by removing it from the database and clearing the refresh token cookie.
435
+ * @param {import('mongoose').Model} User The Mongoose User model.
436
+ * @param {import('express').Request} req The Express request object.
437
+ * @param {import('express').Response} res The Express response object.
438
+ * @returns {Promise<boolean>} True if a session was found and removed, false otherwise.
439
+ * @memberof Auth
440
+ */
441
+ async function logoutSession(User, req, res) {
442
+ const refreshToken = req.cookies?.refreshToken;
443
+
444
+ if (!refreshToken) {
445
+ return false;
446
+ }
447
+
448
+ const user = await User.findOne({ 'activeSessions.tokenHash': refreshToken });
449
+
450
+ if (!user) {
451
+ return false;
452
+ }
453
+
454
+ const session = user.activeSessions.find((s) => s.tokenHash === refreshToken);
455
+
456
+ const result = await removeSession(User, user._id, session._id);
457
+
458
+ res.clearCookie('refreshToken', { path: '/' });
459
+
460
+ return result.modifiedCount > 0;
461
+ }
462
+
463
+ /**
464
+ * Create user and immediate session + access token
465
+ * @param {import('express').Request} req The Express request object.
466
+ * @param {import('express').Response} res The Express response object.
467
+ * @param {import('mongoose').Model} User The Mongoose User model.
468
+ * @param {object} [options={}] Additional options.
469
+ * @param {string} options.host The host name.
470
+ * @param {string} options.path The path name.
471
+ * @returns {Promise<{token: string, user: object}>} The access token and user object.
472
+ * @throws {Error} If password validation fails.
473
+ * @memberof Auth
474
+ */
475
+ async function createUserAndSession(req, res, User, options = { host: '', path: '' }) {
476
+ const pwdCheck = validatePasswordMiddleware(req);
477
+ if (pwdCheck.status === 'error') throw new Error(pwdCheck.message);
478
+
479
+ req.body.password = await hashPassword(req.body.password);
480
+ req.body.role = req.body.role === 'guest' ? 'guest' : 'user';
481
+
482
+ const saved = await new User(req.body).save();
483
+ const user = await User.findOne({ _id: saved._id }).select(UserDto.select.get());
484
+
485
+ const { jwtid } = await createSessionAndUserToken(user, User, req, res, options);
486
+ const token = jwtSign(
487
+ UserDto.auth.payload(user, jwtid, req.ip, req.headers['user-agent'], options.host, options.path),
488
+ options,
489
+ );
490
+ return { token, user };
491
+ }
492
+
493
+ /**
494
+ * Refresh session and rotate refresh token.
495
+ * Detect token reuse: if a refresh token is presented but not found, consider
496
+ * it a possible theft and revoke all sessions for that user.
497
+ * @param {import('express').Request} req The Express request object.
498
+ * @param {import('express').Response} res The Express response object.
499
+ * @param {import('mongoose').Model} User The Mongoose User model.
500
+ * @param {object} options Additional options.
501
+ * @param {string} options.host The host name.
502
+ * @param {string} options.path The path name.
503
+ * @returns {Promise<{token: string}>} The new access token.
504
+ * @throws {Error} If the refresh token is missing, invalid, or expired.
505
+ * @memberof Auth
506
+ */
507
+ async function refreshSessionAndToken(req, res, User, options = { host: '', path: '' }) {
508
+ const currentRefreshToken = req.cookies.refreshToken;
509
+ if (!currentRefreshToken) throw new Error('Refresh token missing');
510
+
511
+ // Find user owning that token
512
+ const user = await User.findOne({ 'activeSessions.tokenHash': currentRefreshToken });
513
+
514
+ if (!user) {
515
+ // Possible token reuse: look up user by some other signals? If not possible, log and throw.
516
+ // TODO: on cors requests, this will throw an error, because the cookie is not sent.
517
+ logger.warn('Refresh token reuse or invalid token detected');
518
+ // Optional: revoke by clearing cookie and returning unauthorized
519
+ res.clearCookie('refreshToken', { path: '/' });
520
+ throw new Error('Invalid refresh token');
521
+ }
522
+
523
+ // Locate session
524
+ const session = user.activeSessions.find((s) => s.tokenHash === currentRefreshToken);
525
+ if (!session) {
526
+ // Shouldn't happen, but safe-guard
527
+ res.clearCookie('refreshToken', { path: '/' });
528
+ throw new Error('Session not found');
529
+ }
530
+
531
+ // Check expiry
532
+ if (!isRefreshTokenReq(req) && session.expiresAt && session.expiresAt < new Date()) {
533
+ const result = await removeSession(User, user._id, session._id);
534
+ if (result) throw new Error('Refresh token expired');
535
+ else throw new Error('Session not found');
536
+ }
537
+
538
+ // Rotate: generate new token, update stored hash and metadata
539
+ const refreshToken = hashToken(generateRandomHex());
540
+ session.tokenHash = refreshToken;
541
+ session.expiresAt = new Date(Date.now() + parseInt(process.env.REFRESH_EXPIRE_MINUTES) * 60 * 1000);
542
+ session.ip = req.ip;
543
+ session.userAgent = req.headers['user-agent'];
544
+ await user.save({ validateBeforeSave: false });
545
+
546
+ logger.warn('Refreshed session for user ' + user.email);
547
+
548
+ res.cookie('refreshToken', refreshToken, cookieOptionsFactory(req, options.host));
549
+
550
+ return jwtSign(
551
+ UserDto.auth.payload(user, session._id.toString(), req.ip, req.headers['user-agent'], options.host, options.path),
552
+ options,
553
+ );
554
+ }
555
+
556
+ // ---------- Security middleware composition ----------
557
+ /**
558
+ * Applies a set of security-related middleware to an Express app.
559
+ * @param {import('express').Application} app The Express application.
560
+ * @param {object} [opts={}] Options for security middleware.
561
+ * @param {string[]} opts.origin Allowed origins for CORS.
562
+ * @param {object} opts.rate Rate limiting options for `express-rate-limit`.
563
+ * @param {object} opts.slowdown Slow down options for `express-slow-down`.
564
+ * @param {object} opts.cookie Cookie options.
565
+ * @param {string[]} opts.frameAncestors Allowed frame ancestors for CSP.
566
+ * @memberof Auth
567
+ */
568
+ function applySecurity(app, opts = {}) {
569
+ const {
570
+ origin,
571
+ rate = { windowMs: 15 * 60 * 1000, max: 500 },
572
+ slowdown = { windowMs: 15 * 60 * 1000, delayAfter: 50, delayMs: () => 500 },
573
+ cookie = { secure: process.env.NODE_ENV === 'production', sameSite: 'Strict' },
574
+ frameAncestors = ["'self'"],
575
+ } = opts;
576
+
577
+ app.disable('x-powered-by');
578
+
579
+ // Generate nonce per request and attach to res.locals for templates
580
+ app.use((req, res, next) => {
581
+ res.locals.nonce = crypto.randomBytes(16).toString('base64');
582
+ next();
583
+ });
584
+
585
+ // Basic header hardening with Helmet
586
+ app.use(
587
+ helmet({
588
+ // We'll customize CSP below because many apps need tailored directives
589
+ crossOriginEmbedderPolicy: true,
590
+ crossOriginOpenerPolicy: { policy: 'same-origin' },
591
+ crossOriginResourcePolicy: { policy: 'same-origin' },
592
+ originAgentCluster: false,
593
+ // Permissions-Policy (formerly Feature-Policy) — limit powerful features
594
+ permissionsPolicy: {
595
+ // example: disable geolocation, camera, microphone, payment
596
+ features: {
597
+ fullscreen: ["'self'"],
598
+ geolocation: [],
599
+ camera: [],
600
+ microphone: [],
601
+ payment: [],
602
+ },
603
+ },
604
+ }),
605
+ );
606
+
607
+ // Strict HSTS (only enable in production over TLS)
608
+ // maxAge in seconds (e.g. 31536000 = 1 year). Use includeSubDomains and preload carefully.
609
+ if (process.env.NODE_ENV === 'production') {
610
+ app.use(
611
+ helmet.hsts({
612
+ maxAge: 31536000,
613
+ includeSubDomains: true,
614
+ preload: true,
615
+ }),
616
+ );
617
+ }
618
+
619
+ // Other helpful Helmet policies
620
+ app.use(helmet.noSniff()); // X-Content-Type-Options: nosniff
621
+ app.use(helmet.frameguard({ action: 'deny' })); // X-Frame-Options: DENY
622
+ app.use(helmet.referrerPolicy({ policy: 'no-referrer-when-downgrade' }));
623
+
624
+ // Content-Security-Policy: include nonce from res.locals
625
+ // Note: We avoid 'unsafe-inline' on script/style. Use nonces or hashes.
626
+ const httpDirective = process.env.NODE_ENV === 'production' ? 'https:' : 'http:';
627
+ app.use(
628
+ helmet.contentSecurityPolicy({
629
+ useDefaults: true,
630
+ directives: {
631
+ defaultSrc: ["'self'"],
632
+ baseUri: ["'self'"],
633
+ blockAllMixedContent: [],
634
+ fontSrc: ["'self'", httpDirective, 'data:'],
635
+ frameAncestors: frameAncestors,
636
+ imgSrc: ["'self'", 'data:', httpDirective, 'https:', 'blob:'],
637
+ objectSrc: ["'none'"],
638
+ // script-src and script-src-elem: use 'unsafe-inline' for swagger (no nonce, otherwise
639
+ // the nonce causes 'unsafe-inline' to be ignored per CSP3 spec), nonce for everything else.
640
+ scriptSrc: ["'self'", (req, res) => (res.locals.isSwagger ? "'unsafe-inline'" : `'nonce-${res.locals.nonce}'`)],
641
+ scriptSrcElem: [
642
+ "'self'",
643
+ (req, res) => (res.locals.isSwagger ? "'unsafe-inline'" : `'nonce-${res.locals.nonce}'`),
644
+ ],
645
+ // style-src: avoid 'unsafe-inline' when possible; if you must inline styles,
646
+ // use a nonce for them too (or hash).
647
+ styleSrc: [
648
+ "'self'",
649
+ httpDirective,
650
+ (req, res) => (res.locals.isSwagger ? "'unsafe-inline'" : `'nonce-${res.locals.nonce}'`),
651
+ ],
652
+ styleSrcAttr: [(req, res) => (res.locals.isSwagger ? "'unsafe-inline'" : "'none'")],
653
+ // deny plugins
654
+ objectSrc: ["'none'"],
655
+ },
656
+ }),
657
+ );
658
+
659
+ // CORS - be explicit. In production, pass allowed origin(s) as opts.origin
660
+ app.use(
661
+ cors({
662
+ origin: origin || false,
663
+ methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
664
+ credentials: true,
665
+ allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'withcredentials', 'credentials'],
666
+ maxAge: 600,
667
+ }),
668
+ );
669
+ logger.info('Cors origin', origin);
670
+ if (!process.env.DISABLE_API_RATE_LIMIT) {
671
+ // Rate limiting + slow down
672
+ const limiter = rateLimit({
673
+ windowMs: rate.windowMs,
674
+ max: rate.max,
675
+ standardHeaders: true,
676
+ legacyHeaders: false,
677
+ message: { error: 'Too many requests, please try again later.' },
678
+ });
679
+ app.use(limiter);
680
+
681
+ const speedLimiter = slowDown({
682
+ windowMs: slowdown.windowMs,
683
+ delayAfter: slowdown.delayAfter,
684
+ delayMs: () => slowdown.delayMs,
685
+ });
686
+ app.use(speedLimiter);
687
+ }
688
+ // Cookie parsing
689
+ app.use(cookieParser(process.env.JWT_SECRET));
690
+ }
691
+
692
+ export {
693
+ authMiddlewareFactory,
694
+ hashPassword,
695
+ verifyPassword,
696
+ hashToken,
697
+ jwtSign,
698
+ jwtVerify,
699
+ jwtSign as hashJWT,
700
+ jwtVerify as verifyJWT,
701
+ adminGuard,
702
+ moderatorGuard,
703
+ userGuard,
704
+ validatePasswordMiddleware,
705
+ getBearerToken,
706
+ createSessionAndUserToken,
707
+ createUserAndSession,
708
+ refreshSessionAndToken,
709
+ logoutSession,
710
+ removeSession,
711
+ applySecurity,
712
+ isRefreshTokenReq,
713
+ };