@simplysm/service-server 13.0.68 → 13.0.70
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/README.md +48 -249
- package/dist/auth/jwt-manager.js +2 -2
- package/dist/auth/jwt-manager.js.map +1 -1
- package/dist/core/define-service.js +2 -2
- package/dist/core/define-service.js.map +1 -1
- package/dist/core/service-executor.js +5 -5
- package/dist/core/service-executor.js.map +1 -1
- package/dist/legacy/v1-auto-update-handler.d.ts +2 -2
- package/dist/legacy/v1-auto-update-handler.js +2 -2
- package/dist/legacy/v1-auto-update-handler.js.map +1 -1
- package/dist/service-server.js +11 -11
- package/dist/service-server.js.map +1 -1
- package/dist/services/auto-update-service.js +1 -1
- package/dist/services/auto-update-service.js.map +1 -1
- package/dist/services/orm-service.js +6 -6
- package/dist/services/orm-service.js.map +1 -1
- package/dist/transport/http/http-request-handler.js +1 -1
- package/dist/transport/http/http-request-handler.js.map +1 -1
- package/dist/transport/http/static-file-handler.js +3 -3
- package/dist/transport/http/upload-handler.js +2 -2
- package/dist/transport/http/upload-handler.js.map +1 -1
- package/dist/transport/socket/service-socket.js +2 -2
- package/dist/transport/socket/service-socket.js.map +1 -1
- package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
- package/dist/transport/socket/websocket-handler.js +11 -9
- package/dist/transport/socket/websocket-handler.js.map +1 -1
- package/dist/utils/config-manager.js +7 -7
- package/dist/utils/config-manager.js.map +1 -1
- package/package.json +9 -9
- package/src/auth/jwt-manager.ts +2 -2
- package/src/core/define-service.ts +2 -2
- package/src/core/service-executor.ts +13 -13
- package/src/legacy/v1-auto-update-handler.ts +8 -8
- package/src/service-server.ts +28 -28
- package/src/services/auto-update-service.ts +1 -1
- package/src/services/orm-service.ts +6 -6
- package/src/transport/http/http-request-handler.ts +5 -5
- package/src/transport/http/static-file-handler.ts +7 -7
- package/src/transport/http/upload-handler.ts +3 -3
- package/src/transport/socket/service-socket.ts +4 -4
- package/src/transport/socket/websocket-handler.ts +12 -10
- package/src/utils/config-manager.ts +11 -11
- package/tests/define-service.spec.ts +85 -0
- package/tests/orm-service.spec.ts +83 -0
- package/tests/service-executor.spec.ts +114 -0
- package/docs/authentication.md +0 -114
- package/docs/built-in-services.md +0 -100
- package/docs/server.md +0 -374
- package/docs/transport.md +0 -273
|
@@ -13,14 +13,14 @@ const OrmService = defineService(
|
|
|
13
13
|
const sock = () => {
|
|
14
14
|
const socket = ctx.socket;
|
|
15
15
|
if (socket == null) {
|
|
16
|
-
throw new Error("WebSocket
|
|
16
|
+
throw new Error("WebSocket connection is required. ORM service cannot be used over HTTP.");
|
|
17
17
|
}
|
|
18
18
|
return socket;
|
|
19
19
|
};
|
|
20
20
|
const getConf = async (opt) => {
|
|
21
21
|
const config = (await ctx.getConfig("orm"))[opt.configName];
|
|
22
22
|
if (config == null) {
|
|
23
|
-
throw new Error(`ORM
|
|
23
|
+
throw new Error(`ORM configuration not found: ${opt.configName}`);
|
|
24
24
|
}
|
|
25
25
|
return { ...config, ...opt.config };
|
|
26
26
|
};
|
|
@@ -28,7 +28,7 @@ const OrmService = defineService(
|
|
|
28
28
|
const myConns = socketConns.get(sock());
|
|
29
29
|
const conn = myConns?.get(connId);
|
|
30
30
|
if (conn == null) {
|
|
31
|
-
throw new Error("
|
|
31
|
+
throw new Error("Not connected to database. (Invalid Connection ID)");
|
|
32
32
|
}
|
|
33
33
|
return conn;
|
|
34
34
|
};
|
|
@@ -48,7 +48,7 @@ const OrmService = defineService(
|
|
|
48
48
|
socketConns.set(sock(), myConns);
|
|
49
49
|
sock().on("close", async () => {
|
|
50
50
|
if (myConns == null) return;
|
|
51
|
-
logger.debug("
|
|
51
|
+
logger.debug("Socket close detected: cleaning up all open DB connections.");
|
|
52
52
|
const conns = Array.from(myConns.values());
|
|
53
53
|
await Promise.all(
|
|
54
54
|
conns.map(async (conn) => {
|
|
@@ -57,7 +57,7 @@ const OrmService = defineService(
|
|
|
57
57
|
await conn.close();
|
|
58
58
|
}
|
|
59
59
|
} catch (err) {
|
|
60
|
-
logger.warn("
|
|
60
|
+
logger.warn("Error ignored during forced DB connection close", err);
|
|
61
61
|
}
|
|
62
62
|
})
|
|
63
63
|
);
|
|
@@ -80,7 +80,7 @@ const OrmService = defineService(
|
|
|
80
80
|
const conn = getConn(connId);
|
|
81
81
|
await conn.close();
|
|
82
82
|
} catch (err) {
|
|
83
|
-
logger.warn("
|
|
83
|
+
logger.warn("Error ignored during DB connection close", err);
|
|
84
84
|
}
|
|
85
85
|
},
|
|
86
86
|
async beginTransaction(connId, isolationLevel) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/orm-service.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,oBAAoD;AAC7D;AAAA,EAEE;AAAA,EAGA;AAAA,OAGK;AACP,SAAS,eAAe,YAAiC;AAGzD,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,2BAA2B;AAG1D,MAAM,cAAc,oBAAI,QAA4C;AAE7D,MAAM,aAAa;AAAA,EACxB;AAAA,EACA,KAAK,CAAC,QAAQ;AACZ,UAAM,OAAO,MAAqB;AAChC,YAAM,SAAS,IAAI;AACnB,UAAI,UAAU,MAAM;AAClB,cAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -8,7 +8,7 @@ async function handleHttpRequest(req, reply, jwtSecret, runMethod) {
|
|
|
8
8
|
try {
|
|
9
9
|
const authHeader = req.headers.authorization;
|
|
10
10
|
if (authHeader != null) {
|
|
11
|
-
if (jwtSecret == null) throw new Error("JWT Secret
|
|
11
|
+
if (jwtSecret == null) throw new Error("JWT Secret is not defined.");
|
|
12
12
|
const token = authHeader.split(" ")[1];
|
|
13
13
|
authTokenPayload = await verifyJwt(jwtSecret, token);
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/http/http-request-handler.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,iBAAiB;AAE1B,SAAS,iBAAiB;AAG1B,eAAsB,kBACpB,KACA,OACA,WACA,WAMe;AACf,QAAM,EAAE,SAAS,OAAO,IAAI,IAAI;AAGhC,QAAM,aAAa,IAAI,QAAQ,kBAAkB;AACjD,MAAI,cAAc,KAAM,OAAM,IAAI,MAAM,+BAA+B;AAGvE,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,cAAc,MAAM;AACtB,UAAI,aAAa,KAAM,OAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAE1B,SAAS,iBAAiB;AAG1B,eAAsB,kBACpB,KACA,OACA,WACA,WAMe;AACf,QAAM,EAAE,SAAS,OAAO,IAAI,IAAI;AAGhC,QAAM,aAAa,IAAI,QAAQ,kBAAkB;AACjD,MAAI,cAAc,KAAM,OAAM,IAAI,MAAM,+BAA+B;AAGvE,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,cAAc,MAAM;AACtB,UAAI,aAAa,KAAM,OAAM,IAAI,MAAM,4BAA4B;AAEnE,YAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,CAAC;AACrC,yBAAmB,MAAM,UAAqB,WAAW,KAAK;AAAA,IAChE;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC1D,CAAC;AACD;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,IAAI,WAAW,OAAO;AACxB,UAAM,QAAQ,IAAI;AAClB,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,aAAS,UAAU,MAAM,IAAI;AAAA,EAC/B,WAAW,IAAI,WAAW,QAAQ;AAChC,QAAI,CAAC,MAAM,QAAQ,IAAI,IAAI,GAAG;AAC5B,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAEA,aAAS,IAAI;AAAA,EACf;AAGA,MAAI,UAAU,MAAM;AAClB,UAAM,gBAAgB,MAAM,UAAU;AAAA,MACpC,aAAa;AAAA,MACb,YAAY;AAAA,MACZ;AAAA,MACA,MAAM,EAAE,YAAY,iBAAiB;AAAA,IACvC,CAAC;AAED,UAAM,KAAK,aAAa;AAAA,EAC1B;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -17,7 +17,7 @@ async function handleStaticFile(req, reply, rootPath, urlPath) {
|
|
|
17
17
|
targetFilePath = path.resolve(targetFilePath, "index.html");
|
|
18
18
|
}
|
|
19
19
|
if (path.basename(targetFilePath).startsWith(".")) {
|
|
20
|
-
const errorMessage = "
|
|
20
|
+
const errorMessage = "You do not have permission to access this file.";
|
|
21
21
|
responseErrorHtml(reply, 403, errorMessage);
|
|
22
22
|
logger.warn(`[403] ${errorMessage} (${targetFilePath})`);
|
|
23
23
|
return;
|
|
@@ -29,11 +29,11 @@ async function handleStaticFile(req, reply, rootPath, urlPath) {
|
|
|
29
29
|
} catch (err) {
|
|
30
30
|
const error = err;
|
|
31
31
|
if (error.code === "ENOENT") {
|
|
32
|
-
const errorMessage = "
|
|
32
|
+
const errorMessage = "File not found.";
|
|
33
33
|
responseErrorHtml(reply, 404, errorMessage);
|
|
34
34
|
logger.warn(`[404] ${errorMessage} (${targetFilePath})`);
|
|
35
35
|
} else {
|
|
36
|
-
const errorMessage = "
|
|
36
|
+
const errorMessage = "An error occurred while sending the file.";
|
|
37
37
|
responseErrorHtml(reply, 500, errorMessage);
|
|
38
38
|
logger.error(`[500] ${errorMessage}`, err);
|
|
39
39
|
}
|
|
@@ -14,10 +14,10 @@ async function handleUpload(req, reply, rootPath, jwtSecret) {
|
|
|
14
14
|
try {
|
|
15
15
|
const authHeader = req.headers.authorization;
|
|
16
16
|
if (authHeader == null) {
|
|
17
|
-
throw new Error("
|
|
17
|
+
throw new Error("Authentication token is missing.");
|
|
18
18
|
}
|
|
19
19
|
if (jwtSecret == null) {
|
|
20
|
-
throw new Error("JWT Secret
|
|
20
|
+
throw new Error("JWT Secret is not defined.");
|
|
21
21
|
}
|
|
22
22
|
const token = authHeader.split(" ")[1];
|
|
23
23
|
await verifyJwt(jwtSecret, token);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/http/upload-handler.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,SAAS,QAAQ,YAAY;AAGtC,SAAS,iBAAiB;AAC1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAE7D,eAAsB,aACpB,KACA,OACA,UACA,WACe;AACf,MAAI,CAAC,IAAI,YAAY,GAAG;AACtB,UAAM,OAAO,GAAG,EAAE,KAAK,4BAA4B;AACnD;AAAA,EACF;AAGA,MAAI;AACF,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,cAAc,MAAM;AACtB,YAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,SAAS,QAAQ,YAAY;AAGtC,SAAS,iBAAiB;AAC1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAE7D,eAAsB,aACpB,KACA,OACA,UACA,WACe;AACf,MAAI,CAAC,IAAI,YAAY,GAAG;AACtB,UAAM,OAAO,GAAG,EAAE,KAAK,4BAA4B;AACnD;AAAA,EACF;AAGA,MAAI;AACF,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,cAAc,MAAM;AACtB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,QAAI,aAAa,MAAM;AACrB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,CAAC;AACrC,UAAM,UAAU,WAAW,KAAK;AAAA,EAClC,SAAS,KAAK;AACZ,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC1D,CAAC;AACD;AAAA,EACF;AAEA,QAAM,SAAgC,CAAC;AACvC,QAAM,YAAY,KAAK,QAAQ,UAAU,OAAO,SAAS;AAEzD,QAAM,QAAQ,SAAS;AAEvB,MAAI;AAEJ,MAAI;AACF,qBAAiB,QAAQ,IAAI,MAAM,GAAG;AACpC,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,mBAAmB,KAAK;AAC9B,cAAM,YAAY,KAAK,QAAQ,gBAAgB;AAC/C,cAAM,WAAW,GAAG,KAAK,IAAI,EAAE,SAAS,CAAC,GAAG,SAAS;AACrD,0BAAkB,KAAK,KAAK,WAAW,QAAQ;AAE/C,cAAM,SAAS,KAAK,MAAM,kBAAkB,eAAe,CAAC;AAE5D,YAAI,KAAK,KAAK,WAAW;AACvB,gBAAM,IAAI,MAAM,wBAAwB,gBAAgB,EAAE;AAAA,QAC5D;AAEA,cAAM,QAAQ,MAAM,OAAO,eAAe;AAE1C,eAAO,KAAK;AAAA,UACV,MAAM,WAAW,QAAQ;AAAA,UACzB,UAAU;AAAA,UACV,MAAM,MAAM;AAAA,QACd,CAAC;AAED,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,GAAG;AAEhC,QAAI,mBAAmB,MAAM;AAC3B,YAAM,KAAK,eAAe,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC1C,aAAO,KAAK,4BAA4B,eAAe,EAAE;AAAA,IAC3D;AAEA,UAAM,KAAK,GAAG,EAAE,KAAK,eAAe;AAAA,EACtC;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -31,7 +31,7 @@ function createServiceSocket(socket, clientId, clientName, connReq) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
function onError(err) {
|
|
34
|
-
logger.error("WebSocket
|
|
34
|
+
logger.error("WebSocket client error", err);
|
|
35
35
|
emitEvent("error", err);
|
|
36
36
|
}
|
|
37
37
|
function onClose(code) {
|
|
@@ -61,7 +61,7 @@ function createServiceSocket(socket, clientId, clientName, connReq) {
|
|
|
61
61
|
emitEvent("message", { uuid: decodeResult.uuid, msg });
|
|
62
62
|
}
|
|
63
63
|
} catch (err) {
|
|
64
|
-
logger.error("
|
|
64
|
+
logger.error("Error processing WebSocket message", err);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
socket.on("close", onClose);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/socket/service-socket.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,gBAAgB;AAEzB,SAAS,qBAAqB;AAC9B,OAAO,aAAa;AACpB,SAAS,iBAAiB;AAE1B,SAAS,6BAA6B;AAOtC,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AA0DtD,SAAS,oBACd,QACA,UACA,YACA,SACe;AAKf,QAAM,gBAAgB;AACtB,QAAM,cAAc,IAAI,WAAW,CAAC,CAAI,CAAC;AAEzC,QAAM,WAAW,sBAAsB;AACvC,QAAM,gBAA0E,CAAC;AACjF,QAAM,gBAAgB;AAAA,IACpB,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI,UAAU;AACd,MAAI;AAEJ,QAAM,sBAAsB,IAAI,SAAS;AAMzC,iBAAe,aAAa,MAAc,KAA+C;AACvF,QAAI,OAAO,eAAe,UAAU,KAAM,QAAO;AAEjD,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO,MAAM,GAAG;AAClD,eAAW,SAAS,QAAQ;AAC1B,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO,OAAO,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC;AAAA,EAC1D;AAEA,WAAS,UACP,UACG,MACG;AACN,eAAW,WAAW,cAAc,KAAK,GAAG;AAC1C,MAAC,QAAyC,GAAG,IAAI;AAAA,IACnD;AAAA,EACF;AAMA,WAAS,QAAQ,KAAkB;AACjC,WAAO,MAAM,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\socket\\websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,EACvB,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\socket\\websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,EACvB,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,CAkMlB"}
|
|
@@ -46,12 +46,12 @@ function createWebSocketHandler(runMethod, jwtSecret) {
|
|
|
46
46
|
}
|
|
47
47
|
return await serviceSocket.send(uuid, { name: "response" });
|
|
48
48
|
} else if (message.name === "auth") {
|
|
49
|
-
if (jwtSecret == null) throw new Error("JWT Secret
|
|
49
|
+
if (jwtSecret == null) throw new Error("JWT Secret is not defined.");
|
|
50
50
|
const token = message.body;
|
|
51
51
|
serviceSocket.authTokenPayload = await verifyJwt(jwtSecret, token);
|
|
52
52
|
return await serviceSocket.send(uuid, { name: "response" });
|
|
53
53
|
} else {
|
|
54
|
-
const err = new Error("
|
|
54
|
+
const err = new Error("Invalid request.");
|
|
55
55
|
return await serviceSocket.send(uuid, {
|
|
56
56
|
name: "error",
|
|
57
57
|
body: {
|
|
@@ -63,7 +63,7 @@ function createWebSocketHandler(runMethod, jwtSecret) {
|
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
} catch (err) {
|
|
66
|
-
const error = err instanceof Error ? err : new Error(typeof err === "string" ? err : "
|
|
66
|
+
const error = err instanceof Error ? err : new Error(typeof err === "string" ? err : "An unknown error has occurred.");
|
|
67
67
|
return serviceSocket.send(uuid, {
|
|
68
68
|
name: "error",
|
|
69
69
|
body: {
|
|
@@ -83,26 +83,28 @@ function createWebSocketHandler(runMethod, jwtSecret) {
|
|
|
83
83
|
if (prevServiceSocket != null) {
|
|
84
84
|
prevServiceSocket.close();
|
|
85
85
|
const connectionDateTimeText = prevServiceSocket.connectedAtDateTime.toFormatString("yyyy:MM:dd HH:mm:ss.fff");
|
|
86
|
-
logger.debug(
|
|
86
|
+
logger.debug(
|
|
87
|
+
`Disconnected previous client connection: ${clientId}: ${connectionDateTimeText}`
|
|
88
|
+
);
|
|
87
89
|
}
|
|
88
90
|
socketMap.set(clientId, serviceSocket);
|
|
89
91
|
serviceSocket.on("close", (code) => {
|
|
90
|
-
logger.debug(
|
|
92
|
+
logger.debug(`Client disconnected: (code: ${code})`);
|
|
91
93
|
if (socketMap.get(clientId) !== serviceSocket) return;
|
|
92
94
|
socketMap.delete(clientId);
|
|
93
95
|
});
|
|
94
96
|
serviceSocket.on("message", async ({ uuid, msg }) => {
|
|
95
|
-
logger.debug("
|
|
97
|
+
logger.debug("Request received", msg);
|
|
96
98
|
const sentSize = await processRequest(serviceSocket, uuid, msg);
|
|
97
|
-
logger.debug(
|
|
99
|
+
logger.debug(`Response sent (size: ${sentSize})`);
|
|
98
100
|
});
|
|
99
|
-
logger.debug("
|
|
101
|
+
logger.debug("Client connected", {
|
|
100
102
|
clientId,
|
|
101
103
|
remoteAddress: connReq.socket.remoteAddress,
|
|
102
104
|
socketSize: socketMap.size
|
|
103
105
|
});
|
|
104
106
|
} catch (err) {
|
|
105
|
-
logger.error("
|
|
107
|
+
logger.error("Error handling connection", err);
|
|
106
108
|
socket.terminate();
|
|
107
109
|
}
|
|
108
110
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/socket/websocket-handler.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,YAAY;AAErB,SAAS,2BAA+C;AACxD,SAAS,iBAAiB;AAE1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,iCAAiC;AAwCzD,SAAS,uBACd,WAMA,WACkB;AAKlB,QAAM,YAAY,oBAAI,IAA2B;AAMjD,iBAAe,eACb,eACA,MACA,SACiB;AACjB,QAAI;AACF,UAAI,QAAQ,KAAK,SAAS,GAAG,KAAK,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7D,cAAM,CAAC,aAAa,UAAU,IAAI,QAAQ,KAAK,MAAM,GAAG;AAExD,cAAM,SAAS,MAAM,UAAU;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,YAAY,MAAM,OAAO,CAAC;AAAA,MAC1E,WAAW,QAAQ,SAAS,WAAW;AACrC,cAAM,EAAE,KAAK,MAAM,KAAK,IAAI,QAAQ;AACpC,sBAAc,iBAAiB,KAAK,MAAM,IAAI;AAC9C,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,cAAc;AACxC,cAAM,EAAE,IAAI,IAAI,QAAQ;AACxB,sBAAc,oBAAoB,GAAG;AACrC,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,YAAY;AACtC,cAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,cAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,UAAQ,CAAC,YACpD,QAAQ,kBAAkB,IAAI;AAAA,QAChC;AACA,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,MACzE,WAAW,QAAQ,SAAS,YAAY;AACtC,cAAM,EAAE,MAAM,KAAK,IAAI,QAAQ;AAE/B,mBAAW,WAAW,UAAU,OAAO,GAAG;AACxC,gBAAM,aAAa,QAAQ,sBAAsB,IAAI;AACrD,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,QAAQ,KAAK,MAAM;AAAA,cACvB,MAAM;AAAA,cACN,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,QAAQ;AAClC,YAAI,aAAa,KAAM,OAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AACA,SAAS,YAAY;AAErB,SAAS,2BAA+C;AACxD,SAAS,iBAAiB;AAE1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,iCAAiC;AAwCzD,SAAS,uBACd,WAMA,WACkB;AAKlB,QAAM,YAAY,oBAAI,IAA2B;AAMjD,iBAAe,eACb,eACA,MACA,SACiB;AACjB,QAAI;AACF,UAAI,QAAQ,KAAK,SAAS,GAAG,KAAK,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7D,cAAM,CAAC,aAAa,UAAU,IAAI,QAAQ,KAAK,MAAM,GAAG;AAExD,cAAM,SAAS,MAAM,UAAU;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,YAAY,MAAM,OAAO,CAAC;AAAA,MAC1E,WAAW,QAAQ,SAAS,WAAW;AACrC,cAAM,EAAE,KAAK,MAAM,KAAK,IAAI,QAAQ;AACpC,sBAAc,iBAAiB,KAAK,MAAM,IAAI;AAC9C,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,cAAc;AACxC,cAAM,EAAE,IAAI,IAAI,QAAQ;AACxB,sBAAc,oBAAoB,GAAG;AACrC,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,YAAY;AACtC,cAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,cAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,UAAQ,CAAC,YACpD,QAAQ,kBAAkB,IAAI;AAAA,QAChC;AACA,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,MACzE,WAAW,QAAQ,SAAS,YAAY;AACtC,cAAM,EAAE,MAAM,KAAK,IAAI,QAAQ;AAE/B,mBAAW,WAAW,UAAU,OAAO,GAAG;AACxC,gBAAM,aAAa,QAAQ,sBAAsB,IAAI;AACrD,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,QAAQ,KAAK,MAAM;AAAA,cACvB,MAAM;AAAA,cACN,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,QAAQ;AAClC,YAAI,aAAa,KAAM,OAAM,IAAI,MAAM,4BAA4B;AAEnE,cAAM,QAAQ,QAAQ;AACtB,sBAAc,mBAAmB,MAAM,UAAU,WAAW,KAAK;AACjE,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,OAAO;AACL,cAAM,MAAM,IAAI,MAAM,kBAAkB;AAExC,eAAO,MAAM,cAAc,KAAK,MAAM;AAAA,UACpC,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,MAAM,IAAI;AAAA,YACV,SAAS,IAAI;AAAA,YACb,OAAO,IAAI;AAAA,YACX,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,QACJ,eAAe,QACX,MACA,IAAI,MAAM,OAAO,QAAQ,WAAW,MAAM,gCAAgC;AAEhF,aAAO,cAAc,KAAK,MAAM;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,MAAM;AAAA,UACN,OAAO,MAAM;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAMA,SAAO;AAAA,IACL,UACE,QACA,UACA,YACA,SACM;AACN,UAAI;AACF,cAAM,gBAAgB,oBAAoB,QAAQ,UAAU,YAAY,OAAO;AAG/E,cAAM,oBAAoB,UAAU,IAAI,QAAQ;AAChD,YAAI,qBAAqB,MAAM;AAC7B,4BAAkB,MAAM;AAExB,gBAAM,yBACJ,kBAAkB,oBAAoB,eAAe,yBAAyB;AAChF,iBAAO;AAAA,YACL,4CAA4C,QAAQ,KAAK,sBAAsB;AAAA,UACjF;AAAA,QACF;AAEA,kBAAU,IAAI,UAAU,aAAa;AAErC,sBAAc,GAAG,SAAS,CAAC,SAAS;AAClC,iBAAO,MAAM,+BAA+B,IAAI,GAAG;AAEnD,cAAI,UAAU,IAAI,QAAQ,MAAM,cAAe;AAC/C,oBAAU,OAAO,QAAQ;AAAA,QAC3B,CAAC;AAED,sBAAc,GAAG,WAAW,OAAO,EAAE,MAAM,IAAI,MAAM;AACnD,iBAAO,MAAM,oBAAoB,GAAG;AACpC,gBAAM,WAAW,MAAM,eAAe,eAAe,MAAM,GAAG;AAC9D,iBAAO,MAAM,wBAAwB,QAAQ,GAAG;AAAA,QAClD,CAAC;AAED,eAAO,MAAM,oBAAoB;AAAA,UAC/B;AAAA,UACA,eAAe,QAAQ,OAAO;AAAA,UAC9B,YAAY,UAAU;AAAA,QACxB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,6BAA6B,GAAG;AAC7C,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,WAAiB;AACf,iBAAW,iBAAiB,UAAU,OAAO,GAAG;AAC9C,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,gBACJ,YACA,gBACe;AACf,iBAAW,iBAAiB,UAAU,OAAO,GAAG;AAC9C,cAAM,cAAc,KAAK,KAAK,IAAI,EAAE,SAAS,GAAG;AAAA,UAC9C,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAM,aACJ,UACA,cACA,MACe;AACf,YAAM,YAAY,SAAS;AAC3B,YAAM,aAAa,MAAM,KAAK,UAAU,OAAO,CAAC,EAC7C,QAAQ,CAAC,YAAY,QAAQ,kBAAkB,SAAS,CAAC,EACzD,OAAO,CAAC,SAAS,aAAa,KAAK,IAAa,CAAC,EACjD,IAAI,CAAC,SAAS,KAAK,GAAG;AAEzB,iBAAW,WAAW,UAAU,OAAO,GAAG;AACxC,cAAM,gBAAgB,QAAQ,sBAAsB,UAAU;AAC9D,YAAI,cAAc,SAAS,GAAG;AAC5B,gBAAM,QAAQ,KAAK,KAAK,IAAI,EAAE,SAAS,GAAG;AAAA,YACxC,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,MAAM;AAAA,cACN;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -5,11 +5,11 @@ import consola from "consola";
|
|
|
5
5
|
const logger = consola.withTag("service-server:ConfigManager");
|
|
6
6
|
const _cache = new LazyGcMap({
|
|
7
7
|
gcInterval: 10 * 60 * 1e3,
|
|
8
|
-
// 10
|
|
8
|
+
// Every 10 minutes
|
|
9
9
|
expireTime: 60 * 60 * 1e3,
|
|
10
|
-
// 1
|
|
10
|
+
// Expire after 1 hour
|
|
11
11
|
onExpire: async (filePath) => {
|
|
12
|
-
logger.debug(
|
|
12
|
+
logger.debug(`Config cache expired and watcher released: ${path.basename(filePath)}`);
|
|
13
13
|
await closeWatcher(filePath);
|
|
14
14
|
}
|
|
15
15
|
});
|
|
@@ -29,19 +29,19 @@ async function getConfig(filePath) {
|
|
|
29
29
|
if (!await fsExists(filePath)) {
|
|
30
30
|
_cache.delete(filePath);
|
|
31
31
|
await closeWatcher(filePath);
|
|
32
|
-
logger.debug(
|
|
32
|
+
logger.debug(`Config file deleted: ${path.basename(filePath)}`);
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
try {
|
|
36
36
|
const newConfig = await fsReadJson(filePath);
|
|
37
37
|
_cache.set(filePath, newConfig);
|
|
38
|
-
logger.debug(
|
|
38
|
+
logger.debug(`Config file live-reloaded: ${path.basename(filePath)}`);
|
|
39
39
|
} catch (err) {
|
|
40
|
-
logger.warn(
|
|
40
|
+
logger.warn(`Config file reload failed: ${filePath}`, err);
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
} catch (err) {
|
|
44
|
-
logger.error(
|
|
44
|
+
logger.error(`Watch failed: ${filePath}`, err);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
return config;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/config-manager.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,UAAU,YAAY,iBAAiB;AAChD,OAAO,UAAU;AACjB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAG7D,MAAM,SAAS,IAAI,UAA2B;AAAA,EAC5C,YAAY,KAAK,KAAK;AAAA;AAAA,EACtB,YAAY,KAAK,KAAK;AAAA;AAAA,EACtB,UAAU,OAAO,aAAa;AAC5B,WAAO,MAAM,
|
|
4
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,UAAU,YAAY,iBAAiB;AAChD,OAAO,UAAU;AACjB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAG7D,MAAM,SAAS,IAAI,UAA2B;AAAA,EAC5C,YAAY,KAAK,KAAK;AAAA;AAAA,EACtB,YAAY,KAAK,KAAK;AAAA;AAAA,EACtB,UAAU,OAAO,aAAa;AAC5B,WAAO,MAAM,8CAA8C,KAAK,SAAS,QAAQ,CAAC,EAAE;AACpF,UAAM,aAAa,QAAQ;AAAA,EAC7B;AACF,CAAC;AAED,MAAM,YAAY,oBAAI,IAAuB;AAE7C,eAAsB,UAAmB,UAAgD;AAEvF,MAAI,OAAO,IAAI,QAAQ,GAAG;AACxB,WAAO,OAAO,IAAI,QAAQ;AAAA,EAC5B;AAEA,MAAI,CAAE,MAAM,SAAS,QAAQ,EAAI,QAAO;AAGxC,QAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,SAAO,IAAI,UAAU,MAAM;AAG3B,MAAI,CAAC,UAAU,IAAI,QAAQ,GAAG;AAC5B,QAAI;AACF,YAAM,UAAU,MAAM,UAAU,MAAM,CAAC,QAAQ,CAAC;AAChD,gBAAU,IAAI,UAAU,OAAO;AAE/B,cAAQ,SAAS,EAAE,OAAO,IAAI,GAAG,YAAY;AAC3C,YAAI,CAAE,MAAM,SAAS,QAAQ,GAAI;AAC/B,iBAAO,OAAO,QAAQ;AACtB,gBAAM,aAAa,QAAQ;AAC3B,iBAAO,MAAM,wBAAwB,KAAK,SAAS,QAAQ,CAAC,EAAE;AAC9D;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,YAAY,MAAM,WAAW,QAAQ;AAC3C,iBAAO,IAAI,UAAU,SAAS;AAC9B,iBAAO,MAAM,8BAA8B,KAAK,SAAS,QAAQ,CAAC,EAAE;AAAA,QACtE,SAAS,KAAK;AACZ,iBAAO,KAAK,8BAA8B,QAAQ,IAAI,GAAG;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,MAAM,iBAAiB,QAAQ,IAAI,GAAG;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,aAAa,UAAkB;AAC5C,QAAM,UAAU,UAAU,IAAI,QAAQ;AACtC,MAAI,WAAW,MAAM;AACnB,UAAM,QAAQ,MAAM;AACpB,cAAU,OAAO,QAAQ;AAAA,EAC3B;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/service-server",
|
|
3
|
-
"version": "13.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "
|
|
3
|
+
"version": "13.0.70",
|
|
4
|
+
"description": "Simplysm package - service module (server)",
|
|
5
|
+
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
17
|
"src",
|
|
18
|
-
"
|
|
18
|
+
"tests"
|
|
19
19
|
],
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"dependencies": {
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"semver": "^7.7.4",
|
|
35
35
|
"utf-8-validate": "^6.0.6",
|
|
36
36
|
"ws": "^8.19.0",
|
|
37
|
-
"@simplysm/
|
|
38
|
-
"@simplysm/
|
|
39
|
-
"@simplysm/core-
|
|
40
|
-
"@simplysm/service-common": "13.0.
|
|
41
|
-
"@simplysm/orm-node": "13.0.
|
|
37
|
+
"@simplysm/orm-common": "13.0.70",
|
|
38
|
+
"@simplysm/core-node": "13.0.70",
|
|
39
|
+
"@simplysm/core-common": "13.0.70",
|
|
40
|
+
"@simplysm/service-common": "13.0.70",
|
|
41
|
+
"@simplysm/orm-node": "13.0.70"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/semver": "^7.7.1",
|
package/src/auth/jwt-manager.ts
CHANGED
|
@@ -25,9 +25,9 @@ export async function verifyJwt<TAuthInfo = unknown>(
|
|
|
25
25
|
return payload as AuthTokenPayload<TAuthInfo>;
|
|
26
26
|
} catch (err) {
|
|
27
27
|
if (err != null && typeof err === "object" && "code" in err && err.code === "ERR_JWT_EXPIRED") {
|
|
28
|
-
throw new Error("
|
|
28
|
+
throw new Error("Token has expired.");
|
|
29
29
|
}
|
|
30
|
-
throw new Error("
|
|
30
|
+
throw new Error("Invalid token.");
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -49,7 +49,7 @@ export function createServiceContext<TAuthInfo = unknown>(
|
|
|
49
49
|
if (name == null) return undefined;
|
|
50
50
|
|
|
51
51
|
if (name === "" || name.includes("..") || name.includes("/") || name.includes("\\")) {
|
|
52
|
-
throw new Error(
|
|
52
|
+
throw new Error(`Invalid client name: ${name}`);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
return name;
|
|
@@ -79,7 +79,7 @@ export function createServiceContext<TAuthInfo = unknown>(
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
const config = configParent[section];
|
|
82
|
-
if (config == null) throw new Error(
|
|
82
|
+
if (config == null) throw new Error(`Configuration section not found: ${section}`);
|
|
83
83
|
return config;
|
|
84
84
|
},
|
|
85
85
|
};
|
|
@@ -13,36 +13,36 @@ export async function runServiceMethod(
|
|
|
13
13
|
http?: { clientName: string; authTokenPayload?: AuthTokenPayload };
|
|
14
14
|
},
|
|
15
15
|
): Promise<unknown> {
|
|
16
|
-
//
|
|
16
|
+
// Find service definition
|
|
17
17
|
const serviceDef = server.options.services.find((item) => item.name === def.serviceName);
|
|
18
18
|
|
|
19
19
|
if (serviceDef == null) {
|
|
20
|
-
throw new Error(
|
|
20
|
+
throw new Error(`Service [${def.serviceName}] not found.`);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
//
|
|
23
|
+
// Request validation (gatekeeper)
|
|
24
24
|
const clientName = def.socket?.clientName ?? def.http?.clientName;
|
|
25
25
|
if (clientName != null) {
|
|
26
26
|
if (clientName.includes("..") || clientName.includes("/") || clientName.includes("\\")) {
|
|
27
|
-
throw new Error(`[Security]
|
|
27
|
+
throw new Error(`[Security] Invalid client name: ${clientName}`);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
//
|
|
31
|
+
// Create context
|
|
32
32
|
const ctx = createServiceContext(server, def.socket, def.http);
|
|
33
33
|
|
|
34
|
-
//
|
|
34
|
+
// Invoke factory to create method object
|
|
35
35
|
const methods = serviceDef.factory(ctx);
|
|
36
36
|
|
|
37
|
-
//
|
|
37
|
+
// Find method
|
|
38
38
|
const method = (methods as Record<string, unknown>)[def.methodName];
|
|
39
39
|
if (typeof method !== "function") {
|
|
40
|
-
throw new Error(
|
|
40
|
+
throw new Error(`Method [${def.serviceName}.${def.methodName}] not found.`);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
//
|
|
43
|
+
// Auth check
|
|
44
44
|
if (server.options.auth != null) {
|
|
45
|
-
//
|
|
45
|
+
// Check method-level auth first, fallback to service-level
|
|
46
46
|
const methodPerms = getServiceAuthPermissions(method);
|
|
47
47
|
const requiredPerms = methodPerms ?? serviceDef.authPermissions;
|
|
48
48
|
|
|
@@ -50,18 +50,18 @@ export async function runServiceMethod(
|
|
|
50
50
|
const authTokenPayload = def.socket?.authTokenPayload ?? def.http?.authTokenPayload;
|
|
51
51
|
|
|
52
52
|
if (authTokenPayload == null) {
|
|
53
|
-
throw new Error("
|
|
53
|
+
throw new Error("Login is required.");
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
if (requiredPerms.length > 0) {
|
|
57
57
|
const hasPerm = requiredPerms.some((perm) => authTokenPayload.roles.includes(perm));
|
|
58
58
|
if (!hasPerm) {
|
|
59
|
-
throw new Error("
|
|
59
|
+
throw new Error("Insufficient permissions.");
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
//
|
|
65
|
+
// Execute
|
|
66
66
|
return await method(...def.params);
|
|
67
67
|
}
|
|
@@ -18,24 +18,24 @@ interface IV1Response {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* V1
|
|
22
|
-
*
|
|
21
|
+
* V1 legacy client handler (only auto-update supported).
|
|
22
|
+
* All other requests return an upgrade-required error.
|
|
23
23
|
*/
|
|
24
24
|
export function handleV1Connection(
|
|
25
25
|
socket: WebSocket,
|
|
26
26
|
autoUpdateMethods: { getLastVersion: (platform: string) => Promise<any> },
|
|
27
27
|
clientNameSetter?: (clientName: string | undefined) => void,
|
|
28
28
|
) {
|
|
29
|
-
//
|
|
29
|
+
// Notify connection established
|
|
30
30
|
socket.send(JSON.stringify({ name: "connected" }));
|
|
31
31
|
|
|
32
32
|
socket.on("message", (data) => {
|
|
33
33
|
try {
|
|
34
34
|
const msg = JSON.parse(data.toString()) as IV1Request;
|
|
35
35
|
|
|
36
|
-
// SdAutoUpdateService.getLastVersion
|
|
36
|
+
// Only allow SdAutoUpdateService.getLastVersion
|
|
37
37
|
if (msg.command === "SdAutoUpdateService.getLastVersion") {
|
|
38
|
-
// legacy
|
|
38
|
+
// Set legacy context
|
|
39
39
|
clientNameSetter?.(msg.clientName);
|
|
40
40
|
|
|
41
41
|
const result = autoUpdateMethods.getLastVersion(msg.params[0] as string);
|
|
@@ -48,20 +48,20 @@ export function handleV1Connection(
|
|
|
48
48
|
};
|
|
49
49
|
socket.send(JSON.stringify(response));
|
|
50
50
|
} else {
|
|
51
|
-
//
|
|
51
|
+
// All other requests prompt for upgrade
|
|
52
52
|
const response: IV1Response = {
|
|
53
53
|
name: "response",
|
|
54
54
|
reqUuid: msg.uuid,
|
|
55
55
|
state: "error",
|
|
56
56
|
body: {
|
|
57
|
-
message: "
|
|
57
|
+
message: "App upgrade is required.",
|
|
58
58
|
code: "UPGRADE_REQUIRED",
|
|
59
59
|
},
|
|
60
60
|
};
|
|
61
61
|
socket.send(JSON.stringify(response));
|
|
62
62
|
}
|
|
63
63
|
} catch (err) {
|
|
64
|
-
logger.warn("V1
|
|
64
|
+
logger.warn("V1 message processing error", err);
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
}
|