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
@@ -2,13 +2,15 @@ import { Auth } from '../core/Auth.js';
2
2
  import { LogIn } from '../core/LogIn.js';
3
3
  import { AppStoreCryptokoyn } from './AppStoreCryptokoyn.js';
4
4
 
5
- const LogInCryptokoyn = async function () {
6
- LogIn.Event['LogInCryptokoyn'] = async (options) => {
5
+ class LogInCryptokoyn {
6
+ static async instance() {
7
+ LogIn.onLogin(async (options) => {
7
8
  const { token, user } = options;
8
9
  AppStoreCryptokoyn.Data.user.main.model.user = user;
9
- };
10
+ }, { key: 'LogInCryptokoyn' });
10
11
  const { user } = await Auth.sessionIn();
11
12
  AppStoreCryptokoyn.Data.user.main.model.user = user;
12
- };
13
+ }
14
+ }
13
15
 
14
16
  export { LogInCryptokoyn };
@@ -1,10 +1,12 @@
1
1
  import { LogOut } from '../core/LogOut.js';
2
2
  import { AppStoreCryptokoyn } from './AppStoreCryptokoyn.js';
3
3
 
4
- const LogOutCryptokoyn = async function () {
5
- LogOut.Event['LogOutCryptokoyn'] = async (result = { user: { _id: '' } }) => {
4
+ class LogOutCryptokoyn {
5
+ static async instance() {
6
+ LogOut.onLogout(async (result = { user: { _id: '' } }) => {
6
7
  AppStoreCryptokoyn.Data.user.main.model.user = result.user;
7
- };
8
- };
8
+ }, { key: 'LogOutCryptokoyn' });
9
+ }
10
+ }
9
11
 
10
12
  export { LogOutCryptokoyn };
@@ -0,0 +1,37 @@
1
+ import { loggerFactory } from '../core/Logger.js';
2
+ import { Modal } from '../core/Modal.js';
3
+ import { s } from '../core/VanillaJs.js';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ const BannerAppTemplate = html`Cryptokoyn`;
8
+
9
+ class RouterCryptokoyn {
10
+ static routes() {
11
+ return {
12
+ '/': {
13
+ title: 'Home',
14
+ render: () => Modal.onHomeRouterEvent(),
15
+ },
16
+ '/log-in': { title: 'log-in', render: () => s(`.main-btn-log-in`).click() },
17
+ '/sign-up': { title: 'sign-up', render: () => s(`.main-btn-sign-up`).click() },
18
+ '/log-out': {
19
+ title: 'log-out',
20
+ render: () => s(`.main-btn-log-out`).click(),
21
+ },
22
+ '/account': {
23
+ title: 'account',
24
+ render: () => s(`.main-btn-account`).click(),
25
+ },
26
+ '/wallet': { title: 'wallet', render: () => s(`.main-btn-wallet`).click() },
27
+ '/settings': { title: 'settings', render: () => s(`.main-btn-settings`).click() },
28
+ '/recover': { title: 'recover', render: () => s(`.main-btn-recover`).click() },
29
+ };
30
+ }
31
+
32
+ static instance() {
33
+ return { Routes: RouterCryptokoyn.routes };
34
+ }
35
+ }
36
+
37
+ export { RouterCryptokoyn, BannerAppTemplate };
@@ -3,14 +3,14 @@ import { FullScreen } from '../core/FullScreen.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
- const SettingsCryptokoyn = {
7
- Render: async function () {
6
+ class SettingsCryptokoyn {
7
+ static async instance() {
8
8
  let render = await FullScreen.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
12
12
  return render;
13
- },
14
- };
13
+ }
14
+ }
15
15
 
16
16
  export { SettingsCryptokoyn };
@@ -1,9 +1,11 @@
1
1
  import { SignUp } from '../core/SignUp.js';
2
2
 
3
- const SignUpCryptokoyn = function () {
4
- SignUp.Event['SignUpCryptokoyn'] = async (options) => {
3
+ class SignUpCryptokoyn {
4
+ static instance() {
5
+ SignUp.onSignup(async (options) => {
5
6
  const { user } = options;
6
- };
7
- };
7
+ }, { key: 'SignUpCryptokoyn' });
8
+ }
9
+ }
8
10
 
9
11
  export { SignUpCryptokoyn };
@@ -11,12 +11,63 @@ import { CyberiaMapService } from '../../services/cyberia-map/cyberia-map.servic
11
11
  import { FileService } from '../../services/file/file.service.js';
12
12
  import { DefaultManagement } from '../../services/default/default.management.js';
13
13
  import { getApiBaseUrl } from '../../services/core/core.service.js';
14
+ import { ObjectLayerService } from '../../services/object-layer/object-layer.service.js';
15
+
16
+ const dropdownValueKey = (value = '') => String(value).trim().replaceAll(' ', '-');
17
+ const createDropdownOption = (value, onClick = () => {}, display = value, data = value) => ({
18
+ value,
19
+ display,
20
+ data,
21
+ onClick,
22
+ });
14
23
 
15
24
  class InstanceEngineCyberia {
16
25
  static currentInstanceId = null;
17
26
  static currentThumbnailId = null;
18
27
  static thumbnailDirty = false;
19
28
  static portals = [];
29
+ static itemIdsDropdownId = 'instance-engine-item-ids-dropdown';
30
+
31
+ static syncItemIdsDropdownSelection(itemIds = []) {
32
+ const dropdownId = InstanceEngineCyberia.itemIdsDropdownId;
33
+ if (!DropDown.Tokens[dropdownId]) return;
34
+
35
+ DropDown.Tokens[dropdownId].value = [];
36
+ if (s(`.${dropdownId}`)) s(`.${dropdownId}`).value = [];
37
+ DropDown.Tokens[dropdownId].oncheckvalues = {};
38
+ htmls(`.dropdown-current-${dropdownId}`, '');
39
+ htmls(`.${dropdownId}-render-container`, '');
40
+
41
+ for (const itemId of itemIds) {
42
+ const key = dropdownValueKey(itemId);
43
+ DropDown.Tokens[dropdownId].oncheckvalues[key] = {
44
+ data: itemId,
45
+ display: itemId,
46
+ value: itemId,
47
+ };
48
+ }
49
+ DropDown.Tokens[dropdownId].value = [...itemIds];
50
+ if (s(`.${dropdownId}`)) s(`.${dropdownId}`).value = [...itemIds];
51
+ DropDown.Tokens[dropdownId]._renderSelectedBadges?.();
52
+ }
53
+
54
+ static async buildItemIdsDropdown() {
55
+ return await DropDown.instance({
56
+ id: InstanceEngineCyberia.itemIdsDropdownId,
57
+ label: html`Object Layer Item IDs`,
58
+ data: [],
59
+ type: 'checkbox',
60
+ containerClass: 'inl',
61
+ excludeSelected: true,
62
+ serviceProvider: async (q) => {
63
+ const result = await ObjectLayerService.searchItemIds({ q });
64
+ if (result.status === 'success' && result.data?.itemIds) {
65
+ return result.data.itemIds.map((itemId) => createDropdownOption(itemId));
66
+ }
67
+ return [];
68
+ },
69
+ });
70
+ }
20
71
 
21
72
  static renderPortalList(containerId) {
22
73
  const container = s(`.${containerId}`);
@@ -40,7 +91,12 @@ class InstanceEngineCyberia {
40
91
  (${portal.sourceCellX}, ${portal.sourceCellY})
41
92
  <span style="margin:0 4px;">&rarr;</span>
42
93
  <span style="color:${darkTheme ? '#fc8' : '#842'};">${portal.targetMapCode}</span>
43
- (${portal.targetCellX}, ${portal.targetCellY})
94
+ ${portal.targetCellX < 0 || portal.targetCellY < 0
95
+ ? '<span style="color:#aaa;">(random)</span>'
96
+ : `(${portal.targetCellX}, ${portal.targetCellY})`}
97
+ <span style="color:${darkTheme ? '#9e9' : '#383'};margin-left:4px;font-size:11px;"
98
+ >[${portal.portalMode || 'inter-portal'}]</span
99
+ >
44
100
  </div>
45
101
  <div class="in fll" style="display:flex;gap:3px;">
46
102
  <button
@@ -102,6 +158,7 @@ class InstanceEngineCyberia {
102
158
  const idStatus = 'instance-engine-input-status';
103
159
  const idThumbnail = 'instance-engine-input-thumbnail';
104
160
  const idMapCodesDropdown = 'instance-engine-map-codes-dropdown';
161
+ const idItemIdsDropdown = InstanceEngineCyberia.itemIdsDropdownId;
105
162
  const managementId = 'modal-cyberia-instance-engine';
106
163
  const portalListId = 'instance-engine-portal-list';
107
164
  const idSourceMapCode = 'instance-engine-source-map-code';
@@ -127,6 +184,7 @@ class InstanceEngineCyberia {
127
184
  const cyberiaMapCodes = DropDown.Tokens[idMapCodesDropdown]?.value
128
185
  ? [...DropDown.Tokens[idMapCodesDropdown].value]
129
186
  : [];
187
+ const itemIds = DropDown.Tokens[idItemIdsDropdown]?.value ? [...DropDown.Tokens[idItemIdsDropdown].value] : [];
130
188
  const payload = {
131
189
  code: s(`.${idCode}`)?.value || '',
132
190
  name: s(`.${idName}`)?.value || '',
@@ -134,13 +192,14 @@ class InstanceEngineCyberia {
134
192
  tags,
135
193
  status: DropDown.Tokens[idStatus]?.value || 'unlisted',
136
194
  cyberiaMapCodes,
195
+ itemIds,
137
196
  portals: InstanceEngineCyberia.portals,
138
197
  };
139
198
  if (InstanceEngineCyberia.currentThumbnailId) payload.thumbnail = InstanceEngineCyberia.currentThumbnailId;
140
199
  return payload;
141
200
  };
142
201
 
143
- const saveInstance = async () => {
202
+ const persistInstance = async ({ notify = true } = {}) => {
144
203
  // Upload thumbnail file only if user selected a new one
145
204
  const thumbnailInput = s(`.${idThumbnail}`);
146
205
  if (
@@ -155,34 +214,44 @@ class InstanceEngineCyberia {
155
214
  if (uploadResult.status === 'success' && uploadResult.data && uploadResult.data.length > 0) {
156
215
  InstanceEngineCyberia.currentThumbnailId = uploadResult.data[0]._id;
157
216
  } else {
158
- NotificationManager.Push({
159
- html: uploadResult.message || 'Failed to upload thumbnail',
160
- status: 'error',
161
- });
162
- return;
217
+ if (notify) {
218
+ NotificationManager.Push({
219
+ html: uploadResult.message || 'Failed to upload thumbnail',
220
+ status: 'error',
221
+ });
222
+ }
223
+ return uploadResult;
163
224
  }
164
225
  }
165
226
 
166
227
  const body = getInstancePayload();
228
+ const isUpdate = !!InstanceEngineCyberia.currentInstanceId;
167
229
  let result;
168
- if (InstanceEngineCyberia.currentInstanceId) {
230
+ if (isUpdate) {
169
231
  result = await CyberiaInstanceService.put({ id: InstanceEngineCyberia.currentInstanceId, body });
170
232
  } else {
171
233
  result = await CyberiaInstanceService.post({ body });
172
234
  }
173
- NotificationManager.Push({
174
- html:
175
- result.status === 'error'
176
- ? result.message
177
- : InstanceEngineCyberia.currentInstanceId
178
- ? Translate.Render('success-update-item')
179
- : Translate.Render('success-create-item'),
180
- status: result.status,
181
- });
235
+ if (notify) {
236
+ NotificationManager.Push({
237
+ html:
238
+ result.status === 'error'
239
+ ? result.message
240
+ : isUpdate
241
+ ? Translate.instance('success-update-item')
242
+ : Translate.instance('success-create-item'),
243
+ status: result.status,
244
+ });
245
+ }
182
246
  if (result.status === 'success') {
183
247
  if (result.data?._id) InstanceEngineCyberia.currentInstanceId = result.data._id;
184
248
  await DefaultManagement.loadTable(managementId, { force: true, reload: true });
185
249
  }
250
+ return result;
251
+ };
252
+
253
+ const saveInstance = async () => {
254
+ await persistInstance({ notify: true });
186
255
  };
187
256
 
188
257
  const loadInstance = async (instanceData) => {
@@ -265,6 +334,8 @@ class InstanceEngineCyberia {
265
334
  }
266
335
  }
267
336
 
337
+ InstanceEngineCyberia.syncItemIdsDropdownSelection(instanceData.itemIds || instanceData.itemsId || []);
338
+
268
339
  // Load portals
269
340
  InstanceEngineCyberia.portals = (instanceData.portals || []).map((p) => ({
270
341
  sourceMapCode: p.sourceMapCode || '',
@@ -273,6 +344,7 @@ class InstanceEngineCyberia {
273
344
  targetMapCode: p.targetMapCode || '',
274
345
  targetCellX: p.targetCellX || 0,
275
346
  targetCellY: p.targetCellY || 0,
347
+ portalMode: p.portalMode || 'inter-portal',
276
348
  }));
277
349
  InstanceEngineCyberia.renderPortalList(portalListId);
278
350
  };
@@ -303,6 +375,12 @@ class InstanceEngineCyberia {
303
375
  htmls(`.dropdown-current-${idMapCodesDropdown}`, '');
304
376
  htmls(`.${idMapCodesDropdown}-render-container`, '');
305
377
  }
378
+ if (DropDown.Tokens[idItemIdsDropdown]) {
379
+ DropDown.Tokens[idItemIdsDropdown].oncheckvalues = {};
380
+ DropDown.Tokens[idItemIdsDropdown].value = [];
381
+ htmls(`.dropdown-current-${idItemIdsDropdown}`, '');
382
+ htmls(`.${idItemIdsDropdown}-render-container`, '');
383
+ }
306
384
  InstanceEngineCyberia.portals = [];
307
385
  InstanceEngineCyberia.renderPortalList(portalListId);
308
386
  };
@@ -325,16 +403,17 @@ class InstanceEngineCyberia {
325
403
  // Portal management
326
404
  if (s(`.btn-instance-engine-portal-connect`))
327
405
  s(`.btn-instance-engine-portal-connect`).onclick = async () => {
328
- if (!InstanceEngineCyberia.currentInstanceId) {
329
- NotificationManager.Push({
330
- html: Translate.Render('save-instance-first') || 'Save the instance first.',
331
- status: 'warning',
332
- });
333
- return;
334
- }
335
406
  const btn = s(`.btn-instance-engine-portal-connect`);
336
407
  if (btn) btn.disabled = true;
337
408
  try {
409
+ const persistResult = await persistInstance({ notify: false });
410
+ if (!persistResult || persistResult.status !== 'success' || !InstanceEngineCyberia.currentInstanceId) {
411
+ NotificationManager.Push({
412
+ html: persistResult?.message || Translate.instance('save-instance-first') || 'Save the instance first.',
413
+ status: persistResult?.status === 'error' ? 'error' : 'warning',
414
+ });
415
+ return;
416
+ }
338
417
  const result = await CyberiaInstanceService.portalConnect({ id: InstanceEngineCyberia.currentInstanceId });
339
418
  if (result.status === 'error') {
340
419
  NotificationManager.Push({ html: result.message, status: 'error' });
@@ -348,21 +427,21 @@ class InstanceEngineCyberia {
348
427
  });
349
428
  return;
350
429
  }
351
- // Append generated portals (skip duplicates by source+target pair)
352
- const existing = new Set(InstanceEngineCyberia.portals.map((p) => `${p.sourceMapCode}>${p.targetMapCode}`));
353
- let added = 0;
354
- for (const p of generated) {
355
- const key = `${p.sourceMapCode}>${p.targetMapCode}`;
356
- if (!existing.has(key)) {
357
- InstanceEngineCyberia.portals.push(p);
358
- existing.add(key);
359
- added++;
360
- }
361
- }
430
+ // Replace all portals with the centralized topology output
431
+ // (ring + random behavior for remaining unassigned portals)
432
+ InstanceEngineCyberia.portals = generated.map((p) => ({
433
+ sourceMapCode: p.sourceMapCode || '',
434
+ sourceCellX: p.sourceCellX || 0,
435
+ sourceCellY: p.sourceCellY || 0,
436
+ targetMapCode: p.targetMapCode || '',
437
+ targetCellX: p.targetCellX || 0,
438
+ targetCellY: p.targetCellY || 0,
439
+ portalMode: p.portalMode || 'inter-portal',
440
+ }));
362
441
  InstanceEngineCyberia.renderPortalList(portalListId);
363
442
  NotificationManager.Push({
364
- html: `${topology} ring — ${added} portal(s) added.`,
365
- status: added > 0 ? 'success' : 'warning',
443
+ html: `${topology} — ${generated.length} portal(s) generated.`,
444
+ status: 'success',
366
445
  });
367
446
  } catch (e) {
368
447
  NotificationManager.Push({ html: e.message, status: 'error' });
@@ -380,6 +459,7 @@ class InstanceEngineCyberia {
380
459
  targetMapCode: s(`.${idTargetMapCode}`)?.value || '',
381
460
  targetCellX: parseInt(s(`.${idTargetCellX}`)?.value) || 0,
382
461
  targetCellY: parseInt(s(`.${idTargetCellY}`)?.value) || 0,
462
+ portalMode: 'inter-portal',
383
463
  };
384
464
  InstanceEngineCyberia.portals.push(portal);
385
465
  InstanceEngineCyberia.renderPortalList(portalListId);
@@ -427,7 +507,7 @@ class InstanceEngineCyberia {
427
507
  { value: 'archived', display: 'archived', data: 'archived', onClick: () => {} },
428
508
  ];
429
509
 
430
- const managementTableHtml = await CyberiaInstanceManagement.RenderTable({
510
+ const managementTableHtml = await CyberiaInstanceManagement.instance({
431
511
  idModal: managementId,
432
512
  loadInstanceCallback: loadInstance,
433
513
  appStore,
@@ -452,7 +532,7 @@ class InstanceEngineCyberia {
452
532
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcFields, type: 'search-inputs' })}
453
533
  <div class="fl">
454
534
  <div class="in fll ${dcFields}-col-a">
455
- ${await Input.Render({
535
+ ${await Input.instance({
456
536
  id: idCode,
457
537
  label: html`Code`,
458
538
  containerClass: 'inl',
@@ -460,7 +540,7 @@ class InstanceEngineCyberia {
460
540
  })}
461
541
  </div>
462
542
  <div class="in fll ${dcFields}-col-b">
463
- ${await Input.Render({
543
+ ${await Input.instance({
464
544
  id: idName,
465
545
  label: html`Name`,
466
546
  containerClass: 'inl',
@@ -468,7 +548,7 @@ class InstanceEngineCyberia {
468
548
  })}
469
549
  </div>
470
550
  <div class="in fll ${dcFields}-col-c">
471
- ${await Input.Render({
551
+ ${await Input.instance({
472
552
  id: idDescription,
473
553
  label: html`Description`,
474
554
  containerClass: 'inl',
@@ -479,7 +559,7 @@ class InstanceEngineCyberia {
479
559
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcMetaFields, type: 'search-inputs' })}
480
560
  <div class="fl">
481
561
  <div class="in fll ${dcMetaFields}-col-a">
482
- ${await Input.Render({
562
+ ${await Input.instance({
483
563
  id: idTags,
484
564
  label: html`Tags (comma separated)`,
485
565
  containerClass: 'inl',
@@ -487,7 +567,7 @@ class InstanceEngineCyberia {
487
567
  })}
488
568
  </div>
489
569
  <div class="in fll ${dcMetaFields}-col-b">
490
- ${await DropDown.Render({
570
+ ${await DropDown.instance({
491
571
  id: idStatus,
492
572
  label: html`Status`,
493
573
  data: statusOptions.map((opt) => ({ ...opt })),
@@ -506,12 +586,12 @@ class InstanceEngineCyberia {
506
586
  </div>
507
587
  <div class="in section-mp" style="margin-top: 5px;">
508
588
  <div class="in instance-engine-thumbnail-preview" style="margin-bottom: 5px;"></div>
509
- ${await BtnIcon.Render({
589
+ ${await BtnIcon.instance({
510
590
  class: 'wfa btn-instance-engine-toggle-thumbnail',
511
591
  label: html`<i class="fa-solid fa-caret-right instance-engine-thumbnail-caret"></i> Thumbnail`,
512
592
  })}
513
593
  <div class="in instance-engine-thumbnail-body hide">
514
- ${await InputFile.Render(
594
+ ${await InputFile.instance(
515
595
  {
516
596
  id: idThumbnail,
517
597
  multiple: false,
@@ -543,7 +623,7 @@ class InstanceEngineCyberia {
543
623
  </div>
544
624
  </div>
545
625
  <div class="in section-mp" style="margin-top: 10px;">
546
- ${await DropDown.Render({
626
+ ${await DropDown.instance({
547
627
  id: idMapCodesDropdown,
548
628
  label: html`Cyberia Map Codes`,
549
629
  data: [],
@@ -564,12 +644,13 @@ class InstanceEngineCyberia {
564
644
  },
565
645
  })}
566
646
  </div>
647
+ <div class="in section-mp" style="margin-top: 10px;">${await InstanceEngineCyberia.buildItemIdsDropdown()}</div>
567
648
  <div class="in section-mp" style="margin-top: 10px;">
568
649
  <div class="in input-label" style="font-size:14px;margin-bottom:5px;">Portals</div>
569
650
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcPortalSource, type: 'search-inputs' })}
570
651
  <div class="fl">
571
652
  <div class="in fll ${dcPortalSource}-col-a">
572
- ${await Input.Render({
653
+ ${await Input.instance({
573
654
  id: idSourceMapCode,
574
655
  label: html`Source Map Code`,
575
656
  containerClass: 'inl',
@@ -577,7 +658,7 @@ class InstanceEngineCyberia {
577
658
  })}
578
659
  </div>
579
660
  <div class="in fll ${dcPortalSource}-col-b">
580
- ${await Input.Render({
661
+ ${await Input.instance({
581
662
  id: idSourceCellX,
582
663
  label: html`Source Cell X`,
583
664
  containerClass: 'inl',
@@ -587,7 +668,7 @@ class InstanceEngineCyberia {
587
668
  })}
588
669
  </div>
589
670
  <div class="in fll ${dcPortalSource}-col-c">
590
- ${await Input.Render({
671
+ ${await Input.instance({
591
672
  id: idSourceCellY,
592
673
  label: html`Source Cell Y`,
593
674
  containerClass: 'inl',
@@ -600,7 +681,7 @@ class InstanceEngineCyberia {
600
681
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcPortalTarget, type: 'search-inputs' })}
601
682
  <div class="fl">
602
683
  <div class="in fll ${dcPortalTarget}-col-a">
603
- ${await Input.Render({
684
+ ${await Input.instance({
604
685
  id: idTargetMapCode,
605
686
  label: html`Target Map Code`,
606
687
  containerClass: 'inl',
@@ -608,7 +689,7 @@ class InstanceEngineCyberia {
608
689
  })}
609
690
  </div>
610
691
  <div class="in fll ${dcPortalTarget}-col-b">
611
- ${await Input.Render({
692
+ ${await Input.instance({
612
693
  id: idTargetCellX,
613
694
  label: html`Target Cell X`,
614
695
  containerClass: 'inl',
@@ -618,7 +699,7 @@ class InstanceEngineCyberia {
618
699
  })}
619
700
  </div>
620
701
  <div class="in fll ${dcPortalTarget}-col-c">
621
- ${await Input.Render({
702
+ ${await Input.instance({
622
703
  id: idTargetCellY,
623
704
  label: html`Target Cell Y`,
624
705
  containerClass: 'inl',
@@ -629,17 +710,17 @@ class InstanceEngineCyberia {
629
710
  </div>
630
711
  </div>
631
712
  <div class="in" style="display:flex;gap:5px;flex-wrap:wrap;">
632
- ${await BtnIcon.Render({
713
+ ${await BtnIcon.instance({
633
714
  class: 'wfa btn-instance-engine-add-portal',
634
715
  label: html`<i class="fa-solid fa-plus"></i> Add Portal`,
635
716
  })}
636
- ${await BtnIcon.Render({
717
+ ${await BtnIcon.instance({
637
718
  class: 'wfa btn-instance-engine-portal-connect',
638
719
  label: html`<i class="fa-solid fa-circle-nodes"></i> Portal Connector`,
639
720
  })}
640
721
  </div>
641
722
  <div class="in" style="margin-top: 10px;">
642
- ${await BtnIcon.Render({
723
+ ${await BtnIcon.instance({
643
724
  class: 'wfa btn-instance-engine-toggle-portal-filter',
644
725
  label: html`<i class="fa-solid fa-caret-right instance-engine-portal-filter-caret"></i> Filters`,
645
726
  })}
@@ -647,7 +728,7 @@ class InstanceEngineCyberia {
647
728
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcPortalFilter, type: 'a-50-b-50' })}
648
729
  <div class="fl">
649
730
  <div class="in fll ${dcPortalFilter}-col-a">
650
- ${await Input.Render({
731
+ ${await Input.instance({
651
732
  id: idFilterSource,
652
733
  label: html`Source Map Code`,
653
734
  containerClass: 'inl',
@@ -656,7 +737,7 @@ class InstanceEngineCyberia {
656
737
  })}
657
738
  </div>
658
739
  <div class="in fll ${dcPortalFilter}-col-b">
659
- ${await Input.Render({
740
+ ${await Input.instance({
660
741
  id: idFilterTarget,
661
742
  label: html`Target Map Code`,
662
743
  containerClass: 'inl',
@@ -666,7 +747,7 @@ class InstanceEngineCyberia {
666
747
  </div>
667
748
  </div>
668
749
  <div class="in" style="margin-top:5px;">
669
- ${await BtnIcon.Render({
750
+ ${await BtnIcon.instance({
670
751
  class: 'wfa btn-instance-engine-clear-portal-filter',
671
752
  label: html`<i class="fa-solid fa-broom"></i> Clear Filters`,
672
753
  })}
@@ -679,13 +760,13 @@ class InstanceEngineCyberia {
679
760
  ${dynamicCol({ containerSelector: 'instance-engine-container', id: dcSaveNew, type: 'a-50-b-50' })}
680
761
  <div class="fl">
681
762
  <div class="in fll ${dcSaveNew}-col-a" style="padding: 5px;">
682
- ${await BtnIcon.Render({
763
+ ${await BtnIcon.instance({
683
764
  class: 'wfa btn-instance-engine-save',
684
765
  label: html`<i class="fa-solid fa-floppy-disk"></i> Save Instance`,
685
766
  })}
686
767
  </div>
687
768
  <div class="in fll ${dcSaveNew}-col-b" style="padding: 5px;">
688
- ${await BtnIcon.Render({
769
+ ${await BtnIcon.instance({
689
770
  class: 'wfa btn-instance-engine-new',
690
771
  label: html`<i class="fa-solid fa-file"></i> New Instance`,
691
772
  })}