@simplysm/service-client 13.0.100 → 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.
- package/dist/features/event-client.d.ts.map +1 -1
- package/dist/features/event-client.js +75 -67
- package/dist/features/event-client.js.map +1 -6
- package/dist/features/file-client.js +41 -39
- package/dist/features/file-client.js.map +1 -6
- package/dist/features/orm/orm-client-connector.js +37 -38
- package/dist/features/orm/orm-client-connector.js.map +1 -6
- package/dist/features/orm/orm-client-db-context-executor.d.ts.map +1 -1
- package/dist/features/orm/orm-client-db-context-executor.js +60 -60
- package/dist/features/orm/orm-client-db-context-executor.js.map +1 -6
- package/dist/features/orm/orm-connect-options.js +2 -1
- package/dist/features/orm/orm-connect-options.js.map +1 -6
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -6
- package/dist/protocol/client-protocol-wrapper.d.ts +1 -0
- package/dist/protocol/client-protocol-wrapper.d.ts.map +1 -1
- package/dist/protocol/client-protocol-wrapper.js +92 -70
- package/dist/protocol/client-protocol-wrapper.js.map +1 -6
- package/dist/service-client.d.ts +2 -0
- package/dist/service-client.d.ts.map +1 -1
- package/dist/service-client.js +113 -111
- package/dist/service-client.js.map +1 -6
- package/dist/transport/service-transport.js +121 -104
- package/dist/transport/service-transport.js.map +1 -6
- package/dist/transport/socket-provider.js +180 -155
- package/dist/transport/socket-provider.js.map +1 -6
- package/dist/types/connection-options.d.ts +1 -1
- package/dist/types/connection-options.d.ts.map +1 -1
- package/dist/types/connection-options.js +2 -1
- package/dist/types/connection-options.js.map +1 -6
- package/dist/types/progress.types.d.ts +1 -0
- package/dist/types/progress.types.d.ts.map +1 -1
- package/dist/types/progress.types.js +2 -1
- package/dist/types/progress.types.js.map +1 -6
- package/dist/workers/client-protocol.worker.js +38 -24
- package/dist/workers/client-protocol.worker.js.map +1 -6
- package/package.json +16 -9
- package/src/features/event-client.ts +19 -17
- package/src/features/file-client.ts +5 -5
- package/src/features/orm/orm-client-connector.ts +2 -2
- package/src/features/orm/orm-client-db-context-executor.ts +8 -7
- package/src/index.ts +5 -5
- package/src/protocol/client-protocol-wrapper.ts +24 -19
- package/src/service-client.ts +22 -15
- package/src/transport/service-transport.ts +19 -19
- package/src/transport/socket-provider.ts +38 -38
- package/src/types/connection-options.ts +1 -1
- package/src/types/progress.types.ts +1 -0
- package/src/workers/client-protocol.worker.ts +9 -9
- package/README.md +0 -126
- package/docs/features.md +0 -143
- package/docs/protocol.md +0 -29
- package/docs/service-client.md +0 -93
- package/docs/transport.md +0 -96
- 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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
if (workerAvailable === undefined) {
|
|
15
|
+
workerAvailable = typeof Worker !== "undefined";
|
|
16
|
+
}
|
|
17
|
+
return workerAvailable;
|
|
18
18
|
}
|
|
19
19
|
function getWorker() {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
98
|
+
return {
|
|
99
|
+
encode,
|
|
100
|
+
decode,
|
|
101
|
+
dispose() {
|
|
102
|
+
protocol.dispose();
|
|
103
|
+
workerResolvers.dispose();
|
|
104
|
+
},
|
|
105
|
+
};
|
|
81
106
|
}
|
|
82
|
-
|
|
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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"}
|
package/dist/service-client.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/service-client.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
+
export function createServiceClient(name, options) {
|
|
124
|
+
return new ServiceClient(name, options);
|
|
119
125
|
}
|
|
120
|
-
|
|
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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"}
|