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
@@ -3,9 +3,7 @@
3
3
  * @module src/api/object-layer/object-layer.model.js
4
4
  * @namespace CyberiaObjectLayerModel
5
5
  */
6
-
7
6
  import { Schema, model } from 'mongoose';
8
-
9
7
  /**
10
8
  * @typedef {Object} Stats
11
9
  * @property {number} effect - The effect attribute value
@@ -27,7 +25,6 @@ const StatsSchema = new Schema(
27
25
  },
28
26
  { _id: false },
29
27
  );
30
-
31
28
  /**
32
29
  * @typedef {Object} Item
33
30
  * @property {string} id - Unique identifier for the item
@@ -45,7 +42,6 @@ const ItemSchema = new Schema(
45
42
  },
46
43
  { _id: false },
47
44
  );
48
-
49
45
  /**
50
46
  * @typedef {Object} Ledger
51
47
  * Blockchain protocol metadata linking the visual object-layer prefab to its economic reality.
@@ -68,7 +64,6 @@ const LedgerSchema = new Schema(
68
64
  },
69
65
  { _id: false },
70
66
  );
71
-
72
67
  /**
73
68
  * @typedef {Object} Render
74
69
  * IPFS content identifiers for the consolidated atlas sprite sheet.
@@ -83,7 +78,6 @@ const RenderSchema = new Schema(
83
78
  },
84
79
  { _id: false },
85
80
  );
86
-
87
81
  /**
88
82
  * @typedef {Object} ObjectLayer
89
83
  * @property {Object} data - Object layer data
@@ -138,11 +132,9 @@ const ObjectLayerSchema = new Schema(
138
132
  toObject: { virtuals: true },
139
133
  },
140
134
  );
141
-
142
135
  // Index for faster querying
143
136
  ObjectLayerSchema.index({ 'data.item.id': 1 });
144
137
  ObjectLayerSchema.index({ 'data.item.type': 1 });
145
-
146
138
  // Add text index for searchable fields
147
139
  ObjectLayerSchema.index(
148
140
  {
@@ -158,7 +150,6 @@ ObjectLayerSchema.index(
158
150
  },
159
151
  },
160
152
  );
161
-
162
153
  // Pre-save hook to ensure data consistency
163
154
  ObjectLayerSchema.pre('save', function () {
164
155
  // Ensure all required fields are present
@@ -167,14 +158,11 @@ ObjectLayerSchema.pre('save', function () {
167
158
  }
168
159
  // cid (object layer data JSON) and data.render.cid (atlas PNG) are optional – default to ''
169
160
  });
170
-
171
161
  // Create and export the model
172
162
  const ObjectLayerModel = model('ObjectLayer', ObjectLayerSchema);
173
-
174
163
  const ProviderSchema = ObjectLayerSchema;
175
-
176
- const ObjectLayerDto = {
177
- select: {
164
+ class ObjectLayerDto {
165
+ static select = {
178
166
  get: () => {
179
167
  return {
180
168
  _id: 1,
@@ -207,7 +195,6 @@ const ObjectLayerDto = {
207
195
  objectLayerRenderFramesId: 1,
208
196
  };
209
197
  },
210
- },
211
- };
212
-
198
+ };
199
+ }
213
200
  export { ObjectLayerSchema, ObjectLayerModel, ProviderSchema, ObjectLayerDto };
@@ -36,7 +36,7 @@ const logger = loggerFactory(import.meta);
36
36
  * @namespace CyberiaObjectLayerService.ObjectLayerService
37
37
  * @memberof CyberiaObjectLayerService
38
38
  */
39
- const ObjectLayerService = {
39
+ class ObjectLayerService {
40
40
  /**
41
41
  * POST handler for creating object layers and uploading frame images.
42
42
  *
@@ -59,7 +59,7 @@ const ObjectLayerService = {
59
59
  * @returns {Promise<Object>} The created object layer document or frame upload result.
60
60
  * @throws {Error} If file validation fails or required parameters are missing.
61
61
  */
62
- post: async (req, res, options) => {
62
+ static post = async (req, res, options) => {
63
63
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
64
64
 
65
65
  if (req.path.startsWith('/frame-image')) {
@@ -245,7 +245,7 @@ const ObjectLayerService = {
245
245
  }
246
246
 
247
247
  return newObjectLayer;
248
- },
248
+ };
249
249
 
250
250
  /**
251
251
  * GET handler for retrieving object layers.
@@ -268,7 +268,7 @@ const ObjectLayerService = {
268
268
  * @returns {Promise<Object>} The requested object layer data, list, or frame counts.
269
269
  * @throws {Error} If the requested object layer is not found.
270
270
  */
271
- get: async (req, res, options) => {
271
+ static get = async (req, res, options) => {
272
272
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
273
273
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
274
274
 
@@ -432,7 +432,7 @@ const ObjectLayerService = {
432
432
  ObjectLayer.countDocuments(query), // { userId: req.auth.user._id }
433
433
  ]);
434
434
  return { data, total, page, totalPages: Math.ceil(total / limit) };
435
- },
435
+ };
436
436
 
437
437
  /**
438
438
  * Generates a WebP animation from PNG frame images for a specific direction of an object layer.
@@ -449,7 +449,7 @@ const ObjectLayerService = {
449
449
  * @returns {Promise<Buffer>} The generated WebP animation as a Buffer.
450
450
  * @throws {Error} If required parameters are missing, frames directory is not found, or img2webp fails.
451
451
  */
452
- generateWebp: async (req, res, options) => {
452
+ static generateWebp = async (req, res, options) => {
453
453
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
454
454
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
455
455
 
@@ -560,7 +560,7 @@ const ObjectLayerService = {
560
560
 
561
561
  throw error;
562
562
  }
563
- },
563
+ };
564
564
 
565
565
  /**
566
566
  * PUT handler for updating object layers, their frame images, and metadata.
@@ -584,7 +584,7 @@ const ObjectLayerService = {
584
584
  * @returns {Promise<Object>} The updated object layer document or frame upload result.
585
585
  * @throws {Error} If file validation fails, object layer is not found, or required parameters are missing.
586
586
  */
587
- put: async (req, res, options) => {
587
+ static put = async (req, res, options) => {
588
588
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
589
589
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
590
590
 
@@ -775,7 +775,7 @@ const ObjectLayerService = {
775
775
  }).populate('objectLayerRenderFramesId');
776
776
 
777
777
  return updatedObjectLayer;
778
- },
778
+ };
779
779
 
780
780
  /**
781
781
  * DELETE handler for removing object layers and all associated resources.
@@ -801,7 +801,7 @@ const ObjectLayerService = {
801
801
  * @returns {Promise<Object>} The deleted object layer document or bulk delete count.
802
802
  * @throws {Error} If the object layer is not found.
803
803
  */
804
- delete: async (req, res, options) => {
804
+ static delete = async (req, res, options) => {
805
805
  /** @type {import('./object-layer.model.js').ObjectLayerModel} */
806
806
  const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
807
807
  const ObjectLayerRenderFrames =
@@ -890,7 +890,7 @@ const ObjectLayerService = {
890
890
  }
891
891
  return { deletedCount: allObjectLayers.length };
892
892
  }
893
- },
894
- };
893
+ };
894
+ }
895
895
 
896
896
  export { ObjectLayerService };
@@ -3,8 +3,8 @@ import { ObjectLayerRenderFramesService } from './object-layer-render-frames.ser
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const ObjectLayerRenderFramesController = {
7
- post: async (req, res, options) => {
6
+ class ObjectLayerRenderFramesController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await ObjectLayerRenderFramesService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const ObjectLayerRenderFramesController = {
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 { page, limit } = req.query;
25
25
  const result = await ObjectLayerRenderFramesService.get(
@@ -38,8 +38,8 @@ const ObjectLayerRenderFramesController = {
38
38
  message: error.message,
39
39
  });
40
40
  }
41
- },
42
- put: async (req, res, options) => {
41
+ };
42
+ static put = async (req, res, options) => {
43
43
  try {
44
44
  const result = await ObjectLayerRenderFramesService.put(req, res, options);
45
45
  return res.status(200).json({
@@ -53,8 +53,8 @@ const ObjectLayerRenderFramesController = {
53
53
  message: error.message,
54
54
  });
55
55
  }
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  try {
59
59
  const result = await ObjectLayerRenderFramesService.delete(req, res, options);
60
60
  return res.status(200).json({
@@ -68,7 +68,7 @@ const ObjectLayerRenderFramesController = {
68
68
  message: error.message,
69
69
  });
70
70
  }
71
- },
72
- };
71
+ };
72
+ }
73
73
 
74
74
  export { ObjectLayerRenderFramesController };
@@ -3,9 +3,7 @@
3
3
  * @module src/api/object-layer-render-frames/object-layer-render-frames.model.js
4
4
  * @namespace CyberiaObjectLayerRenderFramesModel
5
5
  */
6
-
7
6
  import { Schema, model } from 'mongoose';
8
-
9
7
  /**
10
8
  * @typedef {Object} ObjectLayerRenderFramesDirections
11
9
  * @property {number[][][]} up_idle - Up idle animation frames
@@ -51,13 +49,11 @@ const ObjectLayerRenderFramesDirectionsSchema = new Schema(
51
49
  },
52
50
  { _id: false },
53
51
  );
54
-
55
52
  /**
56
53
  * @typedef {Object} ObjectLayerRenderFrames
57
54
  * @property {RenderFrames} frames - Animation frames for different states
58
55
  * @property {number[][]} colors - Color palette for rendering
59
56
  * @property {number} frame_duration - Duration of each frame in milliseconds
60
- * @property {boolean} is_stateless - Whether the render is stateless
61
57
  * @property {Date} createdAt - When the document was created
62
58
  * @property {Date} updatedAt - When the document was last updated
63
59
  * @memberof CyberiaObjectLayerRenderFramesModel
@@ -67,7 +63,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
67
63
  frames: { type: ObjectLayerRenderFramesDirectionsSchema, required: true },
68
64
  colors: { type: [[Number]], required: true },
69
65
  frame_duration: { type: Number, required: true, min: 0 },
70
- is_stateless: { type: Boolean, default: false },
71
66
  },
72
67
  {
73
68
  timestamps: true,
@@ -75,7 +70,6 @@ const ObjectLayerRenderFramesSchema = new Schema(
75
70
  toObject: { virtuals: true },
76
71
  },
77
72
  );
78
-
79
73
  // Pre-save hook to ensure data consistency
80
74
  ObjectLayerRenderFramesSchema.pre('save', function () {
81
75
  // Ensure all required fields are present
@@ -83,21 +77,17 @@ ObjectLayerRenderFramesSchema.pre('save', function () {
83
77
  throw new Error('Missing required fields: frames, colors, or frame_duration');
84
78
  }
85
79
  });
86
-
87
80
  // Create and export the model
88
81
  const ObjectLayerRenderFramesModel = model('ObjectLayerRenderFrames', ObjectLayerRenderFramesSchema);
89
-
90
82
  const ProviderSchema = ObjectLayerRenderFramesSchema;
91
-
92
- const ObjectLayerRenderFramesDto = {
93
- select: {
83
+ class ObjectLayerRenderFramesDto {
84
+ static select = {
94
85
  get: () => {
95
- return { _id: 1, frame_duration: 1, is_stateless: 1 };
86
+ return { _id: 1, frame_duration: 1 };
96
87
  },
97
88
  getFull: () => {
98
- return { _id: 1, frames: 1, colors: 1, frame_duration: 1, is_stateless: 1 };
89
+ return { _id: 1, frames: 1, colors: 1, frame_duration: 1 };
99
90
  },
100
- },
101
- };
102
-
91
+ };
92
+ }
103
93
  export { ObjectLayerRenderFramesSchema, ObjectLayerRenderFramesModel, ProviderSchema, ObjectLayerRenderFramesDto };
@@ -4,15 +4,17 @@ import { DataQuery } from '../../server/data-query.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const ObjectLayerRenderFramesService = {
8
- post: async (req, res, options) => {
7
+ class ObjectLayerRenderFramesService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
10
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
10
+ const ObjectLayerRenderFrames =
11
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
11
12
  return await new ObjectLayerRenderFrames(req.body).save();
12
- },
13
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
14
15
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
15
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
16
+ const ObjectLayerRenderFrames =
17
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
16
18
  if (req.params.id) return await ObjectLayerRenderFrames.findById(req.params.id);
17
19
 
18
20
  // Parse query parameters using DataQuery helper
@@ -25,18 +27,20 @@ const ObjectLayerRenderFramesService = {
25
27
 
26
28
  const totalPages = Math.ceil(total / limit);
27
29
  return { data, total, page, totalPages };
28
- },
29
- put: async (req, res, options) => {
30
+ };
31
+ static put = async (req, res, options) => {
30
32
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
31
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
33
+ const ObjectLayerRenderFrames =
34
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
32
35
  return await ObjectLayerRenderFrames.findByIdAndUpdate(req.params.id, req.body);
33
- },
34
- delete: async (req, res, options) => {
36
+ };
37
+ static delete = async (req, res, options) => {
35
38
  /** @type {import('./object-layer-render-frames.model.js').ObjectLayerRenderFramesModel} */
36
- const ObjectLayerRenderFrames = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
39
+ const ObjectLayerRenderFrames =
40
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
37
41
  if (req.params.id) return await ObjectLayerRenderFrames.findByIdAndDelete(req.params.id);
38
42
  else return await ObjectLayerRenderFrames.deleteMany();
39
- },
40
- };
43
+ };
44
+ }
41
45
 
42
46
  export { ObjectLayerRenderFramesService };
@@ -3,8 +3,8 @@ import { TestService } from './test.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const TestController = {
7
- post: async (req, res, options) => {
6
+ class TestController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  return res.status(200).json({
10
10
  status: 'success',
@@ -17,8 +17,8 @@ const TestController = {
17
17
  message: error.message,
18
18
  });
19
19
  }
20
- },
21
- get: async (req, res, options) => {
20
+ };
21
+ static get = async (req, res, options) => {
22
22
  try {
23
23
  const result = await TestService.get(req, res, options);
24
24
  if (result)
@@ -37,8 +37,8 @@ const TestController = {
37
37
  message: error.message,
38
38
  });
39
39
  }
40
- },
41
- delete: async (req, res, options) => {
40
+ };
41
+ static delete = async (req, res, options) => {
42
42
  try {
43
43
  const result = await TestService.delete(req, res, options);
44
44
 
@@ -53,7 +53,7 @@ const TestController = {
53
53
  message: error.message,
54
54
  });
55
55
  }
56
- },
57
- };
56
+ };
57
+ }
58
58
 
59
59
  export { TestController };
@@ -5,14 +5,14 @@ import { getYouTubeID, validatePassword } from '../../client/components/core/Com
5
5
 
6
6
  const logger = loggerFactory(import.meta);
7
7
 
8
- const TestService = {
9
- post: async (req, res, options) => {
8
+ class TestService {
9
+ static post = async (req, res, options) => {
10
10
  switch (req.params.id) {
11
11
  default:
12
12
  break;
13
13
  }
14
- },
15
- get: async (req, res, options) => {
14
+ };
15
+ static get = async (req, res, options) => {
16
16
  switch (req.params.id) {
17
17
  case 'verify-email':
18
18
  return validator.isEmail(req.query.email);
@@ -23,13 +23,13 @@ const TestService = {
23
23
 
24
24
  default:
25
25
  }
26
- },
27
- delete: async (req, res, options) => {
26
+ };
27
+ static delete = async (req, res, options) => {
28
28
  switch (req.params.id) {
29
29
  default:
30
30
  break;
31
31
  }
32
- },
33
- };
32
+ };
33
+ }
34
34
 
35
35
  export { TestService };
@@ -0,0 +1,99 @@
1
+ import mongoose from 'mongoose';
2
+ import { UserDto } from './user.model.js';
3
+ import { ValkeyAPI } from '../../server/valkey.js';
4
+ import { hashPassword, getBearerToken, jwtSign } from '../../server/auth.js';
5
+
6
+ // ─── TTL ──────────────────────────────────────────────────────────────────────
7
+
8
+ const _guestTtlMs = () => {
9
+ const minutes = Number.parseInt(process.env.REFRESH_EXPIRE_MINUTES || '60', 10);
10
+ return Number.isFinite(minutes) && minutes > 0 ? minutes * 60 * 1000 : 60 * 60 * 1000;
11
+ };
12
+
13
+ // ─── Domain helpers ───────────────────────────────────────────────────────────
14
+
15
+ /**
16
+ * Constructs a new ephemeral guest user object.
17
+ * This is domain logic specific to the guest lifecycle; it does not belong
18
+ * in the generic Valkey storage module.
19
+ *
20
+ * @param {{ host?: string }} options
21
+ * @returns {object}
22
+ */
23
+ const buildGuestUser = (options) => {
24
+ const now = new Date().toISOString();
25
+ const _id = new mongoose.Types.ObjectId().toString();
26
+ const role = 'guest';
27
+ return {
28
+ _id: `${role}${_id}`,
29
+ username: `${role}${_id.slice(-5)}`,
30
+ email: `${_id}@${options.host || 'localhost'}`,
31
+ password: hashPassword(process.env.JWT_SECRET),
32
+ role,
33
+ emailConfirmed: false,
34
+ profileImageId: null,
35
+ publicKey: [],
36
+ phoneNumbers: [],
37
+ activeSessions: [],
38
+ failedLoginAttempts: 0,
39
+ recoverTimeOut: null,
40
+ lastLoginDate: null,
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ guestSessionExpiresAt: Date.now() + _guestTtlMs(),
44
+ };
45
+ };
46
+
47
+ /**
48
+ * Projects a user object to the public-safe fields defined by UserDto.select.get().
49
+ * Keeps this logic next to the guest domain instead of in a generic utility.
50
+ *
51
+ * @param {object} user
52
+ * @returns {object}
53
+ */
54
+ const _toPublicUser = (user) => {
55
+ const select = UserDto.select.get();
56
+ return Object.fromEntries(
57
+ Object.keys(select)
58
+ .filter((k) => select[k] === 1 && k in user)
59
+ .map((k) => [k, user[k]]),
60
+ );
61
+ };
62
+
63
+ const _withRefreshedExpiry = (user) => ({ ...user, guestSessionExpiresAt: Date.now() + _guestTtlMs() });
64
+
65
+ // ─── Service ──────────────────────────────────────────────────────────────────
66
+
67
+ class GuestService {
68
+ static async create(req, options) {
69
+ const user = buildGuestUser(options);
70
+
71
+ await ValkeyAPI.set(options, user.email, user, _guestTtlMs());
72
+
73
+ return {
74
+ token: jwtSign(
75
+ UserDto.auth.payload(user, null, req.ip, req.headers['user-agent'], options.host, options.path),
76
+ options,
77
+ ),
78
+ user: _toPublicUser(user),
79
+ };
80
+ }
81
+
82
+ static async auth(req, options) {
83
+ const user = await ValkeyAPI.get(options, req.auth.user.email);
84
+ if (!user) throw new Error('guest user expired');
85
+
86
+ const expiresAt = Number(user.guestSessionExpiresAt || 0);
87
+ if (expiresAt && expiresAt <= Date.now()) throw new Error('guest user expired');
88
+
89
+ const refreshed = _withRefreshedExpiry(user);
90
+ await ValkeyAPI.set(options, refreshed.email, refreshed, _guestTtlMs());
91
+
92
+ return {
93
+ user: _toPublicUser(refreshed),
94
+ token: getBearerToken(req),
95
+ };
96
+ }
97
+ }
98
+
99
+ export { GuestService };
@@ -25,11 +25,11 @@ const handleRequest = (serviceMethod) => async (req, res, options) => {
25
25
  }
26
26
  };
27
27
 
28
- const UserController = {
29
- post: handleRequest(UserService.post),
30
- get: handleRequest(UserService.get),
31
- delete: handleRequest(UserService.delete),
32
- put: handleRequest(UserService.put),
33
- };
28
+ class UserController {
29
+ static post = handleRequest(UserService.post);
30
+ static get = handleRequest(UserService.get);
31
+ static delete = handleRequest(UserService.delete);
32
+ static put = handleRequest(UserService.put);
33
+ }
34
34
 
35
35
  export { UserController };
@@ -3,7 +3,6 @@ import validator from 'validator';
3
3
  import { userRoleEnum } from '../../client/components/core/CommonJs.js';
4
4
  import crypto from 'crypto';
5
5
  // https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
6
-
7
6
  const UserSchema = new Schema(
8
7
  {
9
8
  email: {
@@ -88,13 +87,10 @@ const UserSchema = new Schema(
88
87
  timestamps: true,
89
88
  },
90
89
  );
91
-
92
90
  const UserModel = model('User', UserSchema);
93
-
94
91
  const ProviderSchema = UserSchema;
95
-
96
- const UserDto = {
97
- select: {
92
+ class UserDto {
93
+ static select = {
98
94
  get: () => {
99
95
  return {
100
96
  _id: 1,
@@ -112,8 +108,8 @@ const UserDto = {
112
108
  getAll: () => {
113
109
  return { _id: 1 };
114
110
  },
115
- },
116
- public: {
111
+ };
112
+ static public = {
117
113
  get: () => {
118
114
  return {
119
115
  _id: 1,
@@ -125,8 +121,8 @@ const UserDto = {
125
121
  updatedAt: 1,
126
122
  };
127
123
  },
128
- },
129
- auth: {
124
+ };
125
+ static auth = {
130
126
  payload: (user, jwtid, ip, userAgent, host, path) => {
131
127
  const tokenPayload = {
132
128
  _id: user._id.toString(),
@@ -141,7 +137,6 @@ const UserDto = {
141
137
  };
142
138
  return tokenPayload;
143
139
  },
144
- },
145
- };
146
-
140
+ };
141
+ }
147
142
  export { UserSchema, UserModel, userRoleEnum, ProviderSchema, UserDto };
@@ -9,7 +9,6 @@ import {
9
9
  refreshSessionAndToken,
10
10
  logoutSession,
11
11
  jwtSign,
12
- getBearerToken,
13
12
  validatePasswordMiddleware,
14
13
  } from '../../server/auth.js';
15
14
  import { MailerProvider } from '../../mailer/MailerProvider.js';
@@ -19,8 +18,8 @@ import validator from 'validator';
19
18
  import { DataBaseProvider } from '../../db/DataBaseProvider.js';
20
19
  import { FileFactory, FileCleanup } from '../file/file.service.js';
21
20
  import { UserDto } from './user.model.js';
22
- import { selectDtoFactory, ValkeyAPI } from '../../server/valkey.js';
23
21
  import { timer } from '../../client/components/core/CommonJs.js';
22
+ import { GuestService } from './guest.service.js';
24
23
 
25
24
  const logger = loggerFactory(import.meta);
26
25
 
@@ -226,15 +225,7 @@ const UserService = {
226
225
  } else throw new Error('Invalid credentials');
227
226
 
228
227
  case 'guest': {
229
- const user = await ValkeyAPI.valkeyObjectFactory(options, 'user');
230
- await ValkeyAPI.setValkeyObject(options, user.email, user);
231
- return {
232
- token: jwtSign(
233
- UserDto.auth.payload(user, null, req.ip, req.headers['user-agent'], options.host, options.path),
234
- options,
235
- ),
236
- user: selectDtoFactory(user, UserDto.select.get()),
237
- };
228
+ return await GuestService.create(req, options);
238
229
  }
239
230
 
240
231
  default:
@@ -360,8 +351,7 @@ const UserService = {
360
351
  case 'auth': {
361
352
  let user;
362
353
  if (req.auth.user._id.match('guest')) {
363
- user = await ValkeyAPI.getValkeyObject(options, req.auth.user.email);
364
- if (!user) throw new Error('guest user expired');
354
+ return await GuestService.auth(req, options);
365
355
  } else
366
356
  user = await User.findOne({
367
357
  _id: req.auth.user._id,
@@ -369,13 +359,6 @@ const UserService = {
369
359
 
370
360
  if (!user) throw new Error('user not found');
371
361
 
372
- const guestUser = await ValkeyAPI.getValkeyObject(options, req.auth.user.email);
373
- if (guestUser)
374
- return {
375
- user: selectDtoFactory(guestUser, UserDto.select.get()),
376
- token: getBearerToken(req),
377
- };
378
-
379
362
  return {
380
363
  token: await refreshSessionAndToken(req, res, User, options),
381
364
  user: await User.findOne({