@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
@@ -6,64 +6,69 @@ import { fsx } from "@simplysm/core-node";
6
6
  import { verifyJwt } from "../../auth/jwt-manager.js";
7
7
  import consola from "consola";
8
8
  const logger = consola.withTag("service-server:UploadHandler");
9
- async function handleUpload(req, reply, rootPath, jwtSecret) {
10
- if (!req.isMultipart()) {
11
- reply.status(400).send("Multipart request expected");
12
- return;
13
- }
14
- try {
15
- const authHeader = req.headers.authorization;
16
- if (authHeader == null) {
17
- throw new Error("Authentication token is missing.");
9
+ export async function handleUpload(req, reply, rootPath, jwtSecret) {
10
+ if (!req.isMultipart()) {
11
+ reply.status(400).send("Multipart 요청이 필요합니다");
12
+ return;
18
13
  }
19
- if (jwtSecret == null) {
20
- throw new Error("JWT Secret is not defined.");
21
- }
22
- const token = authHeader.split(" ")[1];
23
- await verifyJwt(jwtSecret, token);
24
- } catch (err) {
25
- reply.status(401).send({
26
- error: "Unauthorized",
27
- message: err instanceof Error ? err.message : String(err)
28
- });
29
- return;
30
- }
31
- const result = [];
32
- const uploadDir = path.resolve(rootPath, "www", "uploads");
33
- await fsx.mkdir(uploadDir);
34
- let currentSavePath;
35
- try {
36
- for await (const part of req.parts()) {
37
- if (part.type === "file") {
38
- const originalFilename = part.filename;
39
- const extension = path.extname(originalFilename);
40
- const saveName = `${Uuid.generate().toString()}${extension}`;
41
- currentSavePath = path.join(uploadDir, saveName);
42
- await pipeline(part.file, createWriteStream(currentSavePath));
43
- if (part.file.truncated) {
44
- throw new Error(`File limit exceeded: ${originalFilename}`);
14
+ // 인증 확인
15
+ try {
16
+ const authHeader = req.headers.authorization;
17
+ if (authHeader == null) {
18
+ throw new Error("인증 토큰이 누락되었습니다.");
19
+ }
20
+ if (jwtSecret == null) {
21
+ throw new Error("JWT Secret이 정의되지 않았습니다.");
45
22
  }
46
- const stats = await fsx.stat(currentSavePath);
47
- result.push({
48
- path: `uploads/${saveName}`,
49
- filename: originalFilename,
50
- size: stats.size
23
+ const token = authHeader.split(" ")[1];
24
+ await verifyJwt(jwtSecret, token);
25
+ }
26
+ catch (err) {
27
+ reply.status(401).send({
28
+ error: "인증 실패",
29
+ message: err instanceof Error ? err.message : String(err),
51
30
  });
52
- currentSavePath = void 0;
53
- }
31
+ return;
54
32
  }
55
- reply.send(result);
56
- } catch (err) {
57
- logger.error("Upload Error", err);
58
- if (currentSavePath != null) {
59
- await fsx.rm(currentSavePath).catch(() => {
60
- });
61
- logger.warn(`Incomplete file deleted: ${currentSavePath}`);
33
+ const result = [];
34
+ const uploadDir = path.resolve(rootPath, "www", "uploads");
35
+ await fsx.mkdir(uploadDir);
36
+ let currentSavePath;
37
+ try {
38
+ for await (const part of req.parts()) {
39
+ if (part.type === "file") {
40
+ const originalFilename = part.filename;
41
+ const extension = path.extname(originalFilename);
42
+ const saveName = `${Uuid.generate().toString()}${extension}`;
43
+ currentSavePath = path.join(uploadDir, saveName);
44
+ await pipeline(part.file, createWriteStream(currentSavePath));
45
+ if (part.file.truncated) {
46
+ throw new Error(`파일 크기 제한 초과: ${originalFilename}`);
47
+ }
48
+ const stats = await fsx.stat(currentSavePath);
49
+ result.push({
50
+ path: `uploads/${saveName}`,
51
+ filename: originalFilename,
52
+ size: stats.size,
53
+ });
54
+ currentSavePath = undefined;
55
+ }
56
+ }
57
+ reply.send(result);
58
+ }
59
+ catch (err) {
60
+ logger.error("업로드 에러", err);
61
+ if (currentSavePath != null) {
62
+ await fsx.rm(currentSavePath).catch(() => { });
63
+ logger.warn(`불완전한 파일 삭제됨: ${currentSavePath}`);
64
+ }
65
+ // 이미 저장된 파일 정리
66
+ for (const savedFile of result) {
67
+ const savedPath = path.resolve(rootPath, "www", savedFile.path);
68
+ await fsx.rm(savedPath).catch(() => { });
69
+ logger.warn(`이미 저장된 파일 삭제됨: ${savedPath}`);
70
+ }
71
+ reply.code(500).send("업로드 실패");
62
72
  }
63
- reply.code(500).send("Upload Failed");
64
- }
65
73
  }
66
- export {
67
- handleUpload
68
- };
69
- //# sourceMappingURL=upload-handler.js.map
74
+ //# sourceMappingURL=upload-handler.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/transport/http/upload-handler.ts"],
4
- "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW;AAGpB,SAAS,iBAAiB;AAC1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAE7D,eAAsB,aACpB,KACA,OACA,UACA,WACe;AACf,MAAI,CAAC,IAAI,YAAY,GAAG;AACtB,UAAM,OAAO,GAAG,EAAE,KAAK,4BAA4B;AACnD;AAAA,EACF;AAGA,MAAI;AACF,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,cAAc,MAAM;AACtB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,QAAI,aAAa,MAAM;AACrB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,CAAC;AACrC,UAAM,UAAU,WAAW,KAAK;AAAA,EAClC,SAAS,KAAK;AACZ,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC1D,CAAC;AACD;AAAA,EACF;AAEA,QAAM,SAAgC,CAAC;AACvC,QAAM,YAAY,KAAK,QAAQ,UAAU,OAAO,SAAS;AAEzD,QAAM,IAAI,MAAM,SAAS;AAEzB,MAAI;AAEJ,MAAI;AACF,qBAAiB,QAAQ,IAAI,MAAM,GAAG;AACpC,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,mBAAmB,KAAK;AAC9B,cAAM,YAAY,KAAK,QAAQ,gBAAgB;AAC/C,cAAM,WAAW,GAAG,KAAK,SAAS,EAAE,SAAS,CAAC,GAAG,SAAS;AAC1D,0BAAkB,KAAK,KAAK,WAAW,QAAQ;AAE/C,cAAM,SAAS,KAAK,MAAM,kBAAkB,eAAe,CAAC;AAE5D,YAAI,KAAK,KAAK,WAAW;AACvB,gBAAM,IAAI,MAAM,wBAAwB,gBAAgB,EAAE;AAAA,QAC5D;AAEA,cAAM,QAAQ,MAAM,IAAI,KAAK,eAAe;AAE5C,eAAO,KAAK;AAAA,UACV,MAAM,WAAW,QAAQ;AAAA,UACzB,UAAU;AAAA,UACV,MAAM,MAAM;AAAA,QACd,CAAC;AAED,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,GAAG;AAEhC,QAAI,mBAAmB,MAAM;AAC3B,YAAM,IAAI,GAAG,eAAe,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC5C,aAAO,KAAK,4BAA4B,eAAe,EAAE;AAAA,IAC3D;AAEA,UAAM,KAAK,GAAG,EAAE,KAAK,eAAe;AAAA,EACtC;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"upload-handler.js","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\upload-handler.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,10 @@ import { WebSocket } from "ws";
4
4
  import type { AuthTokenPayload } from "../../auth/auth-token-payload";
5
5
  import type { ServiceClientMessage, ServiceServerMessage } from "@simplysm/service-common";
6
6
  /**
7
- * Service socket interface
7
+ * 서비스 소켓 인터페이스
8
8
  *
9
- * Manages a single WebSocket connection with protocol encoding/decoding,
10
- * ping/pong keep-alive, and event listener tracking.
9
+ * 프로토콜 인코딩/디코딩, ping/pong 연결 유지,
10
+ * 이벤트 리스너 추적이 포함된 단일 WebSocket 연결을 관리한다.
11
11
  */
12
12
  export interface ServiceSocket {
13
13
  readonly connectedAtDateTime: DateTime;
@@ -15,34 +15,34 @@ export interface ServiceSocket {
15
15
  readonly connReq: FastifyRequest;
16
16
  authTokenPayload?: AuthTokenPayload;
17
17
  /**
18
- * Close the WebSocket connection
18
+ * WebSocket 연결을 닫는다
19
19
  */
20
20
  close(): void;
21
21
  /**
22
- * Send a message to the client
22
+ * 클라이언트에 메시지를 전송한다
23
23
  */
24
24
  send(uuid: string, msg: ServiceServerMessage): Promise<number>;
25
25
  /**
26
- * Register an event listener with key/name/info
26
+ * key/name/info로 이벤트 리스너를 등록한다
27
27
  */
28
28
  addListener(key: string, eventName: string, info: unknown): void;
29
29
  /**
30
- * Remove an event listener by key
30
+ * key로 이벤트 리스너를 제거한다
31
31
  */
32
32
  removeListener(key: string): void;
33
33
  /**
34
- * Get all event listeners for a specific event name
34
+ * 특정 이벤트 이름에 해당하는 모든 이벤트 리스너를 조회한다
35
35
  */
36
36
  getEventListeners(eventName: string): Array<{
37
37
  key: string;
38
38
  info: unknown;
39
39
  }>;
40
40
  /**
41
- * Filter target keys that exist in this socket's listeners
41
+ * 소켓의 리스너에 존재하는 대상 키를 필터링한다
42
42
  */
43
43
  filterEventTargetKeys(targetKeys: string[]): string[];
44
44
  /**
45
- * Register event handlers
45
+ * 이벤트 핸들러를 등록한다
46
46
  */
47
47
  on(event: "error", handler: (err: Error) => void): void;
48
48
  on(event: "close", handler: (code: number) => void): void;
@@ -52,10 +52,10 @@ export interface ServiceSocket {
52
52
  }) => void): void;
53
53
  }
54
54
  /**
55
- * Create a service socket instance
55
+ * 서비스 소켓 인스턴스를 생성한다
56
56
  *
57
- * Manages a single WebSocket connection with protocol encoding/decoding,
58
- * ping/pong keep-alive, and event listener tracking.
57
+ * 프로토콜 인코딩/디코딩, ping/pong 연결 유지,
58
+ * 이벤트 리스너 추적이 포함된 단일 WebSocket 연결을 관리한다.
59
59
  */
60
60
  export declare function createServiceSocket(socket: WebSocket, clientId: string, clientName: string, connReq: FastifyRequest): ServiceSocket;
61
61
  //# sourceMappingURL=service-socket.d.ts.map
@@ -4,117 +4,141 @@ import consola from "consola";
4
4
  import { WebSocket } from "ws";
5
5
  import { createServerProtocolWrapper } from "../../protocol/protocol-wrapper.js";
6
6
  const logger = consola.withTag("service-server:ServiceSocket");
7
- function createServiceSocket(socket, clientId, clientName, connReq) {
8
- const PING_INTERVAL = 5e3;
9
- const PONG_PACKET = new Uint8Array([2]);
10
- const protocol = createServerProtocolWrapper();
11
- const listenerInfos = [];
12
- const eventHandlers = {
13
- error: [],
14
- close: [],
15
- message: []
16
- };
17
- let isAlive = true;
18
- let authTokenPayload;
19
- const connectedAtDateTime = new DateTime();
20
- async function sendInternal(uuid, msg) {
21
- if (socket.readyState !== WebSocket.OPEN) return 0;
22
- const { chunks } = await protocol.encode(uuid, msg);
23
- for (const chunk of chunks) {
24
- socket.send(chunk);
25
- }
26
- return chunks.reduce((acc, item) => acc + item.length, 0);
27
- }
28
- function emitEvent(event, ...args) {
29
- for (const handler of eventHandlers[event]) {
30
- handler(...args);
7
+ /**
8
+ * 서비스 소켓 인스턴스를 생성한다
9
+ *
10
+ * 프로토콜 인코딩/디코딩, ping/pong 연결 유지,
11
+ * 이벤트 리스너 추적이 포함된 단일 WebSocket 연결을 관리한다.
12
+ */
13
+ export function createServiceSocket(socket, clientId, clientName, connReq) {
14
+ // -------------------------------------------------------------------
15
+ // 상태
16
+ // -------------------------------------------------------------------
17
+ const PING_INTERVAL = 5000; // 5초마다 ping 전송
18
+ const PONG_PACKET = new Uint8Array([0x02]);
19
+ const protocol = createServerProtocolWrapper();
20
+ const listenerInfos = [];
21
+ const eventHandlers = {
22
+ error: [],
23
+ close: [],
24
+ message: [],
25
+ };
26
+ let isAlive = true;
27
+ let authTokenPayload;
28
+ const connectedAtDateTime = new DateTime();
29
+ // -------------------------------------------------------------------
30
+ // 헬퍼
31
+ // -------------------------------------------------------------------
32
+ async function sendInternal(uuid, msg) {
33
+ if (socket.readyState !== WebSocket.OPEN)
34
+ return 0;
35
+ const { chunks } = await protocol.encode(uuid, msg);
36
+ for (const chunk of chunks) {
37
+ socket.send(chunk);
38
+ }
39
+ return chunks.reduce((acc, item) => acc + item.length, 0);
31
40
  }
32
- }
33
- function onError(err) {
34
- logger.error("WebSocket client error", err);
35
- emitEvent("error", err);
36
- }
37
- function onClose(code) {
38
- clearInterval(pingTimer);
39
- protocol.dispose();
40
- emitEvent("close", code);
41
- }
42
- async function onMessage(msgBuffer) {
43
- try {
44
- if (msgBuffer.length === 1 && msgBuffer[0] === 1) {
45
- if (socket.readyState === WebSocket.OPEN) {
46
- socket.send(PONG_PACKET);
41
+ function emitEvent(event, ...args) {
42
+ for (const handler of eventHandlers[event]) {
43
+ handler(...args);
47
44
  }
48
- return;
49
- }
50
- const decodeResult = await protocol.decode(msgBuffer);
51
- if (decodeResult.type === "progress") {
52
- await sendInternal(decodeResult.uuid, {
53
- name: "progress",
54
- body: {
55
- totalSize: decodeResult.totalSize,
56
- completedSize: decodeResult.completedSize
57
- }
58
- });
59
- } else {
60
- const msg = decodeResult.message;
61
- emitEvent("message", { uuid: decodeResult.uuid, msg });
62
- }
63
- } catch (err) {
64
- logger.error("Error processing WebSocket message", err);
65
45
  }
66
- }
67
- socket.on("close", onClose);
68
- socket.on("error", onError);
69
- socket.on("message", onMessage);
70
- socket.on("pong", () => {
71
- isAlive = true;
72
- });
73
- const pingTimer = setInterval(() => {
74
- if (!isAlive) {
75
- socket.terminate();
76
- return;
46
+ // -------------------------------------------------------------------
47
+ // 이벤트 핸들러
48
+ // -------------------------------------------------------------------
49
+ function onError(err) {
50
+ logger.error("WebSocket 클라이언트 에러", err);
51
+ emitEvent("error", err);
52
+ }
53
+ function onClose(code) {
54
+ clearInterval(pingTimer);
55
+ protocol.dispose();
56
+ emitEvent("close", code);
77
57
  }
78
- isAlive = false;
79
- socket.ping();
80
- }, PING_INTERVAL);
81
- return {
82
- connectedAtDateTime,
83
- clientName,
84
- connReq,
85
- get authTokenPayload() {
86
- return authTokenPayload;
87
- },
88
- set authTokenPayload(value) {
89
- authTokenPayload = value;
90
- },
91
- close() {
92
- socket.terminate();
93
- },
94
- async send(uuid, msg) {
95
- return sendInternal(uuid, msg);
96
- },
97
- addListener(key, eventName, info) {
98
- listenerInfos.push({ key, eventName, info });
99
- },
100
- removeListener(key) {
101
- const idx = listenerInfos.findIndex((item) => item.key === key);
102
- if (idx >= 0) {
103
- listenerInfos.splice(idx, 1);
104
- }
105
- },
106
- getEventListeners(eventName) {
107
- return listenerInfos.filter((item) => item.eventName === eventName).map((item) => ({ key: item.key, info: item.info }));
108
- },
109
- filterEventTargetKeys(targetKeys) {
110
- return listenerInfos.filter((item) => targetKeys.includes(item.key)).map((item) => item.key);
111
- },
112
- on(event, handler) {
113
- eventHandlers[event].push(handler);
58
+ async function onMessage(msgBuffer) {
59
+ try {
60
+ // ping에 대한 pong 응답 처리
61
+ if (msgBuffer.length === 1 && msgBuffer[0] === 0x01) {
62
+ if (socket.readyState === WebSocket.OPEN) {
63
+ socket.send(PONG_PACKET);
64
+ }
65
+ return;
66
+ }
67
+ const decodeResult = await protocol.decode(msgBuffer);
68
+ if (decodeResult.type === "progress") {
69
+ await sendInternal(decodeResult.uuid, {
70
+ name: "progress",
71
+ body: {
72
+ totalSize: decodeResult.totalSize,
73
+ completedSize: decodeResult.completedSize,
74
+ },
75
+ });
76
+ }
77
+ else {
78
+ const msg = decodeResult.message;
79
+ emitEvent("message", { uuid: decodeResult.uuid, msg });
80
+ }
81
+ }
82
+ catch (err) {
83
+ logger.error("WebSocket 메시지 처리 중 에러 발생", err);
84
+ }
114
85
  }
115
- };
86
+ // -------------------------------------------------------------------
87
+ // 설정
88
+ // -------------------------------------------------------------------
89
+ socket.on("close", onClose);
90
+ socket.on("error", onError);
91
+ socket.on("message", onMessage);
92
+ socket.on("pong", () => {
93
+ isAlive = true;
94
+ });
95
+ const pingTimer = setInterval(() => {
96
+ if (!isAlive) {
97
+ socket.terminate();
98
+ return;
99
+ }
100
+ isAlive = false;
101
+ socket.ping();
102
+ }, PING_INTERVAL);
103
+ // -------------------------------------------------------------------
104
+ // 공개 API
105
+ // -------------------------------------------------------------------
106
+ return {
107
+ connectedAtDateTime,
108
+ clientName,
109
+ connReq,
110
+ get authTokenPayload() {
111
+ return authTokenPayload;
112
+ },
113
+ set authTokenPayload(value) {
114
+ authTokenPayload = value;
115
+ },
116
+ close() {
117
+ socket.terminate();
118
+ },
119
+ async send(uuid, msg) {
120
+ return sendInternal(uuid, msg);
121
+ },
122
+ addListener(key, eventName, info) {
123
+ listenerInfos.push({ key, eventName, info });
124
+ },
125
+ removeListener(key) {
126
+ const idx = listenerInfos.findIndex((item) => item.key === key);
127
+ if (idx >= 0) {
128
+ listenerInfos.splice(idx, 1);
129
+ }
130
+ },
131
+ getEventListeners(eventName) {
132
+ return listenerInfos
133
+ .filter((item) => item.eventName === eventName)
134
+ .map((item) => ({ key: item.key, info: item.info }));
135
+ },
136
+ filterEventTargetKeys(targetKeys) {
137
+ return listenerInfos.filter((item) => targetKeys.includes(item.key)).map((item) => item.key);
138
+ },
139
+ on(event, handler) {
140
+ eventHandlers[event].push(handler);
141
+ },
142
+ };
116
143
  }
117
- export {
118
- createServiceSocket
119
- };
120
- //# sourceMappingURL=service-socket.js.map
144
+ //# sourceMappingURL=service-socket.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/transport/socket/service-socket.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"service-socket.js","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\socket\\service-socket.ts"],"names":[],"mappings":"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"}
@@ -3,34 +3,34 @@ import type { ServiceEventDef } from "@simplysm/service-common";
3
3
  import { type ServiceSocket } from "./service-socket";
4
4
  import type { FastifyRequest } from "fastify";
5
5
  /**
6
- * WebSocket handler interface
6
+ * WebSocket 핸들러 인터페이스
7
7
  *
8
- * Manages multiple WebSocket connections, routes messages to services,
9
- * and handles event broadcasting.
8
+ * 여러 WebSocket 연결을 관리하고, 메시지를 서비스로 라우팅하며,
9
+ * 이벤트 브로드캐스팅을 처리한다.
10
10
  */
11
11
  export interface WebSocketHandler {
12
12
  /**
13
- * Add a new WebSocket connection
13
+ * WebSocket 연결을 추가한다
14
14
  */
15
15
  addSocket(socket: WebSocket, clientId: string, clientName: string, connReq: FastifyRequest): void;
16
16
  /**
17
- * Close all active connections
17
+ * 모든 활성 연결을 닫는다
18
18
  */
19
19
  closeAll(): void;
20
20
  /**
21
- * Broadcast reload message to all clients
21
+ * 모든 클라이언트에 리로드 메시지를 브로드캐스트한다
22
22
  */
23
23
  broadcastReload(clientName: string | undefined, changedFileSet: Set<string>): Promise<void>;
24
24
  /**
25
- * Emit event to matching clients
25
+ * 매칭되는 클라이언트에 이벤트를 발생시킨다
26
26
  */
27
27
  emit<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, infoSelector: (item: TInfo) => boolean, data: TData): Promise<void>;
28
28
  }
29
29
  /**
30
- * Create a WebSocket handler instance
30
+ * WebSocket 핸들러 인스턴스를 생성한다
31
31
  *
32
- * Manages multiple WebSocket connections, routes messages to services,
33
- * and handles event broadcasting.
32
+ * 여러 WebSocket 연결을 관리하고, 메시지를 서비스로 라우팅하며,
33
+ * 이벤트 브로드캐스팅을 처리한다.
34
34
  */
35
35
  export declare function createWebSocketHandler(runMethod: (def: {
36
36
  serviceName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\socket\\websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,EACf,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,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,CAkMlB"}
1
+ {"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\socket\\websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,EACf,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,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,CAiMlB"}