@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.
- package/dist/auth/auth-token-payload.js +2 -1
- package/dist/auth/auth-token-payload.js.map +1 -6
- package/dist/auth/jwt-manager.js +21 -21
- package/dist/auth/jwt-manager.js.map +1 -6
- package/dist/core/define-service.d.ts +12 -12
- package/dist/core/define-service.d.ts.map +1 -1
- package/dist/core/define-service.js +77 -63
- package/dist/core/define-service.js.map +1 -6
- package/dist/core/service-executor.d.ts.map +1 -1
- package/dist/core/service-executor.js +42 -32
- package/dist/core/service-executor.js.map +1 -6
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -6
- package/dist/legacy/v1-auto-update-handler.d.ts +2 -2
- package/dist/legacy/v1-auto-update-handler.js +42 -35
- package/dist/legacy/v1-auto-update-handler.js.map +1 -6
- package/dist/protocol/protocol-wrapper.d.ts +9 -9
- package/dist/protocol/protocol-wrapper.js +64 -46
- package/dist/protocol/protocol-wrapper.js.map +1 -6
- package/dist/service-server.d.ts +2 -0
- package/dist/service-server.d.ts.map +1 -1
- package/dist/service-server.js +187 -165
- package/dist/service-server.js.map +1 -6
- package/dist/services/auto-update-service.js +35 -34
- package/dist/services/auto-update-service.js.map +1 -6
- package/dist/services/orm-service.js +114 -120
- package/dist/services/orm-service.js.map +1 -6
- package/dist/transport/http/http-request-handler.d.ts.map +1 -1
- package/dist/transport/http/http-request-handler.js +58 -46
- package/dist/transport/http/http-request-handler.js.map +1 -6
- package/dist/transport/http/static-file-handler.js +42 -39
- package/dist/transport/http/static-file-handler.js.map +1 -6
- package/dist/transport/http/upload-handler.d.ts.map +1 -1
- package/dist/transport/http/upload-handler.js +60 -55
- package/dist/transport/http/upload-handler.js.map +1 -6
- package/dist/transport/socket/service-socket.d.ts +13 -13
- package/dist/transport/socket/service-socket.js +132 -108
- package/dist/transport/socket/service-socket.js.map +1 -6
- package/dist/transport/socket/websocket-handler.d.ts +10 -10
- package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
- package/dist/transport/socket/websocket-handler.js +154 -139
- package/dist/transport/socket/websocket-handler.js.map +1 -6
- package/dist/types/server-options.d.ts +1 -1
- package/dist/types/server-options.d.ts.map +1 -1
- package/dist/types/server-options.js +2 -1
- package/dist/types/server-options.js.map +1 -6
- package/dist/utils/config-manager.js +48 -46
- package/dist/utils/config-manager.js.map +1 -6
- package/dist/workers/service-protocol.worker.js +8 -11
- package/dist/workers/service-protocol.worker.js.map +1 -6
- package/package.json +12 -14
- package/src/auth/jwt-manager.ts +2 -2
- package/src/core/define-service.ts +19 -19
- package/src/core/service-executor.ts +23 -17
- package/src/index.ts +10 -12
- package/src/legacy/v1-auto-update-handler.ts +10 -10
- package/src/protocol/protocol-wrapper.ts +16 -16
- package/src/service-server.ts +52 -39
- package/src/services/auto-update-service.ts +1 -1
- package/src/services/orm-service.ts +7 -7
- package/src/transport/http/http-request-handler.ts +16 -10
- package/src/transport/http/static-file-handler.ts +8 -8
- package/src/transport/http/upload-handler.ts +16 -9
- package/src/transport/socket/service-socket.ts +22 -22
- package/src/transport/socket/websocket-handler.ts +59 -60
- package/src/types/server-options.ts +1 -1
- package/src/utils/config-manager.ts +11 -11
- package/README.md +0 -163
- package/dist/services/smtp-client-service.d.ts +0 -8
- package/dist/services/smtp-client-service.d.ts.map +0 -1
- package/dist/services/smtp-client-service.js +0 -46
- package/dist/services/smtp-client-service.js.map +0 -6
- package/docs/auth.md +0 -59
- package/docs/core.md +0 -133
- package/docs/server.md +0 -126
- package/docs/services.md +0 -58
- package/docs/transport.md +0 -164
- package/src/services/smtp-client-service.ts +0 -59
- package/tests/define-service.spec.ts +0 -66
- package/tests/orm-service.spec.ts +0 -83
- package/tests/service-executor.spec.ts +0 -114
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=auth-token-payload.js.map
|
package/dist/auth/jwt-manager.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import * as jose from "jose";
|
|
2
|
-
async function signJwt(jwtSecret, payload) {
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
23
|
+
export function decodeJwt(token) {
|
|
24
|
+
return jose.decodeJwt(token);
|
|
20
25
|
}
|
|
21
|
-
|
|
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
|
|
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
|
-
/**
|
|
26
|
+
/** auth()로 래핑된 함수에서 인증 권한을 읽는다. 래핑되지 않은 경우 undefined를 반환한다. */
|
|
27
27
|
export declare function getServiceAuthPermissions(fn: Function): string[] | undefined;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* 서비스 팩토리 및 메서드용 인증 래퍼.
|
|
30
30
|
*
|
|
31
|
-
* -
|
|
32
|
-
* -
|
|
33
|
-
* -
|
|
34
|
-
* -
|
|
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
|
-
*
|
|
44
|
+
* 이름과 팩토리 함수로 서비스를 정의한다.
|
|
45
45
|
*
|
|
46
46
|
* @example
|
|
47
|
-
* //
|
|
47
|
+
* // 기본 서비스
|
|
48
48
|
* const HealthService = defineService("Health", (ctx) => ({
|
|
49
49
|
* check: () => ({ status: "ok" }),
|
|
50
50
|
* }));
|
|
51
51
|
*
|
|
52
|
-
* //
|
|
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
|
-
*
|
|
60
|
+
* 클라이언트 측 타입 공유를 위해 ServiceDefinition에서 메서드 시그니처를 추출한다.
|
|
61
61
|
*
|
|
62
62
|
* @example
|
|
63
63
|
* export type UserServiceType = ServiceMethods<typeof UserService>;
|
|
64
|
-
* //
|
|
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
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
47
|
+
// 실행
|
|
48
|
+
return await method(...def.params);
|
|
36
49
|
}
|
|
37
|
-
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,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;
|
|
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
|
-
|
|
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
|
|
4
|
-
*
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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"}
|