cyberia 3.2.5 → 3.2.9

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 (301) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +2 -2
  2. package/.github/workflows/release.cd.yml +1 -2
  3. package/CHANGELOG.md +351 -1
  4. package/CLI-HELP.md +40 -13
  5. package/Dockerfile +0 -4
  6. package/README.md +242 -497
  7. package/bin/build.js +19 -5
  8. package/bin/cyberia.js +1149 -240
  9. package/bin/deploy.js +570 -1
  10. package/bin/file.js +6 -0
  11. package/bin/index.js +1149 -240
  12. package/bin/vs.js +1 -1
  13. package/conf.js +67 -89
  14. package/deployment.yaml +4 -222
  15. package/hardhat/package-lock.json +32 -32
  16. package/hardhat/package.json +3 -3
  17. package/jsconfig.json +1 -1
  18. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  19. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  20. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
  21. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  22. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  23. package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
  24. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  25. package/package.json +23 -14
  26. package/proxy.yaml +10 -118
  27. package/scripts/k3s-node-setup.sh +2 -2
  28. package/scripts/nat-iptables.sh +103 -18
  29. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  30. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  31. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
  32. package/src/api/core/core.controller.js +10 -10
  33. package/src/api/core/core.service.js +10 -10
  34. package/src/api/crypto/crypto.controller.js +8 -8
  35. package/src/api/crypto/crypto.service.js +8 -8
  36. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  37. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  38. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  39. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  40. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  41. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  42. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  43. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
  44. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  45. package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
  46. package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
  47. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  48. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  49. package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
  50. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  51. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  52. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  53. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
  54. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
  55. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
  56. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  57. package/src/api/cyberia-map/cyberia-map.service.js +10 -10
  58. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  59. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  60. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  61. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  62. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  63. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  64. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  65. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  66. package/src/api/default/default.controller.js +10 -10
  67. package/src/api/default/default.service.js +10 -10
  68. package/src/api/document/document.controller.js +12 -12
  69. package/src/api/document/document.model.js +10 -16
  70. package/src/api/file/file.controller.js +8 -8
  71. package/src/api/file/file.model.js +10 -10
  72. package/src/api/file/file.service.js +36 -36
  73. package/src/api/instance/instance.controller.js +10 -10
  74. package/src/api/instance/instance.model.js +4 -10
  75. package/src/api/instance/instance.service.js +10 -10
  76. package/src/api/ipfs/ipfs.controller.js +12 -12
  77. package/src/api/ipfs/ipfs.model.js +4 -13
  78. package/src/api/ipfs/ipfs.service.js +14 -28
  79. package/src/api/object-layer/object-layer.controller.js +12 -12
  80. package/src/api/object-layer/object-layer.model.js +4 -17
  81. package/src/api/object-layer/object-layer.service.js +12 -12
  82. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  83. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  84. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  85. package/src/api/test/test.controller.js +8 -8
  86. package/src/api/test/test.service.js +8 -8
  87. package/src/api/user/guest.service.js +99 -0
  88. package/src/api/user/user.controller.js +6 -6
  89. package/src/api/user/user.model.js +8 -13
  90. package/src/api/user/user.service.js +3 -20
  91. package/src/cli/cluster.js +61 -14
  92. package/src/cli/db.js +47 -2
  93. package/src/cli/deploy.js +67 -35
  94. package/src/cli/fs.js +79 -8
  95. package/src/cli/image.js +43 -1
  96. package/src/cli/index.js +26 -1
  97. package/src/cli/release.js +57 -1
  98. package/src/cli/repository.js +69 -31
  99. package/src/cli/run.js +415 -36
  100. package/src/cli/ssh.js +1 -1
  101. package/src/cli/static.js +43 -115
  102. package/src/client/Cryptokoyn.index.js +18 -21
  103. package/src/client/CyberiaPortal.index.js +19 -23
  104. package/src/client/Default.index.js +21 -33
  105. package/src/client/Itemledger.index.js +20 -26
  106. package/src/client/Underpost.index.js +19 -23
  107. package/src/client/components/core/404.js +4 -4
  108. package/src/client/components/core/500.js +4 -4
  109. package/src/client/components/core/Account.js +73 -60
  110. package/src/client/components/core/AgGrid.js +23 -33
  111. package/src/client/components/core/Alert.js +12 -13
  112. package/src/client/components/core/AppStore.js +1 -1
  113. package/src/client/components/core/Auth.js +35 -37
  114. package/src/client/components/core/Badge.js +7 -13
  115. package/src/client/components/core/BtnIcon.js +15 -17
  116. package/src/client/components/core/CalendarCore.js +42 -63
  117. package/src/client/components/core/Chat.js +13 -15
  118. package/src/client/components/core/ClientEvents.js +87 -0
  119. package/src/client/components/core/ColorPaletteElement.js +309 -0
  120. package/src/client/components/core/Content.js +17 -14
  121. package/src/client/components/core/Css.js +15 -71
  122. package/src/client/components/core/CssCore.js +12 -16
  123. package/src/client/components/core/D3Chart.js +4 -4
  124. package/src/client/components/core/Docs.js +64 -91
  125. package/src/client/components/core/DropDown.js +69 -91
  126. package/src/client/components/core/EventBus.js +92 -0
  127. package/src/client/components/core/EventsUI.js +14 -17
  128. package/src/client/components/core/FileExplorer.js +96 -228
  129. package/src/client/components/core/FullScreen.js +47 -75
  130. package/src/client/components/core/Input.js +24 -69
  131. package/src/client/components/core/Keyboard.js +25 -18
  132. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  133. package/src/client/components/core/LoadingAnimation.js +25 -31
  134. package/src/client/components/core/LogIn.js +41 -41
  135. package/src/client/components/core/LogOut.js +23 -14
  136. package/src/client/components/core/Modal.js +462 -178
  137. package/src/client/components/core/NotificationManager.js +14 -18
  138. package/src/client/components/core/Panel.js +54 -50
  139. package/src/client/components/core/PanelForm.js +25 -125
  140. package/src/client/components/core/Polyhedron.js +110 -214
  141. package/src/client/components/core/PublicProfile.js +39 -32
  142. package/src/client/components/core/Recover.js +48 -44
  143. package/src/client/components/core/Responsive.js +88 -32
  144. package/src/client/components/core/RichText.js +9 -18
  145. package/src/client/components/core/Router.js +24 -3
  146. package/src/client/components/core/SearchBox.js +37 -37
  147. package/src/client/components/core/SignUp.js +39 -30
  148. package/src/client/components/core/SocketIo.js +31 -2
  149. package/src/client/components/core/SocketIoHandler.js +6 -6
  150. package/src/client/components/core/ToggleSwitch.js +8 -20
  151. package/src/client/components/core/ToolTip.js +5 -17
  152. package/src/client/components/core/Translate.js +56 -59
  153. package/src/client/components/core/Validator.js +26 -16
  154. package/src/client/components/core/Wallet.js +15 -26
  155. package/src/client/components/core/Worker.js +163 -27
  156. package/src/client/components/core/windowGetDimensions.js +7 -7
  157. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  158. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  159. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  160. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  161. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  162. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  163. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  164. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  165. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  166. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  167. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  168. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  169. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  170. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
  171. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  172. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  173. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  174. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  175. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  176. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  177. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  178. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  179. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  180. package/src/client/components/default/CssDefault.js +12 -12
  181. package/src/client/components/default/LogInDefault.js +6 -4
  182. package/src/client/components/default/LogOutDefault.js +6 -4
  183. package/src/client/components/default/RouterDefault.js +47 -0
  184. package/src/client/components/default/SettingsDefault.js +4 -4
  185. package/src/client/components/default/SignUpDefault.js +6 -4
  186. package/src/client/components/default/TranslateDefault.js +3 -3
  187. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  188. package/src/client/components/itemledger/CssItemledger.js +15 -15
  189. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  190. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  191. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  192. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  193. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  194. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  195. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  196. package/src/client/components/underpost/CssUnderpost.js +14 -14
  197. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  198. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  199. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  200. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  201. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  202. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  203. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  204. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  205. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  206. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  207. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  208. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  209. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  210. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  211. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  212. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  213. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  214. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  215. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  216. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  217. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  218. package/src/client/services/core/core.service.js +17 -49
  219. package/src/client/services/crypto/crypto.service.js +8 -13
  220. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  221. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  222. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  223. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  224. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  225. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  226. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  227. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  228. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  229. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  230. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  231. package/src/client/services/default/default.management.js +159 -267
  232. package/src/client/services/default/default.service.js +10 -16
  233. package/src/client/services/document/document.service.js +14 -19
  234. package/src/client/services/file/file.service.js +8 -13
  235. package/src/client/services/instance/instance.management.js +5 -5
  236. package/src/client/services/instance/instance.service.js +10 -15
  237. package/src/client/services/ipfs/ipfs.service.js +12 -18
  238. package/src/client/services/object-layer/object-layer.management.js +12 -12
  239. package/src/client/services/object-layer/object-layer.service.js +20 -26
  240. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  241. package/src/client/services/test/test.service.js +8 -13
  242. package/src/client/services/user/guest.service.js +86 -0
  243. package/src/client/services/user/user.management.js +5 -5
  244. package/src/client/services/user/user.service.js +14 -20
  245. package/src/client/ssr/body/404.js +3 -3
  246. package/src/client/ssr/body/500.js +3 -3
  247. package/src/client/ssr/body/CacheControl.js +5 -2
  248. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  249. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  250. package/src/client/ssr/head/PwaItemledger.js +197 -60
  251. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  252. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  253. package/src/client/ssr/offline/Maintenance.js +12 -11
  254. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  255. package/src/client/ssr/pages/Test.js +2 -2
  256. package/src/client/sw/core.sw.js +212 -0
  257. package/src/grpc/cyberia/grpc-server.js +179 -67
  258. package/src/index.js +1 -1
  259. package/src/runtime/cyberia-client/Dockerfile +80 -0
  260. package/src/runtime/cyberia-server/Dockerfile +37 -0
  261. package/src/runtime/express/Dockerfile +4 -4
  262. package/src/runtime/lampp/Dockerfile +8 -7
  263. package/src/runtime/wp/Dockerfile +11 -17
  264. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  265. package/src/server/client-build-docs.js +45 -46
  266. package/src/server/client-build.js +334 -60
  267. package/src/server/client-formatted.js +47 -16
  268. package/src/server/conf.js +5 -4
  269. package/src/server/data-query.js +32 -20
  270. package/src/server/dns.js +22 -0
  271. package/src/server/ipfs-client.js +232 -91
  272. package/src/server/object-layer.js +1 -6
  273. package/src/server/process.js +13 -27
  274. package/src/server/semantic-layer-generator-floor.js +11 -51
  275. package/src/server/semantic-layer-generator-resource.js +259 -0
  276. package/src/server/semantic-layer-generator-skin.js +41 -171
  277. package/src/server/semantic-layer-generator.js +122 -14
  278. package/src/server/shape-generator.js +108 -0
  279. package/src/server/start.js +17 -3
  280. package/src/server/valkey.js +141 -235
  281. package/tsconfig.docs.json +15 -0
  282. package/typedoc.dd-cyberia.json +29 -0
  283. package/typedoc.json +29 -0
  284. package/WHITE-PAPER.md +0 -1540
  285. package/hardhat/README.md +0 -531
  286. package/hardhat/WHITE-PAPER.md +0 -1540
  287. package/jsdoc.dd-cyberia.json +0 -68
  288. package/jsdoc.json +0 -68
  289. package/src/api/object-layer/README.md +0 -672
  290. package/src/client/components/core/ColorPalette.js +0 -5267
  291. package/src/client/components/core/JoyStick.js +0 -80
  292. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  293. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  294. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  295. package/src/client/components/default/RoutesDefault.js +0 -49
  296. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  297. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  298. package/src/client/sw/default.sw.js +0 -127
  299. package/src/client/sw/template.sw.js +0 -84
  300. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  301. package/src/grpc/cyberia/README.md +0 -326
@@ -1,26 +1,111 @@
1
1
  #!/bin/bash
2
2
  set -euo pipefail
3
3
 
4
- # Disable firewalld
5
- sudo systemctl disable --now iptables
6
- sudo systemctl disable --now ufw
7
- sudo systemctl disable --now firewalld
4
+ echo "[INFO] Enabling firewalld..."
5
+ sudo systemctl enable --now firewalld
8
6
 
7
+ echo "[INFO] Configuring kernel networking..."
9
8
 
10
- # Remove any existing entries, then append exactly one
11
- sudo sed -i '/^net.ipv4.ip_forward/d' /etc/sysctl.conf
12
- sudo sed -i '/^net.ipv6.conf.all.forwarding/d' /etc/sysctl.conf
13
- echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
14
- echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf
15
- # ---
9
+ sudo tee /etc/sysctl.d/99-kubernetes.conf >/dev/null <<'EOF'
10
+ # Kubernetes networking
11
+ net.ipv4.ip_forward = 1
12
+ net.ipv6.conf.all.forwarding = 1
16
13
 
17
- sudo sysctl -p
14
+ # Required for Kubernetes iptables
15
+ net.bridge.bridge-nf-call-iptables = 1
16
+ net.bridge.bridge-nf-call-ip6tables = 1
18
17
 
19
- # Accept all traffic
20
- sudo iptables -P INPUT ACCEPT
21
- sudo iptables -P FORWARD ACCEPT
22
- sudo iptables -P OUTPUT ACCEPT
18
+ # Better conntrack handling
19
+ net.netfilter.nf_conntrack_max = 131072
20
+ EOF
23
21
 
24
- # List iptables rules and forwarding flag
25
- sudo iptables -L -n
26
- sysctl net.ipv4.ip_forward net.ipv6.conf.all.forwarding
22
+ # Load br_netfilter immediately
23
+ sudo modprobe br_netfilter
24
+
25
+ # Apply sysctl
26
+ sudo sysctl --system
27
+
28
+ echo "[INFO] Opening common WAN/public services..."
29
+
30
+ # Public services
31
+ sudo firewall-cmd --permanent --zone=public --add-service=ssh
32
+ sudo firewall-cmd --permanent --zone=public --add-service=http
33
+ sudo firewall-cmd --permanent --zone=public --add-service=https
34
+
35
+ echo "[INFO] Opening Kubernetes control plane ports..."
36
+
37
+ # Kubernetes API Server
38
+ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
39
+
40
+ # etcd
41
+ sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
42
+
43
+ # kubelet API
44
+ sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
45
+
46
+ # kube-scheduler
47
+ sudo firewall-cmd --permanent --zone=public --add-port=10259/tcp
48
+
49
+ # kube-controller-manager
50
+ sudo firewall-cmd --permanent --zone=public --add-port=10257/tcp
51
+
52
+ echo "[INFO] Opening Kubernetes networking ports..."
53
+
54
+ # CoreDNS
55
+ sudo firewall-cmd --permanent --zone=public --add-port=53/tcp
56
+ sudo firewall-cmd --permanent --zone=public --add-port=53/udp
57
+
58
+ # NodePort Services
59
+ sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
60
+ sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/udp
61
+
62
+ # Calico VXLAN
63
+ sudo firewall-cmd --permanent --zone=public --add-port=4789/udp
64
+
65
+ # Calico BGP
66
+ sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
67
+
68
+ # Calico Typha (required for multi-node Calico deployments)
69
+ sudo firewall-cmd --permanent --zone=public --add-port=5473/tcp
70
+
71
+ # Calico WireGuard (optional encrypted overlay)
72
+ sudo firewall-cmd --permanent --zone=public --add-port=51820/udp
73
+ sudo firewall-cmd --permanent --zone=public --add-port=51821/udp
74
+
75
+ # Flannel VXLAN (UDP, required if using Flannel CNI)
76
+ sudo firewall-cmd --permanent --zone=public --add-port=8472/udp
77
+
78
+ # kube-proxy healthz
79
+ sudo firewall-cmd --permanent --zone=public --add-port=10256/tcp
80
+
81
+ # metrics-server
82
+ sudo firewall-cmd --permanent --zone=public --add-port=4443/tcp
83
+
84
+ echo "[INFO] Configuring trusted zone for inter-node pod/service CIDRs..."
85
+ # Allow all traffic from the default pod CIDR and service CIDR so that
86
+ # cross-node pod-to-pod and service routing works without explicit per-port rules.
87
+ sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/16
88
+ sudo firewall-cmd --permanent --zone=trusted --add-source=10.96.0.0/12
89
+
90
+ echo "[INFO] Enabling masquerade and forwarding..."
91
+
92
+ sudo firewall-cmd --permanent --zone=public --add-masquerade
93
+
94
+ echo "[INFO] Reloading firewall..."
95
+
96
+ sudo firewall-cmd --reload
97
+
98
+ echo
99
+ echo "[INFO] Sysctl status:"
100
+ sudo sysctl \
101
+ net.ipv4.ip_forward \
102
+ net.ipv6.conf.all.forwarding \
103
+ net.bridge.bridge-nf-call-iptables \
104
+ net.bridge.bridge-nf-call-ip6tables
105
+
106
+ echo
107
+ echo "[INFO] Firewall status:"
108
+ sudo firewall-cmd --zone=public --list-all
109
+
110
+ echo
111
+ echo "[INFO] Kubernetes firewall configuration completed."
@@ -3,8 +3,8 @@ import { AtlasSpriteSheetService } from './atlas-sprite-sheet.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const AtlasSpriteSheetController = {
7
- blob: async (req, res, options) => {
6
+ class AtlasSpriteSheetController {
7
+ static blob = async (req, res, options) => {
8
8
  try {
9
9
  if (req && req.headers && req.headers.origin) {
10
10
  res.set('Access-Control-Allow-Origin', req.headers.origin);
@@ -23,8 +23,8 @@ const AtlasSpriteSheetController = {
23
23
  message: error.message,
24
24
  });
25
25
  }
26
- },
27
- generate: async (req, res, options) => {
26
+ };
27
+ static generate = async (req, res, options) => {
28
28
  try {
29
29
  const result = await AtlasSpriteSheetService.generate(req, res, options);
30
30
  return res.status(200).json({
@@ -38,8 +38,8 @@ const AtlasSpriteSheetController = {
38
38
  message: error.message,
39
39
  });
40
40
  }
41
- },
42
- deleteByObjectLayerId: async (req, res, options) => {
41
+ };
42
+ static deleteByObjectLayerId = async (req, res, options) => {
43
43
  try {
44
44
  const result = await AtlasSpriteSheetService.deleteByObjectLayerId(req, res, options);
45
45
  return res.status(200).json({
@@ -53,8 +53,8 @@ const AtlasSpriteSheetController = {
53
53
  message: error.message,
54
54
  });
55
55
  }
56
- },
57
- post: async (req, res, options) => {
56
+ };
57
+ static post = async (req, res, options) => {
58
58
  try {
59
59
  const result = await AtlasSpriteSheetService.post(req, res, options);
60
60
  return res.status(200).json({
@@ -68,8 +68,8 @@ const AtlasSpriteSheetController = {
68
68
  message: error.message,
69
69
  });
70
70
  }
71
- },
72
- get: async (req, res, options) => {
71
+ };
72
+ static get = async (req, res, options) => {
73
73
  try {
74
74
  if (req && req.headers && req.headers.origin) {
75
75
  res.set('Access-Control-Allow-Origin', req.headers.origin);
@@ -92,8 +92,8 @@ const AtlasSpriteSheetController = {
92
92
  message: error.message,
93
93
  });
94
94
  }
95
- },
96
- put: async (req, res, options) => {
95
+ };
96
+ static put = async (req, res, options) => {
97
97
  try {
98
98
  const result = await AtlasSpriteSheetService.put(req, res, options);
99
99
  return res.status(200).json({
@@ -107,8 +107,8 @@ const AtlasSpriteSheetController = {
107
107
  message: error.message,
108
108
  });
109
109
  }
110
- },
111
- delete: async (req, res, options) => {
110
+ };
111
+ static delete = async (req, res, options) => {
112
112
  try {
113
113
  const result = await AtlasSpriteSheetService.delete(req, res, options);
114
114
  return res.status(200).json({
@@ -122,8 +122,8 @@ const AtlasSpriteSheetController = {
122
122
  message: error.message,
123
123
  });
124
124
  }
125
- },
126
- getMetadata: async (req, res, options) => {
125
+ };
126
+ static getMetadata = async (req, res, options) => {
127
127
  try {
128
128
  if (req && req.headers && req.headers.origin) {
129
129
  res.set('Access-Control-Allow-Origin', req.headers.origin);
@@ -146,7 +146,7 @@ const AtlasSpriteSheetController = {
146
146
  message: error.message,
147
147
  });
148
148
  }
149
- },
150
- };
149
+ };
150
+ }
151
151
 
152
152
  export { AtlasSpriteSheetController };
@@ -3,9 +3,7 @@
3
3
  * @module src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js
4
4
  * @namespace CyberiaAtlasSpriteSheetModel
5
5
  */
6
-
7
6
  import { Schema, model, Types } from 'mongoose';
8
-
9
7
  /**
10
8
  * @typedef {Object} FrameMetadata
11
9
  * @property {number} x - X position in the atlas
@@ -25,7 +23,6 @@ const FrameMetadataSchema = new Schema(
25
23
  },
26
24
  { _id: false },
27
25
  );
28
-
29
26
  /**
30
27
  * @typedef {Object} DirectionFrames
31
28
  * @property {FrameMetadata[]} up_idle - Up idle animation frames
@@ -71,7 +68,6 @@ const DirectionFramesSchema = new Schema(
71
68
  },
72
69
  { _id: false },
73
70
  );
74
-
75
71
  /**
76
72
  * @typedef {Object} AtlasSpriteSheet
77
73
  * @property {Types.ObjectId} fileId - Reference to File document (consolidated PNG)
@@ -81,6 +77,7 @@ const DirectionFramesSchema = new Schema(
81
77
  * @property {number} metadata.atlasWidth - Total atlas width in pixels
82
78
  * @property {number} metadata.atlasHeight - Total atlas height in pixels
83
79
  * @property {number} metadata.cellPixelDim - Pixel dimension of each cell
80
+ * @property {number} metadata.frame_duration - Duration of each frame in milliseconds
84
81
  * @property {DirectionFrames} metadata.frames - Frame positions in atlas by direction
85
82
  * @property {Date} createdAt - When the document was created
86
83
  * @property {Date} updatedAt - When the document was last updated
@@ -103,6 +100,7 @@ const AtlasSpriteSheetSchema = new Schema(
103
100
  atlasWidth: { type: Number, required: true, min: 1 },
104
101
  atlasHeight: { type: Number, required: true, min: 1 },
105
102
  cellPixelDim: { type: Number, required: true, min: 1, default: 20 },
103
+ frame_duration: { type: Number, min: 0, default: 100 },
106
104
  frames: { type: DirectionFramesSchema, required: true },
107
105
  },
108
106
  },
@@ -112,24 +110,19 @@ const AtlasSpriteSheetSchema = new Schema(
112
110
  toObject: { virtuals: true },
113
111
  },
114
112
  );
115
-
116
113
  // Indexes for efficient querying
117
114
  AtlasSpriteSheetSchema.index({ 'metadata.itemKey': 1 }, { unique: true });
118
115
  AtlasSpriteSheetSchema.index({ fileId: 1 });
119
-
120
116
  // Pre-save validation
121
117
  AtlasSpriteSheetSchema.pre('save', function () {
122
118
  if (!this.fileId || !this.metadata) {
123
119
  throw new Error('AtlasSpriteSheet missing required fields: fileId or metadata');
124
120
  }
125
121
  });
126
-
127
122
  const AtlasSpriteSheetModel = model('AtlasSpriteSheet', AtlasSpriteSheetSchema);
128
-
129
123
  const ProviderSchema = AtlasSpriteSheetSchema;
130
-
131
- const AtlasSpriteSheetDto = {
132
- select: {
124
+ class AtlasSpriteSheetDto {
125
+ static select = {
133
126
  get: () => {
134
127
  return {
135
128
  _id: 1,
@@ -151,12 +144,12 @@ const AtlasSpriteSheetDto = {
151
144
  'metadata.atlasWidth': 1,
152
145
  'metadata.atlasHeight': 1,
153
146
  'metadata.cellPixelDim': 1,
147
+ 'metadata.frame_duration': 1,
154
148
  'metadata.frames': 1,
155
149
  createdAt: 1,
156
150
  updatedAt: 1,
157
151
  };
158
152
  },
159
- },
160
- };
161
-
153
+ };
154
+ }
162
155
  export { AtlasSpriteSheetSchema, AtlasSpriteSheetModel, ProviderSchema, AtlasSpriteSheetDto };
@@ -8,9 +8,51 @@ import { IpfsClient } from '../../server/ipfs-client.js';
8
8
  import { createPinRecord, removePinRecordsAndUnpin } from '../ipfs/ipfs.service.js';
9
9
 
10
10
  const logger = loggerFactory(import.meta);
11
-
12
- const AtlasSpriteSheetService = {
13
- blob: async (req, res, options) => {
11
+ const DEFAULT_ATLAS_FRAME_DURATION = 100;
12
+
13
+ function parseAtlasFrameDuration(value) {
14
+ const frameDuration = Number(value);
15
+ return Number.isFinite(frameDuration) ? frameDuration : null;
16
+ }
17
+
18
+ async function resolveAtlasFrameDuration(ObjectLayer, itemKey) {
19
+ if (!itemKey) return DEFAULT_ATLAS_FRAME_DURATION;
20
+
21
+ const objectLayer = await ObjectLayer.findOne({ 'data.item.id': itemKey })
22
+ .select({ _id: 1, objectLayerRenderFramesId: 1 })
23
+ .populate('objectLayerRenderFramesId', { _id: 1, frame_duration: 1 })
24
+ .lean();
25
+
26
+ return (
27
+ parseAtlasFrameDuration(objectLayer?.objectLayerRenderFramesId?.frame_duration) || DEFAULT_ATLAS_FRAME_DURATION
28
+ );
29
+ }
30
+
31
+ async function withResolvedAtlasFrameDuration(doc, ObjectLayer) {
32
+ if (!doc?.metadata) return doc;
33
+
34
+ const frameDuration = parseAtlasFrameDuration(doc.metadata.frame_duration);
35
+ if (frameDuration !== null) {
36
+ return {
37
+ ...doc,
38
+ metadata: {
39
+ ...doc.metadata,
40
+ frame_duration: frameDuration,
41
+ },
42
+ };
43
+ }
44
+
45
+ return {
46
+ ...doc,
47
+ metadata: {
48
+ ...doc.metadata,
49
+ frame_duration: await resolveAtlasFrameDuration(ObjectLayer, doc.metadata.itemKey),
50
+ },
51
+ };
52
+ }
53
+
54
+ class AtlasSpriteSheetService {
55
+ static blob = async (req, res, options) => {
14
56
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
15
57
  const AtlasSpriteSheet =
16
58
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -25,8 +67,8 @@ const AtlasSpriteSheetService = {
25
67
  if (!fileDoc || !fileDoc.data) throw new Error(`File not found for atlas itemKey: ${itemKey}`);
26
68
 
27
69
  return { buffer: Buffer.from(fileDoc.data), mimetype: fileDoc.mimetype || 'image/png', name: fileDoc.name };
28
- },
29
- generate: async (req, res, options, generateOptions = {}) => {
70
+ };
71
+ static generate = async (req, res, options, generateOptions = {}) => {
30
72
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
31
73
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
32
74
  /** @type {import('../file/file.model.js').FileModel} */
@@ -150,8 +192,8 @@ const AtlasSpriteSheetService = {
150
192
  await objectLayer.save();
151
193
 
152
194
  return atlasDoc;
153
- },
154
- deleteByObjectLayerId: async (req, res, options) => {
195
+ };
196
+ static deleteByObjectLayerId = async (req, res, options) => {
155
197
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
156
198
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
157
199
  /** @type {import('../file/file.model.js').FileModel} */
@@ -209,14 +251,14 @@ const AtlasSpriteSheetService = {
209
251
  }
210
252
 
211
253
  return { success: true };
212
- },
213
- post: async (req, res, options) => {
254
+ };
255
+ static post = async (req, res, options) => {
214
256
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
215
257
  const AtlasSpriteSheet =
216
258
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
217
259
  return await new AtlasSpriteSheet(req.body).save();
218
- },
219
- get: async (req, res, options) => {
260
+ };
261
+ static get = async (req, res, options) => {
220
262
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
221
263
  const AtlasSpriteSheet =
222
264
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -240,10 +282,12 @@ const AtlasSpriteSheetService = {
240
282
 
241
283
  const totalPages = Math.ceil(total / limit);
242
284
  return { data, total, page, totalPages };
243
- },
285
+ };
244
286
  // Returns atlas metadata (layout + frames) for the client.
245
287
  // Client fetches this once per itemKey, caches it, then fetches the PNG blob.
246
- getMetadata: async (req, res, options) => {
288
+ static getMetadata = async (req, res, options) => {
289
+ /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
290
+ const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
247
291
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
248
292
  const AtlasSpriteSheet =
249
293
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -253,7 +297,7 @@ const AtlasSpriteSheetService = {
253
297
  .select(AtlasSpriteSheetDto.select.getMetadataOnly())
254
298
  .lean();
255
299
  if (!doc) throw new Error(`Atlas not found for itemKey: ${req.params.itemKey}`);
256
- return doc;
300
+ return await withResolvedAtlasFrameDuration(doc, ObjectLayer);
257
301
  }
258
302
 
259
303
  const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
@@ -269,15 +313,26 @@ const AtlasSpriteSheetService = {
269
313
  ]);
270
314
 
271
315
  const totalPages = Math.ceil(total / limit);
272
- return { data, total, page, totalPages };
273
- },
274
- put: async (req, res, options) => {
316
+ return {
317
+ data: data.map((doc) => ({
318
+ ...doc,
319
+ metadata: {
320
+ ...doc.metadata,
321
+ frame_duration: parseAtlasFrameDuration(doc?.metadata?.frame_duration) || DEFAULT_ATLAS_FRAME_DURATION,
322
+ },
323
+ })),
324
+ total,
325
+ page,
326
+ totalPages,
327
+ };
328
+ };
329
+ static put = async (req, res, options) => {
275
330
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
276
331
  const AtlasSpriteSheet =
277
332
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
278
333
  return await AtlasSpriteSheet.findByIdAndUpdate(req.params.id, req.body);
279
- },
280
- delete: async (req, res, options) => {
334
+ };
335
+ static delete = async (req, res, options) => {
281
336
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
282
337
  const AtlasSpriteSheet =
283
338
  DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
@@ -329,7 +384,7 @@ const AtlasSpriteSheetService = {
329
384
  }
330
385
  return await AtlasSpriteSheet.deleteMany();
331
386
  }
332
- },
333
- };
387
+ };
388
+ }
334
389
 
335
390
  export { AtlasSpriteSheetService };
@@ -3,8 +3,8 @@ import { CoreService } from './core.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CoreController = {
7
- post: async (req, res, options) => {
6
+ class CoreController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await CoreService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const CoreController = {
18
18
  message: error.message,
19
19
  });
20
20
  }
21
- },
22
- get: async (req, res, options) => {
21
+ };
22
+ static get = async (req, res, options) => {
23
23
  try {
24
24
  const result = await CoreService.put(req, res, options);
25
25
  return res.status(200).json({
@@ -33,8 +33,8 @@ const CoreController = {
33
33
  message: error.message,
34
34
  });
35
35
  }
36
- },
37
- put: async (req, res, options) => {
36
+ };
37
+ static put = async (req, res, options) => {
38
38
  try {
39
39
  const result = await CoreService.get(req, res, options);
40
40
  return res.status(200).json({
@@ -48,8 +48,8 @@ const CoreController = {
48
48
  message: error.message,
49
49
  });
50
50
  }
51
- },
52
- delete: async (req, res, options) => {
51
+ };
52
+ static delete = async (req, res, options) => {
53
53
  try {
54
54
  const result = await CoreService.delete(req, res, options);
55
55
  return res.status(200).json({
@@ -63,7 +63,7 @@ const CoreController = {
63
63
  message: error.message,
64
64
  });
65
65
  }
66
- },
67
- };
66
+ };
67
+ }
68
68
 
69
69
  export { CoreController };
@@ -4,27 +4,27 @@ import { shellExec } from '../../server/process.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CoreService = {
8
- post: async (req, res, options) => {
7
+ class CoreService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./core.model.js').CoreModel} */
10
10
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
11
11
  return await new Core(req.body).save();
12
- },
13
- get: async (req, res, options) => {
12
+ };
13
+ static get = async (req, res, options) => {
14
14
  /** @type {import('./core.model.js').CoreModel} */
15
15
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
16
16
  return await Core.findById(req.params.id);
17
- },
18
- put: async (req, res, options) => {
17
+ };
18
+ static put = async (req, res, options) => {
19
19
  /** @type {import('./core.model.js').CoreModel} */
20
20
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
21
21
  return await Core.findByIdAndUpdate(req.params.id, req.body);
22
- },
23
- delete: async (req, res, options) => {
22
+ };
23
+ static delete = async (req, res, options) => {
24
24
  /** @type {import('./core.model.js').CoreModel} */
25
25
  const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
26
26
  return await Core.findByIdAndDelete(req.params.id);
27
- },
28
- };
27
+ };
28
+ }
29
29
 
30
30
  export { CoreService };
@@ -2,8 +2,8 @@ import { loggerFactory } from '../../server/logger.js';
2
2
  import { CryptoService } from './crypto.service.js';
3
3
  const logger = loggerFactory(import.meta);
4
4
 
5
- const CryptoController = {
6
- post: async (req, res, options) => {
5
+ class CryptoController {
6
+ static post = async (req, res, options) => {
7
7
  try {
8
8
  return res.status(200).json({
9
9
  status: 'success',
@@ -16,8 +16,8 @@ const CryptoController = {
16
16
  message: error.message,
17
17
  });
18
18
  }
19
- },
20
- get: async (req, res, options) => {
19
+ };
20
+ static get = async (req, res, options) => {
21
21
  try {
22
22
  return res.status(200).json({
23
23
  status: 'success',
@@ -30,8 +30,8 @@ const CryptoController = {
30
30
  message: error.message,
31
31
  });
32
32
  }
33
- },
34
- delete: async (req, res, options) => {
33
+ };
34
+ static delete = async (req, res, options) => {
35
35
  try {
36
36
  const result = await CryptoService.delete(req, res, options);
37
37
  return res.status(200).json({
@@ -45,7 +45,7 @@ const CryptoController = {
45
45
  message: error.message,
46
46
  });
47
47
  }
48
- },
49
- };
48
+ };
49
+ }
50
50
 
51
51
  export { CryptoController };
@@ -3,8 +3,8 @@ import crypto from 'crypto';
3
3
  import { DataBaseProvider } from '../../db/DataBaseProvider.js';
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CryptoService = {
7
- post: async (req, res, options) => {
6
+ class CryptoService {
7
+ static post = async (req, res, options) => {
8
8
  /** @type {import('./crypto.model.js').CryptoModel} */
9
9
  const Crypto = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Crypto;
10
10
  /** @type {import('../user/user.model.js').UserModel} */
@@ -48,17 +48,17 @@ const CryptoService = {
48
48
  return publicKey;
49
49
  }
50
50
  }
51
- },
52
- get: async (req, res, options) => {
51
+ };
52
+ static get = async (req, res, options) => {
53
53
  switch (req.params.id) {
54
54
  default:
55
55
  }
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  switch (req.params.id) {
59
59
  default:
60
60
  }
61
- },
62
- };
61
+ };
62
+ }
63
63
 
64
64
  export { CryptoService };