@rpgjs/client 5.0.0-alpha.43 → 5.0.0-alpha.44

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 (137) hide show
  1. package/dist/Game/AnimationManager.js +25 -24
  2. package/dist/Game/AnimationManager.js.map +1 -1
  3. package/dist/Game/Event.js +11 -10
  4. package/dist/Game/Event.js.map +1 -1
  5. package/dist/Game/Map.js +78 -94
  6. package/dist/Game/Map.js.map +1 -1
  7. package/dist/Game/Object.js +182 -216
  8. package/dist/Game/Object.js.map +1 -1
  9. package/dist/Game/Player.js +11 -10
  10. package/dist/Game/Player.js.map +1 -1
  11. package/dist/Gui/Gui.js +440 -473
  12. package/dist/Gui/Gui.js.map +1 -1
  13. package/dist/Gui/NotificationManager.js +48 -50
  14. package/dist/Gui/NotificationManager.js.map +1 -1
  15. package/dist/Resource.js +132 -113
  16. package/dist/Resource.js.map +1 -1
  17. package/dist/RpgClientEngine.js +1333 -1486
  18. package/dist/RpgClientEngine.js.map +1 -1
  19. package/dist/Sound.js +162 -92
  20. package/dist/Sound.js.map +1 -1
  21. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.js +9 -0
  22. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorateMetadata.js +6 -0
  23. package/dist/components/animations/animation.ce.js +22 -19
  24. package/dist/components/animations/animation.ce.js.map +1 -1
  25. package/dist/components/animations/hit.ce.js +67 -68
  26. package/dist/components/animations/hit.ce.js.map +1 -1
  27. package/dist/components/animations/index.js +9 -8
  28. package/dist/components/animations/index.js.map +1 -1
  29. package/dist/components/character.ce.js +390 -314
  30. package/dist/components/character.ce.js.map +1 -1
  31. package/dist/components/dynamics/parse-value.js +42 -52
  32. package/dist/components/dynamics/parse-value.js.map +1 -1
  33. package/dist/components/dynamics/text.ce.js +71 -139
  34. package/dist/components/dynamics/text.ce.js.map +1 -1
  35. package/dist/components/gui/box.ce.js +26 -25
  36. package/dist/components/gui/box.ce.js.map +1 -1
  37. package/dist/components/gui/dialogbox/index.ce.js +202 -149
  38. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  39. package/dist/components/gui/gameover.ce.js +190 -138
  40. package/dist/components/gui/gameover.ce.js.map +1 -1
  41. package/dist/components/gui/hud/hud.ce.js +90 -33
  42. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  43. package/dist/components/gui/index.js +14 -0
  44. package/dist/components/gui/menu/equip-menu.ce.js +478 -346
  45. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  46. package/dist/components/gui/menu/exit-menu.ce.js +52 -33
  47. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  48. package/dist/components/gui/menu/items-menu.ce.js +341 -226
  49. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  50. package/dist/components/gui/menu/main-menu.ce.js +414 -205
  51. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  52. package/dist/components/gui/menu/options-menu.ce.js +46 -26
  53. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  54. package/dist/components/gui/menu/skills-menu.ce.js +104 -50
  55. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  56. package/dist/components/gui/mobile/index.js +18 -21
  57. package/dist/components/gui/mobile/index.js.map +1 -1
  58. package/dist/components/gui/mobile/mobile.ce.js +76 -15
  59. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  60. package/dist/components/gui/notification/notification.ce.js +62 -36
  61. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  62. package/dist/components/gui/save-load.ce.js +386 -239
  63. package/dist/components/gui/save-load.ce.js.map +1 -1
  64. package/dist/components/gui/shop/shop.ce.js +649 -319
  65. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  66. package/dist/components/gui/title-screen.ce.js +187 -145
  67. package/dist/components/gui/title-screen.ce.js.map +1 -1
  68. package/dist/components/index.js +4 -0
  69. package/dist/components/prebuilt/hp-bar.ce.js +114 -104
  70. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  71. package/dist/components/prebuilt/index.js +2 -0
  72. package/dist/components/prebuilt/light-halo.ce.js +92 -74
  73. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  74. package/dist/components/scenes/canvas.ce.js +58 -42
  75. package/dist/components/scenes/canvas.ce.js.map +1 -1
  76. package/dist/components/scenes/draw-map.ce.js +87 -64
  77. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  78. package/dist/components/scenes/event-layer.ce.js +26 -16
  79. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  80. package/dist/core/inject.js +11 -10
  81. package/dist/core/inject.js.map +1 -1
  82. package/dist/core/setup.js +13 -13
  83. package/dist/core/setup.js.map +1 -1
  84. package/dist/index.js +44 -41
  85. package/dist/module.js +169 -168
  86. package/dist/module.js.map +1 -1
  87. package/dist/node_modules/.pnpm/@signe_di@2.8.3/node_modules/@signe/di/dist/index.js +209 -298
  88. package/dist/node_modules/.pnpm/@signe_di@2.8.3/node_modules/@signe/di/dist/index.js.map +1 -1
  89. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +430 -507
  90. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +1 -1
  91. package/dist/node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js +2062 -2571
  92. package/dist/node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js.map +1 -1
  93. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/chunk-7QVYU63E.js +8 -3
  94. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/chunk-7QVYU63E.js.map +1 -1
  95. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/client/index.js +78 -101
  96. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/client/index.js.map +1 -1
  97. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/index.js +264 -401
  98. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/index.js.map +1 -1
  99. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js +9 -7
  100. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js.map +1 -1
  101. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js +106 -165
  102. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -1
  103. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js +361 -461
  104. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
  105. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/index.js +2 -0
  106. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +3633 -4280
  107. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
  108. package/dist/presets/animation.js +37 -25
  109. package/dist/presets/animation.js.map +1 -1
  110. package/dist/presets/faceset.js +49 -22
  111. package/dist/presets/faceset.js.map +1 -1
  112. package/dist/presets/icon.js +13 -13
  113. package/dist/presets/icon.js.map +1 -1
  114. package/dist/presets/index.js +15 -14
  115. package/dist/presets/index.js.map +1 -1
  116. package/dist/presets/lpc.js +96 -93
  117. package/dist/presets/lpc.js.map +1 -1
  118. package/dist/presets/rmspritesheet.js +40 -39
  119. package/dist/presets/rmspritesheet.js.map +1 -1
  120. package/dist/services/AbstractSocket.js +10 -8
  121. package/dist/services/AbstractSocket.js.map +1 -1
  122. package/dist/services/keyboardControls.js +20 -18
  123. package/dist/services/keyboardControls.js.map +1 -1
  124. package/dist/services/loadMap.js +120 -36
  125. package/dist/services/loadMap.js.map +1 -1
  126. package/dist/services/mmorpg.js +128 -136
  127. package/dist/services/mmorpg.js.map +1 -1
  128. package/dist/services/save.js +74 -66
  129. package/dist/services/save.js.map +1 -1
  130. package/dist/services/standalone.js +165 -167
  131. package/dist/services/standalone.js.map +1 -1
  132. package/dist/utils/getEntityProp.js +49 -51
  133. package/dist/utils/getEntityProp.js.map +1 -1
  134. package/package.json +8 -8
  135. package/src/components/character.ce +1 -1
  136. package/src/components/scenes/draw-map.ce +3 -1
  137. package/dist/index.js.map +0 -1
@@ -1,69 +1,77 @@
1
- import { inject } from '../core/inject.js';
2
- import { WebSocketToken } from './AbstractSocket.js';
3
-
4
- const SaveClientToken = "SaveClientToken";
5
- class SaveClientService {
6
- constructor() {
7
- this.webSocket = inject(WebSocketToken);
8
- this.pending = /* @__PURE__ */ new Map();
9
- this.requestCounter = 0;
10
- }
11
- initialize() {
12
- const saveListResult = (data) => this.resolveRequest(data.requestId, data);
13
- const saveSaveResult = (data) => this.resolveRequest(data.requestId, data);
14
- const saveLoadResult = (data) => this.resolveRequest(data.requestId, data);
15
- const saveErrorResult = (data) => this.rejectRequest(data.requestId, data.message);
16
- this.webSocket.off("save.list.result", saveListResult);
17
- this.webSocket.off("save.save.result", saveSaveResult);
18
- this.webSocket.off("save.load.result", saveLoadResult);
19
- this.webSocket.off("save.error", saveErrorResult);
20
- this.webSocket.on("save.list.result", saveListResult);
21
- this.webSocket.on("save.save.result", saveSaveResult);
22
- this.webSocket.on("save.load.result", saveLoadResult);
23
- this.webSocket.on("save.error", saveErrorResult);
24
- }
25
- listSlots() {
26
- return this.request("save.list", {}).then((result) => result.slots);
27
- }
28
- saveSlot(index, meta = {}) {
29
- return this.request("save.save", { index, meta }).then((result) => result.slots);
30
- }
31
- loadSlot(index) {
32
- return this.request("save.load", { index }).then((result) => result.ok);
33
- }
34
- request(event, payload) {
35
- return new Promise((resolve, reject) => {
36
- if (!this.webSocket) {
37
- this.initialize();
38
- }
39
- const requestId = this.nextRequestId();
40
- this.pending.set(requestId, { resolve, reject });
41
- this.webSocket?.emit(event, { requestId, ...payload });
42
- });
43
- }
44
- resolveRequest(requestId, result) {
45
- const pending = this.pending.get(requestId);
46
- if (!pending) return;
47
- this.pending.delete(requestId);
48
- pending.resolve(result);
49
- }
50
- rejectRequest(requestId, message) {
51
- const pending = this.pending.get(requestId);
52
- if (!pending) return;
53
- this.pending.delete(requestId);
54
- pending.reject(new Error(message));
55
- }
56
- nextRequestId() {
57
- this.requestCounter += 1;
58
- return `${Date.now()}-${this.requestCounter}`;
59
- }
60
- }
1
+ import { inject } from "../core/inject.js";
2
+ import { WebSocketToken } from "./AbstractSocket.js";
3
+ //#region src/services/save.ts
4
+ var SaveClientToken = "SaveClientToken";
5
+ var SaveClientService = class {
6
+ constructor() {
7
+ this.webSocket = inject(WebSocketToken);
8
+ this.pending = /* @__PURE__ */ new Map();
9
+ this.requestCounter = 0;
10
+ }
11
+ initialize() {
12
+ const saveListResult = (data) => this.resolveRequest(data.requestId, data);
13
+ const saveSaveResult = (data) => this.resolveRequest(data.requestId, data);
14
+ const saveLoadResult = (data) => this.resolveRequest(data.requestId, data);
15
+ const saveErrorResult = (data) => this.rejectRequest(data.requestId, data.message);
16
+ this.webSocket.off("save.list.result", saveListResult);
17
+ this.webSocket.off("save.save.result", saveSaveResult);
18
+ this.webSocket.off("save.load.result", saveLoadResult);
19
+ this.webSocket.off("save.error", saveErrorResult);
20
+ this.webSocket.on("save.list.result", saveListResult);
21
+ this.webSocket.on("save.save.result", saveSaveResult);
22
+ this.webSocket.on("save.load.result", saveLoadResult);
23
+ this.webSocket.on("save.error", saveErrorResult);
24
+ }
25
+ listSlots() {
26
+ return this.request("save.list", {}).then((result) => result.slots);
27
+ }
28
+ saveSlot(index, meta = {}) {
29
+ return this.request("save.save", {
30
+ index,
31
+ meta
32
+ }).then((result) => result.slots);
33
+ }
34
+ loadSlot(index) {
35
+ return this.request("save.load", { index }).then((result) => result.ok);
36
+ }
37
+ request(event, payload) {
38
+ return new Promise((resolve, reject) => {
39
+ if (!this.webSocket) this.initialize();
40
+ const requestId = this.nextRequestId();
41
+ this.pending.set(requestId, {
42
+ resolve,
43
+ reject
44
+ });
45
+ this.webSocket?.emit(event, {
46
+ requestId,
47
+ ...payload
48
+ });
49
+ });
50
+ }
51
+ resolveRequest(requestId, result) {
52
+ const pending = this.pending.get(requestId);
53
+ if (!pending) return;
54
+ this.pending.delete(requestId);
55
+ pending.resolve(result);
56
+ }
57
+ rejectRequest(requestId, message) {
58
+ const pending = this.pending.get(requestId);
59
+ if (!pending) return;
60
+ this.pending.delete(requestId);
61
+ pending.reject(new Error(message));
62
+ }
63
+ nextRequestId() {
64
+ this.requestCounter += 1;
65
+ return `${Date.now()}-${this.requestCounter}`;
66
+ }
67
+ };
61
68
  function provideSaveClient() {
62
- return {
63
- provide: SaveClientService,
64
- useClass: SaveClientService
65
- };
69
+ return {
70
+ provide: SaveClientService,
71
+ useClass: SaveClientService
72
+ };
66
73
  }
67
-
74
+ //#endregion
68
75
  export { SaveClientService, SaveClientToken, provideSaveClient };
69
- //# sourceMappingURL=save.js.map
76
+
77
+ //# sourceMappingURL=save.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"save.js","sources":["../../src/services/save.ts"],"sourcesContent":["import type { SaveSlotList, SaveSlotMeta } from \"@rpgjs/common\";\nimport { inject } from \"../core/inject\";\nimport { AbstractWebsocket, WebSocketToken } from \"./AbstractSocket\";\n\nexport const SaveClientToken = \"SaveClientToken\";\n\ntype SaveListResult = {\n requestId: string;\n slots: SaveSlotList;\n};\n\ntype SaveSaveResult = {\n requestId: string;\n index: number;\n slots: SaveSlotList;\n};\n\ntype SaveLoadResult = {\n requestId: string;\n index: number;\n ok: boolean;\n slot?: SaveSlotMeta;\n};\n\ntype SaveErrorResult = {\n requestId: string;\n message: string;\n};\n\ntype PendingRequest = {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n};\n\nexport class SaveClientService {\n private webSocket: AbstractWebsocket = inject(WebSocketToken);\n private pending: Map<string, PendingRequest> = new Map();\n private requestCounter = 0;\n\n initialize() {\n const saveListResult = (data: SaveListResult) => this.resolveRequest(data.requestId, data);\n const saveSaveResult = (data: SaveSaveResult) => this.resolveRequest(data.requestId, data);\n const saveLoadResult = (data: SaveLoadResult) => this.resolveRequest(data.requestId, data);\n const saveErrorResult = (data: SaveErrorResult) => this.rejectRequest(data.requestId, data.message);\n this.webSocket.off(\"save.list.result\", saveListResult);\n this.webSocket.off(\"save.save.result\", saveSaveResult);\n this.webSocket.off(\"save.load.result\", saveLoadResult);\n this.webSocket.off(\"save.error\", saveErrorResult);\n this.webSocket.on(\"save.list.result\", saveListResult);\n this.webSocket.on(\"save.save.result\", saveSaveResult);\n this.webSocket.on(\"save.load.result\", saveLoadResult);\n this.webSocket.on(\"save.error\", saveErrorResult);\n }\n\n listSlots(): Promise<SaveSlotList> {\n return this.request<SaveListResult>(\"save.list\", {}).then((result) => result.slots);\n }\n\n saveSlot(index: number, meta: SaveSlotMeta = {}): Promise<SaveSlotList> {\n return this.request<SaveSaveResult>(\"save.save\", { index, meta }).then((result) => result.slots);\n }\n\n loadSlot(index: number): Promise<boolean> {\n return this.request<SaveLoadResult>(\"save.load\", { index }).then((result) => result.ok);\n }\n\n private request<T>(event: string, payload: Record<string, any>): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.webSocket) {\n this.initialize();\n }\n const requestId = this.nextRequestId();\n this.pending.set(requestId, { resolve, reject });\n this.webSocket?.emit(event, { requestId, ...payload });\n });\n }\n\n private resolveRequest(requestId: string, result: any) {\n const pending = this.pending.get(requestId);\n if (!pending) return;\n this.pending.delete(requestId);\n pending.resolve(result);\n }\n\n private rejectRequest(requestId: string, message: string) {\n const pending = this.pending.get(requestId);\n if (!pending) return;\n this.pending.delete(requestId);\n pending.reject(new Error(message));\n }\n\n private nextRequestId(): string {\n this.requestCounter += 1;\n return `${Date.now()}-${this.requestCounter}`;\n }\n}\n\nexport function provideSaveClient() {\n return {\n provide: SaveClientService,\n useClass: SaveClientService,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"save.js","names":[],"sources":["../../src/services/save.ts"],"sourcesContent":["import type { SaveSlotList, SaveSlotMeta } from \"@rpgjs/common\";\nimport { inject } from \"../core/inject\";\nimport { AbstractWebsocket, WebSocketToken } from \"./AbstractSocket\";\n\nexport const SaveClientToken = \"SaveClientToken\";\n\ntype SaveListResult = {\n requestId: string;\n slots: SaveSlotList;\n};\n\ntype SaveSaveResult = {\n requestId: string;\n index: number;\n slots: SaveSlotList;\n};\n\ntype SaveLoadResult = {\n requestId: string;\n index: number;\n ok: boolean;\n slot?: SaveSlotMeta;\n};\n\ntype SaveErrorResult = {\n requestId: string;\n message: string;\n};\n\ntype PendingRequest = {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n};\n\nexport class SaveClientService {\n private webSocket: AbstractWebsocket = inject(WebSocketToken);\n private pending: Map<string, PendingRequest> = new Map();\n private requestCounter = 0;\n\n initialize() {\n const saveListResult = (data: SaveListResult) => this.resolveRequest(data.requestId, data);\n const saveSaveResult = (data: SaveSaveResult) => this.resolveRequest(data.requestId, data);\n const saveLoadResult = (data: SaveLoadResult) => this.resolveRequest(data.requestId, data);\n const saveErrorResult = (data: SaveErrorResult) => this.rejectRequest(data.requestId, data.message);\n this.webSocket.off(\"save.list.result\", saveListResult);\n this.webSocket.off(\"save.save.result\", saveSaveResult);\n this.webSocket.off(\"save.load.result\", saveLoadResult);\n this.webSocket.off(\"save.error\", saveErrorResult);\n this.webSocket.on(\"save.list.result\", saveListResult);\n this.webSocket.on(\"save.save.result\", saveSaveResult);\n this.webSocket.on(\"save.load.result\", saveLoadResult);\n this.webSocket.on(\"save.error\", saveErrorResult);\n }\n\n listSlots(): Promise<SaveSlotList> {\n return this.request<SaveListResult>(\"save.list\", {}).then((result) => result.slots);\n }\n\n saveSlot(index: number, meta: SaveSlotMeta = {}): Promise<SaveSlotList> {\n return this.request<SaveSaveResult>(\"save.save\", { index, meta }).then((result) => result.slots);\n }\n\n loadSlot(index: number): Promise<boolean> {\n return this.request<SaveLoadResult>(\"save.load\", { index }).then((result) => result.ok);\n }\n\n private request<T>(event: string, payload: Record<string, any>): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.webSocket) {\n this.initialize();\n }\n const requestId = this.nextRequestId();\n this.pending.set(requestId, { resolve, reject });\n this.webSocket?.emit(event, { requestId, ...payload });\n });\n }\n\n private resolveRequest(requestId: string, result: any) {\n const pending = this.pending.get(requestId);\n if (!pending) return;\n this.pending.delete(requestId);\n pending.resolve(result);\n }\n\n private rejectRequest(requestId: string, message: string) {\n const pending = this.pending.get(requestId);\n if (!pending) return;\n this.pending.delete(requestId);\n pending.reject(new Error(message));\n }\n\n private nextRequestId(): string {\n this.requestCounter += 1;\n return `${Date.now()}-${this.requestCounter}`;\n }\n}\n\nexport function provideSaveClient() {\n return {\n provide: SaveClientService,\n useClass: SaveClientService,\n };\n}\n"],"mappings":";;;AAIA,IAAa,kBAAkB;AA8B/B,IAAa,oBAAb,MAA+B;;mBACU,OAAO,eAAe;iCACd,IAAI,KAAK;wBAC/B;;CAEzB,aAAa;EACX,MAAM,kBAAkB,SAAyB,KAAK,eAAe,KAAK,WAAW,KAAK;EAC1F,MAAM,kBAAkB,SAAyB,KAAK,eAAe,KAAK,WAAW,KAAK;EAC1F,MAAM,kBAAkB,SAAyB,KAAK,eAAe,KAAK,WAAW,KAAK;EAC1F,MAAM,mBAAmB,SAA0B,KAAK,cAAc,KAAK,WAAW,KAAK,QAAQ;AACnG,OAAK,UAAU,IAAI,oBAAoB,eAAe;AACtD,OAAK,UAAU,IAAI,oBAAoB,eAAe;AACtD,OAAK,UAAU,IAAI,oBAAoB,eAAe;AACtD,OAAK,UAAU,IAAI,cAAc,gBAAgB;AACjD,OAAK,UAAU,GAAG,oBAAoB,eAAe;AACrD,OAAK,UAAU,GAAG,oBAAoB,eAAe;AACrD,OAAK,UAAU,GAAG,oBAAoB,eAAe;AACrD,OAAK,UAAU,GAAG,cAAc,gBAAgB;;CAGlD,YAAmC;AACjC,SAAO,KAAK,QAAwB,aAAa,EAAE,CAAC,CAAC,MAAM,WAAW,OAAO,MAAM;;CAGrF,SAAS,OAAe,OAAqB,EAAE,EAAyB;AACtE,SAAO,KAAK,QAAwB,aAAa;GAAE;GAAO;GAAM,CAAC,CAAC,MAAM,WAAW,OAAO,MAAM;;CAGlG,SAAS,OAAiC;AACxC,SAAO,KAAK,QAAwB,aAAa,EAAE,OAAO,CAAC,CAAC,MAAM,WAAW,OAAO,GAAG;;CAGzF,QAAmB,OAAe,SAA0C;AAC1E,SAAO,IAAI,SAAS,SAAS,WAAW;AACtC,OAAI,CAAC,KAAK,UACR,MAAK,YAAY;GAEnB,MAAM,YAAY,KAAK,eAAe;AACtC,QAAK,QAAQ,IAAI,WAAW;IAAE;IAAS;IAAQ,CAAC;AAChD,QAAK,WAAW,KAAK,OAAO;IAAE;IAAW,GAAG;IAAS,CAAC;IACtD;;CAGJ,eAAuB,WAAmB,QAAa;EACrD,MAAM,UAAU,KAAK,QAAQ,IAAI,UAAU;AAC3C,MAAI,CAAC,QAAS;AACd,OAAK,QAAQ,OAAO,UAAU;AAC9B,UAAQ,QAAQ,OAAO;;CAGzB,cAAsB,WAAmB,SAAiB;EACxD,MAAM,UAAU,KAAK,QAAQ,IAAI,UAAU;AAC3C,MAAI,CAAC,QAAS;AACd,OAAK,QAAQ,OAAO,UAAU;AAC9B,UAAQ,OAAO,IAAI,MAAM,QAAQ,CAAC;;CAGpC,gBAAgC;AAC9B,OAAK,kBAAkB;AACvB,SAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK;;;AAIjC,SAAgB,oBAAoB;AAClC,QAAO;EACL,SAAS;EACT,UAAU;EACX"}
@@ -1,170 +1,168 @@
1
- import { WebSocketToken, AbstractWebsocket } from './AbstractSocket.js';
2
- import { ServerIo, ClientIo } from '../node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js';
3
- import { RpgClientEngine } from '../RpgClientEngine.js';
4
- import { UpdateMapToken, UpdateMapService } from '@rpgjs/common';
5
- import { RpgGui } from '../Gui/Gui.js';
6
- import { provideKeyboardControls } from './keyboardControls.js';
7
- import { provideSaveClient } from './save.js';
8
-
9
- class BridgeWebsocket extends AbstractWebsocket {
10
- constructor(context, server, options = {}) {
11
- super(context);
12
- this.context = context;
13
- this.server = server;
14
- this.pendingOn = [];
15
- this.rooms = {
16
- partyFn: async (roomId) => {
17
- this.room = new ServerIo(roomId, this.rooms);
18
- const server = new this.server(this.room);
19
- await server.onStart();
20
- await server.subRoom.onStart();
21
- this.context.set("server", server);
22
- return server;
23
- },
24
- env: {}
25
- };
26
- this.rooms.env = options.env || {};
27
- this.room = new ServerIo("lobby-1", this.rooms);
28
- }
29
- async connection(listeners) {
30
- this.serverInstance = new this.server(this.room);
31
- await this.serverInstance.onStart();
32
- await this.serverInstance.subRoom.onStart();
33
- this.context.set("server", this.serverInstance);
34
- return this._connection(listeners);
35
- }
36
- async _connection(listeners) {
37
- this.serverInstance = this.context.get("server");
38
- this.socket = new ClientIo(this.serverInstance, "player-client-id");
39
- const url = new URL("http://localhost");
40
- const request = new Request(url.toString(), {
41
- method: "GET",
42
- headers: {
43
- "Content-Type": "application/json"
44
- }
45
- });
46
- listeners?.(this.socket);
47
- await this.serverInstance.onConnect(this.socket.conn, { request });
48
- this.room.clients.set(this.socket.id, this.socket);
49
- this.pendingOn.forEach(({ event, callback }) => this.socket.addEventListener(event, callback));
50
- this.pendingOn = [];
51
- return this.socket;
52
- }
53
- on(key, callback) {
54
- const handler = (event) => {
55
- const object = JSON.parse(event);
56
- if (object.type === key) {
57
- callback(object.value);
58
- }
59
- };
60
- if (!this.socket) {
61
- this.pendingOn.push({ event: "message", callback: handler });
62
- return;
63
- }
64
- this.socket.addEventListener("message", handler);
65
- }
66
- off(event, callback) {
67
- if (!this.socket) return;
68
- this.socket.removeEventListener(event, callback);
69
- }
70
- emit(event, data) {
71
- this.socket.send({
72
- action: event,
73
- value: data
74
- });
75
- }
76
- /**
77
- * Update underlying connection properties before a reconnect
78
- *
79
- * Design
80
- * - Dynamically register a factory for the requested room to ensure a fresh server instance
81
- * - Swap the internal ServerIo to target the new room
82
- *
83
- * @param params - Properties to update
84
- * @param params.room - The target room id (e.g. `map-simplemap2`)
85
- *
86
- * @example
87
- * ```ts
88
- * websocket.updateProperties({ room: 'map-simplemap2' })
89
- * await websocket.reconnect()
90
- * ```
91
- */
92
- updateProperties(_params) {
93
- }
94
- /**
95
- * Reconnect the client to the current Party room
96
- *
97
- * Design
98
- * - Must be called after `updateProperties()` when switching rooms
99
- * - Rebuilds the client <-> server bridge and re-triggers connection listeners
100
- *
101
- * @param listeners - Optional callback to re-bind event handlers on the new socket
102
- *
103
- * @example
104
- * ```ts
105
- * websocket.updateProperties({ room: 'map-dungeon' })
106
- * await websocket.reconnect((socket) => {
107
- * // re-bind events here
108
- * })
109
- * ```
110
- */
111
- async reconnect(listeners) {
112
- await this._connection((socket) => {
113
- listeners?.(socket);
114
- });
115
- }
116
- getServer() {
117
- return this.serverInstance;
118
- }
119
- getSocket() {
120
- return this.socket;
121
- }
122
- }
123
- class UpdateMapStandaloneService extends UpdateMapService {
124
- /**
125
- * Update the current room map data on the server side
126
- *
127
- * Design
128
- * - Uses the in-memory server instance stored in context (standalone mode)
129
- * - Builds a local HTTP-like request to the current Party room endpoint
130
- *
131
- * @param map - The map payload to apply on the server
132
- *
133
- * @example
134
- * ```ts
135
- * await updateMapService.update({ width: 1024, height: 768, events: [] })
136
- * ```
137
- */
138
- async update(map) {
139
- this.server = this.context.get("server");
140
- const roomId = this.server?.room?.id ?? "lobby-1";
141
- const req = {
142
- url: `http://localhost/parties/main/${roomId}/map/update`,
143
- method: "POST",
144
- headers: new Headers({}),
145
- json: async () => {
146
- return map;
147
- }
148
- };
149
- await this.server.onRequest(req);
150
- }
151
- }
1
+ import { AbstractWebsocket, WebSocketToken } from "./AbstractSocket.js";
2
+ import { provideSaveClient } from "./save.js";
3
+ import { RpgGui } from "../Gui/Gui.js";
4
+ import { RpgClientEngine } from "../RpgClientEngine.js";
5
+ import { ClientIo, ServerIo } from "../node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js";
6
+ import { provideKeyboardControls } from "./keyboardControls.js";
7
+ import { UpdateMapService, UpdateMapToken } from "@rpgjs/common";
8
+ //#region src/services/standalone.ts
9
+ var BridgeWebsocket = class extends AbstractWebsocket {
10
+ constructor(context, server, options = {}) {
11
+ super(context);
12
+ this.context = context;
13
+ this.server = server;
14
+ this.pendingOn = [];
15
+ this.rooms = {
16
+ partyFn: async (roomId) => {
17
+ this.room = new ServerIo(roomId, this.rooms);
18
+ const server = new this.server(this.room);
19
+ await server.onStart();
20
+ await server.subRoom.onStart();
21
+ this.context.set("server", server);
22
+ return server;
23
+ },
24
+ env: {}
25
+ };
26
+ this.rooms.env = options.env || {};
27
+ this.room = new ServerIo("lobby-1", this.rooms);
28
+ }
29
+ async connection(listeners) {
30
+ this.serverInstance = new this.server(this.room);
31
+ await this.serverInstance.onStart();
32
+ await this.serverInstance.subRoom.onStart();
33
+ this.context.set("server", this.serverInstance);
34
+ return this._connection(listeners);
35
+ }
36
+ async _connection(listeners) {
37
+ this.serverInstance = this.context.get("server");
38
+ this.socket = new ClientIo(this.serverInstance, "player-client-id");
39
+ const url = new URL("http://localhost");
40
+ const request = new Request(url.toString(), {
41
+ method: "GET",
42
+ headers: { "Content-Type": "application/json" }
43
+ });
44
+ listeners?.(this.socket);
45
+ await this.serverInstance.onConnect(this.socket.conn, { request });
46
+ this.room.clients.set(this.socket.id, this.socket);
47
+ this.pendingOn.forEach(({ event, callback }) => this.socket.addEventListener(event, callback));
48
+ this.pendingOn = [];
49
+ return this.socket;
50
+ }
51
+ on(key, callback) {
52
+ const handler = (event) => {
53
+ const object = JSON.parse(event);
54
+ if (object.type === key) callback(object.value);
55
+ };
56
+ if (!this.socket) {
57
+ this.pendingOn.push({
58
+ event: "message",
59
+ callback: handler
60
+ });
61
+ return;
62
+ }
63
+ this.socket.addEventListener("message", handler);
64
+ }
65
+ off(event, callback) {
66
+ if (!this.socket) return;
67
+ this.socket.removeEventListener(event, callback);
68
+ }
69
+ emit(event, data) {
70
+ this.socket.send({
71
+ action: event,
72
+ value: data
73
+ });
74
+ }
75
+ /**
76
+ * Update underlying connection properties before a reconnect
77
+ *
78
+ * Design
79
+ * - Dynamically register a factory for the requested room to ensure a fresh server instance
80
+ * - Swap the internal ServerIo to target the new room
81
+ *
82
+ * @param params - Properties to update
83
+ * @param params.room - The target room id (e.g. `map-simplemap2`)
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * websocket.updateProperties({ room: 'map-simplemap2' })
88
+ * await websocket.reconnect()
89
+ * ```
90
+ */
91
+ updateProperties(_params) {}
92
+ /**
93
+ * Reconnect the client to the current Party room
94
+ *
95
+ * Design
96
+ * - Must be called after `updateProperties()` when switching rooms
97
+ * - Rebuilds the client <-> server bridge and re-triggers connection listeners
98
+ *
99
+ * @param listeners - Optional callback to re-bind event handlers on the new socket
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * websocket.updateProperties({ room: 'map-dungeon' })
104
+ * await websocket.reconnect((socket) => {
105
+ * // re-bind events here
106
+ * })
107
+ * ```
108
+ */
109
+ async reconnect(listeners) {
110
+ await this._connection((socket) => {
111
+ listeners?.(socket);
112
+ });
113
+ }
114
+ getServer() {
115
+ return this.serverInstance;
116
+ }
117
+ getSocket() {
118
+ return this.socket;
119
+ }
120
+ };
121
+ var UpdateMapStandaloneService = class extends UpdateMapService {
122
+ /**
123
+ * Update the current room map data on the server side
124
+ *
125
+ * Design
126
+ * - Uses the in-memory server instance stored in context (standalone mode)
127
+ * - Builds a local HTTP-like request to the current Party room endpoint
128
+ *
129
+ * @param map - The map payload to apply on the server
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * await updateMapService.update({ width: 1024, height: 768, events: [] })
134
+ * ```
135
+ */
136
+ async update(map) {
137
+ this.server = this.context.get("server");
138
+ const req = {
139
+ url: `http://localhost/parties/main/${this.server?.room?.id ?? "lobby-1"}/map/update`,
140
+ method: "POST",
141
+ headers: new Headers({}),
142
+ json: async () => {
143
+ return map;
144
+ }
145
+ };
146
+ await this.server.onRequest(req);
147
+ }
148
+ };
152
149
  function provideRpg(server, options = {}) {
153
- return [
154
- {
155
- provide: WebSocketToken,
156
- useFactory: (context) => new BridgeWebsocket(context, server, options)
157
- },
158
- {
159
- provide: UpdateMapToken,
160
- useClass: UpdateMapStandaloneService
161
- },
162
- provideKeyboardControls(),
163
- provideSaveClient(),
164
- RpgGui,
165
- RpgClientEngine
166
- ];
150
+ return [
151
+ {
152
+ provide: WebSocketToken,
153
+ useFactory: (context) => new BridgeWebsocket(context, server, options)
154
+ },
155
+ {
156
+ provide: UpdateMapToken,
157
+ useClass: UpdateMapStandaloneService
158
+ },
159
+ provideKeyboardControls(),
160
+ provideSaveClient(),
161
+ RpgGui,
162
+ RpgClientEngine
163
+ ];
167
164
  }
168
-
165
+ //#endregion
169
166
  export { provideRpg };
170
- //# sourceMappingURL=standalone.js.map
167
+
168
+ //# sourceMappingURL=standalone.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.js","sources":["../../src/services/standalone.ts"],"sourcesContent":["import { AbstractWebsocket, SocketUpdateProperties, WebSocketToken } from \"./AbstractSocket\";\nimport { ClientIo, ServerIo } from \"@signe/room\";\nimport { Context } from \"@signe/di\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { UpdateMapService, UpdateMapToken } from \"@rpgjs/common\";\nimport { LoadMapToken } from \"./loadMap\";\nimport { RpgGui } from \"../Gui/Gui\";\nimport { provideKeyboardControls } from \"./keyboardControls\";\nimport { provideSaveClient } from \"./save\";\n\ntype ServerIo = any;\ntype ClientIo = any;\n\ninterface StandaloneOptions {\n env?: Record<string, any>;\n}\n\nclass BridgeWebsocket extends AbstractWebsocket {\n private room: ServerIo;\n private socket: ClientIo;\n private pendingOn: Array<{ event: string; callback: (data: any) => void }> = [];\n private rooms = {\n partyFn: async (roomId: string) => {\n this.room = new ServerIo(roomId, this.rooms);\n const server = new this.server(this.room)\n await server.onStart();\n await server.subRoom.onStart()\n this.context.set('server', server)\n return server\n },\n env: {}\n }\n private serverInstance: any;\n\n constructor(protected context: Context, private server: any, options: StandaloneOptions = {}) {\n super(context);\n // fake room\n this.rooms.env = options.env || {};\n this.room = new ServerIo(\"lobby-1\", this.rooms);\n }\n\n async connection(listeners?: (data: any) => void) {\n this.serverInstance = new this.server(this.room);\n await this.serverInstance.onStart();\n await this.serverInstance.subRoom.onStart()\n this.context.set('server', this.serverInstance)\n return this._connection(listeners)\n }\n\n private async _connection(listeners?: (data: any) => void) {\n this.serverInstance = this.context.get('server')\n this.socket = new ClientIo(this.serverInstance, 'player-client-id');\n const url = new URL('http://localhost')\n const request = new Request(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n listeners?.(this.socket)\n await this.serverInstance.onConnect(this.socket.conn as any, { request } as any);\n this.room.clients.set(this.socket.id, this.socket);\n this.pendingOn.forEach(({ event, callback }) => this.socket.addEventListener(event, callback));\n this.pendingOn = [];\n return this.socket\n }\n\n on(key: string, callback: (data: any) => void) {\n const handler = (event) => {\n const object = JSON.parse(event);\n if (object.type === key) {\n callback(object.value);\n }\n };\n if (!this.socket) {\n this.pendingOn.push({ event: \"message\", callback: handler });\n return;\n }\n this.socket.addEventListener(\"message\", handler);\n }\n\n off(event: string, callback: (data: any) => void) {\n if (!this.socket) return;\n this.socket.removeEventListener(event, callback);\n }\n\n emit(event: string, data: any) {\n this.socket.send({\n action: event,\n value: data,\n });\n }\n\n /**\n * Update underlying connection properties before a reconnect\n *\n * Design\n * - Dynamically register a factory for the requested room to ensure a fresh server instance\n * - Swap the internal ServerIo to target the new room\n *\n * @param params - Properties to update\n * @param params.room - The target room id (e.g. `map-simplemap2`)\n *\n * @example\n * ```ts\n * websocket.updateProperties({ room: 'map-simplemap2' })\n * await websocket.reconnect()\n * ```\n */\n updateProperties(_params: SocketUpdateProperties) {\n // empty\n }\n\n /**\n * Reconnect the client to the current Party room\n *\n * Design\n * - Must be called after `updateProperties()` when switching rooms\n * - Rebuilds the client <-> server bridge and re-triggers connection listeners\n *\n * @param listeners - Optional callback to re-bind event handlers on the new socket\n *\n * @example\n * ```ts\n * websocket.updateProperties({ room: 'map-dungeon' })\n * await websocket.reconnect((socket) => {\n * // re-bind events here\n * })\n * ```\n */\n async reconnect(listeners?: (data: any) => void): Promise<void> {\n await this._connection((socket) => {\n listeners?.(socket)\n })\n }\n\n getServer() {\n return this.serverInstance\n }\n\n getSocket() {\n return this.socket\n }\n}\n\nclass UpdateMapStandaloneService extends UpdateMapService {\n private server: any;\n\n /**\n * Update the current room map data on the server side\n *\n * Design\n * - Uses the in-memory server instance stored in context (standalone mode)\n * - Builds a local HTTP-like request to the current Party room endpoint\n *\n * @param map - The map payload to apply on the server\n *\n * @example\n * ```ts\n * await updateMapService.update({ width: 1024, height: 768, events: [] })\n * ```\n */\n async update(map: any) {\n this.server = this.context.get('server')\n const roomId = this.server?.room?.id ?? 'lobby-1'\n const req = {\n url: `http://localhost/parties/main/${roomId}/map/update`,\n method: 'POST',\n headers: new Headers({}),\n json: async () => {\n return map;\n }\n };\n await this.server.onRequest(req)\n }\n}\n\nexport function provideRpg(server: any, options: StandaloneOptions = {}) {\n return [\n {\n provide: WebSocketToken,\n useFactory: (context: Context) => new BridgeWebsocket(context, server, options),\n },\n {\n provide: UpdateMapToken,\n useClass: UpdateMapStandaloneService,\n },\n provideKeyboardControls(),\n provideSaveClient(),\n RpgGui,\n RpgClientEngine,\n ];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standalone.js","names":[],"sources":["../../src/services/standalone.ts"],"sourcesContent":["import { AbstractWebsocket, SocketUpdateProperties, WebSocketToken } from \"./AbstractSocket\";\nimport { ClientIo, ServerIo } from \"@signe/room\";\nimport { Context } from \"@signe/di\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { UpdateMapService, UpdateMapToken } from \"@rpgjs/common\";\nimport { LoadMapToken } from \"./loadMap\";\nimport { RpgGui } from \"../Gui/Gui\";\nimport { provideKeyboardControls } from \"./keyboardControls\";\nimport { provideSaveClient } from \"./save\";\n\ntype ServerIo = any;\ntype ClientIo = any;\n\ninterface StandaloneOptions {\n env?: Record<string, any>;\n}\n\nclass BridgeWebsocket extends AbstractWebsocket {\n private room: ServerIo;\n private socket: ClientIo;\n private pendingOn: Array<{ event: string; callback: (data: any) => void }> = [];\n private rooms = {\n partyFn: async (roomId: string) => {\n this.room = new ServerIo(roomId, this.rooms);\n const server = new this.server(this.room)\n await server.onStart();\n await server.subRoom.onStart()\n this.context.set('server', server)\n return server\n },\n env: {}\n }\n private serverInstance: any;\n\n constructor(protected context: Context, private server: any, options: StandaloneOptions = {}) {\n super(context);\n // fake room\n this.rooms.env = options.env || {};\n this.room = new ServerIo(\"lobby-1\", this.rooms);\n }\n\n async connection(listeners?: (data: any) => void) {\n this.serverInstance = new this.server(this.room);\n await this.serverInstance.onStart();\n await this.serverInstance.subRoom.onStart()\n this.context.set('server', this.serverInstance)\n return this._connection(listeners)\n }\n\n private async _connection(listeners?: (data: any) => void) {\n this.serverInstance = this.context.get('server')\n this.socket = new ClientIo(this.serverInstance, 'player-client-id');\n const url = new URL('http://localhost')\n const request = new Request(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n listeners?.(this.socket)\n await this.serverInstance.onConnect(this.socket.conn as any, { request } as any);\n this.room.clients.set(this.socket.id, this.socket);\n this.pendingOn.forEach(({ event, callback }) => this.socket.addEventListener(event, callback));\n this.pendingOn = [];\n return this.socket\n }\n\n on(key: string, callback: (data: any) => void) {\n const handler = (event) => {\n const object = JSON.parse(event);\n if (object.type === key) {\n callback(object.value);\n }\n };\n if (!this.socket) {\n this.pendingOn.push({ event: \"message\", callback: handler });\n return;\n }\n this.socket.addEventListener(\"message\", handler);\n }\n\n off(event: string, callback: (data: any) => void) {\n if (!this.socket) return;\n this.socket.removeEventListener(event, callback);\n }\n\n emit(event: string, data: any) {\n this.socket.send({\n action: event,\n value: data,\n });\n }\n\n /**\n * Update underlying connection properties before a reconnect\n *\n * Design\n * - Dynamically register a factory for the requested room to ensure a fresh server instance\n * - Swap the internal ServerIo to target the new room\n *\n * @param params - Properties to update\n * @param params.room - The target room id (e.g. `map-simplemap2`)\n *\n * @example\n * ```ts\n * websocket.updateProperties({ room: 'map-simplemap2' })\n * await websocket.reconnect()\n * ```\n */\n updateProperties(_params: SocketUpdateProperties) {\n // empty\n }\n\n /**\n * Reconnect the client to the current Party room\n *\n * Design\n * - Must be called after `updateProperties()` when switching rooms\n * - Rebuilds the client <-> server bridge and re-triggers connection listeners\n *\n * @param listeners - Optional callback to re-bind event handlers on the new socket\n *\n * @example\n * ```ts\n * websocket.updateProperties({ room: 'map-dungeon' })\n * await websocket.reconnect((socket) => {\n * // re-bind events here\n * })\n * ```\n */\n async reconnect(listeners?: (data: any) => void): Promise<void> {\n await this._connection((socket) => {\n listeners?.(socket)\n })\n }\n\n getServer() {\n return this.serverInstance\n }\n\n getSocket() {\n return this.socket\n }\n}\n\nclass UpdateMapStandaloneService extends UpdateMapService {\n private server: any;\n\n /**\n * Update the current room map data on the server side\n *\n * Design\n * - Uses the in-memory server instance stored in context (standalone mode)\n * - Builds a local HTTP-like request to the current Party room endpoint\n *\n * @param map - The map payload to apply on the server\n *\n * @example\n * ```ts\n * await updateMapService.update({ width: 1024, height: 768, events: [] })\n * ```\n */\n async update(map: any) {\n this.server = this.context.get('server')\n const roomId = this.server?.room?.id ?? 'lobby-1'\n const req = {\n url: `http://localhost/parties/main/${roomId}/map/update`,\n method: 'POST',\n headers: new Headers({}),\n json: async () => {\n return map;\n }\n };\n await this.server.onRequest(req)\n }\n}\n\nexport function provideRpg(server: any, options: StandaloneOptions = {}) {\n return [\n {\n provide: WebSocketToken,\n useFactory: (context: Context) => new BridgeWebsocket(context, server, options),\n },\n {\n provide: UpdateMapToken,\n useClass: UpdateMapStandaloneService,\n },\n provideKeyboardControls(),\n provideSaveClient(),\n RpgGui,\n RpgClientEngine,\n ];\n}\n"],"mappings":"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"}