@simplysm/service-server 13.0.100 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +1,2 @@
1
- //# sourceMappingURL=auth-token-payload.js.map
1
+ export {};
2
+ //# sourceMappingURL=auth-token-payload.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "mappings": "",
5
- "names": []
6
- }
1
+ {"version":3,"file":"auth-token-payload.js","sourceRoot":"","sources":["..\\..\\src\\auth\\auth-token-payload.ts"],"names":[],"mappings":""}
@@ -1,26 +1,26 @@
1
1
  import * as jose from "jose";
2
- async function signJwt(jwtSecret, payload) {
3
- const secret = new TextEncoder().encode(jwtSecret);
4
- return new jose.SignJWT(payload).setProtectedHeader({ alg: "HS256" }).setIssuedAt().setExpirationTime("12h").sign(secret);
2
+ export async function signJwt(jwtSecret, payload) {
3
+ const secret = new TextEncoder().encode(jwtSecret);
4
+ return new jose.SignJWT(payload)
5
+ .setProtectedHeader({ alg: "HS256" })
6
+ .setIssuedAt()
7
+ .setExpirationTime("12h")
8
+ .sign(secret);
5
9
  }
6
- async function verifyJwt(jwtSecret, token) {
7
- const secret = new TextEncoder().encode(jwtSecret);
8
- try {
9
- const { payload } = await jose.jwtVerify(token, secret);
10
- return payload;
11
- } catch (err) {
12
- if (err != null && typeof err === "object" && "code" in err && err.code === "ERR_JWT_EXPIRED") {
13
- throw new Error("Token has expired.");
10
+ export async function verifyJwt(jwtSecret, token) {
11
+ const secret = new TextEncoder().encode(jwtSecret);
12
+ try {
13
+ const { payload } = await jose.jwtVerify(token, secret);
14
+ return payload;
15
+ }
16
+ catch (err) {
17
+ if (err != null && typeof err === "object" && "code" in err && err.code === "ERR_JWT_EXPIRED") {
18
+ throw new Error("토큰이 만료되었습니다.");
19
+ }
20
+ throw new Error("유효하지 않은 토큰입니다.");
14
21
  }
15
- throw new Error("Invalid token.");
16
- }
17
22
  }
18
- function decodeJwt(token) {
19
- return jose.decodeJwt(token);
23
+ export function decodeJwt(token) {
24
+ return jose.decodeJwt(token);
20
25
  }
21
- export {
22
- decodeJwt,
23
- signJwt,
24
- verifyJwt
25
- };
26
- //# sourceMappingURL=jwt-manager.js.map
26
+ //# sourceMappingURL=jwt-manager.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/auth/jwt-manager.ts"],
4
- "mappings": "AAAA,YAAY,UAAU;AAGtB,eAAsB,QACpB,WACA,SACiB;AACjB,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AAEjD,SAAO,IAAI,KAAK,QAAQ,OAAO,EAC5B,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,YAAY,EACZ,kBAAkB,KAAK,EACvB,KAAK,MAAM;AAChB;AAEA,eAAsB,UACpB,WACA,OACsC;AACtC,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AAEjD,MAAI;AACF,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,UAAU,OAAO,MAAM;AACtD,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,OAAO,QAAQ,OAAO,QAAQ,YAAY,UAAU,OAAO,IAAI,SAAS,mBAAmB;AAC7F,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,UAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AACF;AAEO,SAAS,UAA+B,OAA4C;AACzF,SAAO,KAAK,UAAU,KAAK;AAC7B;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"jwt-manager.js","sourceRoot":"","sources":["..\\..\\src\\auth\\jwt-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,SAAiB,EACjB,OAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;SAC7B,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SACpC,WAAW,EAAE;SACb,iBAAiB,CAAC,KAAK,CAAC;SACxB,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,KAAa;IAEb,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,OAAsC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAsB,KAAa;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAgC,CAAC;AAC9D,CAAC"}
@@ -8,7 +8,7 @@ export interface ServiceContext<TAuthInfo = unknown> {
8
8
  clientName: string;
9
9
  authTokenPayload?: AuthTokenPayload<TAuthInfo>;
10
10
  };
11
- /** V1 legacy context (auto-update only) */
11
+ /** V1 레거시 컨텍스트 (자동 업데이트 전용) */
12
12
  legacy?: {
13
13
  clientName?: string;
14
14
  };
@@ -23,15 +23,15 @@ export declare function createServiceContext<TAuthInfo = unknown>(server: Servic
23
23
  }, legacy?: {
24
24
  clientName?: string;
25
25
  }): ServiceContext<TAuthInfo>;
26
- /** Read auth permissions from an auth()-wrapped function. Returns undefined if not wrapped. */
26
+ /** auth()로 래핑된 함수에서 인증 권한을 읽는다. 래핑되지 않은 경우 undefined를 반환한다. */
27
27
  export declare function getServiceAuthPermissions(fn: Function): string[] | undefined;
28
28
  /**
29
- * Auth wrapper for service factories and methods.
29
+ * 서비스 팩토리 메서드용 인증 래퍼.
30
30
  *
31
- * - Service-level: `auth((ctx) => ({ ... }))` — all methods require login
32
- * - Service-level with roles: `auth(["admin"], (ctx) => ({ ... }))`
33
- * - Method-level: `auth(() => result)` — this method requires login
34
- * - Method-level with roles: `auth(["admin"], () => result)`
31
+ * - 서비스 수준: `auth((ctx) => ({ ... }))` — 모든 메서드에 로그인 필요
32
+ * - 서비스 수준 (역할 지정): `auth(["admin"], (ctx) => ({ ... }))`
33
+ * - 메서드 수준: `auth(() => result)` — 해당 메서드에 로그인 필요
34
+ * - 메서드 수준 (역할 지정): `auth(["admin"], () => result)`
35
35
  */
36
36
  export declare function auth<TFunction extends (...args: any[]) => any>(fn: TFunction): TFunction;
37
37
  export declare function auth<TFunction extends (...args: any[]) => any>(permissions: string[], fn: TFunction): TFunction;
@@ -41,15 +41,15 @@ export interface ServiceDefinition<TMethods = Record<string, (...args: any[]) =>
41
41
  authPermissions?: string[];
42
42
  }
43
43
  /**
44
- * Define a service with a name and factory function.
44
+ * 이름과 팩토리 함수로 서비스를 정의한다.
45
45
  *
46
46
  * @example
47
- * // Basic service
47
+ * // 기본 서비스
48
48
  * const HealthService = defineService("Health", (ctx) => ({
49
49
  * check: () => ({ status: "ok" }),
50
50
  * }));
51
51
  *
52
- * // Service with auth
52
+ * // 인증이 필요한 서비스
53
53
  * const UserService = defineService("User", auth((ctx) => ({
54
54
  * getProfile: () => ctx.authInfo,
55
55
  * adminOnly: auth(["admin"], () => "admin"),
@@ -57,11 +57,11 @@ export interface ServiceDefinition<TMethods = Record<string, (...args: any[]) =>
57
57
  */
58
58
  export declare function defineService<TMethods extends Record<string, (...args: any[]) => any>>(name: string, factory: (ctx: ServiceContext) => TMethods): ServiceDefinition<TMethods>;
59
59
  /**
60
- * Extract method signatures from a ServiceDefinition for client-side type sharing.
60
+ * 클라이언트 타입 공유를 위해 ServiceDefinition에서 메서드 시그니처를 추출한다.
61
61
  *
62
62
  * @example
63
63
  * export type UserServiceType = ServiceMethods<typeof UserService>;
64
- * // Client: client.getService<UserServiceType>("User");
64
+ * // 클라이언트: client.getService<UserServiceType>("User");
65
65
  */
66
66
  export type ServiceMethods<TDefinition> = TDefinition extends ServiceDefinition<infer M> ? M : never;
67
67
  //# sourceMappingURL=define-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"define-service.d.ts","sourceRoot":"","sources":["..\\..\\src\\core\\define-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,MAAM,WAAW,cAAc,CAAC,SAAS,GAAG,OAAO;IACjD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IACtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAG,OAAO,EACtD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;CAAE,EAC7E,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,cAAc,CAAC,SAAS,CAAC,CAoD3B;AAMD,+FAA+F;AAC/F,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;AAC1F,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,WAAW,EAAE,MAAM,EAAE,EACrB,EAAE,EAAE,SAAS,GACZ,SAAS,CAAC;AAcb,MAAM,WAAW,iBAAiB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EACpF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,GACzC,iBAAiB,CAAC,QAAQ,CAAC,CAM7B;AAID;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,WAAW,IACpC,WAAW,SAAS,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"define-service.d.ts","sourceRoot":"","sources":["..\\..\\src\\core\\define-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,MAAM,WAAW,cAAc,CAAC,SAAS,GAAG,OAAO;IACjD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC;IAEF,+BAA+B;IAC/B,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IACtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAG,OAAO,EACtD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;CAAE,EAC7E,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,cAAc,CAAC,SAAS,CAAC,CAoD3B;AAMD,+DAA+D;AAC/D,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;AAC1F,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,WAAW,EAAE,MAAM,EAAE,EACrB,EAAE,EAAE,SAAS,GACZ,SAAS,CAAC;AAcb,MAAM,WAAW,iBAAiB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EACpF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,GACzC,iBAAiB,CAAC,QAAQ,CAAC,CAM7B;AAID;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,WAAW,IACpC,WAAW,SAAS,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
@@ -1,70 +1,84 @@
1
1
  import { obj } from "@simplysm/core-common";
2
2
  import { getConfig } from "../utils/config-manager.js";
3
3
  import path from "path";
4
- function createServiceContext(server, socket, http, legacy) {
5
- return {
6
- server,
7
- socket,
8
- http,
9
- legacy,
10
- get authInfo() {
11
- return socket?.authTokenPayload?.data ?? http?.authTokenPayload?.data;
12
- },
13
- get clientName() {
14
- const name = socket?.clientName ?? http?.clientName ?? legacy?.clientName;
15
- if (name == null) return void 0;
16
- if (name === "" || name.includes("..") || name.includes("/") || name.includes("\\")) {
17
- throw new Error(`Invalid client name: ${name}`);
18
- }
19
- return name;
20
- },
21
- get clientPath() {
22
- const name = this.clientName;
23
- return name == null ? void 0 : path.resolve(server.options.rootPath, "www", name);
24
- },
25
- async getConfig(section) {
26
- let configParent = {};
27
- const rootFilePath = path.resolve(server.options.rootPath, ".config.json");
28
- const rootConfig = await getConfig(rootFilePath);
29
- if (rootConfig != null) {
30
- configParent = rootConfig;
31
- }
32
- const targetPath = this.clientPath;
33
- if (targetPath != null) {
34
- const clientFilePath = path.resolve(targetPath, ".config.json");
35
- const clientConfig = await getConfig(clientFilePath);
36
- if (clientConfig != null) {
37
- configParent = obj.merge(configParent, clientConfig);
38
- }
39
- }
40
- const config = configParent[section];
41
- if (config == null) throw new Error(`Configuration section not found: ${section}`);
42
- return config;
43
- }
44
- };
4
+ export function createServiceContext(server, socket, http, legacy) {
5
+ return {
6
+ server,
7
+ socket,
8
+ http,
9
+ legacy,
10
+ get authInfo() {
11
+ return (socket?.authTokenPayload?.data ?? http?.authTokenPayload?.data);
12
+ },
13
+ get clientName() {
14
+ const name = socket?.clientName ?? http?.clientName ?? legacy?.clientName;
15
+ if (name == null)
16
+ return undefined;
17
+ if (name === "" || name.includes("..") || name.includes("/") || name.includes("\\")) {
18
+ throw new Error(`유효하지 않은 클라이언트 이름: ${name}`);
19
+ }
20
+ return name;
21
+ },
22
+ get clientPath() {
23
+ const name = this.clientName;
24
+ return name == null ? undefined : path.resolve(server.options.rootPath, "www", name);
25
+ },
26
+ async getConfig(section) {
27
+ let configParent = {};
28
+ const rootFilePath = path.resolve(server.options.rootPath, ".config.json");
29
+ const rootConfig = await getConfig(rootFilePath);
30
+ if (rootConfig != null) {
31
+ configParent = rootConfig;
32
+ }
33
+ const targetPath = this.clientPath;
34
+ if (targetPath != null) {
35
+ const clientFilePath = path.resolve(targetPath, ".config.json");
36
+ const clientConfig = await getConfig(clientFilePath);
37
+ if (clientConfig != null) {
38
+ configParent = obj.merge(configParent, clientConfig);
39
+ }
40
+ }
41
+ const config = configParent[section];
42
+ if (config == null)
43
+ throw new Error(`설정 섹션을 찾을 수 없습니다: ${section}`);
44
+ return config;
45
+ },
46
+ };
45
47
  }
46
- const AUTH_PERMISSIONS = /* @__PURE__ */ Symbol("authPermissions");
47
- function getServiceAuthPermissions(fn) {
48
- return fn[AUTH_PERMISSIONS];
48
+ // ── 인증 ──
49
+ const AUTH_PERMISSIONS = Symbol("authPermissions");
50
+ /** auth()로 래핑된 함수에서 인증 권한을 읽는다. 래핑되지 않은 경우 undefined를 반환한다. */
51
+ export function getServiceAuthPermissions(fn) {
52
+ return fn[AUTH_PERMISSIONS];
49
53
  }
50
- function auth(permissionsOrFn, maybeFn) {
51
- const permissions = Array.isArray(permissionsOrFn) ? permissionsOrFn : [];
52
- const fn = Array.isArray(permissionsOrFn) ? maybeFn : permissionsOrFn;
53
- const wrapper = (...args) => fn(...args);
54
- wrapper[AUTH_PERMISSIONS] = permissions;
55
- return wrapper;
54
+ export function auth(permissionsOrFn, maybeFn) {
55
+ const permissions = Array.isArray(permissionsOrFn) ? permissionsOrFn : [];
56
+ const fn = Array.isArray(permissionsOrFn) ? maybeFn : permissionsOrFn;
57
+ // 호출 동작을 유지하는 래퍼 생성
58
+ const wrapper = (...args) => fn(...args);
59
+ wrapper[AUTH_PERMISSIONS] = permissions;
60
+ return wrapper;
56
61
  }
57
- function defineService(name, factory) {
58
- return {
59
- name,
60
- factory,
61
- authPermissions: getServiceAuthPermissions(factory)
62
- };
62
+ /**
63
+ * 이름과 팩토리 함수로 서비스를 정의한다.
64
+ *
65
+ * @example
66
+ * // 기본 서비스
67
+ * const HealthService = defineService("Health", (ctx) => ({
68
+ * check: () => ({ status: "ok" }),
69
+ * }));
70
+ *
71
+ * // 인증이 필요한 서비스
72
+ * const UserService = defineService("User", auth((ctx) => ({
73
+ * getProfile: () => ctx.authInfo,
74
+ * adminOnly: auth(["admin"], () => "admin"),
75
+ * })));
76
+ */
77
+ export function defineService(name, factory) {
78
+ return {
79
+ name,
80
+ factory,
81
+ authPermissions: getServiceAuthPermissions(factory),
82
+ };
63
83
  }
64
- export {
65
- auth,
66
- createServiceContext,
67
- defineService,
68
- getServiceAuthPermissions
69
- };
70
- //# sourceMappingURL=define-service.js.map
84
+ //# sourceMappingURL=define-service.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/define-service.ts"],
4
- "mappings": "AAGA,SAAS,WAAW;AACpB,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AAuBV,SAAS,qBACd,QACA,QACA,MACA,QAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,IAAI,WAAkC;AACpC,aAAQ,QAAQ,kBAAkB,QAAQ,MAAM,kBAAkB;AAAA,IAGpE;AAAA,IAEA,IAAI,aAAiC;AACnC,YAAM,OAAO,QAAQ,cAAc,MAAM,cAAc,QAAQ;AAC/D,UAAI,QAAQ,KAAM,QAAO;AAEzB,UAAI,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,GAAG;AACnF,cAAM,IAAI,MAAM,wBAAwB,IAAI,EAAE;AAAA,MAChD;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,IAAI,aAAiC;AACnC,YAAM,OAAO,KAAK;AAClB,aAAO,QAAQ,OAAO,SAAY,KAAK,QAAQ,OAAO,QAAQ,UAAU,OAAO,IAAI;AAAA,IACrF;AAAA,IAEA,MAAM,UAAa,SAA6B;AAC9C,UAAI,eAA8C,CAAC;AAEnD,YAAM,eAAe,KAAK,QAAQ,OAAO,QAAQ,UAAU,cAAc;AACzE,YAAM,aAAa,MAAM,UAA6B,YAAY;AAClE,UAAI,cAAc,MAAM;AACtB,uBAAe;AAAA,MACjB;AAEA,YAAM,aAAa,KAAK;AACxB,UAAI,cAAc,MAAM;AACtB,cAAM,iBAAiB,KAAK,QAAQ,YAAY,cAAc;AAC9D,cAAM,eAAe,MAAM,UAA6B,cAAc;AACtE,YAAI,gBAAgB,MAAM;AACxB,yBAAe,IAAI,MAAM,cAAc,YAAY;AAAA,QACrD;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,OAAO;AACnC,UAAI,UAAU,KAAM,OAAM,IAAI,MAAM,oCAAoC,OAAO,EAAE;AACjF,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,MAAM,mBAAmB,uBAAO,iBAAiB;AAG1C,SAAS,0BAA0B,IAAoC;AAC5E,SAAQ,GAA0C,gBAAgB;AACpE;AAeO,SAAS,KAAK,iBAAsC,SAA8B;AACvF,QAAM,cAAc,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC;AACxE,QAAM,KAAK,MAAM,QAAQ,eAAe,IAAI,UAAW;AAGvD,QAAM,UAAU,IAAI,SAAoB,GAAG,GAAG,IAAI;AAClD,EAAC,QAA+C,gBAAgB,IAAI;AAEpE,SAAO;AACT;AAyBO,SAAS,cACd,MACA,SAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,0BAA0B,OAAO;AAAA,EACpD;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"define-service.js","sourceRoot":"","sources":["..\\..\\src\\core\\define-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"service-executor.d.ts","sourceRoot":"","sources":["..\\..\\src\\core\\service-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACpE,GACA,OAAO,CAAC,OAAO,CAAC,CAoDlB"}
1
+ {"version":3,"file":"service-executor.d.ts","sourceRoot":"","sources":["..\\..\\src\\core\\service-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACpE,GACA,OAAO,CAAC,OAAO,CAAC,CA0DlB"}
@@ -1,40 +1,50 @@
1
1
  import { createServiceContext, getServiceAuthPermissions } from "./define-service.js";
2
- async function executeServiceMethod(server, def) {
3
- const serviceDef = server.options.services.find((item) => item.name === def.serviceName);
4
- if (serviceDef == null) {
5
- throw new Error(`Service [${def.serviceName}] not found.`);
6
- }
7
- const clientName = def.socket?.clientName ?? def.http?.clientName;
8
- if (clientName != null) {
9
- if (clientName.includes("..") || clientName.includes("/") || clientName.includes("\\")) {
10
- throw new Error(`[Security] Invalid client name: ${clientName}`);
2
+ export async function executeServiceMethod(server, def) {
3
+ // 서비스 정의 검색
4
+ const serviceDef = server.options.services.find((item) => item.name === def.serviceName);
5
+ if (serviceDef == null) {
6
+ throw new Error(`서비스 [${def.serviceName}]를 찾을 수 없습니다.`);
11
7
  }
12
- }
13
- const ctx = createServiceContext(server, def.socket, def.http);
14
- const methods = serviceDef.factory(ctx);
15
- const method = methods[def.methodName];
16
- if (typeof method !== "function") {
17
- throw new Error(`Method [${def.serviceName}.${def.methodName}] not found.`);
18
- }
19
- if (server.options.auth != null) {
8
+ // 요청 유효성 검증 (게이트키퍼)
9
+ const clientName = def.socket?.clientName ?? def.http?.clientName;
10
+ if (clientName != null) {
11
+ if (clientName.includes("..") || clientName.includes("/") || clientName.includes("\\")) {
12
+ throw new Error(`[보안] 유효하지 않은 클라이언트 이름: ${clientName}`);
13
+ }
14
+ }
15
+ // 컨텍스트 생성
16
+ const ctx = createServiceContext(server, def.socket, def.http);
17
+ // 팩토리를 호출하여 메서드 객체 생성
18
+ const methods = serviceDef.factory(ctx);
19
+ // 메서드 검색
20
+ const method = methods[def.methodName];
21
+ if (typeof method !== "function") {
22
+ throw new Error(`메서드 [${def.serviceName}.${def.methodName}]를 찾을 수 없습니다.`);
23
+ }
24
+ // 인증 확인
20
25
  const methodPerms = getServiceAuthPermissions(method);
21
26
  const requiredPerms = methodPerms ?? serviceDef.authPermissions;
22
27
  if (requiredPerms != null) {
23
- const authTokenPayload = def.socket?.authTokenPayload ?? def.http?.authTokenPayload;
24
- if (authTokenPayload == null) {
25
- throw new Error("Login is required.");
26
- }
27
- if (requiredPerms.length > 0) {
28
- const hasPerm = requiredPerms.some((perm) => authTokenPayload.roles.includes(perm));
29
- if (!hasPerm) {
30
- throw new Error("Insufficient permissions.");
28
+ if (server.options.auth === undefined) {
29
+ // auth 설정 누락 — 설정 오류
30
+ throw new Error("auth 설정이 필요합니다. auth 서비스를 사용하려면 서버 옵션에 auth를 설정하세요.");
31
+ }
32
+ if (server.options.auth !== false) {
33
+ // auth가 설정되어 있으면 인증 검사 수행
34
+ const authTokenPayload = def.socket?.authTokenPayload ?? def.http?.authTokenPayload;
35
+ if (authTokenPayload == null) {
36
+ throw new Error("로그인이 필요합니다.");
37
+ }
38
+ if (requiredPerms.length > 0) {
39
+ const hasPerm = requiredPerms.some((perm) => authTokenPayload.roles.includes(perm));
40
+ if (!hasPerm) {
41
+ throw new Error("권한이 부족합니다.");
42
+ }
43
+ }
31
44
  }
32
- }
45
+ // auth === false → 의도적 비활성화, 인증 스킵
33
46
  }
34
- }
35
- return await method(...def.params);
47
+ // 실행
48
+ return await method(...def.params);
36
49
  }
37
- export {
38
- executeServiceMethod
39
- };
40
- //# sourceMappingURL=service-executor.js.map
50
+ //# sourceMappingURL=service-executor.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/service-executor.ts"],
4
- "mappings": "AAGA,SAAS,sBAAsB,iCAAiC;AAEhE,eAAsB,qBACpB,QACA,KAOkB;AAElB,QAAM,aAAa,OAAO,QAAQ,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,WAAW;AAEvF,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,YAAY,IAAI,WAAW,cAAc;AAAA,EAC3D;AAGA,QAAM,aAAa,IAAI,QAAQ,cAAc,IAAI,MAAM;AACvD,MAAI,cAAc,MAAM;AACtB,QAAI,WAAW,SAAS,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,WAAW,SAAS,IAAI,GAAG;AACtF,YAAM,IAAI,MAAM,mCAAmC,UAAU,EAAE;AAAA,IACjE;AAAA,EACF;AAGA,QAAM,MAAM,qBAAqB,QAAQ,IAAI,QAAQ,IAAI,IAAI;AAG7D,QAAM,UAAU,WAAW,QAAQ,GAAG;AAGtC,QAAM,SAAU,QAAoC,IAAI,UAAU;AAClE,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,IAAI,MAAM,WAAW,IAAI,WAAW,IAAI,IAAI,UAAU,cAAc;AAAA,EAC5E;AAGA,MAAI,OAAO,QAAQ,QAAQ,MAAM;AAE/B,UAAM,cAAc,0BAA0B,MAAM;AACpD,UAAM,gBAAgB,eAAe,WAAW;AAEhD,QAAI,iBAAiB,MAAM;AACzB,YAAM,mBAAmB,IAAI,QAAQ,oBAAoB,IAAI,MAAM;AAEnE,UAAI,oBAAoB,MAAM;AAC5B,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,UAAU,cAAc,KAAK,CAAC,SAAS,iBAAiB,MAAM,SAAS,IAAI,CAAC;AAClF,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO,MAAM,OAAO,GAAG,IAAI,MAAM;AACnC;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"service-executor.js","sourceRoot":"","sources":["..\\..\\src\\core\\service-executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAqB,EACrB,GAMC;IAED,YAAY;IACZ,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;IAEzF,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,WAAW,eAAe,CAAC,CAAC;IAC1D,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;IAClE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvF,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,UAAU;IACV,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAE/D,sBAAsB;IACtB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAExC,SAAS;IACT,MAAM,MAAM,GAAI,OAAmC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,eAAe,CAAC,CAAC;IAC5E,CAAC;IAED,QAAQ;IACR,MAAM,WAAW,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,WAAW,IAAI,UAAU,CAAC,eAAe,CAAC;IAEhE,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,qBAAqB;YACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAClC,0BAA0B;YAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,IAAI,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC;YAEpF,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QACD,mCAAmC;IACrC,CAAC;IAED,KAAK;IACL,OAAO,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -11,7 +11,6 @@ export * from "./transport/http/static-file-handler";
11
11
  export * from "./protocol/protocol-wrapper";
12
12
  export * from "./services/orm-service";
13
13
  export * from "./services/auto-update-service";
14
- export * from "./services/smtp-client-service";
15
14
  export * from "./utils/config-manager";
16
15
  export * from "./legacy/v1-auto-update-handler";
17
16
  export * from "./service-server";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AAGvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AAGvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,18 +1,27 @@
1
+ // 타입
1
2
  export * from "./types/server-options.js";
3
+ // 인증
2
4
  export * from "./auth/auth-token-payload.js";
3
5
  export * from "./auth/jwt-manager.js";
6
+ // 코어
4
7
  export * from "./core/define-service.js";
5
8
  export * from "./core/service-executor.js";
9
+ // 전송 계층 - Socket
6
10
  export * from "./transport/socket/websocket-handler.js";
7
11
  export * from "./transport/socket/service-socket.js";
12
+ // 전송 계층 - HTTP
8
13
  export * from "./transport/http/http-request-handler.js";
9
14
  export * from "./transport/http/upload-handler.js";
10
15
  export * from "./transport/http/static-file-handler.js";
16
+ // 프로토콜
11
17
  export * from "./protocol/protocol-wrapper.js";
18
+ // 서비스
12
19
  export * from "./services/orm-service.js";
13
20
  export * from "./services/auto-update-service.js";
14
- export * from "./services/smtp-client-service.js";
21
+ // 유틸리티
15
22
  export * from "./utils/config-manager.js";
23
+ // 레거시
16
24
  export * from "./legacy/v1-auto-update-handler.js";
25
+ // 메인
17
26
  export * from "./service-server.js";
18
- //# sourceMappingURL=index.js.map
27
+ //# 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;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAAA,KAAK;AACL,cAAc,wBAAwB,CAAC;AAEvC,KAAK;AACL,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAEnC,KAAK;AACL,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AAExC,iBAAiB;AACjB,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAElD,eAAe;AACf,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAErD,OAAO;AACP,cAAc,6BAA6B,CAAC;AAE5C,MAAM;AACN,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,OAAO;AACP,cAAc,wBAAwB,CAAC;AAEvC,MAAM;AACN,cAAc,iCAAiC,CAAC;AAEhD,KAAK;AACL,cAAc,kBAAkB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { WebSocket } from "ws";
2
2
  /**
3
- * V1 legacy client handler (only auto-update supported).
4
- * All other requests return an upgrade-required error.
3
+ * V1 레거시 클라이언트 핸들러 (자동 업데이트만 지원).
4
+ * 모든 요청은 업그레이드 필요 에러를 반환한다.
5
5
  */
6
6
  export declare function handleV1Connection(socket: WebSocket, autoUpdateMethods: {
7
7
  getLastVersion: (platform: string) => Promise<any>;
@@ -1,38 +1,45 @@
1
1
  import consola from "consola";
2
2
  const logger = consola.withTag("service-server:V1AutoUpdateHandler");
3
- function handleV1Connection(socket, autoUpdateMethods, clientNameSetter) {
4
- socket.send(JSON.stringify({ name: "connected" }));
5
- socket.on("message", (data) => {
6
- try {
7
- const msg = JSON.parse(data.toString());
8
- if (msg.command === "SdAutoUpdateService.getLastVersion") {
9
- clientNameSetter?.(msg.clientName);
10
- const result = autoUpdateMethods.getLastVersion(msg.params[0]);
11
- const response = {
12
- name: "response",
13
- reqUuid: msg.uuid,
14
- state: "success",
15
- body: result
16
- };
17
- socket.send(JSON.stringify(response));
18
- } else {
19
- const response = {
20
- name: "response",
21
- reqUuid: msg.uuid,
22
- state: "error",
23
- body: {
24
- message: "App upgrade is required.",
25
- code: "UPGRADE_REQUIRED"
26
- }
27
- };
28
- socket.send(JSON.stringify(response));
29
- }
30
- } catch (err) {
31
- logger.warn("V1 message processing error", err);
32
- }
33
- });
3
+ /**
4
+ * V1 레거시 클라이언트 핸들러 (자동 업데이트만 지원).
5
+ * 외 모든 요청은 업그레이드 필요 에러를 반환한다.
6
+ */
7
+ export function handleV1Connection(socket, autoUpdateMethods, clientNameSetter) {
8
+ // 연결 성립 알림
9
+ socket.send(JSON.stringify({ name: "connected" }));
10
+ socket.on("message", async (data) => {
11
+ try {
12
+ const msg = JSON.parse(data.toString());
13
+ // SdAutoUpdateService.getLastVersion만 허용
14
+ if (msg.command === "SdAutoUpdateService.getLastVersion") {
15
+ // 레거시 컨텍스트 설정
16
+ clientNameSetter?.(msg.clientName);
17
+ const result = await autoUpdateMethods.getLastVersion(msg.params[0]);
18
+ const response = {
19
+ name: "response",
20
+ reqUuid: msg.uuid,
21
+ state: "success",
22
+ body: result,
23
+ };
24
+ socket.send(JSON.stringify(response));
25
+ }
26
+ else {
27
+ // 그 외 모든 요청은 업그레이드 요구
28
+ const response = {
29
+ name: "response",
30
+ reqUuid: msg.uuid,
31
+ state: "error",
32
+ body: {
33
+ message: "앱 업그레이드가 필요합니다.",
34
+ code: "UPGRADE_REQUIRED",
35
+ },
36
+ };
37
+ socket.send(JSON.stringify(response));
38
+ }
39
+ }
40
+ catch (err) {
41
+ logger.warn("V1 메시지 처리 에러", err);
42
+ }
43
+ });
34
44
  }
35
- export {
36
- handleV1Connection
37
- };
38
- //# sourceMappingURL=v1-auto-update-handler.js.map
45
+ //# sourceMappingURL=v1-auto-update-handler.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/legacy/v1-auto-update-handler.ts"],
4
- "mappings": "AACA,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,oCAAoC;AAoB5D,SAAS,mBACd,QACA,mBACA,kBACA;AAEA,SAAO,KAAK,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC,CAAC;AAEjD,SAAO,GAAG,WAAW,CAAC,SAAS;AAC7B,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AAGtC,UAAI,IAAI,YAAY,sCAAsC;AAExD,2BAAmB,IAAI,UAAU;AAEjC,cAAM,SAAS,kBAAkB,eAAe,IAAI,OAAO,CAAC,CAAW;AAEvE,cAAM,WAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AACA,eAAO,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,MACtC,OAAO;AAEL,cAAM,WAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,OAAO;AAAA,UACP,MAAM;AAAA,YACJ,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QACF;AACA,eAAO,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,MACtC;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,KAAK,+BAA+B,GAAG;AAAA,IAChD;AAAA,EACF,CAAC;AACH;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"v1-auto-update-handler.js","sourceRoot":"","sources":["..\\..\\src\\legacy\\v1-auto-update-handler.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;AAgBrE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,iBAAyE,EACzE,gBAA2D;IAE3D,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAEnD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAe,CAAC;YAEtD,yCAAyC;YACzC,IAAI,GAAG,CAAC,OAAO,KAAK,oCAAoC,EAAE,CAAC;gBACzD,cAAc;gBACd,gBAAgB,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAEnC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC;gBAE/E,MAAM,QAAQ,GAAgB;oBAC5B,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,GAAG,CAAC,IAAI;oBACjB,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,MAAM;iBACb,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,sBAAsB;gBACtB,MAAM,QAAQ,GAAgB;oBAC5B,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,GAAG,CAAC,IAAI;oBACjB,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE;wBACJ,OAAO,EAAE,iBAAiB;wBAC1B,IAAI,EAAE,kBAAkB;qBACzB;iBACF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}