@simplysm/service-server 14.0.86 → 14.0.87

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.
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/F;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAiBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,qBAAqB,CA8DnE"}
1
+ {"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/F;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAiBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,qBAAqB,CAsEnE"}
@@ -55,13 +55,19 @@ export function createServerProtocolWrapper() {
55
55
  }
56
56
  },
57
57
  async decode(bytes) {
58
- const totalSize = bytes.length;
59
- if (totalSize > SIZE_THRESHOLD) {
60
- return getWorker().decode(bytes);
58
+ // 청크 재조립(stateful)은 항상 메인 스레드 단일 누적기에서 수행한다.
59
+ // 청크별로 worker/메인을 분기하면 한 메시지의 청크가 서로 다른 누적기로 흩어져
60
+ // 재조립이 영원히 완성되지 못한다 (#35).
61
+ const acc = protocol.accumulate(bytes);
62
+ if (acc.type === "progress") {
63
+ return acc;
61
64
  }
62
- else {
63
- return protocol.decode(bytes);
65
+ // 재조립 완료. 무거운 JSON 파싱(stateless)만 크기 기준으로 worker 에 위임한다.
66
+ const resultBytes = acc.resultBytes;
67
+ if (resultBytes.length > SIZE_THRESHOLD) {
68
+ return { type: "complete", uuid: acc.uuid, message: await getWorker().parseMessage(resultBytes) };
64
69
  }
70
+ return { type: "complete", uuid: acc.uuid, message: protocol.parseMessage(resultBytes) };
65
71
  },
66
72
  dispose() {
67
73
  protocol.dispose();
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-wrapper.js","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AA0BjE,0BAA0B;AAC1B,IAAI,YAAyE,CAAC;AAE9E,SAAS,SAAS;IAChB,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,YAAY,GAAG,MAAM,CAAC,MAAM,CAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,EACzD;YACE,cAAc,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE;SACjD,CACF,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IACzC,sEAAsE;IACtE,KAAK;IACL,sEAAsE;IAEtE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;IAEzC,sEAAsE;IACtE,KAAK;IACL,sEAAsE;IAEtE;;OAEG;IACH,SAAS,wBAAwB,CAAC,GAAmB;QACnD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAEtB,2BAA2B;QAC3B,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wCAAwC;QACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,SAAS;IACT,sEAAsE;IAEtE,OAAO;QACL,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,OAAuB;YAEvB,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,OAAO,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAY;YACvB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;YAC/B,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;gBAC/B,OAAO,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"protocol-wrapper.js","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AA0BjE,0BAA0B;AAC1B,IAAI,YAAyE,CAAC;AAE9E,SAAS,SAAS;IAChB,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,YAAY,GAAG,MAAM,CAAC,MAAM,CAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,EACzD;YACE,cAAc,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE;SACjD,CACF,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IACzC,sEAAsE;IACtE,KAAK;IACL,sEAAsE;IAEtE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;IAEzC,sEAAsE;IACtE,KAAK;IACL,sEAAsE;IAEtE;;OAEG;IACH,SAAS,wBAAwB,CAAC,GAAmB;QACnD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAEtB,2BAA2B;QAC3B,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wCAAwC;QACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,SAAS;IACT,sEAAsE;IAEtE,OAAO;QACL,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,OAAuB;YAEvB,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,OAAO,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAY;YACvB,6CAA6C;YAC7C,iDAAiD;YACjD,2BAA2B;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5B,OAAO,GAAG,CAAC;YACb,CAAC;YAED,yDAAyD;YACzD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YACpC,IAAI,WAAW,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;gBACxC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;YACpG,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3F,CAAC;QAED,OAAO;YACL,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Bytes } from "@simplysm/core-common";
2
- import type { ServiceMessageDecodeResult, ServiceMessage } from "@simplysm/service-common";
2
+ import type { ServiceMessage } from "@simplysm/service-common";
3
3
  declare const _default: {
4
4
  send<TEventName extends string>(event: TEventName, data?: undefined): void;
5
5
  __methods: {
@@ -7,7 +7,7 @@ declare const _default: {
7
7
  chunks: Bytes[];
8
8
  totalSize: number;
9
9
  };
10
- decode: (bytes: Bytes) => ServiceMessageDecodeResult<ServiceMessage>;
10
+ parseMessage: (resultBytes: Bytes) => ServiceMessage;
11
11
  };
12
12
  __events: Record<string, never>;
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"service-protocol.worker.d.ts","sourceRoot":"","sources":["../../src/workers/service-protocol.worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;;;;uBAM1E,MAAM,WAAW,cAAc,KAAG;YAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE;wBAGvE,KAAK,KAAG,0BAA0B,CAAC,cAAc,CAAC;;;;AAJpE,wBAOG"}
1
+ {"version":3,"file":"service-protocol.worker.d.ts","sourceRoot":"","sources":["../../src/workers/service-protocol.worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;;;;uBAM9C,MAAM,WAAW,cAAc,KAAG;YAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE;oCAI3D,KAAK,KAAG,cAAc;;;;AALpD,wBAQG"}
@@ -5,8 +5,9 @@ export default createWorker({
5
5
  encode: (uuid, message) => {
6
6
  return protocol.encode(uuid, message);
7
7
  },
8
- decode: (bytes) => {
9
- return protocol.decode(bytes);
8
+ // 재조립 완료된 raw 바이트의 무거운 JSON 파싱만 worker 에서 수행 (stateless)
9
+ parseMessage: (resultBytes) => {
10
+ return protocol.parseMessage(resultBytes);
10
11
  },
11
12
  });
12
13
  //# sourceMappingURL=service-protocol.worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-protocol.worker.js","sourceRoot":"","sources":["../../src/workers/service-protocol.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AAEzC,eAAe,YAAY,CAAC;IAC1B,MAAM,EAAE,CAAC,IAAY,EAAE,OAAuB,EAA0C,EAAE;QACxF,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,EAAE,CAAC,KAAY,EAA8C,EAAE;QACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"service-protocol.worker.js","sourceRoot":"","sources":["../../src/workers/service-protocol.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AAEzC,eAAe,YAAY,CAAC;IAC1B,MAAM,EAAE,CAAC,IAAY,EAAE,OAAuB,EAA0C,EAAE;QACxF,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,yDAAyD;IACzD,YAAY,EAAE,CAAC,WAAkB,EAAkB,EAAE;QACnD,OAAO,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/service-server",
3
- "version": "14.0.86",
3
+ "version": "14.0.87",
4
4
  "description": "심플리즘 패키지 - 서비스 (server)",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -29,11 +29,11 @@
29
29
  "semver": "^7.8.1",
30
30
  "utf-8-validate": "^6.0.6",
31
31
  "ws": "^8.21.0",
32
- "@simplysm/core-node": "14.0.86",
33
- "@simplysm/core-common": "14.0.86",
34
- "@simplysm/orm-common": "14.0.86",
35
- "@simplysm/service-common": "14.0.86",
36
- "@simplysm/orm-node": "14.0.86"
32
+ "@simplysm/core-common": "14.0.87",
33
+ "@simplysm/orm-common": "14.0.87",
34
+ "@simplysm/core-node": "14.0.87",
35
+ "@simplysm/orm-node": "14.0.87",
36
+ "@simplysm/service-common": "14.0.87"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/semver": "^7.7.1",
@@ -98,12 +98,20 @@ export function createServerProtocolWrapper(): ServerProtocolWrapper {
98
98
  },
99
99
 
100
100
  async decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>> {
101
- const totalSize = bytes.length;
102
- if (totalSize > SIZE_THRESHOLD) {
103
- return getWorker().decode(bytes);
104
- } else {
105
- return protocol.decode(bytes);
101
+ // 청크 재조립(stateful)은 항상 메인 스레드 단일 누적기에서 수행한다.
102
+ // 청크별로 worker/메인을 분기하면 한 메시지의 청크가 서로 다른 누적기로 흩어져
103
+ // 재조립이 영원히 완성되지 못한다 (#35).
104
+ const acc = protocol.accumulate(bytes);
105
+ if (acc.type === "progress") {
106
+ return acc;
107
+ }
108
+
109
+ // 재조립 완료. 무거운 JSON 파싱(stateless)만 크기 기준으로 worker 에 위임한다.
110
+ const resultBytes = acc.resultBytes;
111
+ if (resultBytes.length > SIZE_THRESHOLD) {
112
+ return { type: "complete", uuid: acc.uuid, message: await getWorker().parseMessage(resultBytes) };
106
113
  }
114
+ return { type: "complete", uuid: acc.uuid, message: protocol.parseMessage(resultBytes) };
107
115
  },
108
116
 
109
117
  dispose(): void {
@@ -1,6 +1,6 @@
1
1
  import { createWorker } from "@simplysm/core-node";
2
2
  import type { Bytes } from "@simplysm/core-common";
3
- import type { ServiceMessageDecodeResult, ServiceMessage } from "@simplysm/service-common";
3
+ import type { ServiceMessage } from "@simplysm/service-common";
4
4
  import { createServiceProtocol } from "@simplysm/service-common";
5
5
 
6
6
  const protocol = createServiceProtocol();
@@ -9,7 +9,8 @@ export default createWorker({
9
9
  encode: (uuid: string, message: ServiceMessage): { chunks: Bytes[]; totalSize: number } => {
10
10
  return protocol.encode(uuid, message);
11
11
  },
12
- decode: (bytes: Bytes): ServiceMessageDecodeResult<ServiceMessage> => {
13
- return protocol.decode(bytes);
12
+ // 재조립 완료된 raw 바이트의 무거운 JSON 파싱만 worker 에서 수행 (stateless)
13
+ parseMessage: (resultBytes: Bytes): ServiceMessage => {
14
+ return protocol.parseMessage(resultBytes);
14
15
  },
15
16
  });