@simplysm/service-server 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 (83) hide show
  1. package/dist/auth/auth-token-payload.js +2 -1
  2. package/dist/auth/auth-token-payload.js.map +1 -6
  3. package/dist/auth/jwt-manager.js +21 -21
  4. package/dist/auth/jwt-manager.js.map +1 -6
  5. package/dist/core/define-service.d.ts +12 -12
  6. package/dist/core/define-service.d.ts.map +1 -1
  7. package/dist/core/define-service.js +77 -63
  8. package/dist/core/define-service.js.map +1 -6
  9. package/dist/core/service-executor.d.ts.map +1 -1
  10. package/dist/core/service-executor.js +42 -32
  11. package/dist/core/service-executor.js.map +1 -6
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +11 -2
  15. package/dist/index.js.map +1 -6
  16. package/dist/legacy/v1-auto-update-handler.d.ts +2 -2
  17. package/dist/legacy/v1-auto-update-handler.js +42 -35
  18. package/dist/legacy/v1-auto-update-handler.js.map +1 -6
  19. package/dist/protocol/protocol-wrapper.d.ts +9 -9
  20. package/dist/protocol/protocol-wrapper.js +64 -46
  21. package/dist/protocol/protocol-wrapper.js.map +1 -6
  22. package/dist/service-server.d.ts +2 -0
  23. package/dist/service-server.d.ts.map +1 -1
  24. package/dist/service-server.js +187 -165
  25. package/dist/service-server.js.map +1 -6
  26. package/dist/services/auto-update-service.js +35 -34
  27. package/dist/services/auto-update-service.js.map +1 -6
  28. package/dist/services/orm-service.js +114 -120
  29. package/dist/services/orm-service.js.map +1 -6
  30. package/dist/transport/http/http-request-handler.d.ts.map +1 -1
  31. package/dist/transport/http/http-request-handler.js +58 -46
  32. package/dist/transport/http/http-request-handler.js.map +1 -6
  33. package/dist/transport/http/static-file-handler.js +42 -39
  34. package/dist/transport/http/static-file-handler.js.map +1 -6
  35. package/dist/transport/http/upload-handler.d.ts.map +1 -1
  36. package/dist/transport/http/upload-handler.js +60 -55
  37. package/dist/transport/http/upload-handler.js.map +1 -6
  38. package/dist/transport/socket/service-socket.d.ts +13 -13
  39. package/dist/transport/socket/service-socket.js +132 -108
  40. package/dist/transport/socket/service-socket.js.map +1 -6
  41. package/dist/transport/socket/websocket-handler.d.ts +10 -10
  42. package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
  43. package/dist/transport/socket/websocket-handler.js +154 -139
  44. package/dist/transport/socket/websocket-handler.js.map +1 -6
  45. package/dist/types/server-options.d.ts +1 -1
  46. package/dist/types/server-options.d.ts.map +1 -1
  47. package/dist/types/server-options.js +2 -1
  48. package/dist/types/server-options.js.map +1 -6
  49. package/dist/utils/config-manager.js +48 -46
  50. package/dist/utils/config-manager.js.map +1 -6
  51. package/dist/workers/service-protocol.worker.js +8 -11
  52. package/dist/workers/service-protocol.worker.js.map +1 -6
  53. package/package.json +12 -14
  54. package/src/auth/jwt-manager.ts +2 -2
  55. package/src/core/define-service.ts +19 -19
  56. package/src/core/service-executor.ts +23 -17
  57. package/src/index.ts +10 -12
  58. package/src/legacy/v1-auto-update-handler.ts +10 -10
  59. package/src/protocol/protocol-wrapper.ts +16 -16
  60. package/src/service-server.ts +52 -39
  61. package/src/services/auto-update-service.ts +1 -1
  62. package/src/services/orm-service.ts +7 -7
  63. package/src/transport/http/http-request-handler.ts +16 -10
  64. package/src/transport/http/static-file-handler.ts +8 -8
  65. package/src/transport/http/upload-handler.ts +16 -9
  66. package/src/transport/socket/service-socket.ts +22 -22
  67. package/src/transport/socket/websocket-handler.ts +59 -60
  68. package/src/types/server-options.ts +1 -1
  69. package/src/utils/config-manager.ts +11 -11
  70. package/README.md +0 -163
  71. package/dist/services/smtp-client-service.d.ts +0 -8
  72. package/dist/services/smtp-client-service.d.ts.map +0 -1
  73. package/dist/services/smtp-client-service.js +0 -46
  74. package/dist/services/smtp-client-service.js.map +0 -6
  75. package/docs/auth.md +0 -59
  76. package/docs/core.md +0 -133
  77. package/docs/server.md +0 -126
  78. package/docs/services.md +0 -58
  79. package/docs/transport.md +0 -164
  80. package/src/services/smtp-client-service.ts +0 -59
  81. package/tests/define-service.spec.ts +0 -66
  82. package/tests/orm-service.spec.ts +0 -83
  83. package/tests/service-executor.spec.ts +0 -114
@@ -1,33 +1,33 @@
1
1
  import type { Bytes } from "@simplysm/core-common";
2
2
  import type { ServiceMessageDecodeResult, ServiceMessage } from "@simplysm/service-common";
3
3
  /**
4
- * Protocol wrapper interface
4
+ * 프로토콜 래퍼 인터페이스
5
5
  *
6
- * Automatically offloads heavy message encoding/decoding to a worker thread
7
- * while using main thread for lightweight operations.
6
+ * 무거운 메시지 인코딩/디코딩을 worker 스레드에 자동으로 위임하고,
7
+ * 가벼운 작업은 메인 스레드에서 처리한다.
8
8
  */
9
9
  export interface ServerProtocolWrapper {
10
10
  /**
11
- * Encode message (auto worker delegation)
11
+ * 메시지를 인코딩한다 (worker 자동 위임)
12
12
  */
13
13
  encode(uuid: string, message: ServiceMessage): Promise<{
14
14
  chunks: Bytes[];
15
15
  totalSize: number;
16
16
  }>;
17
17
  /**
18
- * Decode message (auto worker delegation)
18
+ * 메시지를 디코딩한다 (worker 자동 위임)
19
19
  */
20
20
  decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>>;
21
21
  /**
22
- * Dispose protocol resources
22
+ * 프로토콜 리소스를 해제한다
23
23
  */
24
24
  dispose(): void;
25
25
  }
26
26
  /**
27
- * Create a protocol wrapper instance
27
+ * 프로토콜 래퍼 인스턴스를 생성한다
28
28
  *
29
- * Automatically offloads heavy message encoding/decoding to a worker thread
30
- * while using main thread for lightweight operations.
29
+ * 무거운 메시지 인코딩/디코딩을 worker 스레드에 자동으로 위임하고,
30
+ * 가벼운 작업은 메인 스레드에서 처리한다.
31
31
  */
32
32
  export declare function createServerProtocolWrapper(): ServerProtocolWrapper;
33
33
  //# sourceMappingURL=protocol-wrapper.d.ts.map
@@ -1,53 +1,71 @@
1
1
  import { Worker } from "@simplysm/core-node";
2
2
  import { createServiceProtocol } from "@simplysm/service-common";
3
+ // 공유 worker 인스턴스 (지연 싱글턴)
3
4
  let sharedWorker;
4
5
  function getWorker() {
5
- if (sharedWorker == null) {
6
- sharedWorker = Worker.create(
7
- import.meta.resolve("../workers/service-protocol.worker"),
8
- {
9
- resourceLimits: { maxOldGenerationSizeMb: 4096 }
10
- }
11
- );
12
- }
13
- return sharedWorker;
14
- }
15
- function createServerProtocolWrapper() {
16
- const protocol = createServiceProtocol();
17
- const SIZE_THRESHOLD = 30 * 1024;
18
- function shouldUseWorkerForEncode(msg) {
19
- if (!("body" in msg)) return false;
20
- const body = msg.body;
21
- if (body instanceof Uint8Array) {
22
- return true;
23
- }
24
- if (Array.isArray(body)) {
25
- return body.length > 0 && body.some((item) => item instanceof Uint8Array);
6
+ if (sharedWorker == null) {
7
+ sharedWorker = Worker.create(import.meta.resolve("../workers/service-protocol.worker"), {
8
+ resourceLimits: { maxOldGenerationSizeMb: 4096 },
9
+ });
26
10
  }
27
- return false;
28
- }
29
- return {
30
- async encode(uuid, message) {
31
- if (shouldUseWorkerForEncode(message)) {
32
- return getWorker().encode(uuid, message);
33
- } else {
34
- return protocol.encode(uuid, message);
35
- }
36
- },
37
- async decode(bytes) {
38
- const totalSize = bytes.length;
39
- if (totalSize > SIZE_THRESHOLD) {
40
- return getWorker().decode(bytes);
41
- } else {
42
- return protocol.decode(bytes);
43
- }
44
- },
45
- dispose() {
46
- protocol.dispose();
11
+ return sharedWorker;
12
+ }
13
+ /**
14
+ * 프로토콜 래퍼 인스턴스를 생성한다
15
+ *
16
+ * 무거운 메시지 인코딩/디코딩을 worker 스레드에 자동으로 위임하고,
17
+ * 가벼운 작업은 메인 스레드에서 처리한다.
18
+ */
19
+ export function createServerProtocolWrapper() {
20
+ // -------------------------------------------------------------------
21
+ // 상태
22
+ // -------------------------------------------------------------------
23
+ const protocol = createServiceProtocol();
24
+ const SIZE_THRESHOLD = 30 * 1024; // 30KB
25
+ // -------------------------------------------------------------------
26
+ // 헬퍼
27
+ // -------------------------------------------------------------------
28
+ /**
29
+ * 메시지 인코딩에 worker를 사용해야 하는지 확인한다
30
+ */
31
+ function shouldUseWorkerForEncode(msg) {
32
+ if (!("body" in msg))
33
+ return false;
34
+ const body = msg.body;
35
+ // Uint8Array: 항상 worker 사용
36
+ if (body instanceof Uint8Array) {
37
+ return true;
38
+ }
39
+ // 배열: Uint8Array 요소 존재 여부 확인 (ORM 결과 등)
40
+ if (Array.isArray(body)) {
41
+ return body.length > 0 && body.some((item) => item instanceof Uint8Array);
42
+ }
43
+ return false;
47
44
  }
48
- };
45
+ // -------------------------------------------------------------------
46
+ // 공개 API
47
+ // -------------------------------------------------------------------
48
+ return {
49
+ async encode(uuid, message) {
50
+ if (shouldUseWorkerForEncode(message)) {
51
+ return getWorker().encode(uuid, message);
52
+ }
53
+ else {
54
+ return protocol.encode(uuid, message);
55
+ }
56
+ },
57
+ async decode(bytes) {
58
+ const totalSize = bytes.length;
59
+ if (totalSize > SIZE_THRESHOLD) {
60
+ return getWorker().decode(bytes);
61
+ }
62
+ else {
63
+ return protocol.decode(bytes);
64
+ }
65
+ },
66
+ dispose() {
67
+ protocol.dispose();
68
+ },
69
+ };
49
70
  }
50
- export {
51
- createServerProtocolWrapper
52
- };
53
- //# sourceMappingURL=protocol-wrapper.js.map
71
+ //# sourceMappingURL=protocol-wrapper.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/protocol/protocol-wrapper.ts"],
4
- "mappings": "AACA,SAAS,cAAgC;AAEzC,SAAS,6BAA6B;AA2BtC,IAAI;AAEJ,SAAS,YAA6D;AACpE,MAAI,gBAAgB,MAAM;AACxB,mBAAe,OAAO;AAAA,MACpB,YAAY,QAAQ,oCAAoC;AAAA,MACxD;AAAA,QACE,gBAAgB,EAAE,wBAAwB,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,8BAAqD;AAKnE,QAAM,WAAW,sBAAsB;AACvC,QAAM,iBAAiB,KAAK;AAS5B,WAAS,yBAAyB,KAA8B;AAC9D,QAAI,EAAE,UAAU,KAAM,QAAO;AAE7B,UAAM,OAAO,IAAI;AAGjB,QAAI,gBAAgB,YAAY;AAC9B,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,SAAS,gBAAgB,UAAU;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAMA,SAAO;AAAA,IACL,MAAM,OACJ,MACA,SACiD;AACjD,UAAI,yBAAyB,OAAO,GAAG;AACrC,eAAO,UAAU,EAAE,OAAO,MAAM,OAAO;AAAA,MACzC,OAAO;AACL,eAAO,SAAS,OAAO,MAAM,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,OAAmE;AAC9E,YAAM,YAAY,MAAM;AACxB,UAAI,YAAY,gBAAgB;AAC9B,eAAO,UAAU,EAAE,OAAO,KAAK;AAAA,MACjC,OAAO;AACL,eAAO,SAAS,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,UAAgB;AACd,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;",
5
- "names": []
6
- }
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"}
@@ -10,6 +10,8 @@ export declare class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
10
10
  readonly options: ServiceServerOptions;
11
11
  isOpen: boolean;
12
12
  private readonly _wsHandler;
13
+ private readonly _jwtSecret;
14
+ private _shutdownRegistered;
13
15
  readonly fastify: FastifyInstance;
14
16
  constructor(options: ServiceServerOptions);
15
17
  listen(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["..\\src\\service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAAQ,YAAY,EAAO,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IAOY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IANlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;IAiB5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4IvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAK3E,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;IAKP,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAOlD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAO1E,OAAO,CAAC,yBAAyB;CAyBlC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAG,OAAO,EACrD,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,SAAS,CAAC,CAE1B"}
1
+ {"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["..\\src\\service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAAQ,YAAY,EAAO,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IASY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IARlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,mBAAmB,CAAS;IAEpC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;IAmB5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsJvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAK3E,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;IAKP,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAKlD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAK1E,OAAO,CAAC,yBAAyB;CA4BlC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAG,OAAO,EACrD,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,SAAS,CAAC,CAE1B"}
@@ -17,172 +17,194 @@ import { handleV1Connection } from "./legacy/v1-auto-update-handler.js";
17
17
  import { createServiceContext } from "./core/define-service.js";
18
18
  import consola from "consola";
19
19
  const logger = consola.withTag("service-server:ServiceServer");
20
- class ServiceServer extends EventEmitter {
21
- constructor(options) {
22
- super();
23
- this.options = options;
24
- const httpsConf = options.ssl ? { pfx: Buffer.from(options.ssl.pfxBytes), passphrase: options.ssl.passphrase } : null;
25
- this.fastify = fastify({ https: httpsConf });
26
- this._wsHandler = createWebSocketHandler(
27
- (def) => executeServiceMethod(this, def),
28
- options.auth?.jwtSecret
29
- );
30
- }
31
- isOpen = false;
32
- _wsHandler;
33
- fastify;
34
- async listen() {
35
- logger.info(`Server starting... ${env.VER ?? ""}`);
36
- await this.fastify.register(fastifyWebsocket);
37
- await this.fastify.register(fastifyHelmet, {
38
- global: true,
39
- contentSecurityPolicy: {
40
- directives: {
41
- ...fastifyHelmet.contentSecurityPolicy.getDefaultDirectives(),
42
- "default-src": ["'self'", "data:", "blob:", "*"],
43
- "script-src-attr": ["'unsafe-inline'"],
44
- "script-src": ["'self'", "'unsafe-inline'", "data:", "blob:", "*"],
45
- ...this.options.ssl != null ? {} : {
46
- "upgrade-insecure-requests": null
47
- }
20
+ export class ServiceServer extends EventEmitter {
21
+ options;
22
+ isOpen = false;
23
+ _wsHandler;
24
+ _jwtSecret;
25
+ _shutdownRegistered = false;
26
+ fastify;
27
+ constructor(options) {
28
+ super();
29
+ this.options = options;
30
+ this._jwtSecret = options.auth != null && options.auth !== false ? options.auth.jwtSecret : undefined;
31
+ // SSL 설정 (동기)
32
+ // 참고: Fastify HTTPS는 Buffer 타입이 필요함 (Uint8Array를 직접 사용할 수 없음)
33
+ const httpsConf = options.ssl
34
+ ? { pfx: Buffer.from(options.ssl.pfxBytes), passphrase: options.ssl.passphrase }
35
+ : null;
36
+ this.fastify = fastify({ https: httpsConf });
37
+ this._wsHandler = createWebSocketHandler((def) => executeServiceMethod(this, def), this._jwtSecret);
38
+ }
39
+ async listen() {
40
+ logger.info(`서버 시작 중... ${env.VER ?? ""}`);
41
+ // auth 설정 검증: auth 미설정(undefined)인데 auth 요구 서비스가 있으면 에러
42
+ if (this.options.auth === undefined) {
43
+ const authRequiredService = this.options.services.find((s) => s.authPermissions != null);
44
+ if (authRequiredService != null) {
45
+ throw new Error(`auth 설정이 필요합니다: 서비스 [${authRequiredService.name}]에 auth가 설정되어 있습니다.`);
46
+ }
48
47
  }
49
- },
50
- hsts: this.options.ssl != null,
51
- crossOriginOpenerPolicy: this.options.ssl != null,
52
- originAgentCluster: false
53
- });
54
- await this.fastify.register(fastifyMultipart);
55
- await this.fastify.register(fastifyStatic, {
56
- root: path.resolve(this.options.rootPath, "www"),
57
- wildcard: false,
58
- serve: false
59
- });
60
- await this.fastify.register(fastifyCors, {
61
- origin: (_origin, cb) => {
62
- cb(null, true);
63
- },
64
- allowedHeaders: ["Content-Type", "Authorization", "x-sd-client-name"],
65
- exposedHeaders: ["Content-Disposition", "Content-Length"]
66
- });
67
- this.fastify.addContentTypeParser(
68
- "application/json",
69
- { parseAs: "string" },
70
- (req, body, done) => {
71
- try {
72
- const parsed = json.parse(body);
73
- done(null, parsed);
74
- } catch (err) {
75
- const error = err;
76
- error.statusCode = 400;
77
- done(error, void 0);
78
- }
79
- }
80
- );
81
- this.fastify.setSerializerCompiler(() => (data) => json.stringify(data));
82
- this.fastify.all("/api/:service/:method", async (req, reply) => {
83
- await handleHttpRequest(
84
- req,
85
- reply,
86
- this.options.auth?.jwtSecret,
87
- (def) => executeServiceMethod(this, def)
88
- );
89
- });
90
- this.fastify.all("/upload", async (req, reply) => {
91
- await handleUpload(req, reply, this.options.rootPath, this.options.auth?.jwtSecret);
92
- });
93
- const onWebSocketConnected = (socket, req) => {
94
- const { ver, clientId, clientName } = req.query;
95
- if (ver === "2") {
96
- if (clientId == null || clientName == null) {
97
- socket.close(1008, "Missing Client ID/NAME");
98
- return;
99
- }
100
- this._wsHandler.addSocket(socket, clientId, clientName, req);
101
- } else {
102
- const autoUpdateDef = this.options.services.find((s) => s.name === "AutoUpdate");
103
- if (autoUpdateDef == null) {
104
- socket.close(1008, "AutoUpdate service not configured");
105
- return;
106
- }
107
- const legacyCtx = createServiceContext(this, void 0, void 0, {});
108
- const autoUpdateMethods = autoUpdateDef.factory(legacyCtx);
109
- handleV1Connection(socket, autoUpdateMethods, (name) => {
110
- legacyCtx.legacy = { clientName: name };
48
+ // WebSocket 플러그인
49
+ await this.fastify.register(fastifyWebsocket);
50
+ // 보안 플러그인
51
+ await this.fastify.register(fastifyHelmet, {
52
+ global: true,
53
+ contentSecurityPolicy: {
54
+ directives: {
55
+ ...fastifyHelmet.contentSecurityPolicy.getDefaultDirectives(),
56
+ "default-src": ["'self'", "data:", "blob:", "*"],
57
+ "script-src-attr": ["'unsafe-inline'"],
58
+ "script-src": ["'self'", "'unsafe-inline'", "data:", "blob:", "*"],
59
+ ...(this.options.ssl != null
60
+ ? {}
61
+ : {
62
+ "upgrade-insecure-requests": null,
63
+ }),
64
+ },
65
+ },
66
+ hsts: this.options.ssl != null,
67
+ crossOriginOpenerPolicy: this.options.ssl != null,
68
+ originAgentCluster: false,
111
69
  });
112
- }
113
- };
114
- this.fastify.get("/", { websocket: true }, onWebSocketConnected.bind(this));
115
- this.fastify.get("/ws", { websocket: true }, onWebSocketConnected.bind(this));
116
- this.fastify.route({
117
- method: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"],
118
- url: "/*",
119
- handler: async (req, reply) => {
120
- const urlObj = new URL(req.raw.url, "http://localhost");
121
- const urlPath = decodeURI(urlObj.pathname.slice(1));
122
- await handleStaticFile(req, reply, this.options.rootPath, urlPath);
123
- }
124
- });
125
- this.fastify.server.on("error", (err) => {
126
- logger.error("HTTP server error", err);
127
- });
128
- await this.fastify.listen({ port: this.options.port, host: "0.0.0.0" });
129
- this._registerGracefulShutdown();
130
- this.isOpen = true;
131
- logger.info(`Server started (port: ${this.options.port})`);
132
- this.emit("ready");
133
- }
134
- async close() {
135
- this._wsHandler.closeAll();
136
- await this.fastify.close();
137
- this.isOpen = false;
138
- logger.debug("Server closed");
139
- this.emit("close");
140
- }
141
- async broadcastReload(clientName, changedFileSet) {
142
- logger.debug("Broadcasting RELOAD to all server clients");
143
- await this._wsHandler.broadcastReload(clientName, changedFileSet);
144
- }
145
- async emitEvent(eventDef, infoSelector, data) {
146
- await this._wsHandler.emit(eventDef, infoSelector, data);
147
- }
148
- async signAuthToken(payload) {
149
- const jwtSecret = this.options.auth?.jwtSecret;
150
- if (jwtSecret == null) throw new Error("JWT Secret is not defined.");
151
- return signJwt(jwtSecret, payload);
152
- }
153
- async verifyAuthToken(token) {
154
- const jwtSecret = this.options.auth?.jwtSecret;
155
- if (jwtSecret == null) throw new Error("JWT Secret is not defined.");
156
- return verifyJwt(jwtSecret, token);
157
- }
158
- _registerGracefulShutdown() {
159
- const shutdownHandler = async (signal) => {
160
- logger.info(`${signal} signal received. Starting server shutdown...`);
161
- const forceExitTimer = setTimeout(() => {
162
- logger.error("Server shutdown timed out (10s). Forcing exit.");
163
- process.exit(1);
164
- }, 1e4);
165
- try {
166
- if (this.isOpen) {
167
- await this.close();
168
- }
169
- logger.info("Server shut down gracefully.");
170
- clearTimeout(forceExitTimer);
171
- process.exit(0);
172
- } catch (err) {
173
- logger.error("Error during server shutdown", err);
174
- process.exit(1);
175
- }
176
- };
177
- process.on("SIGINT", () => shutdownHandler("SIGINT"));
178
- process.on("SIGTERM", () => shutdownHandler("SIGTERM"));
179
- }
70
+ // 업로드 플러그인
71
+ await this.fastify.register(fastifyMultipart);
72
+ // @fastify/static 등록
73
+ await this.fastify.register(fastifyStatic, {
74
+ root: path.resolve(this.options.rootPath, "www"),
75
+ wildcard: false,
76
+ serve: false,
77
+ });
78
+ // CORS 설정
79
+ await this.fastify.register(fastifyCors, {
80
+ origin: (_origin, cb) => {
81
+ cb(null, true);
82
+ },
83
+ allowedHeaders: ["Content-Type", "Authorization", "x-sd-client-name"],
84
+ exposedHeaders: ["Content-Disposition", "Content-Length"],
85
+ });
86
+ // JSON 파서
87
+ this.fastify.addContentTypeParser("application/json", { parseAs: "string" }, (req, body, done) => {
88
+ try {
89
+ const parsed = json.parse(body);
90
+ done(null, parsed);
91
+ }
92
+ catch (err) {
93
+ const error = err;
94
+ error.statusCode = 400;
95
+ done(error, undefined);
96
+ }
97
+ });
98
+ // JSON 직렬화기
99
+ this.fastify.setSerializerCompiler(() => (data) => json.stringify(data));
100
+ // API 라우트
101
+ this.fastify.all("/api/:service/:method", async (req, reply) => {
102
+ await handleHttpRequest(req, reply, this._jwtSecret, (def) => executeServiceMethod(this, def));
103
+ });
104
+ // 업로드 라우트
105
+ this.fastify.all("/upload", async (req, reply) => {
106
+ await handleUpload(req, reply, this.options.rootPath, this._jwtSecret);
107
+ });
108
+ // WebSocket 라우트
109
+ const onWebSocketConnected = (socket, req) => {
110
+ const { ver, clientId, clientName } = req.query;
111
+ if (ver === "2") {
112
+ if (clientId == null || clientName == null) {
113
+ socket.close(1008, "클라이언트 ID/NAME이 누락되었습니다");
114
+ return;
115
+ }
116
+ this._wsHandler.addSocket(socket, clientId, clientName, req);
117
+ }
118
+ else {
119
+ // V1 레거시 지원 (자동 업데이트 전용)
120
+ const autoUpdateDef = this.options.services.find((s) => s.name === "AutoUpdate");
121
+ if (autoUpdateDef == null) {
122
+ socket.close(1008, "AutoUpdate 서비스가 설정되지 않았습니다");
123
+ return;
124
+ }
125
+ const legacyCtx = createServiceContext(this, undefined, undefined, {});
126
+ const autoUpdateMethods = autoUpdateDef.factory(legacyCtx);
127
+ handleV1Connection(socket, autoUpdateMethods, (name) => {
128
+ legacyCtx.legacy = { clientName: name };
129
+ });
130
+ }
131
+ };
132
+ this.fastify.get("/", { websocket: true }, onWebSocketConnected.bind(this));
133
+ this.fastify.get("/ws", { websocket: true }, onWebSocketConnected.bind(this));
134
+ // 정적 파일 와일드카드 핸들러
135
+ this.fastify.route({
136
+ method: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"],
137
+ url: "/*",
138
+ handler: async (req, reply) => {
139
+ const urlObj = new URL(req.raw.url, "http://localhost");
140
+ const urlPath = decodeURI(urlObj.pathname.slice(1));
141
+ await handleStaticFile(req, reply, this.options.rootPath, urlPath);
142
+ },
143
+ });
144
+ // HTTP 서버 수준 에러 핸들링
145
+ this.fastify.server.on("error", (err) => {
146
+ logger.error("HTTP 서버 에러", err);
147
+ });
148
+ // 리슨
149
+ await this.fastify.listen({ port: this.options.port, host: "0.0.0.0" });
150
+ // 정상 종료 핸들러 등록
151
+ this._registerGracefulShutdown();
152
+ this.isOpen = true;
153
+ logger.info(`서버 시작됨 (포트: ${this.options.port})`);
154
+ this.emit("ready");
155
+ }
156
+ async close() {
157
+ this._wsHandler.closeAll();
158
+ await this.fastify.close();
159
+ this.isOpen = false;
160
+ logger.debug("서버 종료됨");
161
+ this.emit("close");
162
+ }
163
+ async broadcastReload(clientName, changedFileSet) {
164
+ logger.debug("모든 서버 클라이언트에 RELOAD 브로드캐스팅");
165
+ await this._wsHandler.broadcastReload(clientName, changedFileSet);
166
+ }
167
+ async emitEvent(eventDef, infoSelector, data) {
168
+ await this._wsHandler.emit(eventDef, infoSelector, data);
169
+ }
170
+ async signAuthToken(payload) {
171
+ if (this._jwtSecret == null)
172
+ throw new Error("JWT Secret이 정의되지 않았습니다.");
173
+ return signJwt(this._jwtSecret, payload);
174
+ }
175
+ async verifyAuthToken(token) {
176
+ if (this._jwtSecret == null)
177
+ throw new Error("JWT Secret이 정의되지 않았습니다.");
178
+ return verifyJwt(this._jwtSecret, token);
179
+ }
180
+ _registerGracefulShutdown() {
181
+ if (this._shutdownRegistered)
182
+ return;
183
+ this._shutdownRegistered = true;
184
+ const shutdownHandler = async (signal) => {
185
+ logger.info(`${signal} 시그널 수신됨. 서버 종료를 시작합니다...`);
186
+ const forceExitTimer = setTimeout(() => {
187
+ logger.error("서버 종료 시간 초과 (10초). 강제 종료합니다.");
188
+ process.exit(1);
189
+ }, 10000);
190
+ try {
191
+ if (this.isOpen) {
192
+ await this.close();
193
+ }
194
+ logger.info("서버가 정상적으로 종료되었습니다.");
195
+ clearTimeout(forceExitTimer);
196
+ process.exit(0);
197
+ }
198
+ catch (err) {
199
+ logger.error("서버 종료 중 에러 발생", err);
200
+ process.exit(1);
201
+ }
202
+ };
203
+ process.on("SIGINT", () => shutdownHandler("SIGINT"));
204
+ process.on("SIGTERM", () => shutdownHandler("SIGTERM"));
205
+ }
180
206
  }
181
- function createServiceServer(options) {
182
- return new ServiceServer(options);
207
+ export function createServiceServer(options) {
208
+ return new ServiceServer(options);
183
209
  }
184
- export {
185
- ServiceServer,
186
- createServiceServer
187
- };
188
- //# sourceMappingURL=service-server.js.map
210
+ //# sourceMappingURL=service-server.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/service-server.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"service-server.js","sourceRoot":"","sources":["..\\src\\service-server.ts"],"names":[],"mappings":"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"}