@dooboostore/simple-boot-http-server 1.0.23 → 1.0.24

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 (167) hide show
  1. package/README.MD +27 -1
  2. package/dist/cjs/SimpleBootHttpServer.js +79 -39
  3. package/dist/cjs/SimpleBootHttpServer.js.map +3 -3
  4. package/dist/cjs/codes/HttpHeaders.js +14 -3
  5. package/dist/cjs/codes/HttpHeaders.js.map +2 -2
  6. package/dist/cjs/codes/Mimes.js +2 -0
  7. package/dist/cjs/codes/Mimes.js.map +2 -2
  8. package/dist/cjs/decorators/MethodMapping.js +7 -6
  9. package/dist/cjs/decorators/MethodMapping.js.map +3 -3
  10. package/dist/cjs/endpoints/WebSocketEndPoint.js +16 -0
  11. package/dist/cjs/endpoints/WebSocketEndPoint.js.map +7 -0
  12. package/dist/cjs/filters/CacheFilter.js +75 -35
  13. package/dist/cjs/filters/CacheFilter.js.map +3 -3
  14. package/dist/cjs/filters/IntentSchemeFilter.js +98 -0
  15. package/dist/cjs/filters/IntentSchemeFilter.js.map +7 -0
  16. package/dist/cjs/filters/ResourceFilter.js +4 -1
  17. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  18. package/dist/cjs/filters/TopicProtocolFilter.js +343 -0
  19. package/dist/cjs/filters/TopicProtocolFilter.js.map +7 -0
  20. package/dist/cjs/filters/index.js +2 -0
  21. package/dist/cjs/filters/index.js.map +2 -2
  22. package/dist/cjs/index.js +28 -0
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/cjs/models/RequestResponse.js +51 -89
  25. package/dist/cjs/models/RequestResponse.js.map +3 -3
  26. package/dist/cjs/models/datas/body/ReqPathData.js +29 -0
  27. package/dist/cjs/models/datas/body/ReqPathData.js.map +7 -0
  28. package/dist/cjs/option/HttpServerOption.js +25 -5
  29. package/dist/cjs/option/HttpServerOption.js.map +2 -2
  30. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +141 -0
  31. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  32. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +35 -0
  33. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  34. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js +324 -0
  35. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  36. package/dist/cjs/proxy/index.js +26 -0
  37. package/dist/cjs/proxy/index.js.map +7 -0
  38. package/dist/cjs/resolvers/ResourceResolver.js +2 -2
  39. package/dist/cjs/resolvers/ResourceResolver.js.map +2 -2
  40. package/dist/cjs/session/SessionManager.js +2 -2
  41. package/dist/cjs/session/SessionManager.js.map +2 -2
  42. package/dist/cjs/websocket/WebSocketClient.js +554 -0
  43. package/dist/cjs/websocket/WebSocketClient.js.map +7 -0
  44. package/dist/cjs/websocket/WebSocketManager.js +652 -0
  45. package/dist/cjs/websocket/WebSocketManager.js.map +7 -0
  46. package/dist/cjs/websocket/index.js +24 -0
  47. package/dist/cjs/websocket/index.js.map +7 -0
  48. package/dist/esm/SimpleBootHttpServer.js +59 -19
  49. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  50. package/dist/esm/codes/HttpHeaders.js +12 -2
  51. package/dist/esm/codes/HttpHeaders.js.map +2 -2
  52. package/dist/esm/codes/Mimes.js +2 -0
  53. package/dist/esm/codes/Mimes.js.map +2 -2
  54. package/dist/esm/decorators/MethodMapping.js +2 -1
  55. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  56. package/dist/esm/endpoints/WebSocketEndPoint.js +1 -0
  57. package/dist/esm/endpoints/WebSocketEndPoint.js.map +7 -0
  58. package/dist/esm/filters/CacheFilter.js +67 -27
  59. package/dist/esm/filters/CacheFilter.js.map +2 -2
  60. package/dist/esm/filters/IntentSchemeFilter.js +75 -0
  61. package/dist/esm/filters/IntentSchemeFilter.js.map +7 -0
  62. package/dist/esm/filters/ResourceFilter.js +4 -1
  63. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  64. package/dist/esm/filters/TopicProtocolFilter.js +310 -0
  65. package/dist/esm/filters/TopicProtocolFilter.js.map +7 -0
  66. package/dist/esm/filters/index.js +1 -0
  67. package/dist/esm/filters/index.js.map +2 -2
  68. package/dist/esm/index.js +12 -0
  69. package/dist/esm/index.js.map +2 -2
  70. package/dist/esm/models/RequestResponse.js +46 -84
  71. package/dist/esm/models/RequestResponse.js.map +2 -2
  72. package/dist/esm/models/datas/body/ReqPathData.js +6 -0
  73. package/dist/esm/models/datas/body/ReqPathData.js.map +7 -0
  74. package/dist/esm/option/HttpServerOption.js +24 -4
  75. package/dist/esm/option/HttpServerOption.js.map +2 -2
  76. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +118 -0
  77. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  78. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +12 -0
  79. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  80. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js +301 -0
  81. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  82. package/dist/esm/proxy/index.js +4 -0
  83. package/dist/esm/proxy/index.js.map +7 -0
  84. package/dist/esm/resolvers/ResourceResolver.js +1 -1
  85. package/dist/esm/resolvers/ResourceResolver.js.map +1 -1
  86. package/dist/esm/session/SessionManager.js +1 -1
  87. package/dist/esm/session/SessionManager.js.map +1 -1
  88. package/dist/esm/websocket/WebSocketClient.js +529 -0
  89. package/dist/esm/websocket/WebSocketClient.js.map +7 -0
  90. package/dist/esm/websocket/WebSocketManager.js +622 -0
  91. package/dist/esm/websocket/WebSocketManager.js.map +7 -0
  92. package/dist/esm/websocket/index.js +3 -0
  93. package/dist/esm/websocket/index.js.map +7 -0
  94. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +13190 -4886
  95. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  96. package/dist/types/SimpleBootHttpServer.d.ts +5 -3
  97. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  98. package/dist/types/codes/HttpHeaders.d.ts +3 -0
  99. package/dist/types/codes/HttpHeaders.d.ts.map +1 -1
  100. package/dist/types/codes/Mimes.d.ts +3 -1
  101. package/dist/types/codes/Mimes.d.ts.map +1 -1
  102. package/dist/types/decorators/MethodMapping.d.ts +3 -2
  103. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  104. package/dist/types/endpoints/WebSocketEndPoint.d.ts +17 -0
  105. package/dist/types/endpoints/WebSocketEndPoint.d.ts.map +1 -0
  106. package/dist/types/filters/CacheFilter.d.ts +6 -0
  107. package/dist/types/filters/CacheFilter.d.ts.map +1 -1
  108. package/dist/types/filters/IntentSchemeFilter.d.ts +20 -0
  109. package/dist/types/filters/IntentSchemeFilter.d.ts.map +1 -0
  110. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  111. package/dist/types/filters/TopicProtocolFilter.d.ts +34 -0
  112. package/dist/types/filters/TopicProtocolFilter.d.ts.map +1 -0
  113. package/dist/types/filters/index.d.ts +1 -0
  114. package/dist/types/filters/index.d.ts.map +1 -1
  115. package/dist/types/index.d.ts +12 -0
  116. package/dist/types/index.d.ts.map +1 -1
  117. package/dist/types/models/RequestResponse.d.ts +9 -6
  118. package/dist/types/models/RequestResponse.d.ts.map +1 -1
  119. package/dist/types/models/datas/body/ReqPathData.d.ts +4 -0
  120. package/dist/types/models/datas/body/ReqPathData.d.ts.map +1 -0
  121. package/dist/types/option/HttpServerOption.d.ts +30 -20
  122. package/dist/types/option/HttpServerOption.d.ts.map +1 -1
  123. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +18 -0
  124. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
  125. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts +5 -0
  126. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
  127. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +28 -0
  128. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -0
  129. package/dist/types/proxy/index.d.ts +4 -0
  130. package/dist/types/proxy/index.d.ts.map +1 -0
  131. package/dist/types/session/SessionManager.d.ts +2 -17
  132. package/dist/types/session/SessionManager.d.ts.map +1 -1
  133. package/dist/types/websocket/WebSocketClient.d.ts +88 -0
  134. package/dist/types/websocket/WebSocketClient.d.ts.map +1 -0
  135. package/dist/types/websocket/WebSocketManager.d.ts +163 -0
  136. package/dist/types/websocket/WebSocketManager.d.ts.map +1 -0
  137. package/dist/types/websocket/index.d.ts +3 -0
  138. package/dist/types/websocket/index.d.ts.map +1 -0
  139. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +13262 -4958
  140. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  141. package/dist/umd-bundle/websocket-client.umd.js +11194 -0
  142. package/dist/umd-bundle/websocket-client.umd.js.map +7 -0
  143. package/package.json +24 -15
  144. package/src/SimpleBootHttpServer.ts +366 -312
  145. package/src/codes/HttpHeaders.ts +13 -2
  146. package/src/codes/Mimes.ts +27 -25
  147. package/src/decorators/MethodMapping.ts +4 -3
  148. package/src/endpoints/WebSocketEndPoint.ts +12 -0
  149. package/src/filters/CacheFilter.ts +112 -67
  150. package/src/filters/IntentSchemeFilter.ts +69 -0
  151. package/src/filters/ResourceFilter.ts +6 -1
  152. package/src/filters/TopicProtocolFilter.ts +349 -0
  153. package/src/filters/index.ts +1 -0
  154. package/src/index.ts +12 -12
  155. package/src/models/RequestResponse.ts +108 -240
  156. package/src/models/datas/body/ReqPathData.ts +3 -0
  157. package/src/option/HttpServerOption.ts +73 -23
  158. package/src/proxy/SymbolIntentApiServiceProxy.ts +120 -0
  159. package/src/proxy/SymbolIntentApiServiceProxyBase.ts +16 -0
  160. package/src/proxy/TopicProtocolApiServiceProxy.ts +328 -0
  161. package/src/proxy/index.ts +3 -0
  162. package/src/resolvers/ResourceResolver.ts +1 -1
  163. package/src/session/SessionManager.ts +3 -3
  164. package/src/websocket/WebSocketClient.ts +637 -0
  165. package/src/websocket/WebSocketManager.ts +713 -0
  166. package/src/websocket/index.ts +2 -0
  167. package/tsconfig.json +3 -1
@@ -0,0 +1,652 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var WebSocketManager_exports = {};
19
+ __export(WebSocketManager_exports, {
20
+ WebSocketManager: () => WebSocketManager,
21
+ isTopicRequest: () => isTopicRequest,
22
+ isTopicResponse: () => isTopicResponse,
23
+ isTopicServerEventRequest: () => isTopicServerEventRequest,
24
+ isTopicServerEventResponse: () => isTopicServerEventResponse,
25
+ isTopicServerEventUnSubscribeRequest: () => isTopicServerEventUnSubscribeRequest,
26
+ isTopicSubscribeRequest: () => isTopicSubscribeRequest,
27
+ isTopicUnsubscribeRequest: () => isTopicUnsubscribeRequest
28
+ });
29
+ module.exports = __toCommonJS(WebSocketManager_exports);
30
+ var import_simple_boot = require("@dooboostore/simple-boot");
31
+ var import_ws = require("ws");
32
+ var import_simple_boot2 = require("@dooboostore/simple-boot");
33
+ var import_simple_boot3 = require("@dooboostore/simple-boot");
34
+ var import_simple_boot4 = require("@dooboostore/simple-boot");
35
+ var import_core = require("@dooboostore/core");
36
+ var import_core2 = require("@dooboostore/core");
37
+ var __decorate = function(decorators, target, key, desc) {
38
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
39
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
40
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
41
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
42
+ };
43
+ var __metadata = function(k, v) {
44
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
45
+ };
46
+ var _a, _b;
47
+ const isTopicRequest = (obj) => {
48
+ return typeof obj === "object" && obj !== null && "uuid" in obj && typeof obj.uuid === "string" && (obj.type === void 0 || obj.type === "intent" || obj.type === "router") && (obj.body === void 0 || true);
49
+ };
50
+ const isTopicSubscribeRequest = (obj) => {
51
+ return typeof obj === "object" && obj !== null && "type" in obj && obj.type === "subscribe" && "target" in obj && typeof obj.target === "string" && "uuid" in obj && typeof obj.uuid === "string" && (obj.body === void 0 || true);
52
+ };
53
+ const isTopicUnsubscribeRequest = (obj) => {
54
+ return typeof obj === "object" && obj !== null && "type" in obj && obj.type === "unsubscribe" && "uuid" in obj && typeof obj.uuid === "string";
55
+ };
56
+ const isTopicResponse = (obj) => {
57
+ return typeof obj === "object" && obj !== null && "state" in obj && (obj.state === "success" || obj.state === "error") && "target" in obj && typeof obj.target === "string" && "uuid" in obj && typeof obj.uuid === "string" && "body" in obj;
58
+ };
59
+ const isTopicServerEventRequest = (obj) => {
60
+ return typeof obj === "object" && obj !== null && "type" in obj && obj.type === "event" && "uuid" in obj && typeof obj.uuid === "string" && "eventUUID" in obj && typeof obj.eventUUID === "string" && "event" in obj && typeof obj.event === "string" && (obj.body === void 0 || true);
61
+ };
62
+ const isTopicServerEventResponse = (obj) => {
63
+ return typeof obj === "object" && obj !== null && "type" in obj && obj.type === "event" && "uuid" in obj && typeof obj.uuid === "string" && "eventUUID" in obj && typeof obj.eventUUID === "string" && (obj.body === void 0 || true);
64
+ };
65
+ const isTopicServerEventUnSubscribeRequest = (obj) => {
66
+ return typeof obj === "object" && obj !== null && "type" in obj && obj.type === "unsubscribe" && "uuid" in obj && typeof obj.uuid === "string";
67
+ };
68
+ let WebSocketManager = class WebSocketManager2 {
69
+ constructor(intentManager, routerManager) {
70
+ this.intentManager = intentManager;
71
+ this.routerManager = routerManager;
72
+ this.clients = /* @__PURE__ */ new Map();
73
+ this.eventSubscriptions = /* @__PURE__ */ new Map();
74
+ this.subject = new import_core2.Subject();
75
+ }
76
+ get observable() {
77
+ return this.subject.asObservable();
78
+ }
79
+ connect(wsSet) {
80
+ this.clients.set(wsSet, []);
81
+ console.log("WebSocket connected:", wsSet.request.url);
82
+ }
83
+ close(wsSet) {
84
+ this.removeAllClientsByWebSocketSet(wsSet);
85
+ this.clients.delete(wsSet);
86
+ console.log("WebSocket disconnected:", wsSet.request.url);
87
+ }
88
+ setClientTopic(wsSet, uuid, target, subscribeBody) {
89
+ const clientTopics = this.clients.get(wsSet);
90
+ if (clientTopics && !clientTopics.find((it) => it.uuid === uuid)) {
91
+ clientTopics.push({ uuid, target, subscribeBody });
92
+ this.clients.set(wsSet, clientTopics);
93
+ } else if (clientTopics) {
94
+ throw { message: "Already subscribed topic" };
95
+ }
96
+ }
97
+ findAllClientsByTarget(target) {
98
+ const results = [];
99
+ for (const [wsSet, topics] of Array.from(this.clients.entries())) {
100
+ const find = topics.find((it) => it.target === target);
101
+ if (find) {
102
+ results.push({ ...find, webSocketSet: wsSet });
103
+ }
104
+ }
105
+ return results;
106
+ }
107
+ findClientsByTarget(target) {
108
+ for (const [wsSet, topics] of Array.from(this.clients.entries())) {
109
+ const find = topics.find((it) => it.target === target);
110
+ if (find) {
111
+ return { ...find, webSocketSet: wsSet };
112
+ }
113
+ }
114
+ }
115
+ removeClientByUUID(uuid) {
116
+ for (const [wsSet, topics] of Array.from(this.clients.entries())) {
117
+ const findIndex = topics.findIndex((it) => it.uuid === uuid);
118
+ if (findIndex >= 0) {
119
+ topics.splice(findIndex, 1);
120
+ this.clients.set(wsSet, topics);
121
+ this.eventSubscriptions.delete(uuid);
122
+ return true;
123
+ }
124
+ }
125
+ return false;
126
+ }
127
+ findClientByUUID(uuid) {
128
+ for (const [wsSet, topics] of Array.from(this.clients.entries())) {
129
+ const find = topics.find((it) => it.uuid === uuid);
130
+ if (find) {
131
+ return { ...find, webSocketSet: wsSet };
132
+ }
133
+ }
134
+ return void 0;
135
+ }
136
+ sendDataByUUID({ uuid, body }) {
137
+ const client = this.findClientByUUID(uuid);
138
+ if (client) {
139
+ const data = {
140
+ state: "success",
141
+ target: client.target,
142
+ uuid,
143
+ body
144
+ };
145
+ this.sendTopic(client.webSocketSet, data);
146
+ return true;
147
+ }
148
+ return false;
149
+ }
150
+ sendUnSubscribeByUUID({ uuid }) {
151
+ const client = this.findClientByUUID(uuid);
152
+ if (client) {
153
+ const data = {
154
+ type: "unsubscribe",
155
+ uuid
156
+ };
157
+ this.removeClientByUUID(uuid);
158
+ this.sendTopic(client.webSocketSet, data);
159
+ return true;
160
+ }
161
+ return false;
162
+ }
163
+ sendAllDataByTarget({ target, body }) {
164
+ const clients = this.findAllClientsByTarget(target);
165
+ clients.forEach((it) => {
166
+ const data = {
167
+ state: "success",
168
+ target: it.target,
169
+ uuid: it.uuid,
170
+ body
171
+ };
172
+ this.sendTopic(it.webSocketSet, data);
173
+ });
174
+ return clients.length;
175
+ }
176
+ sendAllUnSubscribeByTarget({ target }) {
177
+ const clients = this.findAllClientsByTarget(target);
178
+ clients.forEach((it) => {
179
+ const data = {
180
+ type: "unsubscribe",
181
+ uuid: it.uuid
182
+ };
183
+ this.removeClientByUUID(it.uuid);
184
+ this.sendTopic(it.webSocketSet, data);
185
+ });
186
+ return clients.length;
187
+ }
188
+ sendEventDataByUUID({ uuid, event, body }, config) {
189
+ const client = this.findClientByUUID(uuid);
190
+ if (client) {
191
+ const eventUUID = import_core.RandomUtils.uuid4();
192
+ const eventTopic = {
193
+ type: "event",
194
+ uuid,
195
+ // target: client.target,
196
+ eventUUID,
197
+ event,
198
+ body
199
+ };
200
+ if (config.responseCallBack) {
201
+ this.addEventSubscribes(uuid, eventUUID, config.responseCallBack);
202
+ }
203
+ this.sendTopic(client.webSocketSet, eventTopic);
204
+ return eventUUID;
205
+ }
206
+ return void 0;
207
+ }
208
+ sendEventDataByUUIDPromise({ uuid, event, body }, config) {
209
+ return new Promise((resolve, reject) => {
210
+ let timeoutId;
211
+ let eventUUIDForCleanup;
212
+ if (config?.responseTimeout !== void 0) {
213
+ timeoutId = setTimeout(() => {
214
+ if (eventUUIDForCleanup) {
215
+ const subscriptions = this.eventSubscriptions.get(uuid);
216
+ if (subscriptions) {
217
+ subscriptions.delete(eventUUIDForCleanup);
218
+ if (subscriptions.size <= 0) {
219
+ this.eventSubscriptions.delete(uuid);
220
+ }
221
+ }
222
+ }
223
+ reject(new Error("WebSocket event response timeout for UUID: " + uuid));
224
+ }, config.responseTimeout);
225
+ }
226
+ const eventUUID = this.sendEventDataByUUID({ uuid, event, body }, {
227
+ responseCallBack: (data) => {
228
+ if (timeoutId)
229
+ clearTimeout(timeoutId);
230
+ resolve(data);
231
+ }
232
+ });
233
+ eventUUIDForCleanup = eventUUID;
234
+ if (!eventUUID) {
235
+ if (timeoutId)
236
+ clearTimeout(timeoutId);
237
+ reject(new Error("WebSocket client not found for UUID: " + uuid));
238
+ }
239
+ });
240
+ }
241
+ async sendEventDataByUUIDPromiseSettled({ uuid, event, body }, config) {
242
+ try {
243
+ const value = await this.sendEventDataByUUIDPromise({ uuid, event, body }, config);
244
+ return { status: "fulfilled", value };
245
+ } catch (reason) {
246
+ return { status: "rejected", reason };
247
+ }
248
+ }
249
+ sendAllEventDataByTargetPromise({ target, event, body }, config) {
250
+ const clients = this.findAllClientsByTarget(target);
251
+ const promises = clients.map((it) => {
252
+ return this.sendEventDataByUUIDPromise({ uuid: it.uuid, event, body }, config).then((result) => ({
253
+ body: result,
254
+ uuid: it.uuid
255
+ }));
256
+ });
257
+ return Promise.all(promises);
258
+ }
259
+ sendAllEventDataByTargetPromiseSettled({ target, event, body }, config) {
260
+ const clients = this.findAllClientsByTarget(target);
261
+ const promises = clients.map((it) => {
262
+ return this.sendEventDataByUUIDPromise({ uuid: it.uuid, event, body }, config).then((result) => ({
263
+ body: result,
264
+ uuid: it.uuid
265
+ }));
266
+ });
267
+ return Promise.allSettled(promises);
268
+ }
269
+ sendAllEventDataByTarget({ target, event, body }, config) {
270
+ const clients = this.findAllClientsByTarget(target);
271
+ clients.forEach((it) => {
272
+ const eventUUID = import_core.RandomUtils.uuid4();
273
+ const eventTopic = {
274
+ type: "event",
275
+ uuid: it.uuid,
276
+ // target: it.target,
277
+ eventUUID,
278
+ event,
279
+ body
280
+ };
281
+ if (config?.responseCallBack) {
282
+ this.addEventSubscribes(it.uuid, eventUUID, config?.responseCallBack);
283
+ }
284
+ this.sendTopic(it.webSocketSet, eventTopic);
285
+ });
286
+ return clients.length;
287
+ }
288
+ addEventSubscribes(uuid, eventUUID, eventResponseCallBack) {
289
+ let eventMap = this.eventSubscriptions.get(uuid);
290
+ if (eventMap) {
291
+ eventMap.set(eventUUID, eventResponseCallBack);
292
+ } else {
293
+ eventMap = /* @__PURE__ */ new Map();
294
+ eventMap.set(eventUUID, eventResponseCallBack);
295
+ this.eventSubscriptions.set(uuid, eventMap);
296
+ }
297
+ }
298
+ getOpenClients() {
299
+ return Array.from(this.clients.keys()).filter((it) => it.socket.readyState === import_ws.WebSocket.OPEN);
300
+ }
301
+ isBinaryPayload(value) {
302
+ if (!value) {
303
+ return false;
304
+ }
305
+ if (Buffer.isBuffer(value)) {
306
+ return true;
307
+ }
308
+ if (typeof Uint8Array !== "undefined" && value instanceof Uint8Array) {
309
+ return true;
310
+ }
311
+ if (typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer) {
312
+ return true;
313
+ }
314
+ if (value && typeof value === "object" && "buffer" in value) {
315
+ const bufferValue = value.buffer;
316
+ return Buffer.isBuffer(bufferValue) || bufferValue instanceof Uint8Array || bufferValue instanceof ArrayBuffer;
317
+ }
318
+ return false;
319
+ }
320
+ hasBinaryPayload(value) {
321
+ if (this.isBinaryPayload(value)) {
322
+ return true;
323
+ }
324
+ if (Array.isArray(value)) {
325
+ return value.some((item) => this.hasBinaryPayload(item));
326
+ }
327
+ if (value && typeof value === "object") {
328
+ return Object.keys(value).some((key) => this.hasBinaryPayload(value[key]));
329
+ }
330
+ return false;
331
+ }
332
+ buildBinaryTopic(topic) {
333
+ const fileRefs = /* @__PURE__ */ new Map();
334
+ const fileEntries = [];
335
+ let fileIndex = 0;
336
+ const registerFile = (value) => {
337
+ const existing = fileRefs.get(value);
338
+ if (existing) {
339
+ return existing;
340
+ }
341
+ const id = `f${++fileIndex}`;
342
+ fileRefs.set(value, id);
343
+ let name = "file";
344
+ let mime = "application/octet-stream";
345
+ let buffer = Buffer.alloc(0);
346
+ if (Buffer.isBuffer(value)) {
347
+ buffer = value;
348
+ } else if (value instanceof Uint8Array) {
349
+ buffer = Buffer.from(value);
350
+ } else if (value instanceof ArrayBuffer) {
351
+ buffer = Buffer.from(value);
352
+ } else if (value && typeof value === "object" && "buffer" in value) {
353
+ const fileLike = value;
354
+ if (typeof fileLike.name === "string") {
355
+ name = fileLike.name || name;
356
+ }
357
+ if (typeof fileLike.mime === "string") {
358
+ mime = fileLike.mime || mime;
359
+ }
360
+ const innerBuffer = fileLike.buffer;
361
+ if (Buffer.isBuffer(innerBuffer)) {
362
+ buffer = innerBuffer;
363
+ } else if (innerBuffer instanceof Uint8Array) {
364
+ buffer = Buffer.from(innerBuffer);
365
+ } else if (innerBuffer instanceof ArrayBuffer) {
366
+ buffer = Buffer.from(innerBuffer);
367
+ }
368
+ }
369
+ fileEntries.push({ id, name, mime, buffer });
370
+ return id;
371
+ };
372
+ const replaceFiles = (value) => {
373
+ if (this.isBinaryPayload(value)) {
374
+ const id = registerFile(value);
375
+ return { $file: id };
376
+ }
377
+ if (Array.isArray(value)) {
378
+ return value.map((item) => replaceFiles(item));
379
+ }
380
+ if (value && typeof value === "object") {
381
+ const result = {};
382
+ Object.keys(value).forEach((key) => {
383
+ result[key] = replaceFiles(value[key]);
384
+ });
385
+ return result;
386
+ }
387
+ return value;
388
+ };
389
+ const payload = replaceFiles(topic.body);
390
+ let offset = 0;
391
+ const files = fileEntries.map((entry) => {
392
+ const size = entry.buffer.length;
393
+ const meta2 = {
394
+ id: entry.id,
395
+ name: entry.name,
396
+ mime: entry.mime,
397
+ size,
398
+ offset
399
+ };
400
+ offset += size;
401
+ return meta2;
402
+ });
403
+ const meta = { ...topic, body: payload, files };
404
+ const json = Buffer.from(JSON.stringify(meta), "utf8");
405
+ const header = Buffer.alloc(4);
406
+ header.writeUInt32LE(json.length, 0);
407
+ const buffers = [header, json, ...fileEntries.map((entry) => entry.buffer)];
408
+ return Buffer.concat(buffers);
409
+ }
410
+ sendTopic(wsSet, topic) {
411
+ if (this.hasBinaryPayload(topic?.body)) {
412
+ const buffer = this.buildBinaryTopic(topic);
413
+ wsSet.socket.send(buffer, { binary: true });
414
+ return;
415
+ }
416
+ wsSet.socket.send(JSON.stringify(topic), { binary: false });
417
+ }
418
+ parseBinaryTopic(data) {
419
+ let buffer;
420
+ if (Buffer.isBuffer(data)) {
421
+ buffer = data;
422
+ } else if (data instanceof ArrayBuffer) {
423
+ buffer = Buffer.from(data);
424
+ } else if (Array.isArray(data)) {
425
+ buffer = Buffer.concat(data.map((item) => Buffer.isBuffer(item) ? item : Buffer.from(item)));
426
+ } else {
427
+ return void 0;
428
+ }
429
+ if (buffer.length < 4) {
430
+ return void 0;
431
+ }
432
+ const jsonLength = buffer.readUInt32LE(0);
433
+ const jsonStart = 4;
434
+ const jsonEnd = jsonStart + jsonLength;
435
+ if (buffer.length < jsonEnd) {
436
+ return void 0;
437
+ }
438
+ const jsonText = buffer.slice(jsonStart, jsonEnd).toString("utf8");
439
+ let meta;
440
+ try {
441
+ meta = JSON.parse(jsonText);
442
+ } catch (error) {
443
+ console.warn("Invalid WebSocket binary payload:", error);
444
+ return void 0;
445
+ }
446
+ const filesMeta = Array.isArray(meta.files) ? meta.files : [];
447
+ const fileMap = /* @__PURE__ */ new Map();
448
+ filesMeta.forEach((file) => {
449
+ if (!file || typeof file.id !== "string" || typeof file.size !== "number" || typeof file.offset !== "number") {
450
+ return;
451
+ }
452
+ const start = jsonEnd + file.offset;
453
+ const end = start + file.size;
454
+ if (start < jsonEnd || end > buffer.length) {
455
+ return;
456
+ }
457
+ const slice = buffer.slice(start, end);
458
+ fileMap.set(file.id, {
459
+ name: file.name || "file",
460
+ mime: file.mime || "application/octet-stream",
461
+ size: file.size,
462
+ buffer: slice
463
+ });
464
+ });
465
+ const replaceFileRefs = (value) => {
466
+ if (value && typeof value === "object" && "$file" in value && typeof value.$file === "string") {
467
+ const file = fileMap.get(value.$file);
468
+ if (file) {
469
+ return file;
470
+ }
471
+ }
472
+ if (Array.isArray(value)) {
473
+ return value.map((item) => replaceFileRefs(item));
474
+ }
475
+ if (value && typeof value === "object") {
476
+ const result = {};
477
+ Object.keys(value).forEach((key) => {
478
+ result[key] = replaceFileRefs(value[key]);
479
+ });
480
+ return result;
481
+ }
482
+ return value;
483
+ };
484
+ const body = replaceFileRefs(meta.body);
485
+ return {
486
+ type: meta.type,
487
+ uuid: meta.uuid,
488
+ requestUUID: meta.requestUUID,
489
+ body
490
+ };
491
+ }
492
+ message(wsSet, data) {
493
+ let topic;
494
+ if (data.isBinary) {
495
+ topic = this.parseBinaryTopic(data.data);
496
+ if (!topic) {
497
+ return;
498
+ }
499
+ } else {
500
+ try {
501
+ topic = JSON.parse(data.data.toString());
502
+ } catch (error) {
503
+ console.warn("Invalid WebSocket payload:", error);
504
+ return;
505
+ }
506
+ }
507
+ this.subject.next(topic);
508
+ const uuid = topic.uuid;
509
+ if (topic.type === "subscribe") {
510
+ try {
511
+ this.setClientTopic(wsSet, topic.uuid, topic.target, topic.body);
512
+ } catch (err) {
513
+ const responseTopic = {
514
+ state: "error",
515
+ // type: topic.type,
516
+ target: topic.target,
517
+ uuid: topic.uuid,
518
+ body: { message: err.message || "Error subscribing topic" }
519
+ };
520
+ wsSet.socket.send(JSON.stringify(responseTopic), { binary: false });
521
+ }
522
+ return;
523
+ } else if (topic.type === "unsubscribe") {
524
+ this.removeClientByUUID(uuid);
525
+ return;
526
+ } else if (topic.type === "event") {
527
+ const subscriptions = this.eventSubscriptions.get(topic.uuid);
528
+ if (subscriptions) {
529
+ const eventCallback = subscriptions.get(topic.eventUUID);
530
+ if (eventCallback) {
531
+ eventCallback(topic.body, wsSet);
532
+ subscriptions.delete(topic.eventUUID);
533
+ }
534
+ if (subscriptions.size <= 0) {
535
+ this.eventSubscriptions.delete(topic.uuid);
536
+ }
537
+ }
538
+ return;
539
+ } else {
540
+ const clientTopics = this.findClientByUUID(uuid);
541
+ if (!clientTopics) {
542
+ const responseTopic = {
543
+ state: "error",
544
+ uuid: topic.uuid,
545
+ requestUUID: topic.requestUUID,
546
+ target: "",
547
+ body: { message: "WebSocket client not registered" }
548
+ };
549
+ this.sendTopic(wsSet, responseTopic);
550
+ return;
551
+ }
552
+ const intent = new import_simple_boot4.Intent(clientTopics.target);
553
+ const webSocketRequest = {
554
+ webSocketSet: wsSet,
555
+ uuid: clientTopics.uuid,
556
+ webSocketManager: this,
557
+ sendEvent: (event, body, config) => this.sendEventDataByUUIDPromise({ uuid: clientTopics.uuid, event, body }, config)
558
+ };
559
+ intent.data = [topic.body, webSocketRequest];
560
+ if (topic.type === "intent") {
561
+ this.intentManager.publishMeta(intent).then(async (it) => {
562
+ if (it.target.length <= 0) {
563
+ const responseTopic = {
564
+ state: "error",
565
+ // type: topic.type,
566
+ target: clientTopics.target,
567
+ uuid: topic.uuid,
568
+ requestUUID: topic.requestUUID,
569
+ body: { message: "Not found intent target" }
570
+ };
571
+ this.sendTopic(wsSet, responseTopic);
572
+ } else {
573
+ const rdata = it.return[0];
574
+ const wdata = rdata instanceof Promise ? await rdata : rdata;
575
+ const responseTopic = {
576
+ state: "success",
577
+ uuid: topic.uuid,
578
+ requestUUID: topic.requestUUID,
579
+ target: clientTopics.target,
580
+ body: wdata
581
+ };
582
+ this.sendTopic(wsSet, responseTopic);
583
+ }
584
+ });
585
+ } else if (topic.type === "router") {
586
+ this.routerManager.routing(intent).then(async (routerModule) => {
587
+ const moduleInstance = routerModule.getModuleInstance?.();
588
+ if (routerModule && moduleInstance) {
589
+ if (routerModule.propertyKeys) {
590
+ for (const it of routerModule.propertyKeys) {
591
+ let r = moduleInstance[it]?.(topic.body, webSocketRequest);
592
+ r = r instanceof Promise ? await r : r;
593
+ const responseTopic = {
594
+ state: "success",
595
+ requestUUID: topic.requestUUID,
596
+ uuid: topic.uuid,
597
+ target: clientTopics.target,
598
+ body: r
599
+ };
600
+ this.sendTopic(wsSet, responseTopic);
601
+ }
602
+ } else {
603
+ const responseTopic = {
604
+ state: "error",
605
+ uuid: topic.uuid,
606
+ requestUUID: topic.requestUUID,
607
+ target: clientTopics.target,
608
+ body: { message: "Not found router target" }
609
+ };
610
+ this.sendTopic(wsSet, responseTopic);
611
+ }
612
+ } else {
613
+ const responseTopic = {
614
+ state: "error",
615
+ uuid: topic.uuid,
616
+ requestUUID: topic.requestUUID,
617
+ target: clientTopics.target,
618
+ body: { message: "Not found router target" }
619
+ };
620
+ this.sendTopic(wsSet, responseTopic);
621
+ }
622
+ });
623
+ }
624
+ }
625
+ }
626
+ removeAllClientsByWebSocketSet(wsSet) {
627
+ const topics = this.clients.get(wsSet);
628
+ if (!topics) {
629
+ return;
630
+ }
631
+ for (const topic of topics) {
632
+ this.eventSubscriptions.delete(topic.uuid);
633
+ }
634
+ this.clients.set(wsSet, []);
635
+ }
636
+ };
637
+ WebSocketManager = __decorate([
638
+ import_simple_boot.Sim,
639
+ __metadata("design:paramtypes", [typeof (_a = typeof import_simple_boot2.IntentManager !== "undefined" && import_simple_boot2.IntentManager) === "function" ? _a : Object, typeof (_b = typeof import_simple_boot3.RouterManager !== "undefined" && import_simple_boot3.RouterManager) === "function" ? _b : Object])
640
+ ], WebSocketManager);
641
+ // Annotate the CommonJS export names for ESM import in node:
642
+ 0 && (module.exports = {
643
+ WebSocketManager,
644
+ isTopicRequest,
645
+ isTopicResponse,
646
+ isTopicServerEventRequest,
647
+ isTopicServerEventResponse,
648
+ isTopicServerEventUnSubscribeRequest,
649
+ isTopicSubscribeRequest,
650
+ isTopicUnsubscribeRequest
651
+ });
652
+ //# sourceMappingURL=WebSocketManager.js.map