@zyno-io/ts-server-foundation 26.712.36

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 (771) hide show
  1. package/README.md +31 -0
  2. package/dist/devconsole/assets/index-BlWLbczn.css +1 -0
  3. package/dist/devconsole/assets/index-lSF6DUY3.js +3 -0
  4. package/dist/devconsole/index.html +13 -0
  5. package/dist/src/app/base.d.ts +66 -0
  6. package/dist/src/app/base.d.ts.map +1 -0
  7. package/dist/src/app/base.js +577 -0
  8. package/dist/src/app/base.js.map +1 -0
  9. package/dist/src/app/commands.d.ts +20 -0
  10. package/dist/src/app/commands.d.ts.map +1 -0
  11. package/dist/src/app/commands.js +17 -0
  12. package/dist/src/app/commands.js.map +1 -0
  13. package/dist/src/app/config-loader.d.ts +9 -0
  14. package/dist/src/app/config-loader.d.ts.map +1 -0
  15. package/dist/src/app/config-loader.js +91 -0
  16. package/dist/src/app/config-loader.js.map +1 -0
  17. package/dist/src/app/config.d.ts +96 -0
  18. package/dist/src/app/config.d.ts.map +1 -0
  19. package/dist/src/app/config.js +114 -0
  20. package/dist/src/app/config.js.map +1 -0
  21. package/dist/src/app/const.d.ts +5 -0
  22. package/dist/src/app/const.d.ts.map +1 -0
  23. package/dist/src/app/const.js +17 -0
  24. package/dist/src/app/const.js.map +1 -0
  25. package/dist/src/app/current.d.ts +5 -0
  26. package/dist/src/app/current.d.ts.map +1 -0
  27. package/dist/src/app/current.js +14 -0
  28. package/dist/src/app/current.js.map +1 -0
  29. package/dist/src/app/index.d.ts +8 -0
  30. package/dist/src/app/index.d.ts.map +1 -0
  31. package/dist/src/app/index.js +13 -0
  32. package/dist/src/app/index.js.map +1 -0
  33. package/dist/src/app/lifecycle.d.ts +9 -0
  34. package/dist/src/app/lifecycle.d.ts.map +1 -0
  35. package/dist/src/app/lifecycle.js +21 -0
  36. package/dist/src/app/lifecycle.js.map +1 -0
  37. package/dist/src/app/migrations-entrypoint.d.ts +3 -0
  38. package/dist/src/app/migrations-entrypoint.d.ts.map +1 -0
  39. package/dist/src/app/migrations-entrypoint.js +35 -0
  40. package/dist/src/app/migrations-entrypoint.js.map +1 -0
  41. package/dist/src/app/resolver.d.ts +6 -0
  42. package/dist/src/app/resolver.d.ts.map +1 -0
  43. package/dist/src/app/resolver.js +15 -0
  44. package/dist/src/app/resolver.js.map +1 -0
  45. package/dist/src/auth/index.d.ts +3 -0
  46. package/dist/src/auth/index.d.ts.map +1 -0
  47. package/dist/src/auth/index.js +15 -0
  48. package/dist/src/auth/index.js.map +1 -0
  49. package/dist/src/auth/jwt.d.ts +61 -0
  50. package/dist/src/auth/jwt.d.ts.map +1 -0
  51. package/dist/src/auth/jwt.js +379 -0
  52. package/dist/src/auth/jwt.js.map +1 -0
  53. package/dist/src/auth/provider.d.ts +21 -0
  54. package/dist/src/auth/provider.d.ts.map +1 -0
  55. package/dist/src/auth/provider.js +148 -0
  56. package/dist/src/auth/provider.js.map +1 -0
  57. package/dist/src/cli/common.d.ts +13 -0
  58. package/dist/src/cli/common.d.ts.map +1 -0
  59. package/dist/src/cli/common.js +99 -0
  60. package/dist/src/cli/common.js.map +1 -0
  61. package/dist/src/cli/tsf-create-app.d.ts +3 -0
  62. package/dist/src/cli/tsf-create-app.d.ts.map +1 -0
  63. package/dist/src/cli/tsf-create-app.js +89 -0
  64. package/dist/src/cli/tsf-create-app.js.map +1 -0
  65. package/dist/src/cli/tsf-dev.d.ts +3 -0
  66. package/dist/src/cli/tsf-dev.d.ts.map +1 -0
  67. package/dist/src/cli/tsf-dev.js +753 -0
  68. package/dist/src/cli/tsf-dev.js.map +1 -0
  69. package/dist/src/cli/tsf-gen-proto.d.ts +3 -0
  70. package/dist/src/cli/tsf-gen-proto.d.ts.map +1 -0
  71. package/dist/src/cli/tsf-gen-proto.js +134 -0
  72. package/dist/src/cli/tsf-gen-proto.js.map +1 -0
  73. package/dist/src/cli/tsf-install.d.ts +8 -0
  74. package/dist/src/cli/tsf-install.d.ts.map +1 -0
  75. package/dist/src/cli/tsf-install.js +424 -0
  76. package/dist/src/cli/tsf-install.js.map +1 -0
  77. package/dist/src/cli/tsf-migrate.d.ts +3 -0
  78. package/dist/src/cli/tsf-migrate.d.ts.map +1 -0
  79. package/dist/src/cli/tsf-migrate.js +271 -0
  80. package/dist/src/cli/tsf-migrate.js.map +1 -0
  81. package/dist/src/cli/tsf-test.d.ts +4 -0
  82. package/dist/src/cli/tsf-test.d.ts.map +1 -0
  83. package/dist/src/cli/tsf-test.js +350 -0
  84. package/dist/src/cli/tsf-test.js.map +1 -0
  85. package/dist/src/cli/tsf-update.d.ts +3 -0
  86. package/dist/src/cli/tsf-update.d.ts.map +1 -0
  87. package/dist/src/cli/tsf-update.js +12 -0
  88. package/dist/src/cli/tsf-update.js.map +1 -0
  89. package/dist/src/cli/tsf.d.ts +3 -0
  90. package/dist/src/cli/tsf.d.ts.map +1 -0
  91. package/dist/src/cli/tsf.js +29 -0
  92. package/dist/src/cli/tsf.js.map +1 -0
  93. package/dist/src/database/database.d.ts +54 -0
  94. package/dist/src/database/database.d.ts.map +1 -0
  95. package/dist/src/database/database.js +695 -0
  96. package/dist/src/database/database.js.map +1 -0
  97. package/dist/src/database/driver.d.ts +28 -0
  98. package/dist/src/database/driver.d.ts.map +1 -0
  99. package/dist/src/database/driver.js +5 -0
  100. package/dist/src/database/driver.js.map +1 -0
  101. package/dist/src/database/drivers/index.d.ts +4 -0
  102. package/dist/src/database/drivers/index.d.ts.map +1 -0
  103. package/dist/src/database/drivers/index.js +9 -0
  104. package/dist/src/database/drivers/index.js.map +1 -0
  105. package/dist/src/database/drivers/mysql-session-rpc.d.ts +40 -0
  106. package/dist/src/database/drivers/mysql-session-rpc.d.ts.map +1 -0
  107. package/dist/src/database/drivers/mysql-session-rpc.js +180 -0
  108. package/dist/src/database/drivers/mysql-session-rpc.js.map +1 -0
  109. package/dist/src/database/drivers/mysql-session.d.ts +25 -0
  110. package/dist/src/database/drivers/mysql-session.d.ts.map +1 -0
  111. package/dist/src/database/drivers/mysql-session.js +124 -0
  112. package/dist/src/database/drivers/mysql-session.js.map +1 -0
  113. package/dist/src/database/drivers/mysql.d.ts +20 -0
  114. package/dist/src/database/drivers/mysql.d.ts.map +1 -0
  115. package/dist/src/database/drivers/mysql.js +84 -0
  116. package/dist/src/database/drivers/mysql.js.map +1 -0
  117. package/dist/src/database/drivers/postgres.d.ts +22 -0
  118. package/dist/src/database/drivers/postgres.d.ts.map +1 -0
  119. package/dist/src/database/drivers/postgres.js +80 -0
  120. package/dist/src/database/drivers/postgres.js.map +1 -0
  121. package/dist/src/database/entity.d.ts +112 -0
  122. package/dist/src/database/entity.d.ts.map +1 -0
  123. package/dist/src/database/entity.js +333 -0
  124. package/dist/src/database/entity.js.map +1 -0
  125. package/dist/src/database/errors.d.ts +7 -0
  126. package/dist/src/database/errors.d.ts.map +1 -0
  127. package/dist/src/database/errors.js +34 -0
  128. package/dist/src/database/errors.js.map +1 -0
  129. package/dist/src/database/factory.d.ts +48 -0
  130. package/dist/src/database/factory.d.ts.map +1 -0
  131. package/dist/src/database/factory.js +139 -0
  132. package/dist/src/database/factory.js.map +1 -0
  133. package/dist/src/database/identifiers.d.ts +8 -0
  134. package/dist/src/database/identifiers.d.ts.map +1 -0
  135. package/dist/src/database/identifiers.js +46 -0
  136. package/dist/src/database/identifiers.js.map +1 -0
  137. package/dist/src/database/index.d.ts +14 -0
  138. package/dist/src/database/index.d.ts.map +1 -0
  139. package/dist/src/database/index.js +33 -0
  140. package/dist/src/database/index.js.map +1 -0
  141. package/dist/src/database/metadata.d.ts +27 -0
  142. package/dist/src/database/metadata.d.ts.map +1 -0
  143. package/dist/src/database/metadata.js +70 -0
  144. package/dist/src/database/metadata.js.map +1 -0
  145. package/dist/src/database/migration/create/comparator.d.ts +3 -0
  146. package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
  147. package/dist/src/database/migration/create/comparator.js +302 -0
  148. package/dist/src/database/migration/create/comparator.js.map +1 -0
  149. package/dist/src/database/migration/create/db-reader.d.ts +9 -0
  150. package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
  151. package/dist/src/database/migration/create/db-reader.js +478 -0
  152. package/dist/src/database/migration/create/db-reader.js.map +1 -0
  153. package/dist/src/database/migration/create/ddl-generator.d.ts +4 -0
  154. package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
  155. package/dist/src/database/migration/create/ddl-generator.js +431 -0
  156. package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
  157. package/dist/src/database/migration/create/entity-reader.d.ts +7 -0
  158. package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
  159. package/dist/src/database/migration/create/entity-reader.js +169 -0
  160. package/dist/src/database/migration/create/entity-reader.js.map +1 -0
  161. package/dist/src/database/migration/create/file-generator.d.ts +7 -0
  162. package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
  163. package/dist/src/database/migration/create/file-generator.js +60 -0
  164. package/dist/src/database/migration/create/file-generator.js.map +1 -0
  165. package/dist/src/database/migration/create/index.d.ts +19 -0
  166. package/dist/src/database/migration/create/index.d.ts.map +1 -0
  167. package/dist/src/database/migration/create/index.js +102 -0
  168. package/dist/src/database/migration/create/index.js.map +1 -0
  169. package/dist/src/database/migration/create/schema-model.d.ts +99 -0
  170. package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
  171. package/dist/src/database/migration/create/schema-model.js +24 -0
  172. package/dist/src/database/migration/create/schema-model.js.map +1 -0
  173. package/dist/src/database/migration/create/type-mapper.d.ts +13 -0
  174. package/dist/src/database/migration/create/type-mapper.d.ts.map +1 -0
  175. package/dist/src/database/migration/create/type-mapper.js +293 -0
  176. package/dist/src/database/migration/create/type-mapper.js.map +1 -0
  177. package/dist/src/database/migration/index.d.ts +33 -0
  178. package/dist/src/database/migration/index.d.ts.map +1 -0
  179. package/dist/src/database/migration/index.js +165 -0
  180. package/dist/src/database/migration/index.js.map +1 -0
  181. package/dist/src/database/migration/maintenance.d.ts +26 -0
  182. package/dist/src/database/migration/maintenance.d.ts.map +1 -0
  183. package/dist/src/database/migration/maintenance.js +65 -0
  184. package/dist/src/database/migration/maintenance.js.map +1 -0
  185. package/dist/src/database/query.d.ts +79 -0
  186. package/dist/src/database/query.d.ts.map +1 -0
  187. package/dist/src/database/query.js +435 -0
  188. package/dist/src/database/query.js.map +1 -0
  189. package/dist/src/database/schema.d.ts +147 -0
  190. package/dist/src/database/schema.d.ts.map +1 -0
  191. package/dist/src/database/schema.js +709 -0
  192. package/dist/src/database/schema.js.map +1 -0
  193. package/dist/src/database/session.d.ts +63 -0
  194. package/dist/src/database/session.d.ts.map +1 -0
  195. package/dist/src/database/session.js +226 -0
  196. package/dist/src/database/session.js.map +1 -0
  197. package/dist/src/database/sql.d.ts +37 -0
  198. package/dist/src/database/sql.d.ts.map +1 -0
  199. package/dist/src/database/sql.js +143 -0
  200. package/dist/src/database/sql.js.map +1 -0
  201. package/dist/src/database/values.d.ts +6 -0
  202. package/dist/src/database/values.d.ts.map +1 -0
  203. package/dist/src/database/values.js +237 -0
  204. package/dist/src/database/values.js.map +1 -0
  205. package/dist/src/devconsole/controller.d.ts +11 -0
  206. package/dist/src/devconsole/controller.d.ts.map +1 -0
  207. package/dist/src/devconsole/controller.js +78 -0
  208. package/dist/src/devconsole/controller.js.map +1 -0
  209. package/dist/src/devconsole/generated/devconsole.d.ts +306 -0
  210. package/dist/src/devconsole/generated/devconsole.d.ts.map +1 -0
  211. package/dist/src/devconsole/generated/devconsole.js +4029 -0
  212. package/dist/src/devconsole/generated/devconsole.js.map +1 -0
  213. package/dist/src/devconsole/index.d.ts +10 -0
  214. package/dist/src/devconsole/index.d.ts.map +1 -0
  215. package/dist/src/devconsole/index.js +26 -0
  216. package/dist/src/devconsole/index.js.map +1 -0
  217. package/dist/src/devconsole/observers.d.ts +4 -0
  218. package/dist/src/devconsole/observers.d.ts.map +1 -0
  219. package/dist/src/devconsole/observers.js +170 -0
  220. package/dist/src/devconsole/observers.js.map +1 -0
  221. package/dist/src/devconsole/runtime.d.ts +16 -0
  222. package/dist/src/devconsole/runtime.d.ts.map +1 -0
  223. package/dist/src/devconsole/runtime.js +48 -0
  224. package/dist/src/devconsole/runtime.js.map +1 -0
  225. package/dist/src/devconsole/security.d.ts +8 -0
  226. package/dist/src/devconsole/security.d.ts.map +1 -0
  227. package/dist/src/devconsole/security.js +33 -0
  228. package/dist/src/devconsole/security.js.map +1 -0
  229. package/dist/src/devconsole/server.d.ts +25 -0
  230. package/dist/src/devconsole/server.d.ts.map +1 -0
  231. package/dist/src/devconsole/server.js +452 -0
  232. package/dist/src/devconsole/server.js.map +1 -0
  233. package/dist/src/devconsole/store.d.ts +111 -0
  234. package/dist/src/devconsole/store.d.ts.map +1 -0
  235. package/dist/src/devconsole/store.js +177 -0
  236. package/dist/src/devconsole/store.js.map +1 -0
  237. package/dist/src/di/container.d.ts +38 -0
  238. package/dist/src/di/container.d.ts.map +1 -0
  239. package/dist/src/di/container.js +252 -0
  240. package/dist/src/di/container.js.map +1 -0
  241. package/dist/src/di/errors.d.ts +18 -0
  242. package/dist/src/di/errors.d.ts.map +1 -0
  243. package/dist/src/di/errors.js +71 -0
  244. package/dist/src/di/errors.js.map +1 -0
  245. package/dist/src/di/index.d.ts +5 -0
  246. package/dist/src/di/index.d.ts.map +1 -0
  247. package/dist/src/di/index.js +10 -0
  248. package/dist/src/di/index.js.map +1 -0
  249. package/dist/src/di/module.d.ts +29 -0
  250. package/dist/src/di/module.d.ts.map +1 -0
  251. package/dist/src/di/module.js +42 -0
  252. package/dist/src/di/module.js.map +1 -0
  253. package/dist/src/di/provider.d.ts +34 -0
  254. package/dist/src/di/provider.d.ts.map +1 -0
  255. package/dist/src/di/provider.js +24 -0
  256. package/dist/src/di/provider.js.map +1 -0
  257. package/dist/src/env.d.ts +122 -0
  258. package/dist/src/env.d.ts.map +1 -0
  259. package/dist/src/env.js +61 -0
  260. package/dist/src/env.js.map +1 -0
  261. package/dist/src/events/event-bus.d.ts +26 -0
  262. package/dist/src/events/event-bus.d.ts.map +1 -0
  263. package/dist/src/events/event-bus.js +67 -0
  264. package/dist/src/events/event-bus.js.map +1 -0
  265. package/dist/src/events/index.d.ts +2 -0
  266. package/dist/src/events/index.d.ts.map +1 -0
  267. package/dist/src/events/index.js +7 -0
  268. package/dist/src/events/index.js.map +1 -0
  269. package/dist/src/health/healthcheck.controller.d.ts +9 -0
  270. package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
  271. package/dist/src/health/healthcheck.controller.js +33 -0
  272. package/dist/src/health/healthcheck.controller.js.map +1 -0
  273. package/dist/src/health/healthcheck.service.d.ts +13 -0
  274. package/dist/src/health/healthcheck.service.d.ts.map +1 -0
  275. package/dist/src/health/healthcheck.service.js +37 -0
  276. package/dist/src/health/healthcheck.service.js.map +1 -0
  277. package/dist/src/health/index.d.ts +3 -0
  278. package/dist/src/health/index.d.ts.map +1 -0
  279. package/dist/src/health/index.js +8 -0
  280. package/dist/src/health/index.js.map +1 -0
  281. package/dist/src/helpers/async/context.d.ts +10 -0
  282. package/dist/src/helpers/async/context.d.ts.map +1 -0
  283. package/dist/src/helpers/async/context.js +52 -0
  284. package/dist/src/helpers/async/context.js.map +1 -0
  285. package/dist/src/helpers/async/process.d.ts +16 -0
  286. package/dist/src/helpers/async/process.d.ts.map +1 -0
  287. package/dist/src/helpers/async/process.js +62 -0
  288. package/dist/src/helpers/async/process.js.map +1 -0
  289. package/dist/src/helpers/async/promise.d.ts +11 -0
  290. package/dist/src/helpers/async/promise.d.ts.map +1 -0
  291. package/dist/src/helpers/async/promise.js +32 -0
  292. package/dist/src/helpers/async/promise.js.map +1 -0
  293. package/dist/src/helpers/data/array.d.ts +5 -0
  294. package/dist/src/helpers/data/array.d.ts.map +1 -0
  295. package/dist/src/helpers/data/array.js +27 -0
  296. package/dist/src/helpers/data/array.js.map +1 -0
  297. package/dist/src/helpers/data/objects.d.ts +13 -0
  298. package/dist/src/helpers/data/objects.d.ts.map +1 -0
  299. package/dist/src/helpers/data/objects.js +55 -0
  300. package/dist/src/helpers/data/objects.js.map +1 -0
  301. package/dist/src/helpers/data/serialization.d.ts +5 -0
  302. package/dist/src/helpers/data/serialization.d.ts.map +1 -0
  303. package/dist/src/helpers/data/serialization.js +25 -0
  304. package/dist/src/helpers/data/serialization.js.map +1 -0
  305. package/dist/src/helpers/data/transformer.d.ts +13 -0
  306. package/dist/src/helpers/data/transformer.d.ts.map +1 -0
  307. package/dist/src/helpers/data/transformer.js +50 -0
  308. package/dist/src/helpers/data/transformer.js.map +1 -0
  309. package/dist/src/helpers/index.d.ts +19 -0
  310. package/dist/src/helpers/index.d.ts.map +1 -0
  311. package/dist/src/helpers/index.js +30 -0
  312. package/dist/src/helpers/index.js.map +1 -0
  313. package/dist/src/helpers/io/package.d.ts +10 -0
  314. package/dist/src/helpers/io/package.d.ts.map +1 -0
  315. package/dist/src/helpers/io/package.js +35 -0
  316. package/dist/src/helpers/io/package.js.map +1 -0
  317. package/dist/src/helpers/io/stream.d.ts +18 -0
  318. package/dist/src/helpers/io/stream.d.ts.map +1 -0
  319. package/dist/src/helpers/io/stream.js +131 -0
  320. package/dist/src/helpers/io/stream.js.map +1 -0
  321. package/dist/src/helpers/redis/broadcast.d.ts +15 -0
  322. package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
  323. package/dist/src/helpers/redis/broadcast.js +93 -0
  324. package/dist/src/helpers/redis/broadcast.js.map +1 -0
  325. package/dist/src/helpers/redis/cache.d.ts +20 -0
  326. package/dist/src/helpers/redis/cache.d.ts.map +1 -0
  327. package/dist/src/helpers/redis/cache.js +57 -0
  328. package/dist/src/helpers/redis/cache.js.map +1 -0
  329. package/dist/src/helpers/redis/mutex.d.ts +45 -0
  330. package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
  331. package/dist/src/helpers/redis/mutex.js +446 -0
  332. package/dist/src/helpers/redis/mutex.js.map +1 -0
  333. package/dist/src/helpers/redis/redis.d.ts +12 -0
  334. package/dist/src/helpers/redis/redis.d.ts.map +1 -0
  335. package/dist/src/helpers/redis/redis.js +62 -0
  336. package/dist/src/helpers/redis/redis.js.map +1 -0
  337. package/dist/src/helpers/security/crypto.d.ts +31 -0
  338. package/dist/src/helpers/security/crypto.d.ts.map +1 -0
  339. package/dist/src/helpers/security/crypto.js +108 -0
  340. package/dist/src/helpers/security/crypto.js.map +1 -0
  341. package/dist/src/helpers/security/validation.d.ts +3 -0
  342. package/dist/src/helpers/security/validation.d.ts.map +1 -0
  343. package/dist/src/helpers/security/validation.js +14 -0
  344. package/dist/src/helpers/security/validation.js.map +1 -0
  345. package/dist/src/helpers/utils/date.d.ts +4 -0
  346. package/dist/src/helpers/utils/date.d.ts.map +1 -0
  347. package/dist/src/helpers/utils/date.js +16 -0
  348. package/dist/src/helpers/utils/date.js.map +1 -0
  349. package/dist/src/helpers/utils/error.d.ts +20 -0
  350. package/dist/src/helpers/utils/error.d.ts.map +1 -0
  351. package/dist/src/helpers/utils/error.js +164 -0
  352. package/dist/src/helpers/utils/error.js.map +1 -0
  353. package/dist/src/helpers/utils/uuid.d.ts +5 -0
  354. package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
  355. package/dist/src/helpers/utils/uuid.js +13 -0
  356. package/dist/src/helpers/utils/uuid.js.map +1 -0
  357. package/dist/src/http/auth.d.ts +20 -0
  358. package/dist/src/http/auth.d.ts.map +1 -0
  359. package/dist/src/http/auth.js +68 -0
  360. package/dist/src/http/auth.js.map +1 -0
  361. package/dist/src/http/base.d.ts +57 -0
  362. package/dist/src/http/base.d.ts.map +1 -0
  363. package/dist/src/http/base.js +331 -0
  364. package/dist/src/http/base.js.map +1 -0
  365. package/dist/src/http/context.d.ts +6 -0
  366. package/dist/src/http/context.d.ts.map +1 -0
  367. package/dist/src/http/context.js +26 -0
  368. package/dist/src/http/context.js.map +1 -0
  369. package/dist/src/http/cors.d.ts +25 -0
  370. package/dist/src/http/cors.d.ts.map +1 -0
  371. package/dist/src/http/cors.js +124 -0
  372. package/dist/src/http/cors.js.map +1 -0
  373. package/dist/src/http/decorators.d.ts +64 -0
  374. package/dist/src/http/decorators.d.ts.map +1 -0
  375. package/dist/src/http/decorators.js +102 -0
  376. package/dist/src/http/decorators.js.map +1 -0
  377. package/dist/src/http/errors.d.ts +50 -0
  378. package/dist/src/http/errors.d.ts.map +1 -0
  379. package/dist/src/http/errors.js +158 -0
  380. package/dist/src/http/errors.js.map +1 -0
  381. package/dist/src/http/index.d.ts +31 -0
  382. package/dist/src/http/index.d.ts.map +1 -0
  383. package/dist/src/http/index.js +33 -0
  384. package/dist/src/http/index.js.map +1 -0
  385. package/dist/src/http/middleware.d.ts +12 -0
  386. package/dist/src/http/middleware.d.ts.map +1 -0
  387. package/dist/src/http/middleware.js +31 -0
  388. package/dist/src/http/middleware.js.map +1 -0
  389. package/dist/src/http/parameter-resolvers.d.ts +3 -0
  390. package/dist/src/http/parameter-resolvers.d.ts.map +1 -0
  391. package/dist/src/http/parameter-resolvers.js +8 -0
  392. package/dist/src/http/parameter-resolvers.js.map +1 -0
  393. package/dist/src/http/request-logging.d.ts +34 -0
  394. package/dist/src/http/request-logging.d.ts.map +1 -0
  395. package/dist/src/http/request-logging.js +130 -0
  396. package/dist/src/http/request-logging.js.map +1 -0
  397. package/dist/src/http/request.d.ts +69 -0
  398. package/dist/src/http/request.d.ts.map +1 -0
  399. package/dist/src/http/request.js +366 -0
  400. package/dist/src/http/request.js.map +1 -0
  401. package/dist/src/http/response.d.ts +98 -0
  402. package/dist/src/http/response.d.ts.map +1 -0
  403. package/dist/src/http/response.js +292 -0
  404. package/dist/src/http/response.js.map +1 -0
  405. package/dist/src/http/router.d.ts +100 -0
  406. package/dist/src/http/router.d.ts.map +1 -0
  407. package/dist/src/http/router.js +1085 -0
  408. package/dist/src/http/router.js.map +1 -0
  409. package/dist/src/http/startup-logging.d.ts +8 -0
  410. package/dist/src/http/startup-logging.d.ts.map +1 -0
  411. package/dist/src/http/startup-logging.js +55 -0
  412. package/dist/src/http/startup-logging.js.map +1 -0
  413. package/dist/src/http/static-files.d.ts +15 -0
  414. package/dist/src/http/static-files.d.ts.map +1 -0
  415. package/dist/src/http/static-files.js +110 -0
  416. package/dist/src/http/static-files.js.map +1 -0
  417. package/dist/src/http/store.d.ts +8 -0
  418. package/dist/src/http/store.d.ts.map +1 -0
  419. package/dist/src/http/store.js +47 -0
  420. package/dist/src/http/store.js.map +1 -0
  421. package/dist/src/http/types.d.ts +23 -0
  422. package/dist/src/http/types.d.ts.map +1 -0
  423. package/dist/src/http/types.js +3 -0
  424. package/dist/src/http/types.js.map +1 -0
  425. package/dist/src/http/upgrade.d.ts +22 -0
  426. package/dist/src/http/upgrade.d.ts.map +1 -0
  427. package/dist/src/http/upgrade.js +164 -0
  428. package/dist/src/http/upgrade.js.map +1 -0
  429. package/dist/src/http/uploads.d.ts +36 -0
  430. package/dist/src/http/uploads.d.ts.map +1 -0
  431. package/dist/src/http/uploads.js +287 -0
  432. package/dist/src/http/uploads.js.map +1 -0
  433. package/dist/src/http/workflow.d.ts +34 -0
  434. package/dist/src/http/workflow.d.ts.map +1 -0
  435. package/dist/src/http/workflow.js +40 -0
  436. package/dist/src/http/workflow.js.map +1 -0
  437. package/dist/src/index.d.ts +21 -0
  438. package/dist/src/index.d.ts.map +1 -0
  439. package/dist/src/index.js +88 -0
  440. package/dist/src/index.js.map +1 -0
  441. package/dist/src/openapi/controller.d.ts +9 -0
  442. package/dist/src/openapi/controller.d.ts.map +1 -0
  443. package/dist/src/openapi/controller.js +45 -0
  444. package/dist/src/openapi/controller.js.map +1 -0
  445. package/dist/src/openapi/index.d.ts +5 -0
  446. package/dist/src/openapi/index.d.ts.map +1 -0
  447. package/dist/src/openapi/index.js +21 -0
  448. package/dist/src/openapi/index.js.map +1 -0
  449. package/dist/src/openapi/schema.d.ts +26 -0
  450. package/dist/src/openapi/schema.d.ts.map +1 -0
  451. package/dist/src/openapi/schema.js +1128 -0
  452. package/dist/src/openapi/schema.js.map +1 -0
  453. package/dist/src/openapi/serializer.d.ts +16 -0
  454. package/dist/src/openapi/serializer.d.ts.map +1 -0
  455. package/dist/src/openapi/serializer.js +506 -0
  456. package/dist/src/openapi/serializer.js.map +1 -0
  457. package/dist/src/openapi/types.d.ts +84 -0
  458. package/dist/src/openapi/types.d.ts.map +1 -0
  459. package/dist/src/openapi/types.js +5 -0
  460. package/dist/src/openapi/types.js.map +1 -0
  461. package/dist/src/reflection/annotations.d.ts +15 -0
  462. package/dist/src/reflection/annotations.d.ts.map +1 -0
  463. package/dist/src/reflection/annotations.js +228 -0
  464. package/dist/src/reflection/annotations.js.map +1 -0
  465. package/dist/src/reflection/conversion.d.ts +15 -0
  466. package/dist/src/reflection/conversion.d.ts.map +1 -0
  467. package/dist/src/reflection/conversion.js +360 -0
  468. package/dist/src/reflection/conversion.js.map +1 -0
  469. package/dist/src/reflection/deserializer.d.ts +15 -0
  470. package/dist/src/reflection/deserializer.d.ts.map +1 -0
  471. package/dist/src/reflection/deserializer.js +42 -0
  472. package/dist/src/reflection/deserializer.js.map +1 -0
  473. package/dist/src/reflection/entity.d.ts +9 -0
  474. package/dist/src/reflection/entity.d.ts.map +1 -0
  475. package/dist/src/reflection/entity.js +74 -0
  476. package/dist/src/reflection/entity.js.map +1 -0
  477. package/dist/src/reflection/errors.d.ts +8 -0
  478. package/dist/src/reflection/errors.d.ts.map +1 -0
  479. package/dist/src/reflection/errors.js +21 -0
  480. package/dist/src/reflection/errors.js.map +1 -0
  481. package/dist/src/reflection/index.d.ts +8 -0
  482. package/dist/src/reflection/index.d.ts.map +1 -0
  483. package/dist/src/reflection/index.js +13 -0
  484. package/dist/src/reflection/index.js.map +1 -0
  485. package/dist/src/reflection/metadata-store.d.ts +14 -0
  486. package/dist/src/reflection/metadata-store.d.ts.map +1 -0
  487. package/dist/src/reflection/metadata-store.js +18 -0
  488. package/dist/src/reflection/metadata-store.js.map +1 -0
  489. package/dist/src/reflection/model.d.ts +271 -0
  490. package/dist/src/reflection/model.d.ts.map +1 -0
  491. package/dist/src/reflection/model.js +36 -0
  492. package/dist/src/reflection/model.js.map +1 -0
  493. package/dist/src/reflection/reflection-class.d.ts +60 -0
  494. package/dist/src/reflection/reflection-class.d.ts.map +1 -0
  495. package/dist/src/reflection/reflection-class.js +263 -0
  496. package/dist/src/reflection/reflection-class.js.map +1 -0
  497. package/dist/src/reflection/type-utils.d.ts +34 -0
  498. package/dist/src/reflection/type-utils.d.ts.map +1 -0
  499. package/dist/src/reflection/type-utils.js +485 -0
  500. package/dist/src/reflection/type-utils.js.map +1 -0
  501. package/dist/src/reflection.d.ts +2 -0
  502. package/dist/src/reflection.d.ts.map +1 -0
  503. package/dist/src/reflection.js +5 -0
  504. package/dist/src/reflection.js.map +1 -0
  505. package/dist/src/services/cli.d.ts +9 -0
  506. package/dist/src/services/cli.d.ts.map +1 -0
  507. package/dist/src/services/cli.js +47 -0
  508. package/dist/src/services/cli.js.map +1 -0
  509. package/dist/src/services/index.d.ts +8 -0
  510. package/dist/src/services/index.d.ts.map +1 -0
  511. package/dist/src/services/index.js +13 -0
  512. package/dist/src/services/index.js.map +1 -0
  513. package/dist/src/services/leader.d.ts +31 -0
  514. package/dist/src/services/leader.d.ts.map +1 -0
  515. package/dist/src/services/leader.js +176 -0
  516. package/dist/src/services/leader.js.map +1 -0
  517. package/dist/src/services/logger.d.ts +60 -0
  518. package/dist/src/services/logger.d.ts.map +1 -0
  519. package/dist/src/services/logger.js +349 -0
  520. package/dist/src/services/logger.js.map +1 -0
  521. package/dist/src/services/mail/index.d.ts +57 -0
  522. package/dist/src/services/mail/index.d.ts.map +1 -0
  523. package/dist/src/services/mail/index.js +89 -0
  524. package/dist/src/services/mail/index.js.map +1 -0
  525. package/dist/src/services/mail/postmark.d.ts +11 -0
  526. package/dist/src/services/mail/postmark.d.ts.map +1 -0
  527. package/dist/src/services/mail/postmark.js +41 -0
  528. package/dist/src/services/mail/postmark.js.map +1 -0
  529. package/dist/src/services/mail/smtp.d.ts +11 -0
  530. package/dist/src/services/mail/smtp.d.ts.map +1 -0
  531. package/dist/src/services/mail/smtp.js +50 -0
  532. package/dist/src/services/mail/smtp.js.map +1 -0
  533. package/dist/src/services/mesh-client/index.d.ts +9 -0
  534. package/dist/src/services/mesh-client/index.d.ts.map +1 -0
  535. package/dist/src/services/mesh-client/index.js +18 -0
  536. package/dist/src/services/mesh-client/index.js.map +1 -0
  537. package/dist/src/services/mesh-client/mesh-client-redis-registry.d.ts +23 -0
  538. package/dist/src/services/mesh-client/mesh-client-redis-registry.d.ts.map +1 -0
  539. package/dist/src/services/mesh-client/mesh-client-redis-registry.js +360 -0
  540. package/dist/src/services/mesh-client/mesh-client-redis-registry.js.map +1 -0
  541. package/dist/src/services/mesh-client/mesh-client-registry.d.ts +16 -0
  542. package/dist/src/services/mesh-client/mesh-client-registry.d.ts.map +1 -0
  543. package/dist/src/services/mesh-client/mesh-client-registry.js +44 -0
  544. package/dist/src/services/mesh-client/mesh-client-registry.js.map +1 -0
  545. package/dist/src/services/mesh-client/mesh-client-service.d.ts +88 -0
  546. package/dist/src/services/mesh-client/mesh-client-service.d.ts.map +1 -0
  547. package/dist/src/services/mesh-client/mesh-client-service.js +222 -0
  548. package/dist/src/services/mesh-client/mesh-client-service.js.map +1 -0
  549. package/dist/src/services/mesh-client/mesh-srpc-server.d.ts +95 -0
  550. package/dist/src/services/mesh-client/mesh-srpc-server.d.ts.map +1 -0
  551. package/dist/src/services/mesh-client/mesh-srpc-server.js +475 -0
  552. package/dist/src/services/mesh-client/mesh-srpc-server.js.map +1 -0
  553. package/dist/src/services/mesh-client/types.d.ts +36 -0
  554. package/dist/src/services/mesh-client/types.d.ts.map +1 -0
  555. package/dist/src/services/mesh-client/types.js +38 -0
  556. package/dist/src/services/mesh-client/types.js.map +1 -0
  557. package/dist/src/services/mesh.d.ts +73 -0
  558. package/dist/src/services/mesh.d.ts.map +1 -0
  559. package/dist/src/services/mesh.js +511 -0
  560. package/dist/src/services/mesh.js.map +1 -0
  561. package/dist/src/services/worker/entity.d.ts +26 -0
  562. package/dist/src/services/worker/entity.d.ts.map +1 -0
  563. package/dist/src/services/worker/entity.js +30 -0
  564. package/dist/src/services/worker/entity.js.map +1 -0
  565. package/dist/src/services/worker/index.d.ts +25 -0
  566. package/dist/src/services/worker/index.d.ts.map +1 -0
  567. package/dist/src/services/worker/index.js +52 -0
  568. package/dist/src/services/worker/index.js.map +1 -0
  569. package/dist/src/services/worker/observer.d.ts +13 -0
  570. package/dist/src/services/worker/observer.d.ts.map +1 -0
  571. package/dist/src/services/worker/observer.js +22 -0
  572. package/dist/src/services/worker/observer.js.map +1 -0
  573. package/dist/src/services/worker/queue.d.ts +38 -0
  574. package/dist/src/services/worker/queue.d.ts.map +1 -0
  575. package/dist/src/services/worker/queue.js +227 -0
  576. package/dist/src/services/worker/queue.js.map +1 -0
  577. package/dist/src/services/worker/recorder.d.ts +17 -0
  578. package/dist/src/services/worker/recorder.d.ts.map +1 -0
  579. package/dist/src/services/worker/recorder.js +88 -0
  580. package/dist/src/services/worker/recorder.js.map +1 -0
  581. package/dist/src/services/worker/runner.d.ts +37 -0
  582. package/dist/src/services/worker/runner.d.ts.map +1 -0
  583. package/dist/src/services/worker/runner.js +319 -0
  584. package/dist/src/services/worker/runner.js.map +1 -0
  585. package/dist/src/services/worker/types.d.ts +63 -0
  586. package/dist/src/services/worker/types.d.ts.map +1 -0
  587. package/dist/src/services/worker/types.js +38 -0
  588. package/dist/src/services/worker/types.js.map +1 -0
  589. package/dist/src/srpc/SrpcByteStream.d.ts +60 -0
  590. package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
  591. package/dist/src/srpc/SrpcByteStream.js +237 -0
  592. package/dist/src/srpc/SrpcByteStream.js.map +1 -0
  593. package/dist/src/srpc/SrpcClient.d.ts +67 -0
  594. package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
  595. package/dist/src/srpc/SrpcClient.js +406 -0
  596. package/dist/src/srpc/SrpcClient.js.map +1 -0
  597. package/dist/src/srpc/SrpcServer.d.ts +56 -0
  598. package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
  599. package/dist/src/srpc/SrpcServer.js +519 -0
  600. package/dist/src/srpc/SrpcServer.js.map +1 -0
  601. package/dist/src/srpc/index.d.ts +9 -0
  602. package/dist/src/srpc/index.d.ts.map +1 -0
  603. package/dist/src/srpc/index.js +17 -0
  604. package/dist/src/srpc/index.js.map +1 -0
  605. package/dist/src/srpc/observer.d.ts +21 -0
  606. package/dist/src/srpc/observer.d.ts.map +1 -0
  607. package/dist/src/srpc/observer.js +22 -0
  608. package/dist/src/srpc/observer.js.map +1 -0
  609. package/dist/src/srpc/types.d.ts +92 -0
  610. package/dist/src/srpc/types.d.ts.map +1 -0
  611. package/dist/src/srpc/types.js +28 -0
  612. package/dist/src/srpc/types.js.map +1 -0
  613. package/dist/src/telemetry/index.d.ts +3 -0
  614. package/dist/src/telemetry/index.d.ts.map +1 -0
  615. package/dist/src/telemetry/index.js +22 -0
  616. package/dist/src/telemetry/index.js.map +1 -0
  617. package/dist/src/telemetry/otel/helpers.d.ts +45 -0
  618. package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
  619. package/dist/src/telemetry/otel/helpers.js +142 -0
  620. package/dist/src/telemetry/otel/helpers.js.map +1 -0
  621. package/dist/src/telemetry/otel/index.d.ts +22 -0
  622. package/dist/src/telemetry/otel/index.d.ts.map +1 -0
  623. package/dist/src/telemetry/otel/index.js +268 -0
  624. package/dist/src/telemetry/otel/index.js.map +1 -0
  625. package/dist/src/telemetry/otel/metrics.controller.d.ts +5 -0
  626. package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
  627. package/dist/src/telemetry/otel/metrics.controller.js +82 -0
  628. package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
  629. package/dist/src/telemetry/otel/metrics.d.ts +2 -0
  630. package/dist/src/telemetry/otel/metrics.d.ts.map +1 -0
  631. package/dist/src/telemetry/otel/metrics.js +16 -0
  632. package/dist/src/telemetry/otel/metrics.js.map +1 -0
  633. package/dist/src/telemetry/sentry.d.ts +9 -0
  634. package/dist/src/telemetry/sentry.d.ts.map +1 -0
  635. package/dist/src/telemetry/sentry.js +63 -0
  636. package/dist/src/telemetry/sentry.js.map +1 -0
  637. package/dist/src/testing/database-readiness.d.ts +11 -0
  638. package/dist/src/testing/database-readiness.d.ts.map +1 -0
  639. package/dist/src/testing/database-readiness.js +102 -0
  640. package/dist/src/testing/database-readiness.js.map +1 -0
  641. package/dist/src/testing/expect.d.ts +21 -0
  642. package/dist/src/testing/expect.d.ts.map +1 -0
  643. package/dist/src/testing/expect.js +110 -0
  644. package/dist/src/testing/expect.js.map +1 -0
  645. package/dist/src/testing/fixtures.d.ts +18 -0
  646. package/dist/src/testing/fixtures.d.ts.map +1 -0
  647. package/dist/src/testing/fixtures.js +46 -0
  648. package/dist/src/testing/fixtures.js.map +1 -0
  649. package/dist/src/testing/index.d.ts +143 -0
  650. package/dist/src/testing/index.d.ts.map +1 -0
  651. package/dist/src/testing/index.js +993 -0
  652. package/dist/src/testing/index.js.map +1 -0
  653. package/dist/src/testing/mysql-session-manager-process.d.ts +3 -0
  654. package/dist/src/testing/mysql-session-manager-process.d.ts.map +1 -0
  655. package/dist/src/testing/mysql-session-manager-process.js +77 -0
  656. package/dist/src/testing/mysql-session-manager-process.js.map +1 -0
  657. package/dist/src/testing/mysql-session-manager.d.ts +59 -0
  658. package/dist/src/testing/mysql-session-manager.d.ts.map +1 -0
  659. package/dist/src/testing/mysql-session-manager.js +910 -0
  660. package/dist/src/testing/mysql-session-manager.js.map +1 -0
  661. package/dist/src/testing/sql.d.ts +47 -0
  662. package/dist/src/testing/sql.d.ts.map +1 -0
  663. package/dist/src/testing/sql.js +313 -0
  664. package/dist/src/testing/sql.js.map +1 -0
  665. package/dist/src/type-compiler/go/ast_expression.go +161 -0
  666. package/dist/src/type-compiler/go/ast_metadata.go +355 -0
  667. package/dist/src/type-compiler/go/collect.go +806 -0
  668. package/dist/src/type-compiler/go/emission_plan.go +205 -0
  669. package/dist/src/type-compiler/go/emit_ast.go +406 -0
  670. package/dist/src/type-compiler/go/emit_ast_test.go +248 -0
  671. package/dist/src/type-compiler/go/go.mod +10 -0
  672. package/dist/src/type-compiler/go/plugin.go +308 -0
  673. package/dist/src/type-compiler/go/plugin_test.go +752 -0
  674. package/dist/src/type-compiler/go/precompute.go +86 -0
  675. package/dist/src/type-compiler/go/receive_type.go +837 -0
  676. package/dist/src/type-compiler/go/resolve.go +265 -0
  677. package/dist/src/type-compiler/go/source_scan.go +51 -0
  678. package/dist/src/type-compiler/go/text_parse.go +671 -0
  679. package/dist/src/type-compiler/go/type_expr.go +1227 -0
  680. package/dist/src/type-compiler/go/typia_expr.go +2119 -0
  681. package/dist/src/type-compiler/index.cjs +6 -0
  682. package/dist/src/types/index.d.ts +7 -0
  683. package/dist/src/types/index.d.ts.map +1 -0
  684. package/dist/src/types/index.js +14 -0
  685. package/dist/src/types/index.js.map +1 -0
  686. package/dist/src/types/phone.d.ts +6 -0
  687. package/dist/src/types/phone.d.ts.map +1 -0
  688. package/dist/src/types/phone.js +64 -0
  689. package/dist/src/types/phone.js.map +1 -0
  690. package/dist/src/types/primitives.d.ts +33 -0
  691. package/dist/src/types/primitives.d.ts.map +1 -0
  692. package/dist/src/types/primitives.js +5 -0
  693. package/dist/src/types/primitives.js.map +1 -0
  694. package/dist/src/types/runtime.d.ts +5 -0
  695. package/dist/src/types/runtime.d.ts.map +1 -0
  696. package/dist/src/types/runtime.js +20 -0
  697. package/dist/src/types/runtime.js.map +1 -0
  698. package/dist/src/types/type-annotations.d.ts +28 -0
  699. package/dist/src/types/type-annotations.d.ts.map +1 -0
  700. package/dist/src/types/type-annotations.js +33 -0
  701. package/dist/src/types/type-annotations.js.map +1 -0
  702. package/dist/src/types.d.ts +2 -0
  703. package/dist/src/types.d.ts.map +1 -0
  704. package/dist/src/types.js +7 -0
  705. package/dist/src/types.js.map +1 -0
  706. package/docs/.vitepress/config.mts +85 -0
  707. package/docs/content/CONTRIBUTING.md +53 -0
  708. package/docs/content/README-DEV.md +59 -0
  709. package/docs/content/README.md +52 -0
  710. package/docs/content/authentication.md +213 -0
  711. package/docs/content/cli.md +214 -0
  712. package/docs/content/configuration.md +191 -0
  713. package/docs/content/database.md +476 -0
  714. package/docs/content/devconsole.md +148 -0
  715. package/docs/content/di.md +212 -0
  716. package/docs/content/documentation-plan.md +182 -0
  717. package/docs/content/env.md +120 -0
  718. package/docs/content/getting-started.md +324 -0
  719. package/docs/content/health.md +64 -0
  720. package/docs/content/helpers.md +294 -0
  721. package/docs/content/http.md +402 -0
  722. package/docs/content/index.md +109 -0
  723. package/docs/content/leader-service.md +98 -0
  724. package/docs/content/logging.md +225 -0
  725. package/docs/content/mail.md +171 -0
  726. package/docs/content/mesh-client.md +333 -0
  727. package/docs/content/mesh-service.md +255 -0
  728. package/docs/content/migrations.md +190 -0
  729. package/docs/content/openapi.md +134 -0
  730. package/docs/content/overview.md +98 -0
  731. package/docs/content/public/images/devconsole/01-dashboard.png +0 -0
  732. package/docs/content/public/images/devconsole/02-routes.png +0 -0
  733. package/docs/content/public/images/devconsole/03-openapi.png +0 -0
  734. package/docs/content/public/images/devconsole/04-requests.png +0 -0
  735. package/docs/content/public/images/devconsole/05-srpc.png +0 -0
  736. package/docs/content/public/images/devconsole/06-database.png +0 -0
  737. package/docs/content/public/images/devconsole/06b-database-log.png +0 -0
  738. package/docs/content/public/images/devconsole/07-health.png +0 -0
  739. package/docs/content/public/images/devconsole/08-mutex.png +0 -0
  740. package/docs/content/public/images/devconsole/09-repl.png +0 -0
  741. package/docs/content/public/images/devconsole/10-workers.png +0 -0
  742. package/docs/content/public-api.md +84 -0
  743. package/docs/content/redis.md +174 -0
  744. package/docs/content/reflection.md +180 -0
  745. package/docs/content/release.md +100 -0
  746. package/docs/content/sql.md +121 -0
  747. package/docs/content/srpc.md +292 -0
  748. package/docs/content/telemetry.md +173 -0
  749. package/docs/content/testing.md +327 -0
  750. package/docs/content/type-reflection-architecture.md +149 -0
  751. package/docs/content/types.md +286 -0
  752. package/docs/content/uploads.md +145 -0
  753. package/docs/content/worker.md +182 -0
  754. package/docs/openapi.md +3 -0
  755. package/package.json +124 -0
  756. package/resources/proto/devconsole.proto +286 -0
  757. package/template-app/.env.development +10 -0
  758. package/template-app/gitignore.tmpl +11 -0
  759. package/template-app/package.json.tmpl +25 -0
  760. package/template-app/src/app.ts +13 -0
  761. package/template-app/src/config.ts +5 -0
  762. package/template-app/src/controllers/Example.controller.ts +19 -0
  763. package/template-app/src/database.ts +5 -0
  764. package/template-app/src/entities/Example.entity.ts +9 -0
  765. package/template-app/src/index.ts +7 -0
  766. package/template-app/src/migrations/.gitkeep +2 -0
  767. package/template-app/src/services/Example.service.ts +20 -0
  768. package/template-app/tests/app.spec.ts +8 -0
  769. package/template-app/tsconfig.json +26 -0
  770. package/template-app/tsconfig.test.json +5 -0
  771. package/types.d.ts +4 -0
@@ -0,0 +1,402 @@
1
+ # HTTP
2
+
3
+ `ts-server-foundation` provides a small HTTP router and response layer for controller-based APIs.
4
+
5
+ ## Controllers
6
+
7
+ Register controllers through `createApp({ controllers: [...] })` and decorate them with the exported `http` helper.
8
+
9
+ ```typescript
10
+ import { HttpBody, http } from '@zyno-io/ts-server-foundation';
11
+
12
+ interface CreateUserBody {
13
+ name: string;
14
+ }
15
+
16
+ @http.controller('/users')
17
+ class UserController {
18
+ @http.GET('/:id')
19
+ async getUser(id: number) {
20
+ return { id };
21
+ }
22
+
23
+ @http.POST()
24
+ async createUser(body: HttpBody<CreateUserBody>) {
25
+ return { id: 1, ...body };
26
+ }
27
+ }
28
+ ```
29
+
30
+ Supported route decorators are `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `OPTIONS`, and `HEAD`.
31
+
32
+ Controller and method paths are joined with one `/`; leading, repeated, and final slashes in declarations are normalized. A request may include one trailing slash and still match. `:name` segments match one encoded URL segment, are decoded before injection, and return HTTP `400` when percent encoding is malformed.
33
+
34
+ Methods match exactly. A `GET` route does not implicitly handle `HEAD`; declare `@http.HEAD()` when the endpoint supports it. Matching also follows declaration and registration order rather than preferring literal paths over parameters, so place `/fixed` before `/:id` when both can match the same request. Controllers exported by imported modules join the same route table and retain module-local DI resolution. If no exact route matches, the router runs `onRouteNotFound` and then returns the normalized `404` response unless a listener has completed the response.
35
+
36
+ When the app listens outside `APP_ENV=test`, startup output includes the registered HTTP route count, routes grouped by controller, the bound URL, and a final started line. This makes silent server starts easier to diagnose.
37
+
38
+ ## HTTP Runtime
39
+
40
+ HTTP server operations live on `app.http`, not directly on `App`:
41
+
42
+ ```typescript
43
+ const app = createApp({ controllers: [UserController] });
44
+
45
+ const server = await app.http.listen(0, '127.0.0.1');
46
+ const address = server.address();
47
+ const port = typeof address === 'object' && address ? address.port : undefined;
48
+
49
+ const removeObserver = app.http.registerObserver(entry => {
50
+ console.log(entry.request.method, entry.request.url, entry.response.statusCode, entry.durationMs);
51
+ });
52
+
53
+ const removeUpgrade = app.http.registerUpgradeHandler((request, socket, head) => {
54
+ // Claim and handle WebSocket or other HTTP upgrade requests.
55
+ });
56
+
57
+ await app.stop();
58
+ removeObserver();
59
+ removeUpgrade();
60
+ ```
61
+
62
+ `app.http.listen()` starts the app if needed, runs the server bootstrap lifecycle events after the socket binds, installs signal handlers, and starts DevConsole when enabled. If binding or a post-bind bootstrap hook fails, it closes any socket that was opened and rolls back app startup when that listen call initiated it. Application entrypoints should usually call `app.run()` and pass `server:start` on the command line; direct `app.http.listen()` is mainly for tests, demos, embedded servers, and custom process managers.
63
+
64
+ `app.http.getPort()` resolves an explicit or configured listen port before binding. When `listen(0)` asks the operating system for an ephemeral port, read the actual port from `server.address()` as shown above.
65
+
66
+ `app.http.request(request, response?)` sends an in-memory `HttpRequest` through the same router/CORS/static-file flow without creating a Node server.
67
+
68
+ Observers run once after every in-memory or Node request, including CORS, static-file, `404`, and error results. The observation contains `request`, `response`, `startedAt`, `durationMs`, and the processing `error` when one was recorded. An observer exception is isolated from request handling, and the function returned by `registerObserver()` unregisters it.
69
+
70
+ ## Request Order
71
+
72
+ The request pipeline is:
73
+
74
+ ```text
75
+ CORS preflight short circuit
76
+ -> prepare CORS response headers
77
+ -> static GET handling when no registered route matches
78
+ -> onRoute workflow
79
+ -> multipart guard, or raw-stream bypass
80
+ -> controller middleware, then route middleware
81
+ -> onController workflow
82
+ -> controller construction and left-to-right parameter resolution
83
+ -> route handler and response-result handling
84
+ -> onResponse workflow
85
+ -> upload cleanup, even when onResponse fails
86
+ -> final CORS application and response observation
87
+ ```
88
+
89
+ An ended response short-circuits later router stages. Multipart guarding happens before middleware so an undeclared or unsafe file cannot be hidden by middleware. `onResponse` runs for successful and failed router requests; upload cleanup runs in its own `finally` after that workflow.
90
+
91
+ ## Request Logging
92
+
93
+ Node HTTP requests are logged at the server boundary and configured with `HTTP_REQUEST_LOGGING_MODE`:
94
+
95
+ | Mode | Behavior |
96
+ | -------- | --------------------------------------------------------- |
97
+ | `e2e` | Logs request start and finish. |
98
+ | `finish` | Logs only request finish. |
99
+ | `errors` | Logs only request processing errors and aborted requests. |
100
+ | `none` | Disables normal request logs. |
101
+
102
+ Test mode defaults to `errors` so service/application logs remain visible without routine HTTP `Request` and `Response` records. Request logs include method, URL, status code, duration, remote address on start, and the active request context. `/healthz` request logging is disabled by default; set `HEALTHZ_ENABLE_REQUEST_LOGGING=true` to include it. `/metrics` is always skipped.
103
+
104
+ `HttpLogPayloadMiddleware` is an opt-in diagnostic middleware that reads and logs the request body as text along with the method, URL, and content type. Because it can record credentials, tokens, personal data, and large payloads, use it only on deliberately selected routes and with a logger whose destination and retention are appropriate for that data.
105
+
106
+ ### Client Address And Trusted Proxies
107
+
108
+ `request.remoteAddress` is the transport socket address. `request.getRemoteAddress()` returns that address unless `USE_REAL_IP_HEADER=true`; when proxy headers are trusted it prefers `x-real-ip`, then the first `x-forwarded-for` entry.
109
+
110
+ ```typescript
111
+ @http.GET('/whoami')
112
+ whoAmI(request: HttpRequest) {
113
+ return { address: request.getRemoteAddress() };
114
+ }
115
+ ```
116
+
117
+ Enable `USE_REAL_IP_HEADER` only when every path to the application passes through a trusted proxy that removes untrusted forwarding headers. DevConsole and `/metrics` deliberately use the socket address for their local/private access checks and do not trust these headers.
118
+
119
+ ## Parameter Injection
120
+
121
+ Parameters are explicit by default. The router only auto-infers a parameter when its name matches a URL path parameter.
122
+
123
+ | Parameter type | Source |
124
+ | ----------------------------------------- | ---------------------------------------------------------------------------------------- |
125
+ | `HttpRequest` | Current request metadata and guarded body readers. |
126
+ | `HttpRequestStream` | Raw request stream escape hatch. Bypasses body parsing and guards. |
127
+ | `HttpResponse` | Current response object for imperative writes. |
128
+ | `HttpBody<T>` | Parsed JSON body or parsed multipart `_payload` object; one per route. |
129
+ | `HttpQueries<T>` | Full query object. |
130
+ | `HttpQuery<T>` | Query value matching the parameter name. |
131
+ | `HttpQuery<T, { name: 'key' }>` | Query value from an explicit key. |
132
+ | `HttpPath<T>` | Path value matching the parameter name. |
133
+ | `HttpPath<T, { name: 'id' }>` | Path value from an explicit key. |
134
+ | `HttpHeader<T>` | Header value matching the parameter name. |
135
+ | `HttpHeader<T, { name: 'x-request-id' }>` | Header value from an explicit header name. |
136
+ | `FileUpload` | Required multipart file matching the parameter name, or the only declared uploaded file. |
137
+
138
+ Any unannotated non-path parameter fails at startup with an error that asks for an explicit HTTP annotation.
139
+ Routes may declare at most one `HttpBody<T>` parameter. Registering a route with multiple body parameters fails at startup instead of assigning one request body to multiple controller arguments.
140
+ An omitted optional `query?: HttpQueries<T>` parameter is injected as `undefined`. Once any query value is supplied, the resulting object is deserialized and validated as `T`, including its required properties.
141
+
142
+ `HttpRequest` normalizes constructed header names to lowercase; Node already supplies lowercased incoming names. An inferred `HttpHeader` lookup checks the parameter name, its lowercase and kebab-case forms, then the `x-`-prefixed kebab form, so `requestId: HttpHeader<string>` can read `x-request-id`. Use `{ name: '...' }` when the wire name should be explicit.
143
+
144
+ Repeated query keys are stored in order as `string[]`. `HttpQueries<T>` receives that complete shape, while a scalar `HttpQuery<T>` selects the last value for its key.
145
+
146
+ ```typescript
147
+ import { HttpBody, HttpHeader, HttpQueries, HttpQuery, HttpRequestStream, http } from '@zyno-io/ts-server-foundation';
148
+
149
+ interface ListUsersQuery {
150
+ search?: string;
151
+ limit?: number;
152
+ }
153
+
154
+ @http.controller('/users')
155
+ class UserController {
156
+ @http.GET()
157
+ async list(query: HttpQueries<ListUsersQuery>) {
158
+ return [];
159
+ }
160
+
161
+ @http.GET('/by-email')
162
+ async byEmail(email: HttpQuery<string>) {
163
+ return { email };
164
+ }
165
+
166
+ @http.POST()
167
+ async create(body: HttpBody<CreateUserBody>, requestId: HttpHeader<string, { name: 'x-request-id' }>) {
168
+ return { requestId, body };
169
+ }
170
+
171
+ @http.POST('/stream')
172
+ async streamUpload(request: HttpRequestStream) {
173
+ for await (const chunk of request) {
174
+ // Stream directly without body parsing.
175
+ }
176
+ }
177
+ }
178
+ ```
179
+
180
+ ### Input Deserialization And Validation
181
+
182
+ Controller-facing values from `HttpBody<T>`, `HttpQueries<T>`, `HttpQuery<T>`, `HttpPath<T>`, `HttpHeader<T>`, and inferred path parameters are automatically reflected-deserialized and then validated before the controller is invoked.
183
+
184
+ ```text
185
+ request bytes or URL strings
186
+ -> JSON/multipart parsing when needed
187
+ -> HTTP normalization
188
+ -> reflected deserialization
189
+ -> reflected validation
190
+ -> final HTTP shape check
191
+ -> controller argument
192
+ ```
193
+
194
+ Deserialization includes primitive coercion, nested DTO projection, reflected class construction, `Date` construction, and registered transforms such as trimmed strings and phone normalization. Validation then enforces required and nullable properties, shapes, literals, enums, string and numeric constraints, and custom validators. A nonnumeric string coerces to `NaN`, which is rejected as an invalid `number`. Any failure becomes an HTTP `400` and the controller is not called.
195
+
196
+ An absent optional parameter bypasses deserialization and validation and is injected as `undefined`. This includes an optional standalone `FileUpload`. A missing required standalone upload produces HTTP `400`. A missing structured `HttpBody<T>` is treated as `{}`, which permits an all-optional body but still reports missing required properties. Undeclared DTO properties are generally dropped during deserialization rather than reported as errors.
197
+
198
+ `HttpRequest`, `HttpRequestStream`, `HttpResponse`, `ParsedJwt`, direct `FileUpload` parameters, and custom parameter-resolver results do not pass through this reflected pipeline. File uploads instead use the multipart declaration, size, and MIME guards. A file declared as a property inside `HttpBody<T>` is included in that body's reflected traversal after multipart parsing.
199
+
200
+ Route middleware and the `onController` workflow run before controller parameters are resolved. If either ends the response, parameter deserialization and validation do not run. Multipart parsing and upload guards may run earlier so unsafe file parts are rejected before controller dispatch.
201
+
202
+ ### Custom Parameter Resolvers
203
+
204
+ Use `http.resolveParameter()` for a controller-specific class parameter. A resolver can be a function, an object with `resolve()`, or a resolver class. Register resolver classes as providers when they need DI.
205
+
206
+ ```typescript
207
+ import { createApp, http, type RouteParameterResolverContext } from '@zyno-io/ts-server-foundation';
208
+
209
+ class ResolvedTenant {
210
+ constructor(readonly id: string) {}
211
+ }
212
+
213
+ class ResolvedTenantResolver {
214
+ resolve(context: RouteParameterResolverContext) {
215
+ return new ResolvedTenant(String(context.parameters.tenantId));
216
+ }
217
+ }
218
+
219
+ @http.resolveParameter(ResolvedTenant, ResolvedTenantResolver)
220
+ @http.controller('/tenants/:tenantId')
221
+ class TenantController {
222
+ @http.GET()
223
+ get(tenantId: string, tenant: ResolvedTenant) {
224
+ return { tenantId, resolvedId: tenant.id };
225
+ }
226
+ }
227
+
228
+ const app = createApp({
229
+ controllers: [TenantController],
230
+ providers: [ResolvedTenantResolver]
231
+ });
232
+ ```
233
+
234
+ `RouteParameterResolverContext` includes the request, response, route, parameter name and reflection metadata, query object, and parameters already resolved to the left of the custom parameter. For an app-wide resolver, pass `httpResolvers: { ResolvedTenant: ResolvedTenantResolver }` to `createApp()`.
235
+
236
+ ### Request-Scoped Values
237
+
238
+ `HttpRequest.store` is available for state that should live for one request. The exported cache helpers support string, symbol, and object keys; `getOrCacheValue()` is useful when middleware, parameter resolvers, and controllers may all need the same asynchronous lookup.
239
+
240
+ ```typescript
241
+ import { getOrCacheValue, type HttpRequest } from '@zyno-io/ts-server-foundation';
242
+
243
+ const CurrentAccountKey = Symbol('current-account');
244
+
245
+ function getCurrentAccount(request: HttpRequest) {
246
+ return getOrCacheValue(request, CurrentAccountKey, () => loadAccount(request));
247
+ }
248
+ ```
249
+
250
+ The full helper set is `getCachedValue`, `setCachedValue`, `hasCachedValue`, `clearCachedValue`, and `getOrCacheValue`. Values disappear with the request; this store is not a cross-request cache.
251
+
252
+ ## Bodies And Streams
253
+
254
+ JSON body parsing happens when a route resolves `HttpBody<T>`. Multipart requests are guarded eagerly on every route except one that opts into raw streaming with `HttpRequestStream`; file parts are rejected unless the route explicitly declares matching `FileUpload` fields.
255
+
256
+ `HttpRequest.readBodyBuffer()` and `HttpRequest.readBodyText()` decode supported request content encodings, enforce request size limits, and cache the consumed body on `request.body`. They are safe to call more than once; later calls resolve from the cached buffer. For an incoming Node request, `request.body` remains unset until a guarded read consumes it. In-memory requests constructed with a buffer, string, object, or `.multiPart()` set `request.body` immediately.
257
+
258
+ Guarded reads accept an absent encoding or `identity`, plus `gzip` and `x-gzip`. Gzip is decoded before JSON or multipart parsing. Unsupported encodings return HTTP `415`; corrupt compressed data returns HTTP `400`.
259
+
260
+ Compressed bytes are limited by `HTTP_MAX_REQUEST_COMPRESSED_BODY_BYTES` and decoded or identity bytes by `HTTP_MAX_REQUEST_BODY_BYTES`. A numeric `content-length` above the applicable limit is rejected before streaming, while the byte transforms still enforce the real size when the header is missing, invalid, or too small.
261
+
262
+ `HttpRequestStream` deliberately bypasses content decoding, both byte limits, `content-length` rejection, JSON/multipart parsing, and upload guards. Routes combining it with `HttpBody<T>` or `FileUpload` fail registration.
263
+
264
+ In-memory object builders are a convenience boundary, not a wire-parser simulation: `HttpRequest.POST(url, object)` and `.json(object)` prepopulate `parsedBody`, so an `HttpBody<T>` route skips byte decoding and JSON parsing. Use a string or buffer with headers, or a real Node request, when testing encodings, malformed JSON, and byte limits. Both transports otherwise share CORS, static routing, route matching, parameter deserialization, middleware, handler, and observer behavior.
265
+
266
+ ## Multipart Uploads
267
+
268
+ Multipart parsing uses `busboy` and writes uploaded files into temporary directories. The router cleans those temporary upload directories after the request finishes. File parts whose field name is not declared by a `FileUpload` parameter or `FileUpload` body property are rejected before being written.
269
+
270
+ ```typescript
271
+ import { FileUpload, HttpBody, http } from '@zyno-io/ts-server-foundation';
272
+
273
+ interface UploadPayload {
274
+ title: string;
275
+ }
276
+
277
+ @http.controller('/files')
278
+ class FileController {
279
+ @http.POST()
280
+ async upload(payload: HttpBody<UploadPayload>, file: FileUpload<{ maxSize: '40MB'; allowedTypes: ['image/jpeg', 'image/png'] }>) {
281
+ return {
282
+ title: payload.title,
283
+ originalName: file.originalName,
284
+ type: file.type,
285
+ size: file.size
286
+ };
287
+ }
288
+ }
289
+ ```
290
+
291
+ Multipart field `_payload` is parsed as JSON and merged into the body object. Other text fields are also included. Multiple values for the same field are represented as arrays.
292
+
293
+ Multipart parsing runs before middleware for every guarded multipart route, including a route that injects only `HttpRequest`. Use `HttpRequestStream` when the controller must consume the raw multipart bytes without parsing or temporary upload files. Temporary upload directories are automatically removed after request handling completes, including error responses.
294
+
295
+ ## Responses
296
+
297
+ Plain returned values are JSON serialized. `undefined` ends the response; `EmptyResponse` return annotations produce status `204`.
298
+
299
+ Responses intentionally do not pass through reflected validation, DTO projection, or a reflected serialization registry. TypeScript return types provide the application contract; at runtime the router sends the value produced by the controller through ordinary `JSON.stringify`. `ApiResponse<T, Status>` affects response metadata and status handling, not runtime value validation.
300
+
301
+ Use response result helpers for explicit writes:
302
+
303
+ ```typescript
304
+ import { emptyResponse, jsonResponse, rawResponse, redirectResponse } from '@zyno-io/ts-server-foundation';
305
+
306
+ return jsonResponse({ ok: true }, 201);
307
+ return redirectResponse('/new-path', 302);
308
+ return emptyResponse(204);
309
+ return rawResponse(Buffer.from('data'), { contentType: 'application/octet-stream' });
310
+ ```
311
+
312
+ The package also exports `OkResponse`, `RedirectResponse`, `EmptyResponse`, and `AnyResponse` return-type helpers. OpenAPI-specific response typing is documented in [OpenAPI](./openapi.md).
313
+
314
+ For imperative responses, `setHeader()` and `getHeader()` are case-insensitive, `headers` exposes comma-joined values, and `rawHeaders` preserves array values. `writeHead()` accepts an object or header tuples and sets the status before data is written. Call `response.write()`/`response.end()` to stream raw output; after a Node response commits, `headersSent` becomes true and later header changes are ignored. The in-memory response buffers writes and does not model header commitment, so `headersSent` remains false there. A handler that starts a Node stream owns ending it.
315
+
316
+ The router does not serialize another result after a response has ended or Node headers have been sent. Explicit `HEAD` routes run normally but both Node and in-memory transports suppress their response body while retaining status and headers.
317
+
318
+ ## Errors
319
+
320
+ Throw `HttpError` or one of the exported helpers for intentional HTTP errors. Unhandled routing, middleware, parameter, and controller errors are returned as status `500` with a normalized JSON body.
321
+
322
+ `onResponse` is the final workflow and runs after router error normalization. If it throws, an in-memory `app.http.request()` rejects after upload cleanup. At the Node boundary, an uncommitted response becomes a generic `500`; a response whose headers were already committed is ended without appending another error body. Final-response listeners should observe and clean up, not throw as a response-control mechanism.
323
+
324
+ ```typescript
325
+ import { HttpBadRequestError, HttpNotFoundError } from '@zyno-io/ts-server-foundation';
326
+
327
+ throw new HttpBadRequestError('Invalid request');
328
+ throw new HttpNotFoundError('User not found');
329
+ ```
330
+
331
+ Error responses use this shape:
332
+
333
+ ```json
334
+ { "error": "User not found" }
335
+ ```
336
+
337
+ ## CORS
338
+
339
+ Pass `cors` to `createApp()` to apply CORS headers to normal responses, error responses, and preflight requests.
340
+
341
+ ```typescript
342
+ const app = createApp({
343
+ controllers: [UserController],
344
+ cors: () => ({
345
+ hosts: ['https://app.example.com'],
346
+ credentials: true
347
+ })
348
+ });
349
+ ```
350
+
351
+ `HttpCorsOptions` supports `hosts`, `paths`, `methods`, `credentials`, `allowHeaders`, and `exposeHeaders`.
352
+
353
+ ## Middleware
354
+
355
+ Middleware classes implement `HttpMiddleware` and can be attached at controller or route level.
356
+
357
+ ```typescript
358
+ import { HttpBadRequestError, HttpMiddleware, HttpRequest, HttpResponse, http } from '@zyno-io/ts-server-foundation';
359
+
360
+ class RequireHeaderMiddleware implements HttpMiddleware {
361
+ async handle(request: HttpRequest, _response: HttpResponse) {
362
+ if (!request.headers['x-request-id']) throw new HttpBadRequestError('Missing request id');
363
+ }
364
+ }
365
+
366
+ class AuditMiddleware implements HttpMiddleware {
367
+ async handle(request: HttpRequest) {
368
+ request.context.audited = 'true';
369
+ }
370
+ }
371
+
372
+ @(http.controller('/admin').middleware(RequireHeaderMiddleware))
373
+ class AdminController {
374
+ @http.middleware(AuditMiddleware)
375
+ @(http.GET().use(RequireHeaderMiddleware))
376
+ async index() {
377
+ return { ok: true };
378
+ }
379
+ }
380
+ ```
381
+
382
+ Use `http.middleware(...)` as a class or method decorator, or chain `.middleware(...)`/`.use(...)` from `http.controller()` and a route decorator. Controller middleware always runs before route middleware. Within each group, middleware runs in the stored decorator/list order; when mixing standalone and chained decorators, remember that TypeScript applies stacked decorators from bottom to top.
383
+
384
+ Returning a response result such as `jsonResponse(...)` writes and ends the response, short-circuiting the remaining middleware, controller workflow, parameter resolution, and handler. Middleware may also end the supplied `HttpResponse` directly.
385
+
386
+ Registered middleware is resolved through DI. Register middleware with `scope: 'request'` when it injects request-scoped providers or `HttpRequest`; it then shares the controller's request context. A middleware class with no constructor arguments may be used without provider registration and is constructed directly. Once a middleware class is registered, DI failures are reported rather than falling back to direct construction.
387
+
388
+ ## Static Files
389
+
390
+ Pass `staticFiles` to `createApp()` to serve files after route matching. Static files are only considered for `GET` requests that do not match a registered route.
391
+
392
+ ```typescript
393
+ const app = createApp({
394
+ controllers: [ApiController],
395
+ staticFiles: {
396
+ directory: 'static',
397
+ spaFallback: 'index.html'
398
+ }
399
+ });
400
+ ```
401
+
402
+ `staticFiles: true` uses the default `static/` directory. `directory` defaults to `static`, `index` to `index.html`, and `spaFallback` to the selected index. A custom fallback is served when no concrete file exists. Static handling is GET-only and never shadows a registered route; unsafe decoded paths return `400`.
@@ -0,0 +1,109 @@
1
+ ---
2
+ layout: home
3
+
4
+ hero:
5
+ name: '@zyno-io/ts-server-foundation'
6
+ text: 'Server Foundation Library'
7
+ tagline: TypeScript server foundation with reflected type metadata
8
+ actions:
9
+ - theme: brand
10
+ text: Get Started
11
+ link: /getting-started
12
+ - theme: alt
13
+ text: Explore Features
14
+ link: /overview
15
+
16
+ features:
17
+ - title: Application Runtime
18
+ details: createApp, lifecycle hooks, app.http server APIs, health checks, CORS, request handling, and request-scoped DI.
19
+ - title: Dependency Injection
20
+ details: Constructor injection from reflected type metadata, request scopes, module exports, and globally injectable imported exports.
21
+ - title: HTTP
22
+ details: Decorator-based controllers, explicit body/query/header/path annotations, multipart uploads, raw request streaming, and OpenAPI metadata.
23
+ - title: Database
24
+ details: Thin active-record layer over mysql2 and pg with transactions, savepoints, raw SQL bindings, locks, migrations, and schema diffing.
25
+ - title: Workers
26
+ details: In-process job registration, inline test execution, cron scheduling, queue recording, and DI-owned job handlers.
27
+ - title: SRPC
28
+ details: HMAC-authenticated WebSocket RPC with generated proto types, bidirectional calls, byte streams, and upgrade claiming.
29
+ - title: Configuration
30
+ details: Reflected config classes loaded from env files and Env while preserving process env for later code and child processes.
31
+ - title: Testing
32
+ details: Test facades, in-memory HTTP requests, isolated MySQL/PostgreSQL databases, seed hooks, and assertion helpers.
33
+ ---
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ corepack yarn add @zyno-io/ts-server-foundation
39
+ corepack yarn tsf-install
40
+ ```
41
+
42
+ `tsf-install` configures the TypeScript transform and compiler dependencies. The TSF compiler emits reflected type metadata and compiler-recognized annotation markers used by DI, HTTP parameters, config classes, entities, validation, and OpenAPI generation. See [Getting Started](./getting-started.md#typescript-configuration) for the manual configuration.
43
+
44
+ ## Quick Start
45
+
46
+ ```ts
47
+ import { BaseAppConfig, createApp, createDatabase, http } from '@zyno-io/ts-server-foundation';
48
+
49
+ class AppConfig extends BaseAppConfig {
50
+ APP_ENV = 'development';
51
+ }
52
+
53
+ @http.controller('/hello')
54
+ class HelloController {
55
+ @http.GET()
56
+ hello() {
57
+ return { ok: true };
58
+ }
59
+ }
60
+
61
+ class AppDatabase extends createDatabase('mysql', {}, []) {}
62
+
63
+ export const app = createApp({
64
+ config: AppConfig,
65
+ db: AppDatabase,
66
+ controllers: [HelloController]
67
+ });
68
+ ```
69
+
70
+ ## Documentation
71
+
72
+ - [Feature Overview](./overview.md)
73
+ - [Getting Started](./getting-started.md)
74
+ - [Public API](./public-api.md)
75
+ - [Dependency Injection](./di.md)
76
+ - [Configuration](./configuration.md)
77
+ - [Environment](./env.md)
78
+ - [Database](./database.md)
79
+ - [SQL](./sql.md)
80
+ - [Migrations](./migrations.md)
81
+ - [HTTP](./http.md)
82
+ - [Uploads](./uploads.md)
83
+ - [OpenAPI](./openapi.md)
84
+ - [Authentication](./authentication.md)
85
+ - [Health Checks](./health.md)
86
+ - [DevConsole](./devconsole.md)
87
+ - [Logging](./logging.md)
88
+ - [Types](./types.md)
89
+ - [Type Reflection](./reflection.md)
90
+ - [Type Reflection Architecture](./type-reflection-architecture.md)
91
+ - [Testing](./testing.md)
92
+ - [CLI](./cli.md)
93
+ - [Workers](./worker.md)
94
+ - [Redis](./redis.md)
95
+ - [SRPC](./srpc.md)
96
+ - [Mail](./mail.md)
97
+ - [Leader Service](./leader-service.md)
98
+ - [Mesh Service](./mesh-service.md)
99
+ - [Mesh Client Tracking](./mesh-client.md)
100
+ - [Helpers](./helpers.md)
101
+ - [Telemetry](./telemetry.md)
102
+ - [Release](./release.md)
103
+ - [Documentation Maintenance](./documentation-plan.md)
104
+
105
+ ## Acknowledgements
106
+
107
+ TS Server Foundation owes a great deal to the open-source projects that made its architecture possible. [Deepkit](https://github.com/marcj/deepkit) inspired many of the design ideas behind its runtime type reflection, dependency injection, and metadata-driven server APIs. We are especially grateful to Deepkit's maintainer, [Marc J. Schmidt](https://github.com/marcj), for showing how powerful a cohesive, type-aware TypeScript framework can be.
108
+
109
+ [Typia](https://typia.io/) and [ttsc](https://github.com/samchon/ttsc) provided the essential compiler groundwork for bringing those ideas to TypeScript 7. TSF builds on their type-analysis and transform infrastructure to generate the runtime metadata at the heart of the framework. Our sincere thanks to Jeongho Nam and every contributor to these projects for making that work available to the TypeScript community.
@@ -0,0 +1,98 @@
1
+ # LeaderService
2
+
3
+ Distributed leader election using a Redis TTL lease with atomic acquisition and periodic renewal. Redis grants the lease to one owner at a time, but an expired holder can still locally report leadership until its next renewal detects the loss, so leader-only work must tolerate lease transitions.
4
+
5
+ ## Usage
6
+
7
+ ```typescript
8
+ import { LeaderService } from '@zyno-io/ts-server-foundation';
9
+
10
+ const leader = new LeaderService('my-feature');
11
+
12
+ leader.setBecameLeaderCallback(async () => {
13
+ console.log('This instance is now the leader');
14
+ // Start leader-only work (e.g. scheduled jobs, cleanup tasks)
15
+ });
16
+
17
+ leader.setLostLeaderCallback(async () => {
18
+ console.log('Leadership lost');
19
+ // Stop leader-only work
20
+ });
21
+
22
+ leader.start();
23
+
24
+ // Check leadership status at any time
25
+ if (leader.isLeader) {
26
+ // perform leader-only operation
27
+ }
28
+
29
+ // Graceful shutdown
30
+ await leader.stop();
31
+ ```
32
+
33
+ ## API
34
+
35
+ ### `new LeaderService(key: string, options?: LeaderServiceOptions)`
36
+
37
+ Creates a new leader election instance.
38
+
39
+ - **`key`** -- Logical name for the leadership group. All instances using the same key compete for the same lock. The full Redis key is derived as `{prefix}:leader:{key}`.
40
+ - **`options`** -- Optional tuning parameters (see below).
41
+
42
+ ### `LeaderServiceOptions`
43
+
44
+ | Option | Type | Default | Description |
45
+ | ------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------ |
46
+ | `ttlMs` | `number` | `30000` | Lock TTL in milliseconds. If the leader crashes without releasing, the lock expires after this period. |
47
+ | `renewalIntervalMs` | `number` | `10000` | How often the leader renews its lock. Should be well below `ttlMs` to avoid accidental expiry. |
48
+ | `retryDelayMs` | `number` | `5000` | Delay between acquisition attempts for non-leader instances. |
49
+
50
+ ### Properties
51
+
52
+ | Property | Type | Description |
53
+ | ---------- | --------- | ----------------------------------------------------------------------------------------- |
54
+ | `isLeader` | `boolean` | Whether this instance most recently acquired the lease and has not yet detected its loss. |
55
+
56
+ ### Methods
57
+
58
+ #### `setBecameLeaderCallback(callback: () => void | Promise<void>): void`
59
+
60
+ Register a callback invoked when this instance acquires leadership. Errors thrown by the callback are logged but do not affect leader status.
61
+
62
+ #### `setLostLeaderCallback(callback: () => void | Promise<void>): void`
63
+
64
+ Register a callback invoked when this instance loses leadership (e.g. renewal failure, network partition). Errors are logged and do not prevent re-election attempts.
65
+
66
+ #### `start(): void`
67
+
68
+ Begin participating in leader election. Throws if already running. Acquisition is asynchronous -- the instance may not be leader immediately after `start()` returns.
69
+
70
+ #### `stop(): Promise<void>`
71
+
72
+ Stop participating and release the lock if currently leader. Safe to call multiple times.
73
+
74
+ ## How It Works
75
+
76
+ 1. **Acquisition**: Each instance attempts to set a Redis key with `NX` (set-if-not-exists) semantics and a TTL via a Lua script. If the key doesn't exist, the caller becomes leader.
77
+ 2. **Renewal**: The leader periodically refreshes the TTL on its lock. If the key's value no longer matches (another instance took over), leadership is considered lost.
78
+ 3. **Release**: On `stop()`, the leader deletes its key (only if the value still matches), allowing immediate failover.
79
+ 4. **Retry**: Non-leaders retry acquisition on a timer. If the leader crashes, the lock expires after `ttlMs` and another instance acquires it.
80
+
81
+ All Redis operations use Lua scripts for atomicity:
82
+
83
+ - **ACQUIRE** -- `SET key value PX ttl` only if the key doesn't exist
84
+ - **RENEW** -- `PEXPIRE key ttl` only if the value matches
85
+ - **RELEASE** -- `DEL key` only if the value matches
86
+
87
+ ## Configuration
88
+
89
+ The Redis connection is configured via environment variables with the `MUTEX_REDIS_` prefix (falls back to `REDIS_`):
90
+
91
+ | Variable | Description |
92
+ | --------------------------- | ------------------------------------------------------------ |
93
+ | `MUTEX_REDIS_HOST` | Redis host |
94
+ | `MUTEX_REDIS_PORT` | Redis port |
95
+ | `MUTEX_REDIS_PREFIX` | Key prefix (falls back to `REDIS_PREFIX`, then package name) |
96
+ | `MUTEX_REDIS_SENTINEL_HOST` | Sentinel host (optional) |
97
+ | `MUTEX_REDIS_SENTINEL_PORT` | Sentinel port (optional) |
98
+ | `MUTEX_REDIS_SENTINEL_NAME` | Sentinel master name (optional) |