@dooboostore/simple-boot-http-server 1.0.26 → 1.0.28

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 (71) hide show
  1. package/README.md +138 -17
  2. package/dist/cjs/SimpleBootHttpServer.js +33 -16
  3. package/dist/cjs/SimpleBootHttpServer.js.map +2 -2
  4. package/dist/cjs/codes/Mimes.js +2 -0
  5. package/dist/cjs/codes/Mimes.js.map +2 -2
  6. package/dist/cjs/decorators/MethodMapping.js +2 -2
  7. package/dist/cjs/decorators/MethodMapping.js.map +2 -2
  8. package/dist/cjs/filters/ResourceFilter.js +0 -1
  9. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  10. package/dist/cjs/models/RequestResponse.js +52 -0
  11. package/dist/cjs/models/RequestResponse.js.map +3 -3
  12. package/dist/cjs/proxy/RequestResponseInjectProxy.js +35 -0
  13. package/dist/cjs/proxy/RequestResponseInjectProxy.js.map +7 -0
  14. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +1 -1
  15. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +2 -2
  16. package/dist/cjs/proxy/index.js +3 -1
  17. package/dist/cjs/proxy/index.js.map +2 -2
  18. package/dist/cjs/resolvers/Resolver.js.map +1 -1
  19. package/dist/cjs/websocket/WebSocketManager.js +68 -40
  20. package/dist/cjs/websocket/WebSocketManager.js.map +2 -2
  21. package/dist/esm/SimpleBootHttpServer.js +34 -17
  22. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  23. package/dist/esm/codes/Mimes.js +2 -0
  24. package/dist/esm/codes/Mimes.js.map +2 -2
  25. package/dist/esm/decorators/MethodMapping.js +2 -2
  26. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  27. package/dist/esm/filters/ResourceFilter.js +0 -1
  28. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  29. package/dist/esm/models/RequestResponse.js +52 -0
  30. package/dist/esm/models/RequestResponse.js.map +2 -2
  31. package/dist/esm/proxy/RequestResponseInjectProxy.js +12 -0
  32. package/dist/esm/proxy/RequestResponseInjectProxy.js.map +7 -0
  33. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +1 -1
  34. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +2 -2
  35. package/dist/esm/proxy/index.js +1 -0
  36. package/dist/esm/proxy/index.js.map +2 -2
  37. package/dist/esm/websocket/WebSocketManager.js +68 -40
  38. package/dist/esm/websocket/WebSocketManager.js.map +2 -2
  39. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +572 -387
  40. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  41. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  42. package/dist/types/codes/Mimes.d.ts +2 -0
  43. package/dist/types/codes/Mimes.d.ts.map +1 -1
  44. package/dist/types/decorators/MethodMapping.d.ts +13 -8
  45. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  46. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  47. package/dist/types/models/RequestResponse.d.ts +9 -0
  48. package/dist/types/models/RequestResponse.d.ts.map +1 -1
  49. package/dist/types/proxy/RequestResponseInjectProxy.d.ts +22 -0
  50. package/dist/types/proxy/RequestResponseInjectProxy.d.ts.map +1 -0
  51. package/dist/types/proxy/index.d.ts +1 -0
  52. package/dist/types/proxy/index.d.ts.map +1 -1
  53. package/dist/types/resolvers/Resolver.d.ts +2 -1
  54. package/dist/types/resolvers/Resolver.d.ts.map +1 -1
  55. package/dist/types/websocket/WebSocketManager.d.ts +3 -1
  56. package/dist/types/websocket/WebSocketManager.d.ts.map +1 -1
  57. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +572 -387
  58. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  59. package/dist/umd-bundle/websocket-client.umd.js +315 -149
  60. package/dist/umd-bundle/websocket-client.umd.js.map +4 -4
  61. package/package.json +9 -9
  62. package/src/SimpleBootHttpServer.ts +38 -17
  63. package/src/codes/Mimes.ts +2 -0
  64. package/src/decorators/MethodMapping.ts +151 -152
  65. package/src/filters/ResourceFilter.ts +0 -1
  66. package/src/models/RequestResponse.ts +50 -0
  67. package/src/proxy/RequestResponseInjectProxy.ts +30 -0
  68. package/src/proxy/SymbolIntentApiServiceProxy.ts +1 -1
  69. package/src/proxy/index.ts +1 -0
  70. package/src/resolvers/Resolver.ts +2 -1
  71. package/src/websocket/WebSocketManager.ts +69 -41
@@ -1,5 +1,6 @@
1
1
  import {RequestResponse} from '../models/RequestResponse';
2
+ import { ResponseMappingConfig } from '../decorators';
2
3
 
3
4
  export interface Resolver<T = any> {
4
- resolve(data: T, rr: RequestResponse): Promise<void>;
5
+ resolve(data: T, rr: RequestResponse, responseMappingConfig: ResponseMappingConfig): Promise<void>;
5
6
  }
@@ -90,7 +90,9 @@ type RegisteredClientSet<T = any> = RegisteredClient<T> & { webSocketSet: WebSoc
90
90
 
91
91
  @Sim
92
92
  export class WebSocketManager implements WebSocketEndPoint {
93
- private clients: Map<WebSocketSet, RegisteredClient[]> = new Map();
93
+ private connections: Map<WebSocketSet, Set<string>> = new Map();
94
+ private registrations: Map<string, RegisteredClientSet> = new Map();
95
+ private targets: Map<string, Set<string>> = new Map();
94
96
  private eventSubscriptions: Map<string, Map<string, EventResponseCallBack>> = new Map();
95
97
  private subject = new Subject<TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest | TopicServerEventResponse>();
96
98
  constructor(
@@ -102,67 +104,82 @@ export class WebSocketManager implements WebSocketEndPoint {
102
104
  return this.subject.asObservable();
103
105
  }
104
106
  connect(wsSet: WebSocketSet) {
105
- this.clients.set(wsSet, []);
107
+ this.connections.set(wsSet, new Set<string>());
106
108
  console.log('WebSocket connected:', wsSet.request.url);
107
109
  }
108
110
  close(wsSet: WebSocketSet) {
109
111
  this.removeAllClientsByWebSocketSet(wsSet);
110
- this.clients.delete(wsSet);
112
+ this.connections.delete(wsSet);
111
113
  console.log('WebSocket disconnected:', wsSet.request.url);
112
114
  }
113
115
 
114
116
  setClientTopic(wsSet: WebSocketSet, uuid: string, target: string, subscribeBody?: any) {
115
- const clientTopics = this.clients.get(wsSet);
116
- if (clientTopics && !clientTopics.find(it => it.uuid === uuid)) {
117
- clientTopics.push({ uuid, target, subscribeBody });
118
- this.clients.set(wsSet, clientTopics);
119
- } else if (clientTopics) {
120
- throw { message: 'Already subscribed topic' };
117
+ const uuidSet = this.connections.get(wsSet);
118
+ if (!uuidSet) {
119
+ return;
120
+ }
121
+ if (this.registrations.has(uuid)) {
122
+ throw new Error('Already subscribed topic');
123
+ }
124
+ this.registrations.set(uuid, { uuid, target, subscribeBody, webSocketSet: wsSet });
125
+ uuidSet.add(uuid);
126
+ if (!this.targets.get(target)) {
127
+ this.targets.set(target, new Set<string>());
121
128
  }
129
+ this.targets.get(target)?.add(uuid);
122
130
  }
123
131
 
124
132
  findAllClientsByTarget(target: string): RegisteredClientSet[] {
133
+ const uuids = this.targets.get(target);
134
+ if (!uuids) {
135
+ return [];
136
+ }
125
137
  const results: RegisteredClientSet[] = [];
126
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
127
- const find = topics.find(it => it.target === target);
128
- if (find) {
129
- results.push({ ...find, webSocketSet: wsSet });
138
+ uuids.forEach(uuid => {
139
+ const reg = this.registrations.get(uuid);
140
+ if (reg) {
141
+ results.push({ ...reg });
130
142
  }
131
- }
143
+ });
132
144
  return results;
133
145
  }
134
146
 
135
147
  findClientsByTarget(target: string): RegisteredClientSet {
136
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
137
- const find = topics.find(it => it.target === target);
138
- if (find) {
139
- return { ...find, webSocketSet: wsSet };
148
+ const uuids = this.targets.get(target);
149
+ if (!uuids) {
150
+ return undefined as any;
151
+ }
152
+ for (const uuid of Array.from(uuids)) {
153
+ const reg = this.registrations.get(uuid);
154
+ if (reg) {
155
+ return { ...reg };
140
156
  }
141
157
  }
158
+ return undefined as any;
142
159
  }
143
160
 
144
161
  removeClientByUUID(uuid: string) {
145
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
146
- const findIndex = topics.findIndex(it => it.uuid === uuid);
147
- if (findIndex >= 0) {
148
- topics.splice(findIndex, 1);
149
- this.clients.set(wsSet, topics);
150
- // 이벤트 구독도 함께 정리
151
- this.eventSubscriptions.delete(uuid);
152
- return true;
162
+ const reg = this.registrations.get(uuid);
163
+ if (!reg) {
164
+ return false;
165
+ }
166
+ this.registrations.delete(uuid);
167
+ this.connections.get(reg.webSocketSet)?.delete(uuid);
168
+ const targetSet = this.targets.get(reg.target);
169
+ if (targetSet) {
170
+ targetSet.delete(uuid);
171
+ if (targetSet.size <= 0) {
172
+ this.targets.delete(reg.target);
153
173
  }
154
174
  }
155
- return false;
175
+ // 이벤트 구독도 함께 정리
176
+ this.eventSubscriptions.delete(uuid);
177
+ return true;
156
178
  }
157
179
 
158
180
  findClientByUUID(uuid: string): RegisteredClientSet | undefined {
159
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
160
- const find = topics.find(it => it.uuid === uuid);
161
- if (find) {
162
- return { ...find, webSocketSet: wsSet };
163
- }
164
- }
165
- return undefined;
181
+ const reg = this.registrations.get(uuid);
182
+ return reg ? { ...reg } : undefined;
166
183
  }
167
184
 
168
185
  sendDataByUUID({ uuid, body }: { uuid: string; body?: any }) {
@@ -342,7 +359,7 @@ export class WebSocketManager implements WebSocketEndPoint {
342
359
  }
343
360
 
344
361
  getOpenClients() {
345
- return Array.from(this.clients.keys()).filter(it => it.socket.readyState === WebSocket.OPEN);
362
+ return Array.from(this.connections.keys()).filter(it => it.socket.readyState === WebSocket.OPEN);
346
363
  }
347
364
 
348
365
  private isBinaryPayload(value: any) {
@@ -701,13 +718,24 @@ export class WebSocketManager implements WebSocketEndPoint {
701
718
  }
702
719
 
703
720
  private removeAllClientsByWebSocketSet(wsSet: WebSocketSet) {
704
- const topics = this.clients.get(wsSet);
705
- if (!topics) {
721
+ const uuidSet = this.connections.get(wsSet);
722
+ if (!uuidSet) {
706
723
  return;
707
724
  }
708
- for (const topic of topics) {
709
- this.eventSubscriptions.delete(topic.uuid);
710
- }
711
- this.clients.set(wsSet, []);
725
+ uuidSet.forEach(uuid => {
726
+ const reg = this.registrations.get(uuid);
727
+ if (reg) {
728
+ this.registrations.delete(uuid);
729
+ const targetSet = this.targets.get(reg.target);
730
+ if (targetSet) {
731
+ targetSet.delete(uuid);
732
+ if (targetSet.size <= 0) {
733
+ this.targets.delete(reg.target);
734
+ }
735
+ }
736
+ }
737
+ this.eventSubscriptions.delete(uuid);
738
+ });
739
+ uuidSet.clear();
712
740
  }
713
741
  }