@simplysm/service-server 14.0.52 → 14.0.54
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/legacy/v1-auto-update-handler.d.ts +40 -5
- package/dist/legacy/v1-auto-update-handler.d.ts.map +1 -1
- package/dist/legacy/v1-auto-update-handler.js +51 -29
- package/dist/legacy/v1-auto-update-handler.js.map +1 -1
- package/dist/service-server.d.ts.map +1 -1
- package/dist/service-server.js +20 -7
- package/dist/service-server.js.map +1 -1
- package/dist/types/server-options.d.ts +2 -0
- package/dist/types/server-options.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/legacy/v1-auto-update-handler.ts +117 -31
- package/src/service-server.ts +29 -14
- package/src/types/server-options.ts +7 -3
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
import type { WebSocket } from "ws";
|
|
2
|
+
import type { ServiceContext } from "../core/define-service";
|
|
3
|
+
export interface V1Request {
|
|
4
|
+
uuid: string;
|
|
5
|
+
command: string;
|
|
6
|
+
params: unknown[];
|
|
7
|
+
clientName?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface V1Response {
|
|
10
|
+
name: "response";
|
|
11
|
+
reqUuid: string;
|
|
12
|
+
state: "success" | "error";
|
|
13
|
+
body: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface V1AutoUpdateMethods {
|
|
16
|
+
getLastVersion: (platform: string) => Promise<unknown> | unknown;
|
|
17
|
+
}
|
|
18
|
+
export type V1RequestHandlerResult = {
|
|
19
|
+
handled: true;
|
|
20
|
+
state?: V1Response["state"];
|
|
21
|
+
body: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
handled: false;
|
|
24
|
+
};
|
|
25
|
+
export interface V1RequestHandlerContext {
|
|
26
|
+
request: V1Request;
|
|
27
|
+
serviceContext: ServiceContext;
|
|
28
|
+
}
|
|
29
|
+
export type V1RequestHandler = ((ctx: V1RequestHandlerContext) => Promise<V1RequestHandlerResult>) | ((ctx: V1RequestHandlerContext) => V1RequestHandlerResult);
|
|
30
|
+
export interface V1ConnectionOptions {
|
|
31
|
+
serviceContext?: ServiceContext;
|
|
32
|
+
serviceContextFactory?: (request: V1Request) => ServiceContext;
|
|
33
|
+
handlers?: V1RequestHandler[];
|
|
34
|
+
autoUpdateMethods?: V1AutoUpdateMethods;
|
|
35
|
+
autoUpdateMethodsFactory?: (ctx: V1RequestHandlerContext) => V1AutoUpdateMethods;
|
|
36
|
+
clientNameSetter?: (clientName: string | undefined) => void;
|
|
37
|
+
}
|
|
2
38
|
/**
|
|
3
|
-
* V1 레거시 클라이언트
|
|
4
|
-
*
|
|
39
|
+
* V1 레거시 클라이언트 핸들러.
|
|
40
|
+
* 사용자 핸들러가 처리하지 않은 요청은 자동 업데이트 fallback 또는 업그레이드 필요 에러로 처리한다.
|
|
5
41
|
*/
|
|
6
|
-
export declare function handleV1Connection(socket: WebSocket, autoUpdateMethods:
|
|
7
|
-
|
|
8
|
-
}, clientNameSetter?: (clientName: string | undefined) => void): void;
|
|
42
|
+
export declare function handleV1Connection(socket: WebSocket, autoUpdateMethods: V1AutoUpdateMethods, clientNameSetter?: (clientName: string | undefined) => void): void;
|
|
43
|
+
export declare function handleV1Connection(socket: WebSocket, options: V1ConnectionOptions): void;
|
|
9
44
|
//# sourceMappingURL=v1-auto-update-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1-auto-update-handler.d.ts","sourceRoot":"","sources":["../../src/legacy/v1-auto-update-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"v1-auto-update-handler.d.ts","sourceRoot":"","sources":["../../src/legacy/v1-auto-update-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClE;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,OAAO,EAAE,KAAK,CAAC;CAChB,CAAC;AAEN,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,SAAS,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,MAAM,gBAAgB,GACxB,CAAC,CAAC,GAAG,EAAE,uBAAuB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC,GACnE,CAAC,CAAC,GAAG,EAAE,uBAAuB,KAAK,sBAAsB,CAAC,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,cAAc,CAAC;IAC/D,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;IACxC,wBAAwB,CAAC,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,mBAAmB,CAAC;IACjF,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,iBAAiB,EAAE,mBAAmB,EACtC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,GAC1D,IAAI,CAAC;AACR,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC"}
|
|
@@ -1,45 +1,67 @@
|
|
|
1
1
|
import consola from "consola";
|
|
2
2
|
const logger = consola.withTag("service-server:V1AutoUpdateHandler");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export function handleV1Connection(socket, autoUpdateMethods, clientNameSetter) {
|
|
3
|
+
export function handleV1Connection(socket, optionsOrMethods, clientNameSetter) {
|
|
4
|
+
const options = "getLastVersion" in optionsOrMethods
|
|
5
|
+
? { autoUpdateMethods: optionsOrMethods, clientNameSetter }
|
|
6
|
+
: optionsOrMethods;
|
|
8
7
|
// 연결 성립 알림
|
|
9
8
|
socket.send(JSON.stringify({ name: "connected" }));
|
|
10
9
|
socket.on("message", async (data) => {
|
|
11
10
|
try {
|
|
12
11
|
const msg = JSON.parse(data.toString());
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
name: "response",
|
|
20
|
-
reqUuid: msg.uuid,
|
|
21
|
-
state: "success",
|
|
22
|
-
body: result,
|
|
23
|
-
};
|
|
24
|
-
socket.send(JSON.stringify(response));
|
|
12
|
+
options.clientNameSetter?.(msg.clientName);
|
|
13
|
+
const serviceContext = options.serviceContextFactory?.(msg) ?? options.serviceContext;
|
|
14
|
+
const handlerResult = await executeCustomHandler(msg, options.handlers ?? [], serviceContext);
|
|
15
|
+
if (handlerResult.handled) {
|
|
16
|
+
sendResponse(socket, msg.uuid, handlerResult.state ?? "success", handlerResult.body);
|
|
17
|
+
return;
|
|
25
18
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
message: "앱 업그레이드가 필요합니다.",
|
|
34
|
-
code: "UPGRADE_REQUIRED",
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
socket.send(JSON.stringify(response));
|
|
19
|
+
if (msg.command === "SdAutoUpdateService.getLastVersion") {
|
|
20
|
+
const autoUpdateMethods = resolveAutoUpdateMethods(msg, options, serviceContext);
|
|
21
|
+
if (autoUpdateMethods != null) {
|
|
22
|
+
const result = await autoUpdateMethods.getLastVersion(msg.params[0]);
|
|
23
|
+
sendResponse(socket, msg.uuid, "success", result);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
38
26
|
}
|
|
27
|
+
sendResponse(socket, msg.uuid, "error", {
|
|
28
|
+
message: "앱 업그레이드가 필요합니다.",
|
|
29
|
+
code: "UPGRADE_REQUIRED",
|
|
30
|
+
});
|
|
39
31
|
}
|
|
40
32
|
catch (err) {
|
|
41
33
|
logger.warn("V1 메시지 처리 에러", err);
|
|
42
34
|
}
|
|
43
35
|
});
|
|
44
36
|
}
|
|
37
|
+
async function executeCustomHandler(request, handlers, serviceContext) {
|
|
38
|
+
if (handlers.length < 1)
|
|
39
|
+
return { handled: false };
|
|
40
|
+
if (serviceContext == null) {
|
|
41
|
+
throw new Error("V1 핸들러를 실행하려면 serviceContext가 필요합니다.");
|
|
42
|
+
}
|
|
43
|
+
for (const handler of handlers) {
|
|
44
|
+
const result = await handler({ request, serviceContext });
|
|
45
|
+
if (result.handled)
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
return { handled: false };
|
|
49
|
+
}
|
|
50
|
+
function resolveAutoUpdateMethods(request, options, serviceContext) {
|
|
51
|
+
if (options.autoUpdateMethodsFactory == null)
|
|
52
|
+
return options.autoUpdateMethods;
|
|
53
|
+
if (serviceContext == null) {
|
|
54
|
+
throw new Error("V1 자동 업데이트 fallback을 실행하려면 serviceContext가 필요합니다.");
|
|
55
|
+
}
|
|
56
|
+
return options.autoUpdateMethodsFactory({ request, serviceContext });
|
|
57
|
+
}
|
|
58
|
+
function sendResponse(socket, reqUuid, state, body) {
|
|
59
|
+
const response = {
|
|
60
|
+
name: "response",
|
|
61
|
+
reqUuid,
|
|
62
|
+
state,
|
|
63
|
+
body,
|
|
64
|
+
};
|
|
65
|
+
socket.send(JSON.stringify(response));
|
|
66
|
+
}
|
|
45
67
|
//# sourceMappingURL=v1-auto-update-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1-auto-update-handler.js","sourceRoot":"","sources":["../../src/legacy/v1-auto-update-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"v1-auto-update-handler.js","sourceRoot":"","sources":["../../src/legacy/v1-auto-update-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAAQ,YAAY,EAAO,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,MAAM,WAAW,gBAAgB,CAAC,SAAS,SAAS,eAAe;IACjE,IAAI,CACF,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,OAAO,EACnD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IASY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IARlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,mBAAmB,CAAS;IAEpC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAAQ,YAAY,EAAO,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,MAAM,WAAW,gBAAgB,CAAC,SAAS,SAAS,eAAe;IACjE,IAAI,CACF,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,OAAO,EACnD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IASY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IARlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,mBAAmB,CAAS;IAEpC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;IAoB5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyJvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,QAAQ,CAAC,SAAS,SAAS,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAMrF,SAAS,CAAC,SAAS,SAAS,eAAe,EAC/C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,OAAO,EACnD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;IAKpB,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAKlD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAK1E,OAAO,CAAC,yBAAyB;CA4BlC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAG,OAAO,EACrD,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,SAAS,CAAC,CAE1B"}
|
package/dist/service-server.js
CHANGED
|
@@ -27,7 +27,8 @@ export class ServiceServer extends EventEmitter {
|
|
|
27
27
|
constructor(options) {
|
|
28
28
|
super();
|
|
29
29
|
this.options = options;
|
|
30
|
-
this._jwtSecret =
|
|
30
|
+
this._jwtSecret =
|
|
31
|
+
options.auth != null && options.auth !== false ? options.auth.jwtSecret : undefined;
|
|
31
32
|
// SSL 설정 (동기)
|
|
32
33
|
// 참고: Fastify HTTPS는 Buffer 타입이 필요함 (Uint8Array를 직접 사용할 수 없음)
|
|
33
34
|
const httpsConf = options.ssl
|
|
@@ -116,16 +117,19 @@ export class ServiceServer extends EventEmitter {
|
|
|
116
117
|
this._wsHandler.addSocket(socket, clientId, clientName, req);
|
|
117
118
|
}
|
|
118
119
|
else {
|
|
119
|
-
// V1 레거시 지원
|
|
120
|
+
// V1 레거시 지원
|
|
120
121
|
const autoUpdateDef = this.options.services.find((s) => s.name === "AutoUpdate");
|
|
121
|
-
|
|
122
|
+
const legacyV1Handlers = this.options.legacyV1Handlers ?? [];
|
|
123
|
+
if (autoUpdateDef == null && legacyV1Handlers.length < 1) {
|
|
122
124
|
socket.close(1008, "AutoUpdate 서비스가 설정되지 않았습니다");
|
|
123
125
|
return;
|
|
124
126
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
handleV1Connection(socket, {
|
|
128
|
+
serviceContextFactory: (request) => createServiceContext(this, undefined, undefined, { clientName: request.clientName }),
|
|
129
|
+
handlers: legacyV1Handlers,
|
|
130
|
+
autoUpdateMethodsFactory: autoUpdateDef == null
|
|
131
|
+
? undefined
|
|
132
|
+
: ({ serviceContext }) => createV1AutoUpdateMethods(autoUpdateDef.factory(serviceContext)),
|
|
129
133
|
});
|
|
130
134
|
}
|
|
131
135
|
};
|
|
@@ -208,4 +212,13 @@ export class ServiceServer extends EventEmitter {
|
|
|
208
212
|
export function createServiceServer(options) {
|
|
209
213
|
return new ServiceServer(options);
|
|
210
214
|
}
|
|
215
|
+
function createV1AutoUpdateMethods(methods) {
|
|
216
|
+
const getLastVersion = methods["getLastVersion"];
|
|
217
|
+
if (getLastVersion == null) {
|
|
218
|
+
throw new Error("AutoUpdate 서비스에 getLastVersion 메서드가 없습니다.");
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
getLastVersion: (platform) => getLastVersion(platform),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
211
224
|
//# sourceMappingURL=service-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-server.js","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"service-server.js","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ServiceDefinition } from "../core/define-service";
|
|
2
|
+
import type { V1RequestHandler } from "../legacy/v1-auto-update-handler";
|
|
2
3
|
export interface ServiceServerOptions {
|
|
3
4
|
rootPath: string;
|
|
4
5
|
port: number;
|
|
@@ -10,5 +11,6 @@ export interface ServiceServerOptions {
|
|
|
10
11
|
jwtSecret: string;
|
|
11
12
|
} | false;
|
|
12
13
|
services: ServiceDefinition[];
|
|
14
|
+
legacyV1Handlers?: V1RequestHandler[];
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=server-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-options.d.ts","sourceRoot":"","sources":["../../src/types/server-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-options.d.ts","sourceRoot":"","sources":["../../src/types/server-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QACJ,QAAQ,EAAE,UAAU,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EACD;QACE,SAAS,EAAE,MAAM,CAAC;KACnB,GACD,KAAK,CAAC;IACV,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACvC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/service-server",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.54",
|
|
4
4
|
"description": "심플리즘 패키지 - 서비스 (server)",
|
|
5
5
|
"author": "심플리즘",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"semver": "^7.7.4",
|
|
31
31
|
"utf-8-validate": "^6.0.6",
|
|
32
32
|
"ws": "^8.20.0",
|
|
33
|
-
"@simplysm/core-
|
|
34
|
-
"@simplysm/core-
|
|
35
|
-
"@simplysm/orm-common": "14.0.
|
|
36
|
-
"@simplysm/
|
|
37
|
-
"@simplysm/
|
|
33
|
+
"@simplysm/core-node": "14.0.54",
|
|
34
|
+
"@simplysm/core-common": "14.0.54",
|
|
35
|
+
"@simplysm/orm-common": "14.0.54",
|
|
36
|
+
"@simplysm/service-common": "14.0.54",
|
|
37
|
+
"@simplysm/orm-node": "14.0.54"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/semver": "^7.7.1",
|
|
@@ -1,67 +1,153 @@
|
|
|
1
1
|
import type { WebSocket } from "ws";
|
|
2
|
+
import type { ServiceContext } from "../core/define-service";
|
|
2
3
|
import consola from "consola";
|
|
3
4
|
|
|
4
5
|
const logger = consola.withTag("service-server:V1AutoUpdateHandler");
|
|
5
6
|
|
|
6
|
-
interface
|
|
7
|
+
export interface V1Request {
|
|
7
8
|
uuid: string;
|
|
8
9
|
command: string;
|
|
9
10
|
params: unknown[];
|
|
10
11
|
clientName?: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
interface
|
|
14
|
+
export interface V1Response {
|
|
14
15
|
name: "response";
|
|
15
16
|
reqUuid: string;
|
|
16
17
|
state: "success" | "error";
|
|
17
18
|
body: unknown;
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
export interface V1AutoUpdateMethods {
|
|
22
|
+
getLastVersion: (platform: string) => Promise<unknown> | unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type V1RequestHandlerResult =
|
|
26
|
+
| {
|
|
27
|
+
handled: true;
|
|
28
|
+
state?: V1Response["state"];
|
|
29
|
+
body: unknown;
|
|
30
|
+
}
|
|
31
|
+
| {
|
|
32
|
+
handled: false;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export interface V1RequestHandlerContext {
|
|
36
|
+
request: V1Request;
|
|
37
|
+
serviceContext: ServiceContext;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type V1RequestHandler =
|
|
41
|
+
| ((ctx: V1RequestHandlerContext) => Promise<V1RequestHandlerResult>)
|
|
42
|
+
| ((ctx: V1RequestHandlerContext) => V1RequestHandlerResult);
|
|
43
|
+
|
|
44
|
+
export interface V1ConnectionOptions {
|
|
45
|
+
serviceContext?: ServiceContext;
|
|
46
|
+
serviceContextFactory?: (request: V1Request) => ServiceContext;
|
|
47
|
+
handlers?: V1RequestHandler[];
|
|
48
|
+
autoUpdateMethods?: V1AutoUpdateMethods;
|
|
49
|
+
autoUpdateMethodsFactory?: (ctx: V1RequestHandlerContext) => V1AutoUpdateMethods;
|
|
50
|
+
clientNameSetter?: (clientName: string | undefined) => void;
|
|
51
|
+
}
|
|
52
|
+
|
|
20
53
|
/**
|
|
21
|
-
* V1 레거시 클라이언트
|
|
22
|
-
*
|
|
54
|
+
* V1 레거시 클라이언트 핸들러.
|
|
55
|
+
* 사용자 핸들러가 처리하지 않은 요청은 자동 업데이트 fallback 또는 업그레이드 필요 에러로 처리한다.
|
|
23
56
|
*/
|
|
24
57
|
export function handleV1Connection(
|
|
25
58
|
socket: WebSocket,
|
|
26
|
-
autoUpdateMethods:
|
|
59
|
+
autoUpdateMethods: V1AutoUpdateMethods,
|
|
60
|
+
clientNameSetter?: (clientName: string | undefined) => void,
|
|
61
|
+
): void;
|
|
62
|
+
export function handleV1Connection(socket: WebSocket, options: V1ConnectionOptions): void;
|
|
63
|
+
export function handleV1Connection(
|
|
64
|
+
socket: WebSocket,
|
|
65
|
+
optionsOrMethods: V1AutoUpdateMethods | V1ConnectionOptions,
|
|
27
66
|
clientNameSetter?: (clientName: string | undefined) => void,
|
|
28
67
|
) {
|
|
68
|
+
const options =
|
|
69
|
+
"getLastVersion" in optionsOrMethods
|
|
70
|
+
? { autoUpdateMethods: optionsOrMethods, clientNameSetter }
|
|
71
|
+
: optionsOrMethods;
|
|
72
|
+
|
|
29
73
|
// 연결 성립 알림
|
|
30
74
|
socket.send(JSON.stringify({ name: "connected" }));
|
|
31
75
|
|
|
32
76
|
socket.on("message", async (data) => {
|
|
33
77
|
try {
|
|
34
|
-
const msg = JSON.parse(data.toString()) as
|
|
78
|
+
const msg = JSON.parse(data.toString()) as V1Request;
|
|
79
|
+
options.clientNameSetter?.(msg.clientName);
|
|
80
|
+
|
|
81
|
+
const serviceContext = options.serviceContextFactory?.(msg) ?? options.serviceContext;
|
|
82
|
+
const handlerResult = await executeCustomHandler(msg, options.handlers ?? [], serviceContext);
|
|
83
|
+
if (handlerResult.handled) {
|
|
84
|
+
sendResponse(socket, msg.uuid, handlerResult.state ?? "success", handlerResult.body);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
35
87
|
|
|
36
|
-
// SdAutoUpdateService.getLastVersion만 허용
|
|
37
88
|
if (msg.command === "SdAutoUpdateService.getLastVersion") {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
reqUuid: msg.uuid,
|
|
46
|
-
state: "success",
|
|
47
|
-
body: result,
|
|
48
|
-
};
|
|
49
|
-
socket.send(JSON.stringify(response));
|
|
50
|
-
} else {
|
|
51
|
-
// 그 외 모든 요청은 업그레이드 요구
|
|
52
|
-
const response: IV1Response = {
|
|
53
|
-
name: "response",
|
|
54
|
-
reqUuid: msg.uuid,
|
|
55
|
-
state: "error",
|
|
56
|
-
body: {
|
|
57
|
-
message: "앱 업그레이드가 필요합니다.",
|
|
58
|
-
code: "UPGRADE_REQUIRED",
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
socket.send(JSON.stringify(response));
|
|
89
|
+
const autoUpdateMethods = resolveAutoUpdateMethods(msg, options, serviceContext);
|
|
90
|
+
if (autoUpdateMethods != null) {
|
|
91
|
+
const result = await autoUpdateMethods.getLastVersion(msg.params[0] as string);
|
|
92
|
+
|
|
93
|
+
sendResponse(socket, msg.uuid, "success", result);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
62
96
|
}
|
|
97
|
+
|
|
98
|
+
sendResponse(socket, msg.uuid, "error", {
|
|
99
|
+
message: "앱 업그레이드가 필요합니다.",
|
|
100
|
+
code: "UPGRADE_REQUIRED",
|
|
101
|
+
});
|
|
63
102
|
} catch (err) {
|
|
64
103
|
logger.warn("V1 메시지 처리 에러", err);
|
|
65
104
|
}
|
|
66
105
|
});
|
|
67
106
|
}
|
|
107
|
+
|
|
108
|
+
async function executeCustomHandler(
|
|
109
|
+
request: V1Request,
|
|
110
|
+
handlers: V1RequestHandler[],
|
|
111
|
+
serviceContext: ServiceContext | undefined,
|
|
112
|
+
): Promise<V1RequestHandlerResult> {
|
|
113
|
+
if (handlers.length < 1) return { handled: false };
|
|
114
|
+
|
|
115
|
+
if (serviceContext == null) {
|
|
116
|
+
throw new Error("V1 핸들러를 실행하려면 serviceContext가 필요합니다.");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
for (const handler of handlers) {
|
|
120
|
+
const result = await handler({ request, serviceContext });
|
|
121
|
+
if (result.handled) return result;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return { handled: false };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function resolveAutoUpdateMethods(
|
|
128
|
+
request: V1Request,
|
|
129
|
+
options: V1ConnectionOptions,
|
|
130
|
+
serviceContext: ServiceContext | undefined,
|
|
131
|
+
): V1AutoUpdateMethods | undefined {
|
|
132
|
+
if (options.autoUpdateMethodsFactory == null) return options.autoUpdateMethods;
|
|
133
|
+
if (serviceContext == null) {
|
|
134
|
+
throw new Error("V1 자동 업데이트 fallback을 실행하려면 serviceContext가 필요합니다.");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return options.autoUpdateMethodsFactory({ request, serviceContext });
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function sendResponse(
|
|
141
|
+
socket: WebSocket,
|
|
142
|
+
reqUuid: string,
|
|
143
|
+
state: V1Response["state"],
|
|
144
|
+
body: unknown,
|
|
145
|
+
) {
|
|
146
|
+
const response: V1Response = {
|
|
147
|
+
name: "response",
|
|
148
|
+
reqUuid,
|
|
149
|
+
state,
|
|
150
|
+
body,
|
|
151
|
+
};
|
|
152
|
+
socket.send(JSON.stringify(response));
|
|
153
|
+
}
|
package/src/service-server.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type { WebSocket } from "ws";
|
|
|
18
18
|
import { signJwt, verifyJwt } from "./auth/jwt-manager";
|
|
19
19
|
import type { AuthTokenPayload } from "./auth/auth-token-payload";
|
|
20
20
|
import type { ServiceServerOptions } from "./types/server-options";
|
|
21
|
-
import { handleV1Connection } from "./legacy/v1-auto-update-handler";
|
|
21
|
+
import { handleV1Connection, type V1AutoUpdateMethods } from "./legacy/v1-auto-update-handler";
|
|
22
22
|
import { createServiceContext } from "./core/define-service";
|
|
23
23
|
import consola from "consola";
|
|
24
24
|
|
|
@@ -46,7 +46,8 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
46
46
|
constructor(readonly options: ServiceServerOptions) {
|
|
47
47
|
super();
|
|
48
48
|
|
|
49
|
-
this._jwtSecret =
|
|
49
|
+
this._jwtSecret =
|
|
50
|
+
options.auth != null && options.auth !== false ? options.auth.jwtSecret : undefined;
|
|
50
51
|
|
|
51
52
|
// SSL 설정 (동기)
|
|
52
53
|
// 참고: Fastify HTTPS는 Buffer 타입이 필요함 (Uint8Array를 직접 사용할 수 없음)
|
|
@@ -164,20 +165,23 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
164
165
|
}
|
|
165
166
|
this._wsHandler.addSocket(socket, clientId, clientName, req);
|
|
166
167
|
} else {
|
|
167
|
-
// V1 레거시 지원
|
|
168
|
+
// V1 레거시 지원
|
|
168
169
|
const autoUpdateDef = this.options.services.find((s) => s.name === "AutoUpdate");
|
|
169
|
-
|
|
170
|
+
const legacyV1Handlers = this.options.legacyV1Handlers ?? [];
|
|
171
|
+
if (autoUpdateDef == null && legacyV1Handlers.length < 1) {
|
|
170
172
|
socket.close(1008, "AutoUpdate 서비스가 설정되지 않았습니다");
|
|
171
173
|
return;
|
|
172
174
|
}
|
|
173
175
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
176
|
+
handleV1Connection(socket, {
|
|
177
|
+
serviceContextFactory: (request) =>
|
|
178
|
+
createServiceContext(this, undefined, undefined, { clientName: request.clientName }),
|
|
179
|
+
handlers: legacyV1Handlers,
|
|
180
|
+
autoUpdateMethodsFactory:
|
|
181
|
+
autoUpdateDef == null
|
|
182
|
+
? undefined
|
|
183
|
+
: ({ serviceContext }) =>
|
|
184
|
+
createV1AutoUpdateMethods(autoUpdateDef.factory(serviceContext)),
|
|
181
185
|
});
|
|
182
186
|
}
|
|
183
187
|
};
|
|
@@ -221,9 +225,7 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
221
225
|
this.emit("close");
|
|
222
226
|
}
|
|
223
227
|
|
|
224
|
-
getEvent<TEventDef extends ServiceEventDef>(
|
|
225
|
-
eventName: string,
|
|
226
|
-
): ServerEventProxy<TEventDef> {
|
|
228
|
+
getEvent<TEventDef extends ServiceEventDef>(eventName: string): ServerEventProxy<TEventDef> {
|
|
227
229
|
return {
|
|
228
230
|
emit: (infoSelector, data) => this.emitEvent<TEventDef>(eventName, infoSelector, data),
|
|
229
231
|
};
|
|
@@ -282,3 +284,16 @@ export function createServiceServer<TAuthInfo = unknown>(
|
|
|
282
284
|
): ServiceServer<TAuthInfo> {
|
|
283
285
|
return new ServiceServer<TAuthInfo>(options);
|
|
284
286
|
}
|
|
287
|
+
|
|
288
|
+
function createV1AutoUpdateMethods(
|
|
289
|
+
methods: Record<string, ((...args: any[]) => any) | undefined>,
|
|
290
|
+
): V1AutoUpdateMethods {
|
|
291
|
+
const getLastVersion = methods["getLastVersion"];
|
|
292
|
+
if (getLastVersion == null) {
|
|
293
|
+
throw new Error("AutoUpdate 서비스에 getLastVersion 메서드가 없습니다.");
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return {
|
|
297
|
+
getLastVersion: (platform) => getLastVersion(platform),
|
|
298
|
+
};
|
|
299
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ServiceDefinition } from "../core/define-service";
|
|
2
|
+
import type { V1RequestHandler } from "../legacy/v1-auto-update-handler";
|
|
2
3
|
|
|
3
4
|
export interface ServiceServerOptions {
|
|
4
5
|
rootPath: string;
|
|
@@ -7,8 +8,11 @@ export interface ServiceServerOptions {
|
|
|
7
8
|
pfxBytes: Uint8Array;
|
|
8
9
|
passphrase: string;
|
|
9
10
|
};
|
|
10
|
-
auth?:
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
auth?:
|
|
12
|
+
| {
|
|
13
|
+
jwtSecret: string;
|
|
14
|
+
}
|
|
15
|
+
| false;
|
|
13
16
|
services: ServiceDefinition[];
|
|
17
|
+
legacyV1Handlers?: V1RequestHandler[];
|
|
14
18
|
}
|