@simplysm/service-server 13.0.0-beta.6 → 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.
Files changed (317) hide show
  1. package/README.md +117 -433
  2. package/dist/auth/auth-token-payload.d.ts.map +1 -0
  3. package/dist/auth/auth-token-payload.js.map +0 -1
  4. package/dist/auth/jwt-manager.d.ts +5 -0
  5. package/dist/auth/jwt-manager.d.ts.map +1 -0
  6. package/dist/auth/jwt-manager.js +19 -28
  7. package/dist/auth/jwt-manager.js.map +1 -2
  8. package/dist/core/define-service.d.ts +67 -0
  9. package/dist/core/define-service.d.ts.map +1 -0
  10. package/dist/core/define-service.js +70 -0
  11. package/dist/core/define-service.js.map +6 -0
  12. package/dist/core/service-executor.d.ts +14 -0
  13. package/dist/core/service-executor.d.ts.map +1 -0
  14. package/dist/core/service-executor.js +29 -35
  15. package/dist/core/service-executor.js.map +1 -2
  16. package/dist/{service-server/src/index.d.ts → index.d.ts} +4 -5
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +23 -19
  19. package/dist/index.js.map +1 -2
  20. package/dist/{service-server/src/legacy → legacy}/v1-auto-update-handler.d.ts +3 -2
  21. package/dist/legacy/v1-auto-update-handler.d.ts.map +1 -0
  22. package/dist/legacy/v1-auto-update-handler.js +5 -5
  23. package/dist/legacy/v1-auto-update-handler.js.map +1 -2
  24. package/dist/protocol/protocol-wrapper.d.ts +33 -0
  25. package/dist/protocol/protocol-wrapper.d.ts.map +1 -0
  26. package/dist/protocol/protocol-wrapper.js +37 -48
  27. package/dist/protocol/protocol-wrapper.js.map +1 -2
  28. package/dist/{service-server/src/service-server.d.ts → service-server.d.ts} +3 -8
  29. package/dist/service-server.d.ts.map +1 -0
  30. package/dist/service-server.js +40 -29
  31. package/dist/service-server.js.map +1 -2
  32. package/dist/services/auto-update-service.d.ts +9 -0
  33. package/dist/services/auto-update-service.d.ts.map +1 -0
  34. package/dist/services/auto-update-service.js +5 -5
  35. package/dist/services/auto-update-service.js.map +1 -2
  36. package/dist/services/crypto-service.d.ts +9 -0
  37. package/dist/services/crypto-service.d.ts.map +1 -0
  38. package/dist/services/crypto-service.js +8 -11
  39. package/dist/services/crypto-service.js.map +1 -2
  40. package/dist/{service-server/src/services → services}/orm-service.d.ts +5 -9
  41. package/dist/services/orm-service.d.ts.map +1 -0
  42. package/dist/services/orm-service.js +125 -174
  43. package/dist/services/orm-service.js.map +1 -2
  44. package/dist/services/smtp-service.d.ts +8 -0
  45. package/dist/services/smtp-service.d.ts.map +1 -0
  46. package/dist/services/smtp-service.js +22 -19
  47. package/dist/services/smtp-service.js.map +1 -2
  48. package/dist/transport/http/http-request-handler.d.ts +12 -0
  49. package/dist/transport/http/http-request-handler.d.ts.map +1 -0
  50. package/dist/transport/http/http-request-handler.js +42 -47
  51. package/dist/transport/http/http-request-handler.js.map +1 -2
  52. package/dist/transport/http/static-file-handler.d.ts +3 -0
  53. package/dist/transport/http/static-file-handler.d.ts.map +1 -0
  54. package/dist/transport/http/static-file-handler.js +34 -39
  55. package/dist/transport/http/static-file-handler.js.map +1 -2
  56. package/dist/transport/http/upload-handler.d.ts +3 -0
  57. package/dist/transport/http/upload-handler.d.ts.map +1 -0
  58. package/dist/transport/http/upload-handler.js +52 -54
  59. package/dist/transport/http/upload-handler.js.map +1 -2
  60. package/dist/transport/socket/service-socket.d.ts +61 -0
  61. package/dist/transport/socket/service-socket.d.ts.map +1 -0
  62. package/dist/transport/socket/service-socket.js +86 -71
  63. package/dist/transport/socket/service-socket.js.map +1 -2
  64. package/dist/transport/socket/websocket-handler.d.ts +41 -0
  65. package/dist/transport/socket/websocket-handler.d.ts.map +1 -0
  66. package/dist/transport/socket/websocket-handler.js +77 -77
  67. package/dist/transport/socket/websocket-handler.js.map +1 -2
  68. package/dist/{service-server/src/types → types}/server-options.d.ts +2 -3
  69. package/dist/types/server-options.d.ts.map +1 -0
  70. package/dist/types/server-options.js.map +0 -1
  71. package/dist/utils/config-manager.d.ts +2 -0
  72. package/dist/utils/config-manager.d.ts.map +1 -0
  73. package/dist/utils/config-manager.js +49 -52
  74. package/dist/utils/config-manager.js.map +1 -2
  75. package/dist/workers/service-protocol.worker.d.ts.map +1 -0
  76. package/dist/workers/service-protocol.worker.js +2 -2
  77. package/dist/workers/service-protocol.worker.js.map +1 -2
  78. package/docs/authentication.md +105 -0
  79. package/docs/built-in-services.md +172 -0
  80. package/docs/server.md +288 -0
  81. package/docs/transport.md +152 -0
  82. package/package.json +18 -13
  83. package/src/auth/jwt-manager.ts +28 -36
  84. package/src/core/define-service.ts +159 -0
  85. package/src/core/service-executor.ts +46 -49
  86. package/src/index.ts +4 -5
  87. package/src/legacy/v1-auto-update-handler.ts +9 -6
  88. package/src/protocol/protocol-wrapper.ts +79 -44
  89. package/src/service-server.ts +49 -34
  90. package/src/services/auto-update-service.ts +8 -7
  91. package/src/services/crypto-service.ts +11 -13
  92. package/src/services/orm-service.ts +163 -157
  93. package/src/services/smtp-service.ts +27 -26
  94. package/src/transport/http/http-request-handler.ts +58 -55
  95. package/src/transport/http/static-file-handler.ts +43 -43
  96. package/src/transport/http/upload-handler.ts +62 -62
  97. package/src/transport/socket/service-socket.ts +187 -89
  98. package/src/transport/socket/websocket-handler.ts +159 -103
  99. package/src/types/server-options.ts +2 -3
  100. package/src/utils/config-manager.ts +51 -53
  101. package/src/workers/service-protocol.worker.ts +2 -2
  102. package/.cache/typecheck-node.tsbuildinfo +0 -1
  103. package/dist/auth/auth.decorators.js +0 -46
  104. package/dist/auth/auth.decorators.js.map +0 -7
  105. package/dist/core/service-base.js +0 -47
  106. package/dist/core/service-base.js.map +0 -7
  107. package/dist/core-common/src/common.types.d.ts +0 -74
  108. package/dist/core-common/src/common.types.d.ts.map +0 -1
  109. package/dist/core-common/src/env.d.ts +0 -6
  110. package/dist/core-common/src/env.d.ts.map +0 -1
  111. package/dist/core-common/src/errors/argument-error.d.ts +0 -25
  112. package/dist/core-common/src/errors/argument-error.d.ts.map +0 -1
  113. package/dist/core-common/src/errors/not-implemented-error.d.ts +0 -29
  114. package/dist/core-common/src/errors/not-implemented-error.d.ts.map +0 -1
  115. package/dist/core-common/src/errors/sd-error.d.ts +0 -27
  116. package/dist/core-common/src/errors/sd-error.d.ts.map +0 -1
  117. package/dist/core-common/src/errors/timeout-error.d.ts +0 -31
  118. package/dist/core-common/src/errors/timeout-error.d.ts.map +0 -1
  119. package/dist/core-common/src/extensions/arr-ext.d.ts +0 -15
  120. package/dist/core-common/src/extensions/arr-ext.d.ts.map +0 -1
  121. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +0 -19
  122. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +0 -1
  123. package/dist/core-common/src/extensions/arr-ext.types.d.ts +0 -215
  124. package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +0 -1
  125. package/dist/core-common/src/extensions/map-ext.d.ts +0 -57
  126. package/dist/core-common/src/extensions/map-ext.d.ts.map +0 -1
  127. package/dist/core-common/src/extensions/set-ext.d.ts +0 -36
  128. package/dist/core-common/src/extensions/set-ext.d.ts.map +0 -1
  129. package/dist/core-common/src/features/debounce-queue.d.ts +0 -53
  130. package/dist/core-common/src/features/debounce-queue.d.ts.map +0 -1
  131. package/dist/core-common/src/features/event-emitter.d.ts +0 -66
  132. package/dist/core-common/src/features/event-emitter.d.ts.map +0 -1
  133. package/dist/core-common/src/features/serial-queue.d.ts +0 -47
  134. package/dist/core-common/src/features/serial-queue.d.ts.map +0 -1
  135. package/dist/core-common/src/index.d.ts +0 -32
  136. package/dist/core-common/src/index.d.ts.map +0 -1
  137. package/dist/core-common/src/types/date-only.d.ts +0 -152
  138. package/dist/core-common/src/types/date-only.d.ts.map +0 -1
  139. package/dist/core-common/src/types/date-time.d.ts +0 -96
  140. package/dist/core-common/src/types/date-time.d.ts.map +0 -1
  141. package/dist/core-common/src/types/lazy-gc-map.d.ts +0 -80
  142. package/dist/core-common/src/types/lazy-gc-map.d.ts.map +0 -1
  143. package/dist/core-common/src/types/time.d.ts +0 -68
  144. package/dist/core-common/src/types/time.d.ts.map +0 -1
  145. package/dist/core-common/src/types/uuid.d.ts +0 -35
  146. package/dist/core-common/src/types/uuid.d.ts.map +0 -1
  147. package/dist/core-common/src/utils/bytes.d.ts +0 -51
  148. package/dist/core-common/src/utils/bytes.d.ts.map +0 -1
  149. package/dist/core-common/src/utils/date-format.d.ts +0 -90
  150. package/dist/core-common/src/utils/date-format.d.ts.map +0 -1
  151. package/dist/core-common/src/utils/json.d.ts +0 -34
  152. package/dist/core-common/src/utils/json.d.ts.map +0 -1
  153. package/dist/core-common/src/utils/num.d.ts +0 -60
  154. package/dist/core-common/src/utils/num.d.ts.map +0 -1
  155. package/dist/core-common/src/utils/obj.d.ts +0 -258
  156. package/dist/core-common/src/utils/obj.d.ts.map +0 -1
  157. package/dist/core-common/src/utils/path.d.ts +0 -23
  158. package/dist/core-common/src/utils/path.d.ts.map +0 -1
  159. package/dist/core-common/src/utils/primitive.d.ts +0 -18
  160. package/dist/core-common/src/utils/primitive.d.ts.map +0 -1
  161. package/dist/core-common/src/utils/str.d.ts +0 -103
  162. package/dist/core-common/src/utils/str.d.ts.map +0 -1
  163. package/dist/core-common/src/utils/template-strings.d.ts +0 -84
  164. package/dist/core-common/src/utils/template-strings.d.ts.map +0 -1
  165. package/dist/core-common/src/utils/transferable.d.ts +0 -47
  166. package/dist/core-common/src/utils/transferable.d.ts.map +0 -1
  167. package/dist/core-common/src/utils/wait.d.ts +0 -19
  168. package/dist/core-common/src/utils/wait.d.ts.map +0 -1
  169. package/dist/core-common/src/utils/xml.d.ts +0 -36
  170. package/dist/core-common/src/utils/xml.d.ts.map +0 -1
  171. package/dist/core-common/src/zip/sd-zip.d.ts +0 -80
  172. package/dist/core-common/src/zip/sd-zip.d.ts.map +0 -1
  173. package/dist/core-node/src/features/fs-watcher.d.ts +0 -70
  174. package/dist/core-node/src/features/fs-watcher.d.ts.map +0 -1
  175. package/dist/core-node/src/index.d.ts +0 -7
  176. package/dist/core-node/src/index.d.ts.map +0 -1
  177. package/dist/core-node/src/utils/fs.d.ts +0 -197
  178. package/dist/core-node/src/utils/fs.d.ts.map +0 -1
  179. package/dist/core-node/src/utils/path.d.ts +0 -75
  180. package/dist/core-node/src/utils/path.d.ts.map +0 -1
  181. package/dist/core-node/src/worker/create-worker.d.ts +0 -23
  182. package/dist/core-node/src/worker/create-worker.d.ts.map +0 -1
  183. package/dist/core-node/src/worker/types.d.ts +0 -67
  184. package/dist/core-node/src/worker/types.d.ts.map +0 -1
  185. package/dist/core-node/src/worker/worker.d.ts +0 -27
  186. package/dist/core-node/src/worker/worker.d.ts.map +0 -1
  187. package/dist/orm-common/src/db-context.d.ts +0 -669
  188. package/dist/orm-common/src/db-context.d.ts.map +0 -1
  189. package/dist/orm-common/src/errors/db-transaction-error.d.ts +0 -51
  190. package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +0 -1
  191. package/dist/orm-common/src/exec/executable.d.ts +0 -79
  192. package/dist/orm-common/src/exec/executable.d.ts.map +0 -1
  193. package/dist/orm-common/src/exec/queryable.d.ts +0 -708
  194. package/dist/orm-common/src/exec/queryable.d.ts.map +0 -1
  195. package/dist/orm-common/src/exec/search-parser.d.ts +0 -72
  196. package/dist/orm-common/src/exec/search-parser.d.ts.map +0 -1
  197. package/dist/orm-common/src/expr/expr-unit.d.ts +0 -25
  198. package/dist/orm-common/src/expr/expr-unit.d.ts.map +0 -1
  199. package/dist/orm-common/src/expr/expr.d.ts +0 -1369
  200. package/dist/orm-common/src/expr/expr.d.ts.map +0 -1
  201. package/dist/orm-common/src/index.d.ts +0 -32
  202. package/dist/orm-common/src/index.d.ts.map +0 -1
  203. package/dist/orm-common/src/models/system-migration.d.ts +0 -10
  204. package/dist/orm-common/src/models/system-migration.d.ts.map +0 -1
  205. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +0 -95
  206. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +0 -1
  207. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +0 -66
  208. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +0 -1
  209. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +0 -84
  210. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +0 -1
  211. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +0 -45
  212. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +0 -1
  213. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +0 -84
  214. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +0 -1
  215. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +0 -54
  216. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +0 -1
  217. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +0 -84
  218. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +0 -1
  219. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +0 -52
  220. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +0 -1
  221. package/dist/orm-common/src/query-builder/query-builder.d.ts +0 -7
  222. package/dist/orm-common/src/query-builder/query-builder.d.ts.map +0 -1
  223. package/dist/orm-common/src/schema/factory/column-builder.d.ts +0 -394
  224. package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +0 -1
  225. package/dist/orm-common/src/schema/factory/index-builder.d.ts +0 -151
  226. package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +0 -1
  227. package/dist/orm-common/src/schema/factory/relation-builder.d.ts +0 -337
  228. package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +0 -1
  229. package/dist/orm-common/src/schema/procedure-builder.d.ts +0 -202
  230. package/dist/orm-common/src/schema/procedure-builder.d.ts.map +0 -1
  231. package/dist/orm-common/src/schema/table-builder.d.ts +0 -259
  232. package/dist/orm-common/src/schema/table-builder.d.ts.map +0 -1
  233. package/dist/orm-common/src/schema/view-builder.d.ts +0 -183
  234. package/dist/orm-common/src/schema/view-builder.d.ts.map +0 -1
  235. package/dist/orm-common/src/types/column.d.ts +0 -172
  236. package/dist/orm-common/src/types/column.d.ts.map +0 -1
  237. package/dist/orm-common/src/types/db.d.ts +0 -175
  238. package/dist/orm-common/src/types/db.d.ts.map +0 -1
  239. package/dist/orm-common/src/types/expr.d.ts +0 -474
  240. package/dist/orm-common/src/types/expr.d.ts.map +0 -1
  241. package/dist/orm-common/src/types/query-def.d.ts +0 -351
  242. package/dist/orm-common/src/types/query-def.d.ts.map +0 -1
  243. package/dist/orm-common/src/utils/result-parser.d.ts +0 -38
  244. package/dist/orm-common/src/utils/result-parser.d.ts.map +0 -1
  245. package/dist/orm-node/src/connections/mssql-db-conn.d.ts +0 -44
  246. package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +0 -1
  247. package/dist/orm-node/src/connections/mysql-db-conn.d.ts +0 -38
  248. package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +0 -1
  249. package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +0 -39
  250. package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +0 -1
  251. package/dist/orm-node/src/db-conn-factory.d.ts +0 -25
  252. package/dist/orm-node/src/db-conn-factory.d.ts.map +0 -1
  253. package/dist/orm-node/src/index.d.ts +0 -9
  254. package/dist/orm-node/src/index.d.ts.map +0 -1
  255. package/dist/orm-node/src/node-db-context-executor.d.ts +0 -77
  256. package/dist/orm-node/src/node-db-context-executor.d.ts.map +0 -1
  257. package/dist/orm-node/src/pooled-db-conn.d.ts +0 -79
  258. package/dist/orm-node/src/pooled-db-conn.d.ts.map +0 -1
  259. package/dist/orm-node/src/sd-orm.d.ts +0 -78
  260. package/dist/orm-node/src/sd-orm.d.ts.map +0 -1
  261. package/dist/orm-node/src/types/db-conn.d.ts +0 -159
  262. package/dist/orm-node/src/types/db-conn.d.ts.map +0 -1
  263. package/dist/service-common/src/index.d.ts +0 -8
  264. package/dist/service-common/src/index.d.ts.map +0 -1
  265. package/dist/service-common/src/protocol/protocol.types.d.ts +0 -100
  266. package/dist/service-common/src/protocol/protocol.types.d.ts.map +0 -1
  267. package/dist/service-common/src/protocol/service-protocol.d.ts +0 -63
  268. package/dist/service-common/src/protocol/service-protocol.d.ts.map +0 -1
  269. package/dist/service-common/src/service-types/auto-update-service.types.d.ts +0 -17
  270. package/dist/service-common/src/service-types/auto-update-service.types.d.ts.map +0 -1
  271. package/dist/service-common/src/service-types/crypto-service.types.d.ts +0 -22
  272. package/dist/service-common/src/service-types/crypto-service.types.d.ts.map +0 -1
  273. package/dist/service-common/src/service-types/orm-service.types.d.ts +0 -30
  274. package/dist/service-common/src/service-types/orm-service.types.d.ts.map +0 -1
  275. package/dist/service-common/src/service-types/smtp-service.types.d.ts +0 -55
  276. package/dist/service-common/src/service-types/smtp-service.types.d.ts.map +0 -1
  277. package/dist/service-common/src/types.d.ts +0 -43
  278. package/dist/service-common/src/types.d.ts.map +0 -1
  279. package/dist/service-server/src/auth/auth-token-payload.d.ts.map +0 -1
  280. package/dist/service-server/src/auth/auth.decorators.d.ts +0 -19
  281. package/dist/service-server/src/auth/auth.decorators.d.ts.map +0 -1
  282. package/dist/service-server/src/auth/jwt-manager.d.ts +0 -10
  283. package/dist/service-server/src/auth/jwt-manager.d.ts.map +0 -1
  284. package/dist/service-server/src/core/service-base.d.ts +0 -19
  285. package/dist/service-server/src/core/service-base.d.ts.map +0 -1
  286. package/dist/service-server/src/core/service-executor.d.ts +0 -18
  287. package/dist/service-server/src/core/service-executor.d.ts.map +0 -1
  288. package/dist/service-server/src/index.d.ts.map +0 -1
  289. package/dist/service-server/src/legacy/v1-auto-update-handler.d.ts.map +0 -1
  290. package/dist/service-server/src/protocol/protocol-wrapper.d.ts +0 -25
  291. package/dist/service-server/src/protocol/protocol-wrapper.d.ts.map +0 -1
  292. package/dist/service-server/src/service-server.d.ts.map +0 -1
  293. package/dist/service-server/src/services/auto-update-service.d.ts +0 -9
  294. package/dist/service-server/src/services/auto-update-service.d.ts.map +0 -1
  295. package/dist/service-server/src/services/crypto-service.d.ts +0 -10
  296. package/dist/service-server/src/services/crypto-service.d.ts.map +0 -1
  297. package/dist/service-server/src/services/orm-service.d.ts.map +0 -1
  298. package/dist/service-server/src/services/smtp-service.d.ts +0 -7
  299. package/dist/service-server/src/services/smtp-service.d.ts.map +0 -1
  300. package/dist/service-server/src/transport/http/http-request-handler.d.ts +0 -12
  301. package/dist/service-server/src/transport/http/http-request-handler.d.ts.map +0 -1
  302. package/dist/service-server/src/transport/http/static-file-handler.d.ts +0 -9
  303. package/dist/service-server/src/transport/http/static-file-handler.d.ts.map +0 -1
  304. package/dist/service-server/src/transport/http/upload-handler.d.ts +0 -10
  305. package/dist/service-server/src/transport/http/upload-handler.d.ts.map +0 -1
  306. package/dist/service-server/src/transport/socket/service-socket.d.ts +0 -41
  307. package/dist/service-server/src/transport/socket/service-socket.d.ts.map +0 -1
  308. package/dist/service-server/src/transport/socket/websocket-handler.d.ts +0 -18
  309. package/dist/service-server/src/transport/socket/websocket-handler.d.ts.map +0 -1
  310. package/dist/service-server/src/types/server-options.d.ts.map +0 -1
  311. package/dist/service-server/src/utils/config-manager.d.ts +0 -7
  312. package/dist/service-server/src/utils/config-manager.d.ts.map +0 -1
  313. package/dist/service-server/src/workers/service-protocol.worker.d.ts.map +0 -1
  314. package/src/auth/auth.decorators.ts +0 -71
  315. package/src/core/service-base.ts +0 -66
  316. /package/dist/{service-server/src/auth → auth}/auth-token-payload.d.ts +0 -0
  317. /package/dist/{service-server/src/workers → workers}/service-protocol.worker.d.ts +0 -0
package/README.md CHANGED
@@ -14,72 +14,58 @@ pnpm add @simplysm/service-server
14
14
 
15
15
  ## Main Modules
16
16
 
17
- ### Core Classes
17
+ ### Core Functions and Classes
18
18
 
19
- | Module | Path | Description |
20
- |------|------|------|
21
- | `ServiceServer` | `service-server.ts` | Main server class. Creates Fastify instance and configures routes/plugins |
22
- | `ServiceBase` | `core/service-base.ts` | Service base abstract class. All custom services must inherit from this |
23
- | `ServiceExecutor` | `core/service-executor.ts` | Internal executor that handles service method discovery, auth checks, and execution |
19
+ - [`createServiceServer`](#basic-server-configuration) - Factory function for creating a ServiceServer instance
20
+ - [`ServiceServer`](docs/server.md#serviceserver) - Main server class. Creates Fastify instance and configures routes/plugins
21
+ - [`defineService`](#custom-services) - Defines a service with a factory function pattern
22
+ - `ServiceExecutor` - Internal executor that handles service method discovery, auth checks, and execution
24
23
 
25
24
  ### Authentication
26
25
 
27
- | Module | Path | Description |
28
- |------|------|------|
29
- | `JwtManager` | `auth/jwt-manager.ts` | JWT token generation/verification/decoding based on jose library (HS256, 12-hour expiration) |
30
- | `Authorize` | `auth/auth.decorators.ts` | Stage 3 decorator. Sets authentication permissions at class or method level |
31
- | `AuthTokenPayload` | `auth/auth-token-payload.ts` | JWT payload interface (includes `roles`, `data`) |
26
+ - [`auth`](#authentication) - Function wrapper that sets authentication permissions at service or method level
27
+ - [`getServiceAuthPermissions`](#authentication) - Queries auth permissions for a service or method (used internally by `ServiceExecutor`)
28
+ - [`JwtManager`](docs/authentication.md#jwtmanager) - JWT token generation/verification/decoding based on jose library (HS256, 12-hour expiration)
29
+ - [`AuthTokenPayload`](docs/authentication.md#authtokenpayload) - JWT payload interface (includes `roles`, `data`)
32
30
 
33
31
  ### Transport Layer - WebSocket
34
32
 
35
- | Module | Path | Description |
36
- |------|------|------|
37
- | `WebSocketHandler` | `transport/socket/websocket-handler.ts` | Handles WebSocket connection management, message routing, and event distribution |
38
- | `ServiceSocket` | `transport/socket/service-socket.ts` | Wraps individual WebSocket connections. Manages ping/pong, protocol encoding/decoding, event listener management |
33
+ - `WebSocketHandler` - Handles WebSocket connection management, message routing, and event distribution
34
+ - [`ServiceSocket`](docs/transport.md#servicesocket) - Wraps individual WebSocket connections. Manages ping/pong, protocol encoding/decoding, event listener management
39
35
 
40
36
  ### Transport Layer - HTTP
41
37
 
42
- | Module | Path | Description |
43
- |------|------|------|
44
- | `HttpRequestHandler` | `transport/http/http-request-handler.ts` | Calls service methods via HTTP at `/api/:service/:method` route |
45
- | `UploadHandler` | `transport/http/upload-handler.ts` | Handles multipart file upload at `/upload` route (auth required) |
46
- | `StaticFileHandler` | `transport/http/static-file-handler.ts` | Serves static files. Prevents path traversal and blocks hidden files |
38
+ - `HttpRequestHandler` - Calls service methods via HTTP at `/api/:service/:method` route
39
+ - [`UploadHandler`](docs/transport.md#file-upload) - Handles multipart file upload at `/upload` route (auth required)
40
+ - `StaticFileHandler` - Serves static files. Prevents path traversal and blocks hidden files
47
41
 
48
42
  ### Protocol
49
43
 
50
- | Module | Path | Description |
51
- |------|------|------|
52
- | `ProtocolWrapper` | `protocol/protocol-wrapper.ts` | Message encoding/decoding wrapper. Messages over 30KB are processed in worker threads |
44
+ - [`ProtocolWrapper`](docs/transport.md#protocolwrapper) - Message encoding/decoding wrapper. Messages over 30KB are processed in worker threads
53
45
 
54
46
  ### Built-in Services
55
47
 
56
- | Module | Path | Description |
57
- |------|------|------|
58
- | `OrmService` | `services/orm-service.ts` | DB connection/transaction/query execution (WebSocket only, auth required) |
59
- | `CryptoService` | `services/crypto-service.ts` | SHA256 hash and AES-256-CBC encryption/decryption |
60
- | `SmtpService` | `services/smtp-service.ts` | nodemailer-based email sending |
61
- | `AutoUpdateService` | `services/auto-update-service.ts` | App auto-update (provides latest version query and download path) |
48
+ - [`OrmService`](docs/built-in-services.md#ormservice) - DB connection/transaction/query execution (WebSocket only, auth required)
49
+ - [`CryptoService`](docs/built-in-services.md#cryptoservice) - SHA256 hash and AES-256-CBC encryption/decryption
50
+ - [`SmtpService`](docs/built-in-services.md#smtpservice) - nodemailer-based email sending
51
+ - [`AutoUpdateService`](docs/built-in-services.md#autoupdateservice) - App auto-update (provides latest version query and download path)
62
52
 
63
53
  ### Utilities
64
54
 
65
- | Module | Path | Description |
66
- |------|------|------|
67
- | `ConfigManager` | `utils/config-manager.ts` | JSON config file loading/caching/real-time monitoring (auto expiration based on LazyGcMap) |
55
+ - [`ConfigManager`](docs/server.md#configmanager) - JSON config file loading/caching/real-time monitoring (auto expiration based on LazyGcMap)
68
56
 
69
57
  ### Legacy
70
58
 
71
- | Module | Path | Description |
72
- |------|------|------|
73
- | `handleV1Connection` | `legacy/v1-auto-update-handler.ts` | V1 protocol client compatibility handling (supports auto-update only) |
59
+ - [`handleV1Connection`](docs/transport.md#legacy-handlev1connection) - V1 protocol client compatibility handling (supports auto-update only)
74
60
 
75
61
  ## Usage
76
62
 
77
63
  ### Basic Server Configuration
78
64
 
79
65
  ```typescript
80
- import { ServiceServer } from "@simplysm/service-server";
66
+ import { createServiceServer } from "@simplysm/service-server";
81
67
 
82
- const server = new ServiceServer({
68
+ const server = createServiceServer({
83
69
  port: 8080,
84
70
  rootPath: "/app/data",
85
71
  services: [MyService],
@@ -101,486 +87,184 @@ server.on("close", () => {
101
87
  await server.close();
102
88
  ```
103
89
 
104
- ### Server Options (`ServiceServerOptions`)
90
+ ### Server Options
105
91
 
106
- ```typescript
107
- interface ServiceServerOptions {
108
- /** Server root path (base directory for static files and config files) */
109
- rootPath: string;
110
- /** Listen port */
111
- port: number;
112
- /** SSL/TLS config (enables HTTPS) */
113
- ssl?: {
114
- pfxBytes: Uint8Array;
115
- passphrase: string;
116
- };
117
- /** JWT authentication config */
118
- auth?: {
119
- jwtSecret: string;
120
- };
121
- /** List of service classes to register */
122
- services: Type<ServiceBase>[];
123
- }
124
- ```
125
-
126
- The following structure is expected under `rootPath`:
92
+ See [`ServiceServerOptions`](docs/server.md#server-options-serviceserveroptions) for detailed configuration options including SSL, authentication, and directory structure.
127
93
 
128
- ```
129
- rootPath/
130
- .config.json # Root config file
131
- www/ # Static file root
132
- uploads/ # Upload file storage directory
133
- {clientName}/ # Per-client directory
134
- .config.json # Per-client config file
135
- index.html
136
- ```
94
+ ### Custom Services
137
95
 
138
- ### SSL/HTTPS Server
96
+ Services are defined using the `defineService` function. Service methods are called via RPC from the client.
139
97
 
140
98
  ```typescript
141
- import { fsReadFile } from "@simplysm/core-node";
99
+ import { defineService } from "@simplysm/service-server";
142
100
 
143
- const pfxBytes = await fsReadFile("/path/to/cert.pfx");
101
+ export const MyService = defineService("MyService", (ctx) => ({
102
+ hello: async (name: string): Promise<string> => {
103
+ return `Hello, ${name}!`;
104
+ },
144
105
 
145
- const server = new ServiceServer({
146
- port: 443,
147
- rootPath: "/app/data",
148
- ssl: {
149
- pfxBytes,
150
- passphrase: "certificate-password",
106
+ getServerTime: async (): Promise<Date> => {
107
+ return new Date();
151
108
  },
152
- auth: { jwtSecret: "my-secret-key" },
153
- services: [],
154
- });
109
+ }));
155
110
 
156
- await server.listen();
111
+ // Export type for client-side type sharing
112
+ export type MyServiceMethods = import("@simplysm/service-server").ServiceMethods<typeof MyService>;
157
113
  ```
158
114
 
159
- ### Custom Service Definition
115
+ #### ServiceContext
160
116
 
161
- Define services by inheriting from `ServiceBase`. Service methods are called via RPC from the client.
117
+ The `ctx` parameter provides access to server resources:
162
118
 
163
- ```typescript
164
- import { ServiceBase } from "@simplysm/service-server";
165
-
166
- class MyService extends ServiceBase {
167
- async hello(name: string): Promise<string> {
168
- return `Hello, ${name}!`;
169
- }
119
+ - `ctx.server` - ServiceServer instance
120
+ - `ctx.socket` - ServiceSocket instance (WebSocket only, undefined for HTTP)
121
+ - `ctx.http` - HTTP request/reply objects (HTTP only, undefined for WebSocket)
122
+ - `ctx.authInfo` - Authentication info (set via JWT token)
123
+ - `ctx.clientName` - Client identifier
124
+ - `ctx.getConfig(name)` - Get server config by name
170
125
 
171
- async getServerTime(): Promise<Date> {
172
- return new Date();
173
- }
174
- }
175
- ```
176
-
177
- Context accessible within services:
178
-
179
- | Property | Type | Description |
180
- |------|------|------|
181
- | `this.server` | `ServiceServer` | Server instance reference |
182
- | `this.socket` | `ServiceSocket \| undefined` | WebSocket connection (`undefined` for HTTP calls) |
183
- | `this.http` | `{ clientName, authTokenPayload? }` | HTTP request context |
184
- | `this.authInfo` | `TAuthInfo \| undefined` | Authenticated user info |
185
- | `this.clientName` | `string \| undefined` | Client app name |
186
- | `this.clientPath` | `string \| undefined` | Per-client directory path |
187
-
188
- ### Config File Reference
126
+ ### Authentication
189
127
 
190
- Read sections from `.config.json` files using `ServiceBase.getConfig()`. Root and per-client configs are automatically merged.
128
+ Use the `auth()` wrapper to set authentication requirements at service or method level:
191
129
 
192
130
  ```typescript
193
- class MyService extends ServiceBase {
194
- async getDbHost(): Promise<string> {
195
- // Read "mySection" key from rootPath/.config.json or clientPath/.config.json
196
- const config = await this.getConfig<{ host: string }>("mySection");
197
- return config.host;
198
- }
199
- }
200
- ```
131
+ import { defineService, auth } from "@simplysm/service-server";
201
132
 
202
- `.config.json` example:
203
-
204
- ```json
205
- {
206
- "mySection": {
207
- "host": "localhost"
208
- },
209
- "orm": {
210
- "default": {
211
- "dialect": "mysql",
212
- "host": "localhost",
213
- "port": 3306,
214
- "database": "mydb",
215
- "user": "root",
216
- "password": "password"
217
- }
218
- }
133
+ interface UserAuthInfo {
134
+ userId: number;
135
+ role: string;
219
136
  }
220
- ```
221
-
222
- `ConfigManager` caches config files and automatically refreshes the cache on file changes (LazyGcMap-based, auto expires after 1 hour).
223
137
 
224
- ### Authentication (`Authorize` Decorator)
225
-
226
- Use Stage 3 decorators to set authentication requirements on services or methods. Only works when `ServiceServerOptions.auth` is configured.
227
-
228
- ```typescript
229
- import { ServiceBase, Authorize } from "@simplysm/service-server";
230
-
231
- // Class level: all methods require login
232
- @Authorize()
233
- class UserService extends ServiceBase<{ userId: number; role: string }> {
234
- // Login only required (inherits from class level)
235
- async getProfile(): Promise<unknown> {
236
- const userId = this.authInfo?.userId;
138
+ // Service-level auth: all methods require authentication
139
+ export const UserService = defineService("UserService", auth((ctx) => ({
140
+ getProfile: async (): Promise<unknown> => {
141
+ const userId = (ctx.authInfo as UserAuthInfo)?.userId;
237
142
  // ...
238
- }
143
+ },
239
144
 
240
- // Method level: specific role required (overrides class level)
241
- @Authorize(["admin"])
242
- async deleteUser(targetId: number): Promise<void> {
145
+ deleteUser: auth(["admin"], async (targetId: number): Promise<void> => {
243
146
  // Only users with admin role can call
244
- }
245
- }
147
+ }),
148
+ })));
246
149
 
247
- // No authentication required (no decorator)
248
- class PublicService extends ServiceBase {
249
- async healthCheck(): Promise<string> {
250
- return "OK";
251
- }
252
- }
150
+ export type UserServiceMethods = import("@simplysm/service-server").ServiceMethods<typeof UserService>;
253
151
  ```
254
152
 
255
- Decorator behavior:
256
-
257
- | Target | `@Authorize()` | `@Authorize(["admin"])` |
258
- |-----------|----------------|-------------------------|
259
- | Class | All methods require login | All methods require admin role |
260
- | Method | Method requires login | Method requires admin role |
261
- | None | No auth required (Public) | - |
262
-
263
- Method-level decorators override class-level settings.
264
-
265
- ### JWT Token Management
266
-
267
- Generate and verify JWT tokens through the `ServiceServer` instance.
153
+ #### Auth Patterns
268
154
 
155
+ **Method-level auth only:**
269
156
  ```typescript
270
- // Generate token (12-hour expiration, HS256 algorithm)
271
- const token = await server.generateAuthToken({
272
- roles: ["admin", "user"],
273
- data: { userId: 1, name: "홍길동" },
274
- });
157
+ export const MyService = defineService("MyService", (ctx) => ({
158
+ publicMethod: async (): Promise<void> => {
159
+ // No auth required
160
+ },
275
161
 
276
- // Verify token
277
- const payload = await server.verifyAuthToken(token);
278
- // payload.roles: ["admin", "user"]
279
- // payload.data: { userId: 1, name: "홍길동" }
280
- ```
162
+ protectedMethod: auth(async (): Promise<void> => {
163
+ // Auth required
164
+ }),
281
165
 
282
- `AuthTokenPayload` interface:
166
+ adminMethod: auth(["admin"], async (): Promise<void> => {
167
+ // Auth + admin role required
168
+ }),
169
+ }));
170
+ ```
283
171
 
172
+ **Service-level auth with method override:**
284
173
  ```typescript
285
- interface AuthTokenPayload<TAuthInfo = unknown> extends JWTPayload {
286
- /** User role list (used for permission check in Authorize decorator) */
287
- roles: string[];
288
- /** Custom auth info (generic type) */
289
- data: TAuthInfo;
290
- }
174
+ // All methods require authentication by default
175
+ export const SecureService = defineService("SecureService", auth((ctx) => ({
176
+ normalMethod: async (): Promise<void> => {
177
+ // Auth required (inherited from service level)
178
+ },
179
+
180
+ adminMethod: auth(["admin"], async (): Promise<void> => {
181
+ // Auth + admin role required
182
+ }),
183
+ })));
291
184
  ```
292
185
 
293
- ### HTTP API Call
186
+ See [Authentication](docs/authentication.md) for JWT token management and permission handling.
294
187
 
295
- Service methods can also be called via HTTP through the `/api/:service/:method` path.
188
+ ### HTTP/WebSocket Communication
296
189
 
297
- **GET Request:**
190
+ Service methods can be called via HTTP or WebSocket:
298
191
 
299
192
  ```
300
193
  GET /api/MyService/hello?json=["World"]
301
- Header: x-sd-client-name: my-app
302
- Header: Authorization: Bearer <token> (optional)
303
- ```
304
-
305
- **POST Request:**
306
-
307
- ```
308
194
  POST /api/MyService/hello
309
- Header: Content-Type: application/json
310
- Header: x-sd-client-name: my-app
311
- Header: Authorization: Bearer <token> (optional)
312
- Body: ["World"]
313
195
  ```
314
196
 
315
- - The `x-sd-client-name` header is required.
316
- - Parameters are passed in array form (in the order of method arguments).
317
- - For GET requests, pass a JSON-serialized array in the `json` query parameter.
197
+ See [HTTP API Call](docs/transport.md#http-api-call) and [ServiceSocket](docs/transport.md#servicesocket) for transport layer details.
318
198
 
319
199
  ### File Upload
320
200
 
321
- Upload files via multipart request to the `/upload` endpoint. Auth token is required.
201
+ Upload files via multipart request to the `/upload` endpoint:
322
202
 
323
203
  ```typescript
324
- // Client-side example
325
204
  const formData = new FormData();
326
205
  formData.append("file", file);
327
206
 
328
207
  const response = await fetch("/upload", {
329
208
  method: "POST",
330
- headers: {
331
- Authorization: `Bearer ${token}`,
332
- },
209
+ headers: { Authorization: `Bearer ${token}` },
333
210
  body: formData,
334
211
  });
335
-
336
- // Response: ServiceUploadResult[]
337
- const results = await response.json();
338
- // [{ path: "uploads/uuid.ext", filename: "original-filename.ext", size: 12345 }]
339
212
  ```
340
213
 
341
- Uploaded files are stored in the `rootPath/www/uploads/` directory with UUID-based filenames.
214
+ See [File Upload](docs/transport.md#file-upload) for more details.
342
215
 
343
- ### Real-time Event Publishing
216
+ ### Event Publishing
344
217
 
345
- Publish events to connected clients from the server.
218
+ Publish real-time events to connected WebSocket clients:
346
219
 
347
220
  ```typescript
348
- import { ServiceEventListener } from "@simplysm/service-common";
221
+ import { defineEvent } from "@simplysm/service-common";
349
222
 
350
- // Event definition (from service-common)
351
- class OrderUpdatedEvent extends ServiceEventListener<
223
+ export const OrderUpdatedEvent = defineEvent<
352
224
  { orderId: number },
353
225
  { status: string }
354
- > {
355
- readonly eventName = "OrderUpdatedEvent";
356
- }
226
+ >("OrderUpdatedEvent");
357
227
 
358
- // Publish event from server
359
228
  await server.emitEvent(
360
229
  OrderUpdatedEvent,
361
- (info) => info.orderId === 123, // Target filter
362
- { status: "completed" }, // Data to send
230
+ (info) => info.orderId === 123,
231
+ { status: "completed" },
363
232
  );
364
-
365
- // Send reload command to all clients
366
- await server.broadcastReload("my-app", new Set(["main.js"]));
367
233
  ```
368
234
 
369
- ### Built-in Service: OrmService
370
-
371
- Provides database connection/query/transaction via WebSocket. `@Authorize()` decorator is applied, requiring login.
372
-
373
- ```typescript
374
- const server = new ServiceServer({
375
- port: 8080,
376
- rootPath: "/app/data",
377
- auth: { jwtSecret: "secret" },
378
- services: [OrmService],
379
- });
380
- ```
235
+ See [Real-time Event Publishing](docs/transport.md#real-time-event-publishing) for more details.
381
236
 
382
- Define ORM config in `.config.json`:
383
-
384
- ```json
385
- {
386
- "orm": {
387
- "default": {
388
- "dialect": "mysql",
389
- "host": "localhost",
390
- "port": 3306,
391
- "database": "mydb",
392
- "user": "root",
393
- "password": "password"
394
- }
395
- }
396
- }
397
- ```
398
-
399
- Methods provided by `OrmService`:
400
-
401
- | Method | Description |
402
- |--------|------|
403
- | `getInfo(opt)` | Query DB connection info (dialect, database, schema) |
404
- | `connect(opt)` | Create DB connection. Returns connection ID |
405
- | `close(connId)` | Close DB connection |
406
- | `beginTransaction(connId, isolationLevel?)` | Begin transaction |
407
- | `commitTransaction(connId)` | Commit transaction |
408
- | `rollbackTransaction(connId)` | Rollback transaction |
409
- | `executeParametrized(connId, query, params?)` | Execute parameterized query |
410
- | `executeDefs(connId, defs, options?)` | Execute QueryDef-based queries |
411
- | `bulkInsert(connId, tableName, columnDefs, records)` | Bulk INSERT |
412
-
413
- When a WebSocket connection is closed, all DB connections opened from that socket are automatically cleaned up.
414
-
415
- ### Built-in Service: CryptoService
416
-
417
- Provides SHA256 hash and AES-256-CBC symmetric key encryption/decryption.
418
-
419
- ```typescript
420
- const server = new ServiceServer({
421
- port: 8080,
422
- rootPath: "/app/data",
423
- services: [CryptoService],
424
- });
425
- ```
426
-
427
- `.config.json` config:
428
-
429
- ```json
430
- {
431
- "crypto": {
432
- "key": "your-32-byte-secret-key-here!!"
433
- }
434
- }
435
- ```
436
-
437
- | Method | Description |
438
- |--------|------|
439
- | `encrypt(data)` | Generate SHA256 HMAC hash (one-way) |
440
- | `encryptAes(data)` | AES-256-CBC encryption. Returns hex string in `iv:encrypted` format |
441
- | `decryptAes(encText)` | AES-256-CBC decryption. Returns original binary |
442
-
443
- ### Built-in Service: SmtpService
444
-
445
- A nodemailer-based email sending service. Can pass SMTP config directly or reference server config file.
446
-
447
- ```typescript
448
- const server = new ServiceServer({
449
- port: 8080,
450
- rootPath: "/app/data",
451
- services: [SmtpService],
452
- });
453
- ```
237
+ ### Built-in Services
454
238
 
455
- `.config.json` config (when using config reference method):
456
-
457
- ```json
458
- {
459
- "smtp": {
460
- "default": {
461
- "host": "smtp.example.com",
462
- "port": 587,
463
- "secure": false,
464
- "user": "user@example.com",
465
- "pass": "password",
466
- "senderName": "My App",
467
- "senderEmail": "noreply@example.com"
468
- }
469
- }
470
- }
471
- ```
239
+ The package provides several built-in services:
472
240
 
473
- | Method | Description |
474
- |--------|------|
475
- | `send(options)` | Send email by directly passing SMTP config |
476
- | `sendByConfig(configName, options)` | Send email by referencing SMTP config in config file |
241
+ - [`OrmService`](docs/built-in-services.md#ormservice) - Database operations (MySQL, MSSQL, PostgreSQL)
242
+ - [`CryptoService`](docs/built-in-services.md#cryptoservice) - Hashing and encryption
243
+ - [`SmtpService`](docs/built-in-services.md#smtpservice) - Email sending
244
+ - [`AutoUpdateService`](docs/built-in-services.md#autoupdateservice) - Client app auto-updates
477
245
 
478
- `send()` options:
246
+ Register them like any other service:
479
247
 
480
248
  ```typescript
481
- interface SmtpSendOption {
482
- host: string;
483
- port?: number;
484
- secure?: boolean;
485
- user?: string;
486
- pass?: string;
487
- from: string;
488
- to: string;
489
- cc?: string;
490
- bcc?: string;
491
- subject: string;
492
- html: string;
493
- attachments?: SmtpSendAttachment[];
494
- }
495
- ```
496
-
497
- ### Built-in Service: AutoUpdateService
249
+ import { createServiceServer, OrmService, CryptoService, SmtpService } from "@simplysm/service-server";
498
250
 
499
- Supports auto-update for client apps. Searches for latest version files by platform in the client directory.
500
-
501
- ```typescript
502
- const server = new ServiceServer({
251
+ const server = createServiceServer({
503
252
  port: 8080,
504
253
  rootPath: "/app/data",
505
- services: [AutoUpdateService],
254
+ auth: { jwtSecret: "secret" },
255
+ services: [OrmService, CryptoService, SmtpService],
506
256
  });
507
257
  ```
508
258
 
509
- Update file structure:
510
-
511
- ```
512
- rootPath/www/{clientName}/{platform}/updates/
513
- 1.0.0.exe (Windows)
514
- 1.0.1.exe
515
- 1.0.0.apk (Android)
516
- 1.0.1.apk
517
- ```
518
-
519
- | Method | Description |
520
- |--------|------|
521
- | `getLastVersion(platform)` | Returns latest version and download path for the platform. Returns `undefined` if no update |
522
-
523
- Return value:
524
-
525
- ```typescript
526
- {
527
- version: string; // e.g., "1.0.1"
528
- downloadPath: string; // e.g., "/my-app/android/updates/1.0.1.apk"
529
- }
530
- ```
531
-
532
- ### ConfigManager
533
-
534
- A static utility class that manages loading, caching, and real-time monitoring of JSON config files. Used internally by `ServiceBase.getConfig()`.
535
-
536
- ```typescript
537
- import { ConfigManager } from "@simplysm/service-server";
538
-
539
- const config = await ConfigManager.getConfig<MyConfig>("/path/to/.config.json");
540
- ```
541
-
542
- Behavior:
543
- - Caches file in `LazyGcMap` on first load.
544
- - Registers file change watch (`FsWatcher`) to auto-refresh cache on changes.
545
- - Cache auto-expires after 1 hour of no access, and associated watch is released.
546
-
547
- ### ProtocolWrapper
548
-
549
- Handles encoding/decoding of WebSocket messages. Automatically branches between main thread and worker thread based on message size.
550
-
551
- | Condition | Processing Method |
552
- |------|-----------|
553
- | 30KB or less | Processed directly in main thread |
554
- | Over 30KB | Processed in worker thread (max 4GB memory allocation) |
555
-
556
- Messages containing large binary data (Uint8Array) also branch to worker thread.
557
-
558
- ## Server Route Structure
559
-
560
- The following routes are automatically registered when `ServiceServer.listen()` is called:
561
-
562
- | Route | Method | Description |
563
- |--------|--------|------|
564
- | `/api/:service/:method` | GET, POST | Service method call via HTTP |
565
- | `/upload` | POST | Multipart file upload (auth required) |
566
- | `/` | WebSocket | WebSocket connection endpoint |
567
- | `/ws` | WebSocket | WebSocket connection endpoint (alias) |
568
- | `/*` | GET, etc. | Static file serving (based on `rootPath/www/`) |
569
-
570
259
  ## Security
571
260
 
572
- - **Helmet**: `@fastify/helmet` plugin automatically sets security headers like CSP, HSTS.
573
- - **CORS**: `@fastify/cors` plugin configures CORS.
574
- - **Path Traversal Prevention**: Static file handler and client name validation block `..`, `/`, `\` characters.
575
- - **Hidden File Blocking**: Files starting with `.` return a 403 response.
576
- - **Graceful Shutdown**: Detects `SIGINT`/`SIGTERM` signals to safely close open WebSocket connections and server (10-second timeout).
577
-
578
- ## Caveats
261
+ - **Helmet**: `@fastify/helmet` plugin automatically sets security headers like CSP, HSTS
262
+ - **CORS**: `@fastify/cors` plugin configures CORS
263
+ - **Path Traversal Prevention**: Static file handler and client name validation block `..`, `/`, `\` characters
264
+ - **Hidden File Blocking**: Files starting with `.` return a 403 response
265
+ - **Graceful Shutdown**: Detects `SIGINT`/`SIGTERM` signals to safely close WebSocket connections and server (10-second timeout)
579
266
 
580
- - `OrmService` is WebSocket-only. Cannot be used via HTTP requests.
581
- - Config files (`.config.json`) contain sensitive information (DB passwords, JWT secrets, etc.), so hidden files (starting with `.`) are automatically blocked by the static file handler.
582
- - WebSocket connection requires query parameters `ver=2`, `clientId`, `clientName`. Without these parameters, it operates in V1 legacy mode.
583
- - If SSL is not configured, the `upgrade-insecure-requests` CSP directive is disabled.
267
+ See [Security](docs/server.md#security) for more details.
584
268
 
585
269
  ## License
586
270