@simplysm/service-client 13.0.99 → 14.0.1

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 (55) hide show
  1. package/dist/features/event-client.d.ts.map +1 -1
  2. package/dist/features/event-client.js +75 -67
  3. package/dist/features/event-client.js.map +1 -6
  4. package/dist/features/file-client.js +41 -39
  5. package/dist/features/file-client.js.map +1 -6
  6. package/dist/features/orm/orm-client-connector.js +37 -38
  7. package/dist/features/orm/orm-client-connector.js.map +1 -6
  8. package/dist/features/orm/orm-client-db-context-executor.d.ts.map +1 -1
  9. package/dist/features/orm/orm-client-db-context-executor.js +60 -60
  10. package/dist/features/orm/orm-client-db-context-executor.js.map +1 -6
  11. package/dist/features/orm/orm-connect-options.js +2 -1
  12. package/dist/features/orm/orm-connect-options.js.map +1 -6
  13. package/dist/index.js +6 -1
  14. package/dist/index.js.map +1 -6
  15. package/dist/protocol/client-protocol-wrapper.d.ts +1 -0
  16. package/dist/protocol/client-protocol-wrapper.d.ts.map +1 -1
  17. package/dist/protocol/client-protocol-wrapper.js +92 -70
  18. package/dist/protocol/client-protocol-wrapper.js.map +1 -6
  19. package/dist/service-client.d.ts +2 -0
  20. package/dist/service-client.d.ts.map +1 -1
  21. package/dist/service-client.js +113 -111
  22. package/dist/service-client.js.map +1 -6
  23. package/dist/transport/service-transport.js +121 -104
  24. package/dist/transport/service-transport.js.map +1 -6
  25. package/dist/transport/socket-provider.js +180 -155
  26. package/dist/transport/socket-provider.js.map +1 -6
  27. package/dist/types/connection-options.d.ts +1 -1
  28. package/dist/types/connection-options.d.ts.map +1 -1
  29. package/dist/types/connection-options.js +2 -1
  30. package/dist/types/connection-options.js.map +1 -6
  31. package/dist/types/progress.types.d.ts +1 -0
  32. package/dist/types/progress.types.d.ts.map +1 -1
  33. package/dist/types/progress.types.js +2 -1
  34. package/dist/types/progress.types.js.map +1 -6
  35. package/dist/workers/client-protocol.worker.js +38 -24
  36. package/dist/workers/client-protocol.worker.js.map +1 -6
  37. package/package.json +16 -9
  38. package/src/features/event-client.ts +19 -17
  39. package/src/features/file-client.ts +5 -5
  40. package/src/features/orm/orm-client-connector.ts +2 -2
  41. package/src/features/orm/orm-client-db-context-executor.ts +8 -7
  42. package/src/index.ts +5 -5
  43. package/src/protocol/client-protocol-wrapper.ts +24 -19
  44. package/src/service-client.ts +22 -15
  45. package/src/transport/service-transport.ts +19 -19
  46. package/src/transport/socket-provider.ts +38 -38
  47. package/src/types/connection-options.ts +1 -1
  48. package/src/types/progress.types.ts +1 -0
  49. package/src/workers/client-protocol.worker.ts +9 -9
  50. package/README.md +0 -126
  51. package/docs/features.md +0 -143
  52. package/docs/protocol.md +0 -29
  53. package/docs/service-client.md +0 -93
  54. package/docs/transport.md +0 -96
  55. package/docs/types.md +0 -55
@@ -1,85 +1,107 @@
1
1
  import { LazyGcMap, transfer, Uuid } from "@simplysm/core-common";
2
+ // 공유 worker 상태 (싱글턴 패턴)
2
3
  let worker;
3
4
  const workerResolvers = new LazyGcMap({
4
- gcInterval: 5 * 1e3,
5
- // Check for expired entries every 5s
6
- expireTime: 60 * 1e3,
7
- // Expire after 60s (timeout)
8
- onExpire: (key, item) => {
9
- item.reject(new Error(`Worker task timed out (uuid: ${key})`));
10
- }
5
+ gcInterval: 5 * 1000, // 5초마다 만료된 항목 확인
6
+ expireTime: 60 * 1000, // 60초 후 만료 (타임아웃)
7
+ onExpire: (key, item) => {
8
+ // 만료 reject (메모리 누수 방지에 필수)
9
+ item.reject(new Error(`Worker 작업 시간 초과 (uuid: ${key})`));
10
+ },
11
11
  });
12
12
  let workerAvailable;
13
13
  function isWorkerAvailable() {
14
- if (workerAvailable === void 0) {
15
- workerAvailable = typeof Worker !== "undefined";
16
- }
17
- return workerAvailable;
14
+ if (workerAvailable === undefined) {
15
+ workerAvailable = typeof Worker !== "undefined";
16
+ }
17
+ return workerAvailable;
18
18
  }
19
19
  function getWorker() {
20
- if (!isWorkerAvailable()) {
21
- return void 0;
22
- }
23
- if (!worker) {
24
- worker = new Worker(new URL("../workers/client-protocol.worker.ts", import.meta.url), {
25
- type: "module"
26
- });
27
- worker.onmessage = (event) => {
28
- const { id, type, result, error } = event.data;
29
- const resolver = workerResolvers.get(id);
30
- if (resolver != null) {
31
- if (type === "success") {
32
- resolver.resolve(result);
33
- } else {
34
- const err = new Error((error == null ? void 0 : error.message) ?? "Unknown worker error");
35
- err.stack = error == null ? void 0 : error.stack;
36
- resolver.reject(err);
37
- }
38
- workerResolvers.delete(id);
39
- }
40
- };
41
- }
42
- return worker;
20
+ if (!isWorkerAvailable()) {
21
+ return undefined;
22
+ }
23
+ if (!worker) {
24
+ // 모던 번들러 (Vite/Esbuild/Webpack) 이 구문을 사용하여 Worker를 별도 파일로 분리/로드함
25
+ // 참고: import.meta.resolve 대신 상대 경로 사용 (Vite 호환성)
26
+ worker = new Worker(new URL("../workers/client-protocol.worker.ts", import.meta.url), {
27
+ type: "module",
28
+ });
29
+ worker.onmessage = (event) => {
30
+ const { id, type, result, error } = event.data;
31
+ const resolver = workerResolvers.get(id);
32
+ if (resolver != null) {
33
+ if (type === "success") {
34
+ resolver.resolve(result);
35
+ }
36
+ else {
37
+ const err = new Error(error?.message ?? "알 수 없는 worker 에러");
38
+ err.stack = error?.stack;
39
+ resolver.reject(err);
40
+ }
41
+ workerResolvers.delete(id);
42
+ }
43
+ };
44
+ }
45
+ return worker;
43
46
  }
47
+ /**
48
+ * Worker에 작업을 위임하고 결과를 대기
49
+ * 참고: workerAvailable이 true일 때만 호출할 것
50
+ */
44
51
  async function runWorker(type, data, transferables = []) {
45
- return new Promise((resolve, reject) => {
46
- const id = Uuid.generate().toString();
47
- workerResolvers.set(id, { resolve, reject });
48
- getWorker().postMessage({ id, type, data }, { transfer: transferables });
49
- });
52
+ return new Promise((resolve, reject) => {
53
+ const id = Uuid.generate().toString();
54
+ workerResolvers.set(id, { resolve, reject });
55
+ // workerAvailable 확인 호출되므로 worker는 항상 존재
56
+ getWorker().postMessage({ id, type, data }, { transfer: transferables });
57
+ });
50
58
  }
51
- function createClientProtocolWrapper(protocol) {
52
- const SIZE_THRESHOLD = 30 * 1024;
53
- function shouldUseWorkerForEncode(msg) {
54
- if (!("body" in msg)) return false;
55
- const body = msg.body;
56
- if (body instanceof Uint8Array) return true;
57
- if (typeof body === "string" && body.length > SIZE_THRESHOLD) return true;
58
- if (Array.isArray(body)) {
59
- return body.length > 100 || body.length > 0 && body[0] instanceof Uint8Array;
59
+ export function createClientProtocolWrapper(protocol) {
60
+ // 임계값: 30KB
61
+ const SIZE_THRESHOLD = 30 * 1024;
62
+ function shouldUseWorkerForEncode(msg) {
63
+ if (!("body" in msg))
64
+ return false;
65
+ const body = msg.body;
66
+ // Uint8Array가 있거나 배열 길이가 큰 경우 worker 사용
67
+ if (body instanceof Uint8Array)
68
+ return true;
69
+ if (typeof body === "string" && body.length > SIZE_THRESHOLD)
70
+ return true;
71
+ if (Array.isArray(body)) {
72
+ return body.length > 100 || (body.length > 0 && body[0] instanceof Uint8Array);
73
+ }
74
+ return false;
60
75
  }
61
- return false;
62
- }
63
- async function encode(uuid, message) {
64
- if (!isWorkerAvailable() || !shouldUseWorkerForEncode(message)) {
65
- return protocol.encode(uuid, message);
76
+ async function encode(uuid, message) {
77
+ // Worker가 없거나 데이터가 작으면 메인 스레드에서 처리
78
+ if (!isWorkerAvailable() || !shouldUseWorkerForEncode(message)) {
79
+ return protocol.encode(uuid, message);
80
+ }
81
+ // [Worker]
82
+ // 인코딩은 객체 전송이 필요하므로 Structured Clone이 발생함.
83
+ // 하지만 메인 스레드에서 JSON.stringify 비용을 오프로드하는 이점이 더 큼.
84
+ return (await runWorker("encode", { uuid, message }));
66
85
  }
67
- return await runWorker("encode", { uuid, message });
68
- }
69
- async function decode(bytes) {
70
- const totalSize = bytes.length;
71
- if (!isWorkerAvailable() || totalSize <= SIZE_THRESHOLD) {
72
- return protocol.decode(bytes);
86
+ async function decode(bytes) {
87
+ const totalSize = bytes.length;
88
+ // Worker가 없거나 데이터가 작으면 메인 스레드에서 처리
89
+ if (!isWorkerAvailable() || totalSize <= SIZE_THRESHOLD) {
90
+ return protocol.decode(bytes);
91
+ }
92
+ // [Worker]
93
+ // Zero-copy 전송 (버퍼 소유권이 Worker로 이동)
94
+ const rawResult = await runWorker("decode", bytes, [bytes.buffer]);
95
+ // Worker의 plain object 결과에서 클래스 인스턴스 복원 (DateTime 등)
96
+ return transfer.decode(rawResult);
73
97
  }
74
- const rawResult = await runWorker("decode", bytes, [bytes.buffer]);
75
- return transfer.decode(rawResult);
76
- }
77
- return {
78
- encode,
79
- decode
80
- };
98
+ return {
99
+ encode,
100
+ decode,
101
+ dispose() {
102
+ protocol.dispose();
103
+ workerResolvers.dispose();
104
+ },
105
+ };
81
106
  }
82
- export {
83
- createClientProtocolWrapper
84
- };
85
- //# sourceMappingURL=client-protocol-wrapper.js.map
107
+ //# sourceMappingURL=client-protocol-wrapper.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/protocol/client-protocol-wrapper.ts"],
4
- "mappings": "AACA,SAAS,WAAW,UAAU,YAAY;AAa1C,IAAI;AACJ,MAAM,kBAAkB,IAAI,UAG1B;AAAA,EACA,YAAY,IAAI;AAAA;AAAA,EAChB,YAAY,KAAK;AAAA;AAAA,EACjB,UAAU,CAAC,KAAK,SAAS;AAEvB,SAAK,OAAO,IAAI,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAAA,EAC/D;AACF,CAAC;AAED,IAAI;AAEJ,SAAS,oBAA6B;AACpC,MAAI,oBAAoB,QAAW;AACjC,sBAAkB,OAAO,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,YAAgC;AACvC,MAAI,CAAC,kBAAkB,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AAGX,aAAS,IAAI,OAAO,IAAI,IAAI,wCAAwC,YAAY,GAAG,GAAG;AAAA,MACpF,MAAM;AAAA,IACR,CAAC;AAED,WAAO,YAAY,CAAC,UAAwB;AAC1C,YAAM,EAAE,IAAI,MAAM,QAAQ,MAAM,IAAI,MAAM;AAO1C,YAAM,WAAW,gBAAgB,IAAI,EAAE;AACvC,UAAI,YAAY,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,mBAAS,QAAQ,MAAM;AAAA,QACzB,OAAO;AACL,gBAAM,MAAM,IAAI,OAAM,+BAAO,YAAW,sBAAsB;AAC9D,cAAI,QAAQ,+BAAO;AACnB,mBAAS,OAAO,GAAG;AAAA,QACrB;AACA,wBAAgB,OAAO,EAAE;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAe,UACb,MACA,MACA,gBAAgC,CAAC,GACf;AAClB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,KAAK,SAAS,EAAE,SAAS;AAEpC,oBAAgB,IAAI,IAAI,EAAE,SAAS,OAAO,CAAC;AAE3C,cAAU,EAAG,YAAY,EAAE,IAAI,MAAM,KAAK,GAAG,EAAE,UAAU,cAAc,CAAC;AAAA,EAC1E,CAAC;AACH;AAEO,SAAS,4BAA4B,UAAkD;AAE5F,QAAM,iBAAiB,KAAK;AAE5B,WAAS,yBAAyB,KAA8B;AAC9D,QAAI,EAAE,UAAU,KAAM,QAAO;AAC7B,UAAM,OAAO,IAAI;AAGjB,QAAI,gBAAgB,WAAY,QAAO;AACvC,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,eAAgB,QAAO;AACrE,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,SAAS,OAAQ,KAAK,SAAS,KAAK,KAAK,CAAC,aAAa;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,OACb,MACA,SACiD;AAEjD,QAAI,CAAC,kBAAkB,KAAK,CAAC,yBAAyB,OAAO,GAAG;AAC9D,aAAO,SAAS,OAAO,MAAM,OAAO;AAAA,IACtC;AAKA,WAAQ,MAAM,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC;AAAA,EAIrD;AAEA,iBAAe,OAAO,OAAmE;AACvF,UAAM,YAAY,MAAM;AAGxB,QAAI,CAAC,kBAAkB,KAAK,aAAa,gBAAgB;AACvD,aAAO,SAAS,OAAO,KAAK;AAAA,IAC9B;AAIA,UAAM,YAAY,MAAM,UAAU,UAAU,OAAO,CAAC,MAAM,MAAM,CAAC;AAGjE,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"client-protocol-wrapper.js","sourceRoot":"","sources":["..\\..\\src\\protocol\\client-protocol-wrapper.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import type { ServiceProgress, ServiceProgressState } from "./types/progress.typ
5
5
  interface ServiceClientEvents {
6
6
  "request-progress": ServiceProgressState;
7
7
  "response-progress": ServiceProgressState;
8
+ "server-progress": ServiceProgressState;
8
9
  "state": "connected" | "closed" | "reconnecting";
9
10
  "reload": Set<string>;
10
11
  }
@@ -15,6 +16,7 @@ export declare class ServiceClient extends EventEmitter<ServiceClientEvents> {
15
16
  private readonly _transport;
16
17
  private readonly _eventClient;
17
18
  private readonly _fileClient;
19
+ private readonly _protocolWrapper;
18
20
  private _authToken?;
19
21
  get connected(): boolean;
20
22
  get hostUrl(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AASpF,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;IACjD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;aAmBhD,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,wBAAwB;IAlBnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,OAAO,CAAC,UAAU,CAAC,CAAS;IAG5B,IAAI,SAAS,YAEZ;IACD,IAAI,OAAO,WAGV;gBAGiB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,wBAAwB;IAsCnD,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;IAW3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,OAAO,CAAC;IAmBb,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,WAAW,CAAC,KAAK,EAAE,KAAK,EAC5B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC;IAKZ,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,KAAK,EAAE,KAAK,EAC1B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC;IAIV,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,EAAE;IASxE,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAGzC;AAGD,MAAM,MAAM,YAAY,CAAC,QAAQ,IAAI;KAClC,CAAC,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACpE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACnC,KAAK;CACV,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,aAAa,CAElG"}
1
+ {"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AASpF,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;IACjD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;aAoBhD,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,wBAAwB;IAnBnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,UAAU,CAAC,CAAS;IAG5B,IAAI,SAAS,YAEZ;IACD,IAAI,OAAO,WAGV;gBAGiB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,wBAAwB;IAsCnD,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;IAW3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,OAAO,CAAC;IAuBb,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,WAAW,CAAC,KAAK,EAAE,KAAK,EAC5B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC;IAKZ,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,KAAK,EAAE,KAAK,EAC1B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC;IAIV,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,EAAE;IASxE,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAGzC;AAGD,MAAM,MAAM,YAAY,CAAC,QAAQ,IAAI;KAClC,CAAC,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACpE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACnC,KAAK;CACV,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,aAAa,CAElG"}
@@ -7,118 +7,120 @@ import { createEventClient } from "./features/event-client.js";
7
7
  import { createFileClient } from "./features/file-client.js";
8
8
  import { createClientProtocolWrapper } from "./protocol/client-protocol-wrapper.js";
9
9
  const logger = consola.withTag("service-client:ServiceClient");
10
- class ServiceClient extends EventEmitter {
11
- constructor(name, options) {
12
- super();
13
- this.name = name;
14
- this.options = options;
15
- const wsProtocol = options.ssl ? "wss" : "ws";
16
- const wsUrl = `${wsProtocol}://${options.host}:${options.port}/ws`;
17
- this._socket = createSocketProvider(wsUrl, this.name, this.options.maxReconnectCount ?? 10);
18
- const protocol = createServiceProtocol();
19
- const protocolWrapper = createClientProtocolWrapper(protocol);
20
- this._transport = createServiceTransport(this._socket, protocolWrapper);
21
- this._eventClient = createEventClient(this._transport);
22
- this._fileClient = createFileClient(this.hostUrl, this.name);
23
- this._socket.on("state", async (state) => {
24
- this.emit("state", state);
25
- if (state === "connected") {
26
- try {
27
- if (this._authToken != null) {
28
- await this.auth(this._authToken);
29
- }
30
- await this._eventClient.resubscribeAll();
31
- } catch (err) {
32
- logger.error("Failed to recover event listeners", err);
33
- }
34
- }
35
- });
36
- this._transport.on("reload", (changedFiles) => {
37
- this.emit("reload", changedFiles);
38
- });
39
- }
40
- // Modules
41
- _socket;
42
- _transport;
43
- _eventClient;
44
- _fileClient;
45
- _authToken;
46
- // State accessors
47
- get connected() {
48
- return this._socket.connected;
49
- }
50
- get hostUrl() {
51
- const hostProtocol = this.options.ssl ? "https" : "http";
52
- return `${hostProtocol}://${this.options.host}:${this.options.port}`;
53
- }
54
- // Proxy creation method for type safety
55
- getService(serviceName) {
56
- return new Proxy({}, {
57
- get: (_target, prop) => {
58
- const methodName = String(prop);
59
- return async (...params) => {
60
- return this.send(serviceName, methodName, params);
61
- };
62
- }
63
- });
64
- }
65
- async connect() {
66
- await this._socket.connect();
67
- }
68
- async close() {
69
- await this._socket.close();
70
- }
71
- async send(serviceName, methodName, params, progress) {
72
- return this._transport.send(
73
- {
74
- name: `${serviceName}.${methodName}`,
75
- body: params
76
- },
77
- {
78
- request: (state) => {
79
- var _a;
80
- this.emit("request-progress", state);
81
- (_a = progress == null ? void 0 : progress.request) == null ? void 0 : _a.call(progress, state);
82
- },
83
- response: (state) => {
84
- var _a;
85
- this.emit("response-progress", state);
86
- (_a = progress == null ? void 0 : progress.response) == null ? void 0 : _a.call(progress, state);
10
+ export class ServiceClient extends EventEmitter {
11
+ name;
12
+ options;
13
+ // 모듈
14
+ _socket;
15
+ _transport;
16
+ _eventClient;
17
+ _fileClient;
18
+ _protocolWrapper;
19
+ _authToken;
20
+ // 상태 접근자
21
+ get connected() {
22
+ return this._socket.connected;
23
+ }
24
+ get hostUrl() {
25
+ const hostProtocol = this.options.ssl ? "https" : "http";
26
+ return `${hostProtocol}://${this.options.host}:${this.options.port}`;
27
+ }
28
+ constructor(name, options) {
29
+ super();
30
+ this.name = name;
31
+ this.options = options;
32
+ const wsProtocol = options.ssl ? "wss" : "ws";
33
+ const wsUrl = `${wsProtocol}://${options.host}:${options.port}/ws`;
34
+ // 모듈 초기화
35
+ this._socket = createSocketProvider(wsUrl, this.name, this.options.maxReconnectCount ?? 10);
36
+ const protocol = createServiceProtocol();
37
+ this._protocolWrapper = createClientProtocolWrapper(protocol);
38
+ this._transport = createServiceTransport(this._socket, this._protocolWrapper);
39
+ this._eventClient = createEventClient(this._transport);
40
+ this._fileClient = createFileClient(this.hostUrl, this.name);
41
+ // 이벤트 바인딩
42
+ this._socket.on("state", async (state) => {
43
+ this.emit("state", state);
44
+ // 재연결 시 이벤트 리스너 자동 복구
45
+ if (state === "connected") {
46
+ try {
47
+ if (this._authToken != null) {
48
+ await this.auth(this._authToken); // 재인증
49
+ }
50
+ await this._eventClient.resubscribeAll();
51
+ }
52
+ catch (err) {
53
+ logger.error("이벤트 리스너 복구 실패", err);
54
+ }
55
+ }
56
+ });
57
+ this._transport.on("reload", (changedFiles) => {
58
+ this.emit("reload", changedFiles);
59
+ });
60
+ }
61
+ // 타입 안전성을 위한 프록시 생성 메서드
62
+ getService(serviceName) {
63
+ return new Proxy({}, {
64
+ get: (_target, prop) => {
65
+ const methodName = String(prop);
66
+ return async (...params) => {
67
+ return this.send(serviceName, methodName, params);
68
+ };
69
+ },
70
+ });
71
+ }
72
+ async connect() {
73
+ await this._socket.connect();
74
+ }
75
+ async close() {
76
+ await this._socket.close();
77
+ this._protocolWrapper.dispose();
78
+ }
79
+ async send(serviceName, methodName, params, progress) {
80
+ return this._transport.send({
81
+ name: `${serviceName}.${methodName}`,
82
+ body: params,
83
+ }, {
84
+ request: (state) => {
85
+ this.emit("request-progress", state);
86
+ progress?.request?.(state);
87
+ },
88
+ response: (state) => {
89
+ this.emit("response-progress", state);
90
+ progress?.response?.(state);
91
+ },
92
+ server: (state) => {
93
+ this.emit("server-progress", state);
94
+ progress?.server?.(state);
95
+ },
96
+ });
97
+ }
98
+ async auth(token) {
99
+ await this._transport.send({ name: "auth", body: token });
100
+ this._authToken = token;
101
+ }
102
+ async addListener(eventDef, info, cb) {
103
+ if (!this.connected)
104
+ throw new Error("서버에 연결되지 않았습니다.");
105
+ return this._eventClient.addListener(eventDef, info, cb);
106
+ }
107
+ async removeListener(key) {
108
+ await this._eventClient.removeListener(key);
109
+ }
110
+ async emitEvent(eventDef, infoSelector, data) {
111
+ await this._eventClient.emit(eventDef, infoSelector, data);
112
+ }
113
+ async uploadFile(files) {
114
+ if (this._authToken == null) {
115
+ throw new Error("인증 토큰이 없습니다. 파일 업로드 전에 auth()를 호출하여 인증해 주세요.");
87
116
  }
88
- }
89
- );
90
- }
91
- async auth(token) {
92
- await this._transport.send({ name: "auth", body: token });
93
- this._authToken = token;
94
- }
95
- async addListener(eventDef, info, cb) {
96
- if (!this.connected) throw new Error("Not connected to the server.");
97
- return this._eventClient.addListener(eventDef, info, cb);
98
- }
99
- async removeListener(key) {
100
- await this._eventClient.removeListener(key);
101
- }
102
- async emitEvent(eventDef, infoSelector, data) {
103
- await this._eventClient.emit(eventDef, infoSelector, data);
104
- }
105
- async uploadFile(files) {
106
- if (this._authToken == null) {
107
- throw new Error(
108
- "No authentication token found. Call auth() to authenticate before uploading files."
109
- );
117
+ return this._fileClient.upload(files, this._authToken);
118
+ }
119
+ async downloadFileBuffer(relPath) {
120
+ return this._fileClient.download(relPath);
110
121
  }
111
- return this._fileClient.upload(files, this._authToken);
112
- }
113
- async downloadFileBuffer(relPath) {
114
- return this._fileClient.download(relPath);
115
- }
116
122
  }
117
- function createServiceClient(name, options) {
118
- return new ServiceClient(name, options);
123
+ export function createServiceClient(name, options) {
124
+ return new ServiceClient(name, options);
119
125
  }
120
- export {
121
- ServiceClient,
122
- createServiceClient
123
- };
124
- //# sourceMappingURL=service-client.js.map
126
+ //# sourceMappingURL=service-client.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/service-client.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"service-client.js","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"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"}