@simplysm/service-server 13.0.0-beta.51 → 13.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/jwt-manager.d.ts +3 -8
- package/dist/auth/jwt-manager.d.ts.map +1 -1
- package/dist/auth/jwt-manager.js +19 -28
- package/dist/auth/jwt-manager.js.map +1 -1
- package/dist/core/define-service.js +3 -3
- package/dist/core/define-service.js.map +1 -1
- package/dist/core/service-executor.d.ts +10 -14
- package/dist/core/service-executor.d.ts.map +1 -1
- package/dist/core/service-executor.js +28 -33
- package/dist/core/service-executor.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/protocol/protocol-wrapper.d.ts +17 -9
- package/dist/protocol/protocol-wrapper.d.ts.map +1 -1
- package/dist/protocol/protocol-wrapper.js +37 -48
- package/dist/protocol/protocol-wrapper.js.map +1 -1
- package/dist/service-server.d.ts +0 -5
- package/dist/service-server.d.ts.map +1 -1
- package/dist/service-server.js +17 -17
- package/dist/service-server.js.map +1 -1
- package/dist/services/orm-service.js +2 -2
- package/dist/services/orm-service.js.map +1 -1
- package/dist/transport/http/http-request-handler.d.ts +10 -10
- package/dist/transport/http/http-request-handler.d.ts.map +1 -1
- package/dist/transport/http/http-request-handler.js +42 -47
- package/dist/transport/http/http-request-handler.js.map +1 -1
- package/dist/transport/http/static-file-handler.d.ts +1 -7
- package/dist/transport/http/static-file-handler.d.ts.map +1 -1
- package/dist/transport/http/static-file-handler.js +32 -37
- package/dist/transport/http/static-file-handler.js.map +1 -1
- package/dist/transport/http/upload-handler.d.ts +1 -8
- package/dist/transport/http/upload-handler.d.ts.map +1 -1
- package/dist/transport/http/upload-handler.js +50 -52
- package/dist/transport/http/upload-handler.js.map +1 -1
- package/dist/transport/socket/service-socket.d.ts +45 -25
- package/dist/transport/socket/service-socket.d.ts.map +1 -1
- package/dist/transport/socket/service-socket.js +84 -69
- package/dist/transport/socket/service-socket.js.map +1 -1
- package/dist/transport/socket/websocket-handler.d.ts +32 -8
- package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
- package/dist/transport/socket/websocket-handler.js +75 -75
- package/dist/transport/socket/websocket-handler.js.map +1 -1
- package/dist/utils/config-manager.d.ts +1 -6
- package/dist/utils/config-manager.d.ts.map +1 -1
- package/dist/utils/config-manager.js +47 -50
- package/dist/utils/config-manager.js.map +1 -1
- package/dist/workers/service-protocol.worker.js +2 -2
- package/dist/workers/service-protocol.worker.js.map +1 -1
- package/docs/transport.md +2 -2
- package/package.json +6 -6
- package/src/auth/jwt-manager.ts +28 -36
- package/src/core/define-service.ts +3 -3
- package/src/core/service-executor.ts +42 -43
- package/src/index.ts +3 -3
- package/src/protocol/protocol-wrapper.ts +79 -44
- package/src/service-server.ts +20 -19
- package/src/services/orm-service.ts +2 -2
- package/src/transport/http/http-request-handler.ts +58 -55
- package/src/transport/http/static-file-handler.ts +41 -41
- package/src/transport/http/upload-handler.ts +58 -58
- package/src/transport/socket/service-socket.ts +184 -86
- package/src/transport/socket/websocket-handler.ts +151 -94
- package/src/utils/config-manager.ts +49 -51
- package/src/workers/service-protocol.worker.ts +2 -2
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import type { ServiceServer } from "../service-server";
|
|
2
1
|
import type { AuthTokenPayload } from "./auth-token-payload";
|
|
3
|
-
export declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
sign(payload: AuthTokenPayload<TAuthInfo>): Promise<string>;
|
|
7
|
-
verify(token: string): Promise<AuthTokenPayload<TAuthInfo>>;
|
|
8
|
-
decode(token: string): AuthTokenPayload<TAuthInfo>;
|
|
9
|
-
}
|
|
2
|
+
export declare function signJwt<TAuthInfo = unknown>(jwtSecret: string, payload: AuthTokenPayload<TAuthInfo>): Promise<string>;
|
|
3
|
+
export declare function verifyJwt<TAuthInfo = unknown>(jwtSecret: string, token: string): Promise<AuthTokenPayload<TAuthInfo>>;
|
|
4
|
+
export declare function decodeJwt<TAuthInfo = unknown>(token: string): AuthTokenPayload<TAuthInfo>;
|
|
10
5
|
//# sourceMappingURL=jwt-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-manager.d.ts","sourceRoot":"","sources":["../../src/auth/jwt-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt-manager.d.ts","sourceRoot":"","sources":["../../src/auth/jwt-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAsB,OAAO,CAAC,SAAS,GAAG,OAAO,EAC/C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,SAAS,CAAC,SAAS,GAAG,OAAO,EACjD,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAYtC;AAED,wBAAgB,SAAS,CAAC,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAEzF"}
|
package/dist/auth/jwt-manager.js
CHANGED
|
@@ -1,35 +1,26 @@
|
|
|
1
1
|
import * as jose from "jose";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
return
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (jwtSecret == null) throw new Error("JWT Secret\uC774 \uC815\uC758\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
|
|
15
|
-
const secret = new TextEncoder().encode(jwtSecret);
|
|
16
|
-
try {
|
|
17
|
-
const { payload } = await jose.jwtVerify(token, secret);
|
|
18
|
-
return payload;
|
|
19
|
-
} catch (err) {
|
|
20
|
-
if (err != null && typeof err === "object" && "code" in err && err.code === "ERR_JWT_EXPIRED") {
|
|
21
|
-
throw new Error("\uD1A0\uD070\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
|
|
22
|
-
}
|
|
23
|
-
throw new Error("\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD1A0\uD070\uC785\uB2C8\uB2E4.");
|
|
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);
|
|
5
|
+
}
|
|
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("\uD1A0\uD070\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
|
|
24
14
|
}
|
|
15
|
+
throw new Error("\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD1A0\uD070\uC785\uB2C8\uB2E4.");
|
|
25
16
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return jose.decodeJwt(token);
|
|
30
|
-
}
|
|
17
|
+
}
|
|
18
|
+
function decodeJwt(token) {
|
|
19
|
+
return jose.decodeJwt(token);
|
|
31
20
|
}
|
|
32
21
|
export {
|
|
33
|
-
|
|
22
|
+
decodeJwt,
|
|
23
|
+
signJwt,
|
|
24
|
+
verifyJwt
|
|
34
25
|
};
|
|
35
26
|
//# sourceMappingURL=jwt-manager.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/auth/jwt-manager.ts"],
|
|
4
|
-
"mappings": "
|
|
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,gEAAc;AAAA,IAChC;AACA,UAAM,IAAI,MAAM,uEAAgB;AAAA,EAClC;AACF;AAEO,SAAS,UAA+B,OAA4C;AACzF,SAAO,KAAK,UAAU,KAAK;AAC7B;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { objMerge } from "@simplysm/core-common";
|
|
2
|
-
import {
|
|
2
|
+
import { getConfig } from "../utils/config-manager.js";
|
|
3
3
|
import path from "path";
|
|
4
4
|
function createServiceContext(server, socket, http, legacy) {
|
|
5
5
|
return {
|
|
@@ -25,14 +25,14 @@ function createServiceContext(server, socket, http, legacy) {
|
|
|
25
25
|
async getConfig(section) {
|
|
26
26
|
let configParent = {};
|
|
27
27
|
const rootFilePath = path.resolve(server.options.rootPath, ".config.json");
|
|
28
|
-
const rootConfig = await
|
|
28
|
+
const rootConfig = await getConfig(rootFilePath);
|
|
29
29
|
if (rootConfig != null) {
|
|
30
30
|
configParent = rootConfig;
|
|
31
31
|
}
|
|
32
32
|
const targetPath = this.clientPath;
|
|
33
33
|
if (targetPath != null) {
|
|
34
34
|
const clientFilePath = path.resolve(targetPath, ".config.json");
|
|
35
|
-
const clientConfig = await
|
|
35
|
+
const clientConfig = await getConfig(clientFilePath);
|
|
36
36
|
if (clientConfig != null) {
|
|
37
37
|
configParent = objMerge(configParent, clientConfig);
|
|
38
38
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/define-service.ts"],
|
|
4
|
-
"mappings": "AAGA,SAAS,gBAAgB;AACzB,SAAS,
|
|
4
|
+
"mappings": "AAGA,SAAS,gBAAgB;AACzB,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,IACpE;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,kGAAuB,IAAI,EAAE;AAAA,MAC/C;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,SAAS,cAAc,YAAY;AAAA,QACpD;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,OAAO;AACnC,UAAI,UAAU,KAAM,OAAM,IAAI,MAAM,iFAAqB,OAAO,EAAE;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,MAAM,mBAAmB,uBAAO,iBAAiB;AAG1C,SAAS,0BAA0B,IAAoC;AAC5E,SAAQ,GAA0C,gBAAgB;AACpE;AAYO,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
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import type { ServiceServer } from "../service-server";
|
|
2
2
|
import type { ServiceSocket } from "../transport/socket/service-socket";
|
|
3
3
|
import type { AuthTokenPayload } from "../auth/auth-token-payload";
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
authTokenPayload?: AuthTokenPayload;
|
|
15
|
-
};
|
|
16
|
-
}): Promise<unknown>;
|
|
17
|
-
}
|
|
4
|
+
export declare function runServiceMethod(server: ServiceServer, def: {
|
|
5
|
+
serviceName: string;
|
|
6
|
+
methodName: string;
|
|
7
|
+
params: unknown[];
|
|
8
|
+
socket?: ServiceSocket;
|
|
9
|
+
http?: {
|
|
10
|
+
clientName: string;
|
|
11
|
+
authTokenPayload?: AuthTokenPayload;
|
|
12
|
+
};
|
|
13
|
+
}): Promise<unknown>;
|
|
18
14
|
//# sourceMappingURL=service-executor.d.ts.map
|
|
@@ -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,
|
|
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,gBAAgB,CACpC,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,45 +1,40 @@
|
|
|
1
1
|
import { createServiceContext, getServiceAuthPermissions } from "./define-service.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
async function runServiceMethod(server, def) {
|
|
3
|
+
const serviceDef = server.options.services.find((item) => item.name === def.serviceName);
|
|
4
|
+
if (serviceDef == null) {
|
|
5
|
+
throw new Error(`\uC11C\uBE44\uC2A4[${def.serviceName}]\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
throw new Error(
|
|
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] \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD074\uB77C\uC774\uC5B8\uD2B8\uBA85\uC785\uB2C8\uB2E4: ${clientName}`);
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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(`\uBA54\uC18C\uB4DC[${def.serviceName}.${def.methodName}]\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);
|
|
18
|
+
}
|
|
19
|
+
if (server.options.auth != null) {
|
|
20
|
+
const methodPerms = getServiceAuthPermissions(method);
|
|
21
|
+
const requiredPerms = methodPerms ?? serviceDef.authPermissions;
|
|
22
|
+
if (requiredPerms != null) {
|
|
23
|
+
const authTokenPayload = def.socket?.authTokenPayload ?? def.http?.authTokenPayload;
|
|
24
|
+
if (authTokenPayload == null) {
|
|
25
|
+
throw new Error("\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.");
|
|
15
26
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (typeof method !== "function") {
|
|
21
|
-
throw new Error(`\uBA54\uC18C\uB4DC[${def.serviceName}.${def.methodName}]\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);
|
|
22
|
-
}
|
|
23
|
-
if (this._server.options.auth != null) {
|
|
24
|
-
const methodPerms = getServiceAuthPermissions(method);
|
|
25
|
-
const requiredPerms = methodPerms ?? serviceDef.authPermissions;
|
|
26
|
-
if (requiredPerms != null) {
|
|
27
|
-
const authTokenPayload = def.socket?.authTokenPayload ?? def.http?.authTokenPayload;
|
|
28
|
-
if (authTokenPayload == null) {
|
|
29
|
-
throw new Error("\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.");
|
|
30
|
-
}
|
|
31
|
-
if (requiredPerms.length > 0) {
|
|
32
|
-
const hasPerm = requiredPerms.some((perm) => authTokenPayload.roles.includes(perm));
|
|
33
|
-
if (!hasPerm) {
|
|
34
|
-
throw new Error("\uAD8C\uD55C\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4.");
|
|
35
|
-
}
|
|
27
|
+
if (requiredPerms.length > 0) {
|
|
28
|
+
const hasPerm = requiredPerms.some((perm) => authTokenPayload.roles.includes(perm));
|
|
29
|
+
if (!hasPerm) {
|
|
30
|
+
throw new Error("\uAD8C\uD55C\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4.");
|
|
36
31
|
}
|
|
37
32
|
}
|
|
38
33
|
}
|
|
39
|
-
return await method(...def.params);
|
|
40
34
|
}
|
|
35
|
+
return await method(...def.params);
|
|
41
36
|
}
|
|
42
37
|
export {
|
|
43
|
-
|
|
38
|
+
runServiceMethod
|
|
44
39
|
};
|
|
45
40
|
//# sourceMappingURL=service-executor.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/service-executor.ts"],
|
|
4
|
-
"mappings": "AAGA,SAAS,sBAAsB,iCAAiC;
|
|
4
|
+
"mappings": "AAGA,SAAS,sBAAsB,iCAAiC;AAEhE,eAAsB,iBACpB,QACA,KAOkB;AAElB,QAAM,aAAa,OAAO,QAAQ,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,WAAW;AAEvF,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,sBAAO,IAAI,WAAW,uDAAe;AAAA,EACvD;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,4GAAiC,UAAU,EAAE;AAAA,IAC/D;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,sBAAO,IAAI,WAAW,IAAI,IAAI,UAAU,uDAAe;AAAA,EACzE;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,0DAAa;AAAA,MAC/B;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,oDAAY;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO,MAAM,OAAO,GAAG,IAAI,MAAM;AACnC;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,12 @@ export * from "./auth/auth-token-payload";
|
|
|
3
3
|
export * from "./auth/jwt-manager";
|
|
4
4
|
export * from "./core/define-service";
|
|
5
5
|
export * from "./core/service-executor";
|
|
6
|
-
export
|
|
7
|
-
export
|
|
6
|
+
export { createWebSocketHandler, type WebSocketHandler } from "./transport/socket/websocket-handler";
|
|
7
|
+
export { createServiceSocket, type ServiceSocket } from "./transport/socket/service-socket";
|
|
8
8
|
export * from "./transport/http/http-request-handler";
|
|
9
9
|
export * from "./transport/http/upload-handler";
|
|
10
10
|
export * from "./transport/http/static-file-handler";
|
|
11
|
-
export
|
|
11
|
+
export { createProtocolWrapper, type ProtocolWrapper } from "./protocol/protocol-wrapper";
|
|
12
12
|
export * from "./services/orm-service";
|
|
13
13
|
export * from "./services/crypto-service";
|
|
14
14
|
export * from "./services/smtp-service";
|
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,
|
|
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,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAG5F,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAGrD,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG1F,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAG/C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ export * from "./auth/auth-token-payload.js";
|
|
|
3
3
|
export * from "./auth/jwt-manager.js";
|
|
4
4
|
export * from "./core/define-service.js";
|
|
5
5
|
export * from "./core/service-executor.js";
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { createWebSocketHandler } from "./transport/socket/websocket-handler.js";
|
|
7
|
+
import { createServiceSocket } from "./transport/socket/service-socket.js";
|
|
8
8
|
export * from "./transport/http/http-request-handler.js";
|
|
9
9
|
export * from "./transport/http/upload-handler.js";
|
|
10
10
|
export * from "./transport/http/static-file-handler.js";
|
|
11
|
-
|
|
11
|
+
import { createProtocolWrapper } from "./protocol/protocol-wrapper.js";
|
|
12
12
|
export * from "./services/orm-service.js";
|
|
13
13
|
export * from "./services/crypto-service.js";
|
|
14
14
|
export * from "./services/smtp-service.js";
|
|
@@ -16,4 +16,9 @@ export * from "./services/auto-update-service.js";
|
|
|
16
16
|
export * from "./utils/config-manager.js";
|
|
17
17
|
export * from "./legacy/v1-auto-update-handler.js";
|
|
18
18
|
export * from "./service-server.js";
|
|
19
|
+
export {
|
|
20
|
+
createProtocolWrapper,
|
|
21
|
+
createServiceSocket,
|
|
22
|
+
createWebSocketHandler
|
|
23
|
+
};
|
|
19
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "AACA,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,
|
|
4
|
+
"mappings": "AACA,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,SAAS,8BAAqD;AAC9D,SAAS,2BAA+C;AAGxD,cAAc;AACd,cAAc;AACd,cAAc;AAGd,SAAS,6BAAmD;AAG5D,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
import type { Bytes } from "@simplysm/core-common";
|
|
2
2
|
import type { ServiceMessageDecodeResult, ServiceMessage } from "@simplysm/service-common";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Protocol wrapper interface
|
|
5
|
+
*
|
|
6
|
+
* Automatically offloads heavy message encoding/decoding to a worker thread
|
|
7
|
+
* while using main thread for lightweight operations.
|
|
8
|
+
*/
|
|
9
|
+
export interface ProtocolWrapper {
|
|
8
10
|
/**
|
|
9
|
-
*
|
|
11
|
+
* Encode message (auto worker delegation)
|
|
10
12
|
*/
|
|
11
13
|
encode(uuid: string, message: ServiceMessage): Promise<{
|
|
12
14
|
chunks: Bytes[];
|
|
13
15
|
totalSize: number;
|
|
14
16
|
}>;
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
18
|
+
* Decode message (auto worker delegation)
|
|
17
19
|
*/
|
|
18
20
|
decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>>;
|
|
19
21
|
/**
|
|
20
|
-
*
|
|
22
|
+
* Dispose protocol resources
|
|
21
23
|
*/
|
|
22
|
-
private _shouldUseWorkerForEncode;
|
|
23
24
|
dispose(): void;
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a protocol wrapper instance
|
|
28
|
+
*
|
|
29
|
+
* Automatically offloads heavy message encoding/decoding to a worker thread
|
|
30
|
+
* while using main thread for lightweight operations.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createProtocolWrapper(): ProtocolWrapper;
|
|
25
33
|
//# sourceMappingURL=protocol-wrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F
|
|
1
|
+
{"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/F;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAiBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CA2DvD"}
|
|
@@ -1,49 +1,21 @@
|
|
|
1
1
|
import { Worker } from "@simplysm/core-node";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
return this._worker;
|
|
16
|
-
}
|
|
17
|
-
// 메인 스레드용 프로토콜 인스턴스 (가벼운 작업용)
|
|
18
|
-
_protocol = new ServiceProtocol();
|
|
19
|
-
// 기준값 설정
|
|
20
|
-
_SIZE_THRESHOLD = 30 * 1024;
|
|
21
|
-
// 30KB
|
|
22
|
-
/**
|
|
23
|
-
* 메시지 인코딩 (자동 분기 처리)
|
|
24
|
-
*/
|
|
25
|
-
async encode(uuid, message) {
|
|
26
|
-
if (this._shouldUseWorkerForEncode(message)) {
|
|
27
|
-
return ProtocolWrapper.worker.encode(uuid, message);
|
|
28
|
-
} else {
|
|
29
|
-
return this._protocol.encode(uuid, message);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* 메시지 디코딩 (자동 분기 처리)
|
|
34
|
-
*/
|
|
35
|
-
async decode(bytes) {
|
|
36
|
-
const totalSize = bytes.length;
|
|
37
|
-
if (totalSize > this._SIZE_THRESHOLD) {
|
|
38
|
-
return ProtocolWrapper.worker.decode(bytes);
|
|
39
|
-
} else {
|
|
40
|
-
return this._protocol.decode(bytes);
|
|
41
|
-
}
|
|
2
|
+
import { createServiceProtocol } from "@simplysm/service-common";
|
|
3
|
+
let sharedWorker;
|
|
4
|
+
function getWorker() {
|
|
5
|
+
if (sharedWorker == null) {
|
|
6
|
+
sharedWorker = Worker.create(
|
|
7
|
+
import.meta.resolve("../workers/service-protocol.worker"),
|
|
8
|
+
{
|
|
9
|
+
resourceLimits: { maxOldGenerationSizeMb: 4096 }
|
|
10
|
+
}
|
|
11
|
+
);
|
|
42
12
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
13
|
+
return sharedWorker;
|
|
14
|
+
}
|
|
15
|
+
function createProtocolWrapper() {
|
|
16
|
+
const protocol = createServiceProtocol();
|
|
17
|
+
const SIZE_THRESHOLD = 30 * 1024;
|
|
18
|
+
function shouldUseWorkerForEncode(msg) {
|
|
47
19
|
if (!("body" in msg)) return false;
|
|
48
20
|
const body = msg.body;
|
|
49
21
|
if (body instanceof Uint8Array) {
|
|
@@ -54,11 +26,28 @@ class ProtocolWrapper {
|
|
|
54
26
|
}
|
|
55
27
|
return false;
|
|
56
28
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
29
|
+
return {
|
|
30
|
+
async encode(uuid, message) {
|
|
31
|
+
if (shouldUseWorkerForEncode(message)) {
|
|
32
|
+
return getWorker().encode(uuid, message);
|
|
33
|
+
} else {
|
|
34
|
+
return protocol.encode(uuid, message);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
async decode(bytes) {
|
|
38
|
+
const totalSize = bytes.length;
|
|
39
|
+
if (totalSize > SIZE_THRESHOLD) {
|
|
40
|
+
return getWorker().decode(bytes);
|
|
41
|
+
} else {
|
|
42
|
+
return protocol.decode(bytes);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
dispose() {
|
|
46
|
+
protocol.dispose();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
60
49
|
}
|
|
61
50
|
export {
|
|
62
|
-
|
|
51
|
+
createProtocolWrapper
|
|
63
52
|
};
|
|
64
53
|
//# sourceMappingURL=protocol-wrapper.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/protocol/protocol-wrapper.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,cAAgC;AAEzC,SAAS,
|
|
4
|
+
"mappings": "AACA,SAAS,cAAgC;AAEzC,SAAS,6BAA6B;AA2BtC,IAAI;AAEJ,SAAS,YAA6D;AACpE,MAAI,gBAAgB,MAAM;AACxB,mBAAe,OAAO;AAAA,MACpB,YAAY,QAAQ,oCAAoC;AAAA,MACxD;AAAA,QACE,gBAAgB,EAAE,wBAAwB,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,wBAAyC;AAKvD,QAAM,WAAW,sBAAsB;AACvC,QAAM,iBAAiB,KAAK;AAS5B,WAAS,yBAAyB,KAA8B;AAC9D,QAAI,EAAE,UAAU,KAAM,QAAO;AAE7B,UAAM,OAAO,IAAI;AAGjB,QAAI,gBAAgB,YAAY;AAC9B,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,SAAS,gBAAgB,UAAU;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAMA,SAAO;AAAA,IACL,MAAM,OAAO,MAAc,SAA0E;AACnG,UAAI,yBAAyB,OAAO,GAAG;AACrC,eAAO,UAAU,EAAE,OAAO,MAAM,OAAO;AAAA,MACzC,OAAO;AACL,eAAO,SAAS,OAAO,MAAM,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,OAAmE;AAC9E,YAAM,YAAY,MAAM;AACxB,UAAI,YAAY,gBAAgB;AAC9B,eAAO,UAAU,EAAE,OAAO,KAAK;AAAA,MACjC,OAAO;AACL,eAAO,SAAS,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,UAAgB;AACd,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/service-server.d.ts
CHANGED
|
@@ -9,11 +9,6 @@ export declare class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
9
9
|
}> {
|
|
10
10
|
readonly options: ServiceServerOptions;
|
|
11
11
|
isOpen: boolean;
|
|
12
|
-
private readonly _serviceExecutor;
|
|
13
|
-
private readonly _jwt;
|
|
14
|
-
private readonly _httpRequestHandler;
|
|
15
|
-
private readonly _staticFileHandler;
|
|
16
|
-
private readonly _uploadHandler;
|
|
17
12
|
private readonly _wsHandler;
|
|
18
13
|
readonly fastify: FastifyInstance;
|
|
19
14
|
constructor(options: ServiceServerOptions);
|
|
@@ -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,EAA4B,YAAY,EAAO,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;
|
|
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,EAA4B,YAAY,EAAO,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IAOY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IANlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;IAc5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAK3E,SAAS,CAAC,KAAK,EAAE,KAAK,EAC1B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK;IAKP,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAOtD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAO1E,OAAO,CAAC,yBAAyB;CAyBlC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAAC,SAAS,CAAC,CAEhH"}
|
package/dist/service-server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { handleStaticFile } from "./transport/http/static-file-handler.js";
|
|
2
|
+
import { handleHttpRequest } from "./transport/http/http-request-handler.js";
|
|
3
|
+
import { runServiceMethod } from "./core/service-executor.js";
|
|
4
4
|
import { jsonStringify, jsonParse, EventEmitter, env } from "@simplysm/core-common";
|
|
5
5
|
import fastify from "fastify";
|
|
6
6
|
import fastifyWebsocket from "@fastify/websocket";
|
|
@@ -10,9 +10,9 @@ import fastifyHelmet from "@fastify/helmet";
|
|
|
10
10
|
import fastifyCors from "@fastify/cors";
|
|
11
11
|
import path from "path";
|
|
12
12
|
import { Buffer } from "node:buffer";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
13
|
+
import { handleUpload } from "./transport/http/upload-handler.js";
|
|
14
|
+
import { createWebSocketHandler } from "./transport/socket/websocket-handler.js";
|
|
15
|
+
import { signJwt, verifyJwt } from "./auth/jwt-manager.js";
|
|
16
16
|
import { handleV1Connection } from "./legacy/v1-auto-update-handler.js";
|
|
17
17
|
import { createServiceContext } from "./core/define-service.js";
|
|
18
18
|
import consola from "consola";
|
|
@@ -23,14 +23,10 @@ class ServiceServer extends EventEmitter {
|
|
|
23
23
|
this.options = options;
|
|
24
24
|
const httpsConf = options.ssl ? { pfx: Buffer.from(options.ssl.pfxBytes), passphrase: options.ssl.passphrase } : null;
|
|
25
25
|
this.fastify = fastify({ https: httpsConf });
|
|
26
|
+
this._wsHandler = createWebSocketHandler((def) => runServiceMethod(this, def), options.auth?.jwtSecret);
|
|
26
27
|
}
|
|
27
28
|
isOpen = false;
|
|
28
|
-
|
|
29
|
-
_jwt = new JwtManager(this);
|
|
30
|
-
_httpRequestHandler = new HttpRequestHandler(this, this._serviceExecutor, this._jwt);
|
|
31
|
-
_staticFileHandler = new StaticFileHandler(this);
|
|
32
|
-
_uploadHandler = new UploadHandler(this, this._jwt);
|
|
33
|
-
_wsHandler = new WebSocketHandler(this._serviceExecutor, this._jwt);
|
|
29
|
+
_wsHandler;
|
|
34
30
|
fastify;
|
|
35
31
|
async listen() {
|
|
36
32
|
logger.info(`\uC11C\uBC84 \uC2DC\uC791... ${env.VER ?? ""}`);
|
|
@@ -77,10 +73,10 @@ class ServiceServer extends EventEmitter {
|
|
|
77
73
|
});
|
|
78
74
|
this.fastify.setSerializerCompiler(() => (data) => jsonStringify(data));
|
|
79
75
|
this.fastify.all("/api/:service/:method", async (req, reply) => {
|
|
80
|
-
await this.
|
|
76
|
+
await handleHttpRequest(req, reply, this.options.auth?.jwtSecret, (def) => runServiceMethod(this, def));
|
|
81
77
|
});
|
|
82
78
|
this.fastify.all("/upload", async (req, reply) => {
|
|
83
|
-
await this.
|
|
79
|
+
await handleUpload(req, reply, this.options.rootPath, this.options.auth?.jwtSecret);
|
|
84
80
|
});
|
|
85
81
|
const onWebSocketConnected = (socket, req) => {
|
|
86
82
|
const { ver, clientId, clientName } = req.query;
|
|
@@ -111,7 +107,7 @@ class ServiceServer extends EventEmitter {
|
|
|
111
107
|
handler: async (req, reply) => {
|
|
112
108
|
const urlObj = new URL(req.raw.url, "http://localhost");
|
|
113
109
|
const urlPath = decodeURI(urlObj.pathname.slice(1));
|
|
114
|
-
await
|
|
110
|
+
await handleStaticFile(req, reply, this.options.rootPath, urlPath);
|
|
115
111
|
}
|
|
116
112
|
});
|
|
117
113
|
this.fastify.server.on("error", (err) => {
|
|
@@ -138,10 +134,14 @@ class ServiceServer extends EventEmitter {
|
|
|
138
134
|
await this._wsHandler.emitToServer(eventDef, infoSelector, data);
|
|
139
135
|
}
|
|
140
136
|
async generateAuthToken(payload) {
|
|
141
|
-
|
|
137
|
+
const jwtSecret = this.options.auth?.jwtSecret;
|
|
138
|
+
if (jwtSecret == null) throw new Error("JWT Secret\uC774 \uC815\uC758\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
|
|
139
|
+
return signJwt(jwtSecret, payload);
|
|
142
140
|
}
|
|
143
141
|
async verifyAuthToken(token) {
|
|
144
|
-
|
|
142
|
+
const jwtSecret = this.options.auth?.jwtSecret;
|
|
143
|
+
if (jwtSecret == null) throw new Error("JWT Secret\uC774 \uC815\uC758\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
|
|
144
|
+
return verifyJwt(jwtSecret, token);
|
|
145
145
|
}
|
|
146
146
|
_registerGracefulShutdown() {
|
|
147
147
|
const shutdownHandler = async (signal) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/service-server.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|