@simplysm/service-server 13.0.99 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/auth/auth-token-payload.js +2 -1
  2. package/dist/auth/auth-token-payload.js.map +1 -6
  3. package/dist/auth/jwt-manager.js +21 -21
  4. package/dist/auth/jwt-manager.js.map +1 -6
  5. package/dist/core/define-service.d.ts +12 -12
  6. package/dist/core/define-service.d.ts.map +1 -1
  7. package/dist/core/define-service.js +77 -63
  8. package/dist/core/define-service.js.map +1 -6
  9. package/dist/core/service-executor.d.ts.map +1 -1
  10. package/dist/core/service-executor.js +42 -32
  11. package/dist/core/service-executor.js.map +1 -6
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +11 -2
  15. package/dist/index.js.map +1 -6
  16. package/dist/legacy/v1-auto-update-handler.d.ts +2 -2
  17. package/dist/legacy/v1-auto-update-handler.js +42 -35
  18. package/dist/legacy/v1-auto-update-handler.js.map +1 -6
  19. package/dist/protocol/protocol-wrapper.d.ts +9 -9
  20. package/dist/protocol/protocol-wrapper.js +64 -46
  21. package/dist/protocol/protocol-wrapper.js.map +1 -6
  22. package/dist/service-server.d.ts +2 -0
  23. package/dist/service-server.d.ts.map +1 -1
  24. package/dist/service-server.js +187 -165
  25. package/dist/service-server.js.map +1 -6
  26. package/dist/services/auto-update-service.js +35 -34
  27. package/dist/services/auto-update-service.js.map +1 -6
  28. package/dist/services/orm-service.js +114 -120
  29. package/dist/services/orm-service.js.map +1 -6
  30. package/dist/transport/http/http-request-handler.d.ts.map +1 -1
  31. package/dist/transport/http/http-request-handler.js +58 -46
  32. package/dist/transport/http/http-request-handler.js.map +1 -6
  33. package/dist/transport/http/static-file-handler.js +42 -39
  34. package/dist/transport/http/static-file-handler.js.map +1 -6
  35. package/dist/transport/http/upload-handler.d.ts.map +1 -1
  36. package/dist/transport/http/upload-handler.js +60 -55
  37. package/dist/transport/http/upload-handler.js.map +1 -6
  38. package/dist/transport/socket/service-socket.d.ts +13 -13
  39. package/dist/transport/socket/service-socket.js +132 -108
  40. package/dist/transport/socket/service-socket.js.map +1 -6
  41. package/dist/transport/socket/websocket-handler.d.ts +10 -10
  42. package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
  43. package/dist/transport/socket/websocket-handler.js +154 -139
  44. package/dist/transport/socket/websocket-handler.js.map +1 -6
  45. package/dist/types/server-options.d.ts +1 -1
  46. package/dist/types/server-options.d.ts.map +1 -1
  47. package/dist/types/server-options.js +2 -1
  48. package/dist/types/server-options.js.map +1 -6
  49. package/dist/utils/config-manager.js +48 -46
  50. package/dist/utils/config-manager.js.map +1 -6
  51. package/dist/workers/service-protocol.worker.js +8 -11
  52. package/dist/workers/service-protocol.worker.js.map +1 -6
  53. package/package.json +12 -14
  54. package/src/auth/jwt-manager.ts +2 -2
  55. package/src/core/define-service.ts +19 -19
  56. package/src/core/service-executor.ts +23 -17
  57. package/src/index.ts +10 -12
  58. package/src/legacy/v1-auto-update-handler.ts +10 -10
  59. package/src/protocol/protocol-wrapper.ts +16 -16
  60. package/src/service-server.ts +52 -39
  61. package/src/services/auto-update-service.ts +1 -1
  62. package/src/services/orm-service.ts +7 -7
  63. package/src/transport/http/http-request-handler.ts +16 -10
  64. package/src/transport/http/static-file-handler.ts +8 -8
  65. package/src/transport/http/upload-handler.ts +16 -9
  66. package/src/transport/socket/service-socket.ts +22 -22
  67. package/src/transport/socket/websocket-handler.ts +59 -60
  68. package/src/types/server-options.ts +1 -1
  69. package/src/utils/config-manager.ts +11 -11
  70. package/README.md +0 -163
  71. package/dist/services/smtp-client-service.d.ts +0 -8
  72. package/dist/services/smtp-client-service.d.ts.map +0 -1
  73. package/dist/services/smtp-client-service.js +0 -46
  74. package/dist/services/smtp-client-service.js.map +0 -6
  75. package/docs/auth.md +0 -59
  76. package/docs/core.md +0 -133
  77. package/docs/server.md +0 -126
  78. package/docs/services.md +0 -58
  79. package/docs/transport.md +0 -164
  80. package/src/services/smtp-client-service.ts +0 -59
  81. package/tests/define-service.spec.ts +0 -66
  82. package/tests/orm-service.spec.ts +0 -83
  83. package/tests/service-executor.spec.ts +0 -114
@@ -2,38 +2,39 @@ import path from "path";
2
2
  import semver from "semver";
3
3
  import { fsx, pathx } from "@simplysm/core-node";
4
4
  import { defineService } from "../core/define-service.js";
5
- const AutoUpdateService = defineService("AutoUpdate", (ctx) => ({
6
- async getLastVersion(platform) {
7
- const clientPath = ctx.clientPath;
8
- if (clientPath == null) throw new Error("Client path not found.");
9
- if (!await fsx.exists(path.resolve(clientPath, platform, "updates"))) return void 0;
10
- const updates = await fsx.readdir(path.resolve(clientPath, platform, "updates"));
11
- const versions = updates.map((item) => ({
12
- fileName: item,
13
- version: path.basename(item, path.extname(item)),
14
- extName: path.extname(item)
15
- })).filter((item) => {
16
- if (platform === "android") {
17
- return item.extName === ".apk" && /^[0-9.]*$/.test(item.version);
18
- } else {
19
- return item.extName === ".exe" && /^[0-9.]*$/.test(item.version);
20
- }
21
- });
22
- const version = semver.maxSatisfying(
23
- versions.map((item) => item.version),
24
- "*"
25
- );
26
- if (version == null) return void 0;
27
- const versionItem = versions.find((item) => item.version === version);
28
- if (versionItem == null) return void 0;
29
- const downloadPath = "/" + pathx.posix(ctx.clientName ?? "", platform, "updates", versionItem.fileName);
30
- return {
31
- version: version.toString(),
32
- downloadPath
33
- };
34
- }
5
+ export const AutoUpdateService = defineService("AutoUpdate", (ctx) => ({
6
+ async getLastVersion(platform) {
7
+ const clientPath = ctx.clientPath;
8
+ if (clientPath == null)
9
+ throw new Error("클라이언트 경로를 찾을 수 없습니다.");
10
+ if (!(await fsx.exists(path.resolve(clientPath, platform, "updates"))))
11
+ return undefined;
12
+ const updates = await fsx.readdir(path.resolve(clientPath, platform, "updates"));
13
+ const versions = updates
14
+ .map((item) => ({
15
+ fileName: item,
16
+ version: path.basename(item, path.extname(item)),
17
+ extName: path.extname(item),
18
+ }))
19
+ .filter((item) => {
20
+ if (platform === "android") {
21
+ return item.extName === ".apk" && /^[0-9.]*$/.test(item.version);
22
+ }
23
+ else {
24
+ return item.extName === ".exe" && /^[0-9.]*$/.test(item.version);
25
+ }
26
+ });
27
+ const version = semver.maxSatisfying(versions.map((item) => item.version), "*");
28
+ if (version == null)
29
+ return undefined;
30
+ const versionItem = versions.find((item) => item.version === version);
31
+ if (versionItem == null)
32
+ return undefined;
33
+ const downloadPath = "/" + pathx.posix(ctx.clientName ?? "", platform, "updates", versionItem.fileName);
34
+ return {
35
+ version: version.toString(),
36
+ downloadPath,
37
+ };
38
+ },
35
39
  }));
36
- export {
37
- AutoUpdateService
38
- };
39
- //# sourceMappingURL=auto-update-service.js.map
40
+ //# sourceMappingURL=auto-update-service.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/services/auto-update-service.ts"],
4
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,KAAK,aAAa;AAC3B,SAAS,qBAA0C;AAE5C,MAAM,oBAAoB,cAAc,cAAc,CAAC,SAAS;AAAA,EACrE,MAAM,eAAe,UAMnB;AACA,UAAM,aAAa,IAAI;AACvB,QAAI,cAAc,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAEhE,QAAI,CAAE,MAAM,IAAI,OAAO,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC,EAAI,QAAO;AAE/E,UAAM,UAAU,MAAM,IAAI,QAAQ,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC;AAC/E,UAAM,WAAW,QACd,IAAI,CAAC,UAAU;AAAA,MACd,UAAU;AAAA,MACV,SAAS,KAAK,SAAS,MAAM,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC/C,SAAS,KAAK,QAAQ,IAAI;AAAA,IAC5B,EAAE,EACD,OAAO,CAAC,SAAS;AAChB,UAAI,aAAa,WAAW;AAC1B,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE,OAAO;AACL,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE;AAAA,IACF,CAAC;AAEH,UAAM,UAAU,OAAO;AAAA,MACrB,SAAS,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW,KAAM,QAAO;AAE5B,UAAM,cAAc,SAAS,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO;AACpE,QAAI,eAAe,KAAM,QAAO;AAEhC,UAAM,eACJ,MAAM,MAAM,MAAM,IAAI,cAAc,IAAI,UAAU,WAAW,YAAY,QAAQ;AAEnF,WAAO;AAAA,MACL,SAAS,QAAQ,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,EAAE;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"auto-update-service.js","sourceRoot":"","sources":["..\\..\\src\\services\\auto-update-service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAuB,MAAM,wBAAwB,CAAC;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrE,KAAK,CAAC,cAAc,CAAC,QAAgB;QAOnC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,UAAU,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEhE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,OAAO;aACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;SAC5B,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAClC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EACpC,GAAG,CACJ,CAAC;QAEF,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAEtC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACtE,IAAI,WAAW,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAE1C,MAAM,YAAY,GAChB,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QAErF,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3B,YAAY;SACb,CAAC;IACJ,CAAC;CACF,CAAC,CAAC,CAAC"}
@@ -1,133 +1,127 @@
1
1
  import { createDbConn } from "@simplysm/orm-node";
2
- import {
3
- createQueryBuilder,
4
- parseQueryResult
5
- } from "@simplysm/orm-common";
2
+ import { createQueryBuilder, parseQueryResult, } from "@simplysm/orm-common";
6
3
  import { defineService, auth } from "../core/define-service.js";
7
4
  import consola from "consola";
8
5
  const logger = consola.withTag("service-server:OrmService");
9
- const socketConns = /* @__PURE__ */ new WeakMap();
10
- const OrmService = defineService(
11
- "Orm",
12
- auth((ctx) => {
6
+ // 정적 상태는 팩토리 외부에 존재해야 (호출 간 공유)
7
+ const socketConns = new WeakMap();
8
+ export const OrmService = defineService("Orm", auth((ctx) => {
13
9
  const sock = () => {
14
- const socket = ctx.socket;
15
- if (socket == null) {
16
- throw new Error("WebSocket connection is required. ORM service cannot be used over HTTP.");
17
- }
18
- return socket;
10
+ const socket = ctx.socket;
11
+ if (socket == null) {
12
+ throw new Error("WebSocket 연결이 필요합니다. ORM 서비스는 HTTP로 사용할 없습니다.");
13
+ }
14
+ return socket;
19
15
  };
20
16
  const getConf = async (opt) => {
21
- const config = (await ctx.getConfig("orm"))[opt.configName];
22
- if (config == null) {
23
- throw new Error(`ORM configuration not found: ${opt.configName}`);
24
- }
25
- return { ...config, ...opt.config };
17
+ const config = (await ctx.getConfig("orm"))[opt.configName];
18
+ if (config == null) {
19
+ throw new Error(`ORM 설정을 찾을 없습니다: ${opt.configName}`);
20
+ }
21
+ return { ...config, ...opt.config };
26
22
  };
27
23
  const getConn = (connId) => {
28
- const myConns = socketConns.get(sock());
29
- const conn = myConns?.get(connId);
30
- if (conn == null) {
31
- throw new Error("Not connected to database. (Invalid Connection ID)");
32
- }
33
- return conn;
24
+ const myConns = socketConns.get(sock());
25
+ const conn = myConns?.get(connId);
26
+ if (conn == null) {
27
+ throw new Error("데이터베이스에 연결되지 않았습니다. (유효하지 않은 연결 ID)");
28
+ }
29
+ return conn;
34
30
  };
35
31
  return {
36
- async getInfo(opt) {
37
- const config = await getConf(opt);
38
- return {
39
- dialect: config.dialect === "mssql-azure" ? "mssql" : config.dialect,
40
- database: config.database,
41
- schema: "schema" in config ? config.schema : void 0
42
- };
43
- },
44
- async connect(opt) {
45
- let myConns = socketConns.get(sock());
46
- if (myConns == null) {
47
- myConns = /* @__PURE__ */ new Map();
48
- socketConns.set(sock(), myConns);
49
- sock().on("close", async () => {
50
- if (myConns == null) return;
51
- logger.debug("Socket close detected: cleaning up all open DB connections.");
52
- const conns = Array.from(myConns.values());
53
- await Promise.all(
54
- conns.map(async (conn) => {
55
- try {
56
- if (conn.isConnected) {
57
- await conn.close();
58
- }
59
- } catch (err) {
60
- logger.warn("Error ignored during forced DB connection close", err);
32
+ async getInfo(opt) {
33
+ const config = await getConf(opt);
34
+ return {
35
+ dialect: config.dialect === "mssql-azure" ? "mssql" : config.dialect,
36
+ database: config.database,
37
+ schema: "schema" in config ? config.schema : undefined,
38
+ };
39
+ },
40
+ async connect(opt) {
41
+ let myConns = socketConns.get(sock());
42
+ if (myConns == null) {
43
+ myConns = new Map();
44
+ socketConns.set(sock(), myConns);
45
+ sock().on("close", async () => {
46
+ if (myConns == null)
47
+ return;
48
+ logger.debug("소켓 종료 감지: 열린 모든 DB 연결을 정리합니다.");
49
+ const conns = Array.from(myConns.values());
50
+ await Promise.all(conns.map(async (conn) => {
51
+ try {
52
+ if (conn.isConnected) {
53
+ await conn.close();
54
+ }
55
+ }
56
+ catch (err) {
57
+ logger.warn("강제 DB 연결 종료 중 에러 무시됨", err);
58
+ }
59
+ }));
60
+ myConns.clear();
61
+ });
62
+ }
63
+ const config = await getConf(opt);
64
+ const dbConn = await createDbConn(config);
65
+ await dbConn.connect();
66
+ const lastConnId = Math.max(0, ...Array.from(myConns.keys()));
67
+ const connId = lastConnId + 1;
68
+ myConns.set(connId, dbConn);
69
+ dbConn.on("close", () => {
70
+ myConns.delete(connId);
71
+ });
72
+ return connId;
73
+ },
74
+ async close(connId) {
75
+ try {
76
+ const conn = getConn(connId);
77
+ await conn.close();
78
+ }
79
+ catch (err) {
80
+ logger.warn("DB 연결 종료 중 에러 무시됨", err);
81
+ }
82
+ },
83
+ async beginTransaction(connId, isolationLevel) {
84
+ const conn = getConn(connId);
85
+ await conn.beginTransaction(isolationLevel);
86
+ },
87
+ async commitTransaction(connId) {
88
+ const conn = getConn(connId);
89
+ await conn.commitTransaction();
90
+ },
91
+ async rollbackTransaction(connId) {
92
+ const conn = getConn(connId);
93
+ await conn.rollbackTransaction();
94
+ },
95
+ async executeParametrized(connId, query, params) {
96
+ const conn = getConn(connId);
97
+ return conn.executeParametrized(query, params);
98
+ },
99
+ async executeDefs(connId, defs, options) {
100
+ const conn = getConn(connId);
101
+ const dialect = conn.config.dialect === "mssql-azure" ? "mssql" : conn.config.dialect;
102
+ const queryBuilder = createQueryBuilder(dialect);
103
+ if (options != null && options.every((item) => item == null)) {
104
+ return conn.execute([defs.map((def) => queryBuilder.build(def).sql).join("\n")]);
105
+ }
106
+ const queries = defs.map((def) => queryBuilder.build(def).sql);
107
+ const result = await conn.execute(queries);
108
+ const parsed = [];
109
+ for (let i = 0; i < result.length; i++) {
110
+ const opt = options?.[i];
111
+ if (opt != null) {
112
+ const parsedResult = await parseQueryResult(result[i], opt);
113
+ parsed.push(parsedResult ?? []);
61
114
  }
62
- })
63
- );
64
- myConns.clear();
65
- });
66
- }
67
- const config = await getConf(opt);
68
- const dbConn = await createDbConn(config);
69
- await dbConn.connect();
70
- const lastConnId = Math.max(0, ...Array.from(myConns.keys()));
71
- const connId = lastConnId + 1;
72
- myConns.set(connId, dbConn);
73
- dbConn.on("close", () => {
74
- myConns.delete(connId);
75
- });
76
- return connId;
77
- },
78
- async close(connId) {
79
- try {
80
- const conn = getConn(connId);
81
- await conn.close();
82
- } catch (err) {
83
- logger.warn("Error ignored during DB connection close", err);
84
- }
85
- },
86
- async beginTransaction(connId, isolationLevel) {
87
- const conn = getConn(connId);
88
- await conn.beginTransaction(isolationLevel);
89
- },
90
- async commitTransaction(connId) {
91
- const conn = getConn(connId);
92
- await conn.commitTransaction();
93
- },
94
- async rollbackTransaction(connId) {
95
- const conn = getConn(connId);
96
- await conn.rollbackTransaction();
97
- },
98
- async executeParametrized(connId, query, params) {
99
- const conn = getConn(connId);
100
- return conn.executeParametrized(query, params);
101
- },
102
- async executeDefs(connId, defs, options) {
103
- const conn = getConn(connId);
104
- const dialect = conn.config.dialect === "mssql-azure" ? "mssql" : conn.config.dialect;
105
- const queryBuilder = createQueryBuilder(dialect);
106
- if (options != null && options.every((item) => item == null)) {
107
- return conn.execute([defs.map((def) => queryBuilder.build(def).sql).join("\n")]);
108
- }
109
- const queries = defs.map((def) => queryBuilder.build(def).sql);
110
- const result = await conn.execute(queries);
111
- const parsed = [];
112
- for (let i = 0; i < result.length; i++) {
113
- const opt = options?.[i];
114
- if (opt != null) {
115
- const parsedResult = await parseQueryResult(result[i], opt);
116
- parsed.push(parsedResult ?? []);
117
- } else {
118
- parsed.push(result[i]);
119
- }
120
- }
121
- return parsed;
122
- },
123
- async bulkInsert(connId, tableName, columnDefs, records) {
124
- const conn = getConn(connId);
125
- await conn.bulkInsert(tableName, columnDefs, records);
126
- }
115
+ else {
116
+ parsed.push(result[i]);
117
+ }
118
+ }
119
+ return parsed;
120
+ },
121
+ async bulkInsert(connId, tableName, columnDefs, records) {
122
+ const conn = getConn(connId);
123
+ await conn.bulkInsert(tableName, columnDefs, records);
124
+ },
127
125
  };
128
- })
129
- );
130
- export {
131
- OrmService
132
- };
133
- //# sourceMappingURL=orm-service.js.map
126
+ }));
127
+ //# sourceMappingURL=orm-service.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/services/orm-service.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"orm-service.js","sourceRoot":"","sources":["..\\..\\src\\services\\orm-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-request-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\http-request-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,wBAAsB,iBAAiB,CAAC,SAAS,GAAG,OAAO,EACzD,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;KAAE,CAAC;CAC9E,KAAK,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CAwDf"}
1
+ {"version":3,"file":"http-request-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\http-request-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,wBAAsB,iBAAiB,CAAC,SAAS,GAAG,OAAO,EACzD,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;KAAE,CAAC;CAC9E,KAAK,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Df"}
@@ -1,52 +1,64 @@
1
1
  import { json } from "@simplysm/core-common";
2
2
  import { verifyJwt } from "../../auth/jwt-manager.js";
3
- async function handleHttpRequest(req, reply, jwtSecret, runMethod) {
4
- const { service, method } = req.params;
5
- const clientName = req.headers["x-sd-client-name"];
6
- if (clientName == null) throw new Error("ClientName header is required");
7
- let authTokenPayload;
8
- try {
9
- const authHeader = req.headers.authorization;
10
- if (authHeader != null) {
11
- if (jwtSecret == null) throw new Error("JWT Secret is not defined.");
12
- const token = authHeader.split(" ")[1];
13
- authTokenPayload = await verifyJwt(jwtSecret, token);
3
+ export async function handleHttpRequest(req, reply, jwtSecret, runMethod) {
4
+ const { service, method } = req.params;
5
+ // ClientName 헤더
6
+ const clientName = req.headers["x-sd-client-name"];
7
+ if (clientName == null)
8
+ throw new Error("ClientName 헤더가 필요합니다");
9
+ // Authorization 헤더 파싱 및 검증
10
+ let authTokenPayload;
11
+ try {
12
+ const authHeader = req.headers.authorization;
13
+ if (authHeader != null) {
14
+ if (jwtSecret == null)
15
+ throw new Error("JWT Secret이 정의되지 않았습니다.");
16
+ const token = authHeader.split(" ")[1]; // "Bearer <token>"
17
+ authTokenPayload = await verifyJwt(jwtSecret, token);
18
+ }
14
19
  }
15
- } catch (err) {
16
- reply.status(401).send({
17
- error: "Unauthorized",
18
- message: err instanceof Error ? err.message : String(err)
19
- });
20
- return;
21
- }
22
- let params;
23
- if (req.method === "GET") {
24
- const query = req.query;
25
- if (typeof query.json !== "string") {
26
- throw new Error("JSON query parameter required");
20
+ catch (err) {
21
+ reply.status(401).send({
22
+ error: "인증 실패",
23
+ message: err instanceof Error ? err.message : String(err),
24
+ });
25
+ return;
27
26
  }
28
- params = json.parse(query.json);
29
- } else if (req.method === "POST") {
30
- if (!Array.isArray(req.body)) {
31
- reply.status(400).send({
32
- error: "Bad Request",
33
- message: "Request body must be an array."
34
- });
35
- return;
27
+ // 매개변수 파싱
28
+ let params;
29
+ if (req.method === "GET") {
30
+ const query = req.query;
31
+ if (typeof query.json !== "string") {
32
+ throw new Error("JSON 쿼리 파라미터가 필요합니다");
33
+ }
34
+ params = json.parse(query.json);
35
+ }
36
+ else if (req.method === "POST") {
37
+ if (!Array.isArray(req.body)) {
38
+ reply.status(400).send({
39
+ error: "잘못된 요청",
40
+ message: "요청 본문은 배열이어야 합니다.",
41
+ });
42
+ return;
43
+ }
44
+ params = req.body;
45
+ }
46
+ else {
47
+ reply.status(405).send({
48
+ error: "Method Not Allowed",
49
+ message: `${req.method} 메서드는 지원하지 않습니다.`,
50
+ });
51
+ return;
52
+ }
53
+ // 서비스 실행 및 응답 전송
54
+ if (params != null) {
55
+ const serviceResult = await runMethod({
56
+ serviceName: service,
57
+ methodName: method,
58
+ params,
59
+ http: { clientName, authTokenPayload },
60
+ });
61
+ reply.send(serviceResult);
36
62
  }
37
- params = req.body;
38
- }
39
- if (params != null) {
40
- const serviceResult = await runMethod({
41
- serviceName: service,
42
- methodName: method,
43
- params,
44
- http: { clientName, authTokenPayload }
45
- });
46
- reply.send(serviceResult);
47
- }
48
63
  }
49
- export {
50
- handleHttpRequest
51
- };
52
- //# sourceMappingURL=http-request-handler.js.map
64
+ //# sourceMappingURL=http-request-handler.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/transport/http/http-request-handler.ts"],
4
- "mappings": "AAAA,SAAS,YAAY;AAErB,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,KAAK,MAAM,MAAM,IAAI;AAAA,EAChC,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
- "names": []
6
- }
1
+ {"version":3,"file":"http-request-handler.js","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\http-request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAmB,EACnB,KAAmB,EACnB,SAA6B,EAC7B,SAKsB;IAEtB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAA6C,CAAC;IAE9E,gBAAgB;IAChB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAuB,CAAC;IACzE,IAAI,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAEhE,2BAA2B;IAC3B,IAAI,gBAAyD,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,SAAS,IAAI,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAElE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;YAC3D,gBAAgB,GAAG,MAAM,SAAS,CAAY,SAAS,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,UAAU;IACV,IAAI,MAA6B,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAA0B,CAAC;QAC7C,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,IAAiB,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,kBAAkB;SACzC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC;YACpC,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,MAAM;YAClB,MAAM;YACN,IAAI,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;SACvC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -2,45 +2,51 @@ import path from "path";
2
2
  import { fsx, pathx } from "@simplysm/core-node";
3
3
  import consola from "consola";
4
4
  const logger = consola.withTag("service-server:StaticFileHandler");
5
- async function handleStaticFile(req, reply, rootPath, urlPath) {
6
- let targetFilePath = path.resolve(rootPath, "www", urlPath);
7
- const allowedRootPath = path.resolve(rootPath, "www");
8
- if (targetFilePath !== allowedRootPath && !pathx.isChildPath(targetFilePath, allowedRootPath)) {
9
- throw new Error("Access denied");
10
- }
11
- if (await fsx.exists(targetFilePath) && (await fsx.stat(targetFilePath)).isDirectory()) {
12
- if (!urlPath.endsWith("/")) {
13
- const urlObj = new URL(req.raw.url, "http://localhost");
14
- reply.redirect(urlObj.pathname + "/" + urlObj.search);
15
- return;
5
+ export async function handleStaticFile(req, reply, rootPath, urlPath) {
6
+ let targetFilePath = path.resolve(rootPath, "www", urlPath);
7
+ const allowedRootPath = path.resolve(rootPath, "www");
8
+ // targetPath 보안 가드 (경로 탐색 공격 방지)
9
+ if (targetFilePath !== allowedRootPath && !pathx.isChildPath(targetFilePath, allowedRootPath)) {
10
+ throw new Error("접근이 거부되었습니다");
16
11
  }
17
- targetFilePath = path.resolve(targetFilePath, "index.html");
18
- }
19
- if (path.basename(targetFilePath).startsWith(".")) {
20
- const errorMessage = "You do not have permission to access this file.";
21
- responseErrorHtml(reply, 403, errorMessage);
22
- logger.warn(`[403] ${errorMessage} (${targetFilePath})`);
23
- return;
24
- }
25
- const filename = path.basename(targetFilePath);
26
- const directory = path.dirname(targetFilePath);
27
- try {
28
- return await reply.sendFile(filename, directory);
29
- } catch (err) {
30
- const error = err;
31
- if (error.code === "ENOENT") {
32
- const errorMessage = "File not found.";
33
- responseErrorHtml(reply, 404, errorMessage);
34
- logger.warn(`[404] ${errorMessage} (${targetFilePath})`);
35
- } else {
36
- const errorMessage = "An error occurred while sending the file.";
37
- responseErrorHtml(reply, 500, errorMessage);
38
- logger.error(`[500] ${errorMessage}`, err);
12
+ // 디렉토리에 대해 슬래시를 추가하여 리다이렉트 (표준 웹 서버 동작)
13
+ if ((await fsx.exists(targetFilePath)) && (await fsx.stat(targetFilePath)).isDirectory()) {
14
+ if (!urlPath.endsWith("/")) {
15
+ const urlObj = new URL(req.raw.url, "http://localhost");
16
+ reply.redirect(urlObj.pathname + "/" + urlObj.search);
17
+ return;
18
+ }
19
+ targetFilePath = path.resolve(targetFilePath, "index.html");
20
+ }
21
+ // 권한 확인 (숨김 파일 등)
22
+ if (path.basename(targetFilePath).startsWith(".")) {
23
+ const errorMessage = "이 파일에 접근할 권한이 없습니다.";
24
+ responseErrorHtml(reply, 403, errorMessage);
25
+ logger.warn(`[403] ${errorMessage} (${targetFilePath})`);
26
+ return;
27
+ }
28
+ // 파일 전송
29
+ const filename = path.basename(targetFilePath);
30
+ const directory = path.dirname(targetFilePath);
31
+ try {
32
+ return await reply.sendFile(filename, directory);
33
+ }
34
+ catch (err) {
35
+ const error = err;
36
+ if (error.code === "ENOENT") {
37
+ const errorMessage = "파일을 찾을 수 없습니다.";
38
+ responseErrorHtml(reply, 404, errorMessage);
39
+ logger.warn(`[404] ${errorMessage} (${targetFilePath})`);
40
+ }
41
+ else {
42
+ const errorMessage = "파일 전송 중 에러가 발생했습니다.";
43
+ responseErrorHtml(reply, 500, errorMessage);
44
+ logger.error(`[500] ${errorMessage}`, err);
45
+ }
39
46
  }
40
- }
41
47
  }
42
48
  function responseErrorHtml(reply, code, message) {
43
- reply.status(code).type("text/html").send(`
49
+ reply.status(code).type("text/html").send(`
44
50
  <!DOCTYPE html>
45
51
  <html>
46
52
  <head>
@@ -51,7 +57,4 @@ function responseErrorHtml(reply, code, message) {
51
57
  <body>${code}: ${message}</body>
52
58
  </html>`);
53
59
  }
54
- export {
55
- handleStaticFile
56
- };
57
- //# sourceMappingURL=static-file-handler.js.map
60
+ //# sourceMappingURL=static-file-handler.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/transport/http/static-file-handler.ts"],
4
- "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,KAAK,aAAa;AAE3B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,kCAAkC;AAEjE,eAAsB,iBACpB,KACA,OACA,UACA,SACe;AACf,MAAI,iBAAiB,KAAK,QAAQ,UAAU,OAAO,OAAO;AAC1D,QAAM,kBAAkB,KAAK,QAAQ,UAAU,KAAK;AAGpD,MAAI,mBAAmB,mBAAmB,CAAC,MAAM,YAAY,gBAAgB,eAAe,GAAG;AAC7F,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAGA,MAAK,MAAM,IAAI,OAAO,cAAc,MAAO,MAAM,IAAI,KAAK,cAAc,GAAG,YAAY,GAAG;AACxF,QAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,YAAM,SAAS,IAAI,IAAI,IAAI,IAAI,KAAM,kBAAkB;AACvD,YAAM,SAAS,OAAO,WAAW,MAAM,OAAO,MAAM;AACpD;AAAA,IACF;AACA,qBAAiB,KAAK,QAAQ,gBAAgB,YAAY;AAAA,EAC5D;AAGA,MAAI,KAAK,SAAS,cAAc,EAAE,WAAW,GAAG,GAAG;AACjD,UAAM,eAAe;AACrB,sBAAkB,OAAO,KAAK,YAAY;AAC1C,WAAO,KAAK,SAAS,YAAY,KAAK,cAAc,GAAG;AACvD;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,SAAS,cAAc;AAC7C,QAAM,YAAY,KAAK,QAAQ,cAAc;AAE7C,MAAI;AACF,WAAO,MAAM,MAAM,SAAS,UAAU,SAAS;AAAA,EACjD,SAAS,KAAc;AACrB,UAAM,QAAQ;AACd,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,eAAe;AACrB,wBAAkB,OAAO,KAAK,YAAY;AAC1C,aAAO,KAAK,SAAS,YAAY,KAAK,cAAc,GAAG;AAAA,IACzD,OAAO;AACL,YAAM,eAAe;AACrB,wBAAkB,OAAO,KAAK,YAAY;AAC1C,aAAO,MAAM,SAAS,YAAY,IAAI,GAAG;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAAqB,MAAc,SAAiB;AAC7E,QAAM,OAAO,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAM/B,IAAI,KAAK,OAAO;AAAA;AAAA,QAErB,IAAI,KAAK,OAAO;AAAA,QAChB;AACR;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"static-file-handler.js","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\static-file-handler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upload-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\upload-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO5D,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqEf"}
1
+ {"version":3,"file":"upload-handler.d.ts","sourceRoot":"","sources":["..\\..\\..\\src\\transport\\http\\upload-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO5D,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Ef"}