@simplysm/service-common 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.
- package/dist/define-event.d.ts +7 -7
- package/dist/define-event.d.ts.map +1 -1
- package/dist/define-event.js +21 -10
- package/dist/define-event.js.map +1 -6
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -6
- package/dist/protocol/create-service-protocol.d.ts +20 -20
- package/dist/protocol/create-service-protocol.d.ts.map +1 -1
- package/dist/protocol/create-service-protocol.js +149 -112
- package/dist/protocol/create-service-protocol.js.map +1 -6
- package/dist/protocol/protocol.types.d.ts +17 -17
- package/dist/protocol/protocol.types.d.ts.map +1 -1
- package/dist/protocol/protocol.types.js +16 -15
- package/dist/protocol/protocol.types.js.map +1 -6
- package/dist/service-types/auto-update-service.types.d.ts +5 -5
- package/dist/service-types/auto-update-service.types.js +2 -1
- package/dist/service-types/auto-update-service.types.js.map +1 -6
- package/dist/service-types/orm-service.types.d.ts +7 -5
- package/dist/service-types/orm-service.types.d.ts.map +1 -1
- package/dist/service-types/orm-service.types.js +2 -1
- package/dist/service-types/orm-service.types.js.map +1 -6
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -6
- package/package.json +6 -8
- package/src/define-event.ts +7 -7
- package/src/index.ts +4 -6
- package/src/protocol/create-service-protocol.ts +45 -38
- package/src/protocol/protocol.types.ts +39 -39
- package/src/service-types/auto-update-service.types.ts +5 -5
- package/src/service-types/orm-service.types.ts +5 -5
- package/src/types.ts +5 -5
- package/README.md +0 -111
- package/dist/service-types/smtp-client-service.types.d.ts +0 -38
- package/dist/service-types/smtp-client-service.types.d.ts.map +0 -1
- package/dist/service-types/smtp-client-service.types.js +0 -1
- package/dist/service-types/smtp-client-service.types.js.map +0 -6
- package/docs/events.md +0 -51
- package/docs/protocol.md +0 -252
- package/docs/service-types.md +0 -162
- package/src/service-types/smtp-client-service.types.ts +0 -41
- package/tests/define-event.spec.ts +0 -11
- package/tests/protocol/service-protocol.spec.ts +0 -251
package/dist/define-event.d.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* $info
|
|
2
|
+
* defineEvent()로 생성된 이벤트 정의.
|
|
3
|
+
* $info와 $data는 타입 전용 마커임 (런타임에서는 사용되지 않음).
|
|
4
4
|
*/
|
|
5
5
|
export interface ServiceEventDef<TInfo = unknown, TData = unknown> {
|
|
6
6
|
eventName: string;
|
|
7
|
-
/**
|
|
7
|
+
/** 타입 추출 전용 (런타임에서는 사용되지 않음) */
|
|
8
8
|
readonly $info: TInfo;
|
|
9
|
-
/**
|
|
9
|
+
/** 타입 추출 전용 (런타임에서는 사용되지 않음) */
|
|
10
10
|
readonly $data: TData;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* 타입 안전한 info와 data를 가진 서비스 이벤트를 정의한다.
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
|
|
17
17
|
*
|
|
18
|
-
* //
|
|
18
|
+
* // 서버에서 이벤트 발생
|
|
19
19
|
* ctx.socket?.emitEvent(OrderUpdated, { orderId: 123 }, { status: "shipped" });
|
|
20
20
|
*
|
|
21
|
-
* //
|
|
21
|
+
* // 클라이언트에서 구독
|
|
22
22
|
* await client.addEventListener(OrderUpdated, { orderId: 123 }, (data) => {
|
|
23
23
|
* console.log(data.status); // typed
|
|
24
24
|
* });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-event.d.ts","sourceRoot":"","sources":["..\\src\\define-event.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"define-event.d.ts","sourceRoot":"","sources":["..\\src\\define-event.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EAC1D,SAAS,EAAE,MAAM,GAChB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAM/B"}
|
package/dist/define-event.js
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 타입 안전한 info와 data를 가진 서비스 이벤트를 정의한다.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
|
|
6
|
+
*
|
|
7
|
+
* // 서버에서 이벤트 발생
|
|
8
|
+
* ctx.socket?.emitEvent(OrderUpdated, { orderId: 123 }, { status: "shipped" });
|
|
9
|
+
*
|
|
10
|
+
* // 클라이언트에서 구독
|
|
11
|
+
* await client.addEventListener(OrderUpdated, { orderId: 123 }, (data) => {
|
|
12
|
+
* console.log(data.status); // typed
|
|
13
|
+
* });
|
|
14
|
+
*/
|
|
15
|
+
export function defineEvent(eventName) {
|
|
16
|
+
return {
|
|
17
|
+
eventName,
|
|
18
|
+
$info: undefined,
|
|
19
|
+
$data: undefined,
|
|
20
|
+
};
|
|
7
21
|
}
|
|
8
|
-
|
|
9
|
-
defineEvent
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=define-event.js.map
|
|
22
|
+
//# sourceMappingURL=define-event.js.map
|
package/dist/define-event.js.map
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/define-event.ts"],
|
|
4
|
-
"mappings": "AA0BO,SAAS,YACd,WAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"define-event.js","sourceRoot":"","sources":["..\\src\\define-event.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CACzB,SAAiB;IAEjB,OAAO;QACL,SAAS;QACT,KAAK,EAAE,SAA6B;QACpC,KAAK,EAAE,SAA6B;KACrC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export * from "./protocol/protocol.types";
|
|
|
2
2
|
export * from "./protocol/create-service-protocol";
|
|
3
3
|
export * from "./service-types/orm-service.types";
|
|
4
4
|
export * from "./service-types/auto-update-service.types";
|
|
5
|
-
export * from "./service-types/smtp-client-service.types";
|
|
6
5
|
export * from "./types";
|
|
7
6
|
export * from "./define-event";
|
|
8
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAE1D,cAAc,SAAS,CAAC;AAGxB,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
// 프로토콜
|
|
1
2
|
export * from "./protocol/protocol.types.js";
|
|
2
3
|
export * from "./protocol/create-service-protocol.js";
|
|
4
|
+
// 서비스 타입
|
|
3
5
|
export * from "./service-types/orm-service.types.js";
|
|
4
6
|
export * from "./service-types/auto-update-service.types.js";
|
|
5
|
-
|
|
7
|
+
// 타입
|
|
6
8
|
export * from "./types.js";
|
|
9
|
+
// 정의
|
|
7
10
|
export * from "./define-event.js";
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "AACA,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAEnD,SAAS;AACT,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,KAAK;AACL,cAAc,SAAS,CAAC;AAExB,KAAK;AACL,cAAc,gBAAgB,CAAC"}
|
|
@@ -2,39 +2,39 @@ import type { Bytes } from "@simplysm/core-common";
|
|
|
2
2
|
import "@simplysm/core-common";
|
|
3
3
|
import { type ServiceMessage } from "./protocol.types";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* 서비스 프로토콜 인터페이스
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
7
|
+
* 바이너리 프로토콜 V2:
|
|
8
|
+
* - 헤더: 28바이트 (UUID 16 + TotalSize 8 + Index 4)
|
|
9
|
+
* - 본문: JSON
|
|
10
|
+
* - 자동 청킹: 3MB 초과 시 300KB 청크로 분할
|
|
11
|
+
* - 최대 메시지 크기: 100MB
|
|
12
12
|
*/
|
|
13
13
|
export interface ServiceProtocol {
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 메시지를 인코딩한다 (필요 시 자동 분할)
|
|
16
16
|
*/
|
|
17
17
|
encode(uuid: string, message: ServiceMessage): {
|
|
18
18
|
chunks: Bytes[];
|
|
19
19
|
totalSize: number;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* 메시지를 디코딩한다 (청크 패킷 자동 재조립)
|
|
23
23
|
*/
|
|
24
24
|
decode<T extends ServiceMessage>(bytes: Bytes): ServiceMessageDecodeResult<T>;
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* 프로토콜 인스턴스를 해제한다.
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* 내부 청크 누적기의 GC 타이머를 해제하고 메모리를 반환한다.
|
|
29
|
+
* 프로토콜 인스턴스가 더 이상 필요하지 않을 때 반드시 호출해야 한다.
|
|
30
30
|
*/
|
|
31
31
|
dispose(): void;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* 메시지 디코딩 결과 타입 (유니언)
|
|
35
35
|
*
|
|
36
|
-
* - `type: "complete"`:
|
|
37
|
-
* - `type: "progress"`:
|
|
36
|
+
* - `type: "complete"`: 모든 청크를 수신하여 메시지 재조립이 완료됨
|
|
37
|
+
* - `type: "progress"`: 청크 메시지 진행 중 (일부 청크만 도착)
|
|
38
38
|
*/
|
|
39
39
|
export type ServiceMessageDecodeResult<TMessage extends ServiceMessage> = {
|
|
40
40
|
type: "complete";
|
|
@@ -47,13 +47,13 @@ export type ServiceMessageDecodeResult<TMessage extends ServiceMessage> = {
|
|
|
47
47
|
completedSize: number;
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
50
|
+
* 서비스 프로토콜 인코더/디코더를 생성한다
|
|
51
51
|
*
|
|
52
|
-
*
|
|
53
|
-
* -
|
|
54
|
-
* -
|
|
55
|
-
* -
|
|
56
|
-
* -
|
|
52
|
+
* 바이너리 프로토콜 V2:
|
|
53
|
+
* - 헤더: 28바이트 (UUID 16 + TotalSize 8 + Index 4)
|
|
54
|
+
* - 본문: JSON
|
|
55
|
+
* - 자동 청킹: 3MB 초과 시 300KB 청크로 분할
|
|
56
|
+
* - 최대 메시지 크기: 100MB
|
|
57
57
|
*/
|
|
58
58
|
export declare function createServiceProtocol(): ServiceProtocol;
|
|
59
59
|
//# sourceMappingURL=create-service-protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-service-protocol.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\create-service-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,uBAAuB,CAAC;AAQ/B,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtF;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,CAAC,QAAQ,SAAS,cAAc,IAClE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"create-service-protocol.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\create-service-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,uBAAuB,CAAC;AAQ/B,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtF;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,CAAC,QAAQ,SAAS,cAAc,IAClE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAoLvD"}
|
|
@@ -1,116 +1,153 @@
|
|
|
1
1
|
import "@simplysm/core-common";
|
|
2
|
-
import {
|
|
3
|
-
ArgumentError,
|
|
4
|
-
bytes as bytesU,
|
|
5
|
-
json,
|
|
6
|
-
LazyGcMap,
|
|
7
|
-
Uuid
|
|
8
|
-
} from "@simplysm/core-common";
|
|
2
|
+
import { ArgumentError, bytes as bytesU, json, LazyGcMap, Uuid, } from "@simplysm/core-common";
|
|
9
3
|
import { PROTOCOL_CONFIG } from "./protocol.types.js";
|
|
10
|
-
|
|
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
|
-
index
|
|
51
|
-
|
|
52
|
-
return { chunks, totalSize };
|
|
53
|
-
},
|
|
54
|
-
decode(bytes) {
|
|
55
|
-
if (bytes.length < 28) {
|
|
56
|
-
throw new ArgumentError("Buffer size is smaller than header size.", {
|
|
57
|
-
bufferSize: bytes.length,
|
|
58
|
-
minimumSize: 28
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
const uuidBytes = bytes.subarray(0, 16);
|
|
62
|
-
const uuid = Uuid.fromBytes(uuidBytes).toString();
|
|
63
|
-
const headerView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
64
|
-
const totalSize = Number(headerView.getBigUint64(16, false));
|
|
65
|
-
const index = headerView.getUint32(24, false);
|
|
66
|
-
if (totalSize > PROTOCOL_CONFIG.MAX_TOTAL_SIZE) {
|
|
67
|
-
throw new ArgumentError("Message size exceeds the limit.", {
|
|
68
|
-
totalSize,
|
|
69
|
-
maxSize: PROTOCOL_CONFIG.MAX_TOTAL_SIZE
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
const bodyBytes = bytes.subarray(28);
|
|
73
|
-
const accItem = accumulator.getOrCreate(uuid, () => ({
|
|
74
|
-
totalSize,
|
|
75
|
-
completedSize: 0,
|
|
76
|
-
chunks: []
|
|
77
|
-
}));
|
|
78
|
-
if (accItem.chunks[index] == null) {
|
|
79
|
-
accItem.chunks[index] = bodyBytes;
|
|
80
|
-
accItem.completedSize += bodyBytes.length;
|
|
81
|
-
}
|
|
82
|
-
if (accItem.completedSize < accItem.totalSize) {
|
|
83
|
-
return {
|
|
84
|
-
type: "progress",
|
|
85
|
-
uuid,
|
|
86
|
-
totalSize,
|
|
87
|
-
completedSize: accItem.completedSize
|
|
88
|
-
};
|
|
89
|
-
} else {
|
|
90
|
-
accumulator.delete(uuid);
|
|
91
|
-
const resultBytes = bytesU.concat(accItem.chunks.filterExists());
|
|
92
|
-
let messageArr;
|
|
93
|
-
try {
|
|
94
|
-
messageArr = json.parse(new TextDecoder().decode(resultBytes));
|
|
95
|
-
} catch (err) {
|
|
96
|
-
throw new ArgumentError("Failed to decode message.", { uuid, cause: err });
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
type: "complete",
|
|
100
|
-
uuid,
|
|
101
|
-
message: {
|
|
102
|
-
name: messageArr[0],
|
|
103
|
-
body: messageArr[1]
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
dispose() {
|
|
109
|
-
accumulator.dispose();
|
|
4
|
+
/**
|
|
5
|
+
* 서비스 프로토콜 인코더/디코더를 생성한다
|
|
6
|
+
*
|
|
7
|
+
* 바이너리 프로토콜 V2:
|
|
8
|
+
* - 헤더: 28바이트 (UUID 16 + TotalSize 8 + Index 4)
|
|
9
|
+
* - 본문: JSON
|
|
10
|
+
* - 자동 청킹: 3MB 초과 시 300KB 청크로 분할
|
|
11
|
+
* - 최대 메시지 크기: 100MB
|
|
12
|
+
*/
|
|
13
|
+
export function createServiceProtocol() {
|
|
14
|
+
// -------------------------------------------------------------------
|
|
15
|
+
// 상태
|
|
16
|
+
// -------------------------------------------------------------------
|
|
17
|
+
const accumulator = new LazyGcMap({
|
|
18
|
+
gcInterval: PROTOCOL_CONFIG.GC_INTERVAL,
|
|
19
|
+
expireTime: PROTOCOL_CONFIG.EXPIRE_TIME,
|
|
20
|
+
});
|
|
21
|
+
// -------------------------------------------------------------------
|
|
22
|
+
// 인코딩 헬퍼
|
|
23
|
+
// -------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* 메시지 청크를 인코딩한다 (헤더 + 본문)
|
|
26
|
+
*
|
|
27
|
+
* 헤더 구조 (28바이트, Big Endian):
|
|
28
|
+
* ```
|
|
29
|
+
* Offset Size Field
|
|
30
|
+
* ------ ---- -----
|
|
31
|
+
* 0 16 UUID (바이너리)
|
|
32
|
+
* 16 8 TotalSize (uint64)
|
|
33
|
+
* 24 4 Index (uint32)
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
function encodeChunk(header, bodyBytes) {
|
|
37
|
+
const headerBytes = new Uint8Array(28);
|
|
38
|
+
// UUID (0-15)
|
|
39
|
+
const uuidBytes = new Uuid(header.uuid).toBytes();
|
|
40
|
+
headerBytes.set(uuidBytes, 0);
|
|
41
|
+
// TotalSize (16-23), Index (24-27)
|
|
42
|
+
const headerView = new DataView(headerBytes.buffer, headerBytes.byteOffset, headerBytes.byteLength);
|
|
43
|
+
headerView.setBigUint64(16, BigInt(header.totalSize), false);
|
|
44
|
+
headerView.setUint32(24, header.index, false);
|
|
45
|
+
return bytesU.concat([headerBytes, ...(bodyBytes ? [bodyBytes] : [])]);
|
|
110
46
|
}
|
|
111
|
-
|
|
47
|
+
// -------------------------------------------------------------------
|
|
48
|
+
// 공개 API
|
|
49
|
+
// -------------------------------------------------------------------
|
|
50
|
+
return {
|
|
51
|
+
encode(uuid, message) {
|
|
52
|
+
const msgJson = json.stringify([message.name, ...("body" in message ? [message.body] : [])]);
|
|
53
|
+
const msgBytes = new TextEncoder().encode(msgJson);
|
|
54
|
+
const totalSize = msgBytes.length;
|
|
55
|
+
// 전체 크기 제한 확인 (우선 수행)
|
|
56
|
+
if (totalSize > PROTOCOL_CONFIG.MAX_TOTAL_SIZE) {
|
|
57
|
+
throw new ArgumentError("메시지 크기가 제한을 초과했습니다.", {
|
|
58
|
+
totalSize,
|
|
59
|
+
maxSize: PROTOCOL_CONFIG.MAX_TOTAL_SIZE,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// 충분히 작으면 그대로 반환
|
|
63
|
+
if (totalSize <= PROTOCOL_CONFIG.SPLIT_MESSAGE_SIZE) {
|
|
64
|
+
return { chunks: [encodeChunk({ uuid, totalSize, index: 0 }, msgBytes)], totalSize };
|
|
65
|
+
}
|
|
66
|
+
// 청크로 분할
|
|
67
|
+
const chunks = [];
|
|
68
|
+
let offset = 0;
|
|
69
|
+
let index = 0;
|
|
70
|
+
while (offset < totalSize) {
|
|
71
|
+
const chunkBodyBytes = msgBytes.subarray(offset, offset + PROTOCOL_CONFIG.CHUNK_SIZE);
|
|
72
|
+
const chunk = encodeChunk({ uuid, totalSize, index }, chunkBodyBytes);
|
|
73
|
+
chunks.push(chunk);
|
|
74
|
+
offset += PROTOCOL_CONFIG.CHUNK_SIZE;
|
|
75
|
+
index++;
|
|
76
|
+
}
|
|
77
|
+
return { chunks, totalSize };
|
|
78
|
+
},
|
|
79
|
+
decode(bytes) {
|
|
80
|
+
if (bytes.length < 28) {
|
|
81
|
+
throw new ArgumentError("버퍼 크기가 헤더 크기보다 작습니다.", {
|
|
82
|
+
bufferSize: bytes.length,
|
|
83
|
+
minimumSize: 28,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// 1. 헤더 읽기
|
|
87
|
+
// UUID
|
|
88
|
+
const uuidBytes = bytes.subarray(0, 16);
|
|
89
|
+
const uuid = Uuid.fromBytes(uuidBytes).toString();
|
|
90
|
+
// TOTAL_SIZE, INDEX
|
|
91
|
+
const headerView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
92
|
+
const totalSize = Number(headerView.getBigUint64(16, false));
|
|
93
|
+
const index = headerView.getUint32(24, false);
|
|
94
|
+
// 전체 크기 제한 확인 (우선 수행)
|
|
95
|
+
if (totalSize > PROTOCOL_CONFIG.MAX_TOTAL_SIZE) {
|
|
96
|
+
throw new ArgumentError("메시지 크기가 제한을 초과했습니다.", {
|
|
97
|
+
totalSize,
|
|
98
|
+
maxSize: PROTOCOL_CONFIG.MAX_TOTAL_SIZE,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const bodyBytes = bytes.subarray(28);
|
|
102
|
+
const accItem = accumulator.getOrCreate(uuid, () => ({
|
|
103
|
+
totalSize,
|
|
104
|
+
completedSize: 0,
|
|
105
|
+
chunks: [],
|
|
106
|
+
}));
|
|
107
|
+
if (accItem.chunks[index] == null) {
|
|
108
|
+
// 중복 패킷 방어
|
|
109
|
+
accItem.chunks[index] = bodyBytes;
|
|
110
|
+
accItem.completedSize += bodyBytes.length;
|
|
111
|
+
}
|
|
112
|
+
if (accItem.completedSize < accItem.totalSize) {
|
|
113
|
+
return {
|
|
114
|
+
type: "progress",
|
|
115
|
+
uuid: uuid,
|
|
116
|
+
totalSize: totalSize,
|
|
117
|
+
completedSize: accItem.completedSize,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else if (accItem.completedSize === accItem.totalSize) {
|
|
121
|
+
accumulator.delete(uuid); // 메모리 해제
|
|
122
|
+
const resultBytes = bytesU.concat(accItem.chunks.filterExists());
|
|
123
|
+
let messageArr;
|
|
124
|
+
try {
|
|
125
|
+
messageArr = json.parse(new TextDecoder().decode(resultBytes));
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
throw new ArgumentError("메시지 디코딩에 실패했습니다.", { uuid, cause: err });
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
type: "complete",
|
|
132
|
+
uuid: uuid,
|
|
133
|
+
message: {
|
|
134
|
+
name: messageArr[0],
|
|
135
|
+
body: messageArr[1],
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
accumulator.delete(uuid);
|
|
141
|
+
throw new ArgumentError("프로토콜 무결성 위반: completedSize가 totalSize를 초과했습니다.", {
|
|
142
|
+
uuid,
|
|
143
|
+
completedSize: accItem.completedSize,
|
|
144
|
+
totalSize: accItem.totalSize,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
dispose() {
|
|
149
|
+
accumulator.dispose();
|
|
150
|
+
},
|
|
151
|
+
};
|
|
112
152
|
}
|
|
113
|
-
|
|
114
|
-
createServiceProtocol
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=create-service-protocol.js.map
|
|
153
|
+
//# sourceMappingURL=create-service-protocol.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/protocol/create-service-protocol.ts"],
|
|
4
|
-
"mappings": "AACA,OAAO;AACP;AAAA,EACE;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAA4C;AAkD9C,SAAS,wBAAyC;AAKvD,QAAM,cAAc,IAAI,UAOtB;AAAA,IACA,YAAY,gBAAgB;AAAA,IAC5B,YAAY,gBAAgB;AAAA,EAC9B,CAAC;AAkBD,WAAS,YACP,QAKA,WACO;AACP,UAAM,cAAc,IAAI,WAAW,EAAE;AAGrC,UAAM,YAAY,IAAI,KAAK,OAAO,IAAI,EAAE,QAAQ;AAChD,gBAAY,IAAI,WAAW,CAAC;AAG5B,UAAM,aAAa,IAAI;AAAA,MACrB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AACA,eAAW,aAAa,IAAI,OAAO,OAAO,SAAS,GAAG,KAAK;AAC3D,eAAW,UAAU,IAAI,OAAO,OAAO,KAAK;AAE5C,WAAO,OAAO,OAAO,CAAC,aAAa,GAAI,YAAY,CAAC,SAAS,IAAI,CAAC,CAAE,CAAC;AAAA,EACvE;AAMA,SAAO;AAAA,IACL,OAAO,MAAc,SAAiE;AACpF,YAAM,UAAU,KAAK,UAAU,CAAC,QAAQ,MAAM,GAAI,UAAU,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAE,CAAC;AAC3F,YAAM,WAAW,IAAI,YAAY,EAAE,OAAO,OAAO;AAEjD,YAAM,YAAY,SAAS;AAG3B,UAAI,YAAY,gBAAgB,gBAAgB;AAC9C,cAAM,IAAI,cAAc,mCAAmC;AAAA,UACzD;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAC;AAAA,MACH;AAGA,UAAI,aAAa,gBAAgB,oBAAoB;AACnD,eAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,WAAW,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,UAAU;AAAA,MACrF;AAGA,YAAM,SAAkB,CAAC;AACzB,UAAI,SAAS;AACb,UAAI,QAAQ;AAEZ,aAAO,SAAS,WAAW;AACzB,cAAM,iBAAiB,SAAS,SAAS,QAAQ,SAAS,gBAAgB,UAAU;AAEpF,cAAM,QAAQ,YAAY,EAAE,MAAM,WAAW,MAAM,GAAG,cAAc;AACpE,eAAO,KAAK,KAAK;AAEjB,kBAAU,gBAAgB;AAC1B;AAAA,MACF;AAEA,aAAO,EAAE,QAAQ,UAAU;AAAA,IAC7B;AAAA,IAEA,OAAiC,OAA6C;AAC5E,UAAI,MAAM,SAAS,IAAI;AACrB,cAAM,IAAI,cAAc,4CAA4C;AAAA,UAClE,YAAY,MAAM;AAAA,UAClB,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAKA,YAAM,YAAY,MAAM,SAAS,GAAG,EAAE;AACtC,YAAM,OAAO,KAAK,UAAU,SAAS,EAAE,SAAS;AAGhD,YAAM,aAAa,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAChF,YAAM,YAAY,OAAO,WAAW,aAAa,IAAI,KAAK,CAAC;AAC3D,YAAM,QAAQ,WAAW,UAAU,IAAI,KAAK;AAG5C,UAAI,YAAY,gBAAgB,gBAAgB;AAC9C,cAAM,IAAI,cAAc,mCAAmC;AAAA,UACzD;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAC;AAAA,MACH;AAEA,YAAM,YAAY,MAAM,SAAS,EAAE;AAEnC,YAAM,UAAU,YAAY,YAAY,MAAM,OAAO;AAAA,QACnD;AAAA,QACA,eAAe;AAAA,QACf,QAAQ,CAAC;AAAA,MACX,EAAE;AACF,UAAI,QAAQ,OAAO,KAAK,KAAK,MAAM;AAEjC,gBAAQ,OAAO,KAAK,IAAI;AACxB,gBAAQ,iBAAiB,UAAU;AAAA,MACrC;AAEA,UAAI,QAAQ,gBAAgB,QAAQ,WAAW;AAC7C,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,eAAe,QAAQ;AAAA,QACzB;AAAA,MACF,OAAO;AACL,oBAAY,OAAO,IAAI;AAEvB,cAAM,cAAc,OAAO,OAAO,QAAQ,OAAO,aAAa,CAAC;AAC/D,YAAI;AACJ,YAAI;AACF,uBAAa,KAAK,MAAyB,IAAI,YAAY,EAAE,OAAO,WAAW,CAAC;AAAA,QAClF,SAAS,KAAK;AACZ,gBAAM,IAAI,cAAc,6BAA6B,EAAE,MAAM,OAAO,IAAI,CAAC;AAAA,QAC3E;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,YACP,MAAM,WAAW,CAAC;AAAA,YAClB,MAAM,WAAW,CAAC;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,UAAgB;AACd,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"create-service-protocol.js","sourceRoot":"","sources":["..\\..\\src\\protocol\\create-service-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** 서비스 프로토콜 설정 */
|
|
2
2
|
export declare const PROTOCOL_CONFIG: {
|
|
3
|
-
/**
|
|
3
|
+
/** 최대 메시지 크기 (100MB) */
|
|
4
4
|
readonly MAX_TOTAL_SIZE: number;
|
|
5
|
-
/**
|
|
5
|
+
/** 청킹 임계값 (3MB) */
|
|
6
6
|
readonly SPLIT_MESSAGE_SIZE: number;
|
|
7
|
-
/**
|
|
7
|
+
/** 청크 크기 (300KB) */
|
|
8
8
|
readonly CHUNK_SIZE: number;
|
|
9
|
-
/** GC
|
|
9
|
+
/** GC 주기 (10초) */
|
|
10
10
|
readonly GC_INTERVAL: number;
|
|
11
|
-
/**
|
|
11
|
+
/** 미완성 메시지 만료 시간 (60초) */
|
|
12
12
|
readonly EXPIRE_TIME: number;
|
|
13
13
|
};
|
|
14
14
|
export type ServiceMessage = ServiceReloadMessage | ServiceRequestMessage | ServiceAuthMessage | ServiceProgressMessage | ServiceResponseMessage | ServiceErrorMessage | ServiceAddEventListenerMessage | ServiceRemoveEventListenerMessage | ServiceGetEventListenerInfosMessage | ServiceEmitEventMessage | ServiceEventMessage;
|
|
15
15
|
export type ServiceServerMessage = ServiceReloadMessage | ServiceResponseMessage | ServiceErrorMessage | ServiceEventMessage;
|
|
16
16
|
export type ServiceServerRawMessage = ServiceProgressMessage | ServiceServerMessage;
|
|
17
17
|
export type ServiceClientMessage = ServiceRequestMessage | ServiceAuthMessage | ServiceAddEventListenerMessage | ServiceRemoveEventListenerMessage | ServiceGetEventListenerInfosMessage | ServiceEmitEventMessage;
|
|
18
|
-
/**
|
|
18
|
+
/** 서버: 클라이언트에 리로드 명령 */
|
|
19
19
|
export interface ServiceReloadMessage {
|
|
20
20
|
name: "reload";
|
|
21
21
|
body: {
|
|
@@ -23,7 +23,7 @@ export interface ServiceReloadMessage {
|
|
|
23
23
|
changedFileSet: Set<string>;
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
/**
|
|
26
|
+
/** 서버: 수신된 청크 메시지의 진행 상태 알림 */
|
|
27
27
|
export interface ServiceProgressMessage {
|
|
28
28
|
name: "progress";
|
|
29
29
|
body: {
|
|
@@ -31,7 +31,7 @@ export interface ServiceProgressMessage {
|
|
|
31
31
|
completedSize: number;
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
/**
|
|
34
|
+
/** 서버: 에러 알림 */
|
|
35
35
|
export interface ServiceErrorMessage {
|
|
36
36
|
name: "error";
|
|
37
37
|
body: {
|
|
@@ -43,22 +43,22 @@ export interface ServiceErrorMessage {
|
|
|
43
43
|
cause?: unknown;
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
/**
|
|
46
|
+
/** 클라이언트: 인증 메시지 */
|
|
47
47
|
export interface ServiceAuthMessage {
|
|
48
48
|
name: "auth";
|
|
49
49
|
body: string;
|
|
50
50
|
}
|
|
51
|
-
/**
|
|
51
|
+
/** 클라이언트: 서비스 메서드 요청 */
|
|
52
52
|
export interface ServiceRequestMessage {
|
|
53
53
|
name: `${string}.${string}`;
|
|
54
54
|
body: unknown[];
|
|
55
55
|
}
|
|
56
|
-
/**
|
|
56
|
+
/** 서버: 서비스 메서드 응답 */
|
|
57
57
|
export interface ServiceResponseMessage {
|
|
58
58
|
name: "response";
|
|
59
59
|
body?: unknown;
|
|
60
60
|
}
|
|
61
|
-
/**
|
|
61
|
+
/** 클라이언트: 이벤트 리스너 추가 */
|
|
62
62
|
export interface ServiceAddEventListenerMessage {
|
|
63
63
|
name: "evt:add";
|
|
64
64
|
body: {
|
|
@@ -67,21 +67,21 @@ export interface ServiceAddEventListenerMessage {
|
|
|
67
67
|
info: unknown;
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
-
/**
|
|
70
|
+
/** 클라이언트: 이벤트 리스너 제거 */
|
|
71
71
|
export interface ServiceRemoveEventListenerMessage {
|
|
72
72
|
name: "evt:remove";
|
|
73
73
|
body: {
|
|
74
74
|
key: string;
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
/**
|
|
77
|
+
/** 클라이언트: 이벤트 리스너 정보 목록 요청 */
|
|
78
78
|
export interface ServiceGetEventListenerInfosMessage {
|
|
79
79
|
name: "evt:gets";
|
|
80
80
|
body: {
|
|
81
81
|
name: string;
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
/**
|
|
84
|
+
/** 클라이언트: 이벤트 발생 */
|
|
85
85
|
export interface ServiceEmitEventMessage {
|
|
86
86
|
name: "evt:emit";
|
|
87
87
|
body: {
|
|
@@ -89,7 +89,7 @@ export interface ServiceEmitEventMessage {
|
|
|
89
89
|
data: unknown;
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
|
-
/**
|
|
92
|
+
/** 서버: 이벤트 알림 */
|
|
93
93
|
export interface ServiceEventMessage {
|
|
94
94
|
name: "evt:on";
|
|
95
95
|
body: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.types.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\protocol.types.ts"],"names":[],"mappings":"AAIA,
|
|
1
|
+
{"version":3,"file":"protocol.types.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\protocol.types.ts"],"names":[],"mappings":"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"}
|