exisjs 0.6.0 → 0.7.0

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 (519) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +11 -9
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/dev.d.ts.map +1 -1
  5. package/dist/cli/commands/dev.js +34 -36
  6. package/dist/cli/commands/dev.js.map +1 -1
  7. package/dist/cli/commands/exports.d.ts.map +1 -1
  8. package/dist/cli/commands/exports.js +5 -32
  9. package/dist/cli/commands/exports.js.map +1 -1
  10. package/dist/cli/commands/generate.d.ts +2 -13
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +27 -60
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +4 -4
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/cli/commands/start.d.ts.map +1 -1
  18. package/dist/cli/commands/start.js +2 -6
  19. package/dist/cli/commands/start.js.map +1 -1
  20. package/dist/cli/index.js +11 -23
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/routes.d.ts.map +1 -1
  23. package/dist/cli/routes.js +20 -8
  24. package/dist/cli/routes.js.map +1 -1
  25. package/dist/config/config.d.ts +2 -1
  26. package/dist/config/config.d.ts.map +1 -1
  27. package/dist/config/config.js +3 -2
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/config/types.d.ts +7 -2
  30. package/dist/config/types.d.ts.map +1 -1
  31. package/dist/decorators/constants.d.ts +2 -2
  32. package/dist/decorators/constants.d.ts.map +1 -1
  33. package/dist/decorators/constants.js +2 -2
  34. package/dist/decorators/constants.js.map +1 -1
  35. package/dist/decorators/core.d.ts +4 -3
  36. package/dist/decorators/core.d.ts.map +1 -1
  37. package/dist/decorators/core.js +7 -4
  38. package/dist/decorators/core.js.map +1 -1
  39. package/dist/decorators/middleware.d.ts +0 -10
  40. package/dist/decorators/middleware.d.ts.map +1 -1
  41. package/dist/decorators/middleware.js +0 -25
  42. package/dist/decorators/middleware.js.map +1 -1
  43. package/dist/decorators/routing.d.ts +0 -2
  44. package/dist/decorators/routing.d.ts.map +1 -1
  45. package/dist/decorators/routing.js +1 -3
  46. package/dist/decorators/routing.js.map +1 -1
  47. package/dist/di/inject.d.ts +1 -2
  48. package/dist/di/inject.d.ts.map +1 -1
  49. package/dist/di/inject.js.map +1 -1
  50. package/dist/docs/ARCHITECTURE.md +46 -285
  51. package/dist/docs/BENCHMARKS.md +5 -5
  52. package/dist/docs/README.md +8 -11
  53. package/dist/docs/content/boundaries.mdx +151 -0
  54. package/dist/docs/content/cli/commands.mdx +66 -104
  55. package/dist/docs/content/cli/overview.mdx +37 -47
  56. package/dist/docs/content/cli/usage.mdx +29 -15
  57. package/dist/docs/content/decorators.mdx +107 -80
  58. package/dist/docs/content/installation.mdx +20 -1
  59. package/dist/docs/content/middleware.mdx +65 -291
  60. package/dist/docs/content/security.mdx +44 -246
  61. package/dist/docs/content/structure.mdx +227 -100
  62. package/dist/docs/content/validation.mdx +0 -17
  63. package/dist/docs/reference/decorators.mdx +24 -217
  64. package/dist/docs/reference/middleware.mdx +41 -217
  65. package/dist/docs/reference/validator.mdx +2 -5
  66. package/dist/error/errors.d.ts.map +1 -1
  67. package/dist/error/errors.js +16 -0
  68. package/dist/error/errors.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -2
  72. package/dist/index.js.map +1 -1
  73. package/dist/lib/start-repl.js +2 -4
  74. package/dist/lib/start-repl.js.map +1 -1
  75. package/dist/lib/start-server.js +12 -4
  76. package/dist/lib/start-server.js.map +1 -1
  77. package/dist/logger/index.d.ts +81 -0
  78. package/dist/logger/index.d.ts.map +1 -0
  79. package/dist/logger/index.js +142 -0
  80. package/dist/logger/index.js.map +1 -0
  81. package/dist/middleware/dedupe.d.ts +1 -1
  82. package/dist/middleware/dedupe.js +1 -1
  83. package/dist/middleware/middleware.d.ts +3 -5
  84. package/dist/middleware/middleware.d.ts.map +1 -1
  85. package/dist/middleware/middleware.js +2 -6
  86. package/dist/middleware/middleware.js.map +1 -1
  87. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  88. package/dist/router/boundary.d.ts.map +1 -0
  89. package/dist/router/boundary.js +11 -0
  90. package/dist/router/boundary.js.map +1 -0
  91. package/dist/router/index.d.ts +3 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/router/index.js +3 -7
  94. package/dist/router/index.js.map +1 -1
  95. package/dist/router/route-builder.d.ts +0 -28
  96. package/dist/router/route-builder.d.ts.map +1 -1
  97. package/dist/router/route-builder.js +0 -4
  98. package/dist/router/route-builder.js.map +1 -1
  99. package/dist/router/route-scanner.d.ts +1 -2
  100. package/dist/router/route-scanner.d.ts.map +1 -1
  101. package/dist/router/route-scanner.js +216 -193
  102. package/dist/router/route-scanner.js.map +1 -1
  103. package/dist/router/router.d.ts +4 -6
  104. package/dist/router/router.d.ts.map +1 -1
  105. package/dist/router/router.js +36 -72
  106. package/dist/router/router.js.map +1 -1
  107. package/dist/router/types.d.ts +2 -6
  108. package/dist/router/types.d.ts.map +1 -1
  109. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  110. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  111. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  112. package/dist/server/adapters/bun-adapter.js.map +1 -0
  113. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  114. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  115. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  116. package/dist/server/adapters/uws-adapter.js.map +1 -0
  117. package/dist/server/app.d.ts +9 -30
  118. package/dist/server/app.d.ts.map +1 -1
  119. package/dist/server/app.js +19 -134
  120. package/dist/server/app.js.map +1 -1
  121. package/dist/server/bootstrapper.d.ts +4 -15
  122. package/dist/server/bootstrapper.d.ts.map +1 -1
  123. package/dist/server/bootstrapper.js +31 -222
  124. package/dist/server/bootstrapper.js.map +1 -1
  125. package/dist/server/define.d.ts +2 -2
  126. package/dist/server/define.d.ts.map +1 -1
  127. package/dist/server/define.js +3 -3
  128. package/dist/server/define.js.map +1 -1
  129. package/dist/server/engines/bun-engine.d.ts +16 -0
  130. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  131. package/dist/server/engines/bun-engine.js +41 -0
  132. package/dist/server/engines/bun-engine.js.map +1 -0
  133. package/dist/server/engines/engine.d.ts +16 -0
  134. package/dist/server/engines/engine.d.ts.map +1 -0
  135. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  136. package/dist/server/engines/engine.js.map +1 -0
  137. package/dist/server/engines/node-engine.d.ts +22 -0
  138. package/dist/server/engines/node-engine.d.ts.map +1 -0
  139. package/dist/server/engines/node-engine.js +130 -0
  140. package/dist/server/engines/node-engine.js.map +1 -0
  141. package/dist/server/engines/uws-engine.d.ts +16 -0
  142. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  143. package/dist/server/engines/uws-engine.js +48 -0
  144. package/dist/server/engines/uws-engine.js.map +1 -0
  145. package/dist/server/request-handler.d.ts +0 -1
  146. package/dist/server/request-handler.d.ts.map +1 -1
  147. package/dist/server/request-handler.js +74 -48
  148. package/dist/server/request-handler.js.map +1 -1
  149. package/dist/server/request.d.ts +0 -8
  150. package/dist/server/request.d.ts.map +1 -1
  151. package/dist/server/request.js +0 -16
  152. package/dist/server/request.js.map +1 -1
  153. package/dist/utils/time.d.ts +6 -0
  154. package/dist/utils/time.d.ts.map +1 -0
  155. package/dist/utils/time.js +15 -0
  156. package/dist/utils/time.js.map +1 -0
  157. package/dist/validator/index.d.ts +1 -7
  158. package/dist/validator/index.d.ts.map +1 -1
  159. package/dist/validator/index.js +1 -5
  160. package/dist/validator/index.js.map +1 -1
  161. package/dist/validator/tex-types.d.ts +15 -2
  162. package/dist/validator/tex-types.d.ts.map +1 -1
  163. package/dist/validator/tex-types.js +8 -0
  164. package/dist/validator/tex-types.js.map +1 -1
  165. package/dist/validator/tex.d.ts.map +1 -1
  166. package/dist/validator/tex.js +21 -2
  167. package/dist/validator/tex.js.map +1 -1
  168. package/package.json +9 -151
  169. package/dist/adapters/aws-lambda.d.ts +0 -21
  170. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  171. package/dist/adapters/aws-lambda.js +0 -125
  172. package/dist/adapters/aws-lambda.js.map +0 -1
  173. package/dist/adapters/bun.d.ts +0 -9
  174. package/dist/adapters/bun.d.ts.map +0 -1
  175. package/dist/adapters/bun.js +0 -23
  176. package/dist/adapters/bun.js.map +0 -1
  177. package/dist/adapters/cloudflare.d.ts +0 -10
  178. package/dist/adapters/cloudflare.d.ts.map +0 -1
  179. package/dist/adapters/cloudflare.js +0 -22
  180. package/dist/adapters/cloudflare.js.map +0 -1
  181. package/dist/adapters/deno.d.ts +0 -7
  182. package/dist/adapters/deno.d.ts.map +0 -1
  183. package/dist/adapters/deno.js +0 -21
  184. package/dist/adapters/deno.js.map +0 -1
  185. package/dist/adapters/fastly.d.ts +0 -6
  186. package/dist/adapters/fastly.d.ts.map +0 -1
  187. package/dist/adapters/fastly.js +0 -20
  188. package/dist/adapters/fastly.js.map +0 -1
  189. package/dist/adapters/fetch.d.ts +0 -30
  190. package/dist/adapters/fetch.d.ts.map +0 -1
  191. package/dist/adapters/fetch.js +0 -119
  192. package/dist/adapters/fetch.js.map +0 -1
  193. package/dist/adapters/index.d.ts +0 -9
  194. package/dist/adapters/index.d.ts.map +0 -1
  195. package/dist/adapters/index.js +0 -28
  196. package/dist/adapters/index.js.map +0 -1
  197. package/dist/adapters/netlify.d.ts +0 -8
  198. package/dist/adapters/netlify.d.ts.map +0 -1
  199. package/dist/adapters/netlify.js +0 -20
  200. package/dist/adapters/netlify.js.map +0 -1
  201. package/dist/adapters/vercel.d.ts +0 -17
  202. package/dist/adapters/vercel.d.ts.map +0 -1
  203. package/dist/adapters/vercel.js +0 -23
  204. package/dist/adapters/vercel.js.map +0 -1
  205. package/dist/auth/index.d.ts +0 -8
  206. package/dist/auth/index.d.ts.map +0 -1
  207. package/dist/auth/index.js +0 -49
  208. package/dist/auth/index.js.map +0 -1
  209. package/dist/auth/jwt.d.ts +0 -20
  210. package/dist/auth/jwt.d.ts.map +0 -1
  211. package/dist/auth/jwt.js +0 -59
  212. package/dist/auth/jwt.js.map +0 -1
  213. package/dist/auth/oauth/core.d.ts +0 -96
  214. package/dist/auth/oauth/core.d.ts.map +0 -1
  215. package/dist/auth/oauth/core.js +0 -203
  216. package/dist/auth/oauth/core.js.map +0 -1
  217. package/dist/auth/oauth/index.d.ts +0 -45
  218. package/dist/auth/oauth/index.d.ts.map +0 -1
  219. package/dist/auth/oauth/index.js +0 -64
  220. package/dist/auth/oauth/index.js.map +0 -1
  221. package/dist/auth/oauth/middleware.d.ts +0 -63
  222. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  223. package/dist/auth/oauth/middleware.js +0 -164
  224. package/dist/auth/oauth/middleware.js.map +0 -1
  225. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  226. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  227. package/dist/auth/oauth/providers/custom.js +0 -204
  228. package/dist/auth/oauth/providers/custom.js.map +0 -1
  229. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  230. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  231. package/dist/auth/oauth/providers/discord.js +0 -130
  232. package/dist/auth/oauth/providers/discord.js.map +0 -1
  233. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  234. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  235. package/dist/auth/oauth/providers/facebook.js +0 -124
  236. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  237. package/dist/auth/oauth/providers/github.d.ts +0 -25
  238. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  239. package/dist/auth/oauth/providers/github.js +0 -132
  240. package/dist/auth/oauth/providers/github.js.map +0 -1
  241. package/dist/auth/oauth/providers/google.d.ts +0 -23
  242. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  243. package/dist/auth/oauth/providers/google.js +0 -134
  244. package/dist/auth/oauth/providers/google.js.map +0 -1
  245. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  246. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  247. package/dist/auth/oauth/providers/microsoft.js +0 -136
  248. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  249. package/dist/auth/oauth/types.d.ts +0 -158
  250. package/dist/auth/oauth/types.d.ts.map +0 -1
  251. package/dist/auth/oauth/types.js +0 -4
  252. package/dist/auth/oauth/types.js.map +0 -1
  253. package/dist/auth/password.d.ts +0 -25
  254. package/dist/auth/password.d.ts.map +0 -1
  255. package/dist/auth/password.js +0 -93
  256. package/dist/auth/password.js.map +0 -1
  257. package/dist/auth/rbac.d.ts +0 -10
  258. package/dist/auth/rbac.d.ts.map +0 -1
  259. package/dist/auth/rbac.js +0 -34
  260. package/dist/auth/rbac.js.map +0 -1
  261. package/dist/auth/session.d.ts +0 -26
  262. package/dist/auth/session.d.ts.map +0 -1
  263. package/dist/auth/session.js +0 -134
  264. package/dist/auth/session.js.map +0 -1
  265. package/dist/cache/index.d.ts +0 -4
  266. package/dist/cache/index.d.ts.map +0 -1
  267. package/dist/cache/index.js +0 -25
  268. package/dist/cache/index.js.map +0 -1
  269. package/dist/cache/store.d.ts +0 -58
  270. package/dist/cache/store.d.ts.map +0 -1
  271. package/dist/cache/store.js +0 -298
  272. package/dist/cache/store.js.map +0 -1
  273. package/dist/cron/parser.d.ts +0 -2
  274. package/dist/cron/parser.d.ts.map +0 -1
  275. package/dist/cron/parser.js +0 -52
  276. package/dist/cron/parser.js.map +0 -1
  277. package/dist/cron/scheduler.d.ts +0 -23
  278. package/dist/cron/scheduler.d.ts.map +0 -1
  279. package/dist/cron/scheduler.js +0 -114
  280. package/dist/cron/scheduler.js.map +0 -1
  281. package/dist/database/adapters/mongodb.d.ts +0 -58
  282. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  283. package/dist/database/adapters/mongodb.js +0 -264
  284. package/dist/database/adapters/mongodb.js.map +0 -1
  285. package/dist/database/adapters/mysql.d.ts +0 -27
  286. package/dist/database/adapters/mysql.d.ts.map +0 -1
  287. package/dist/database/adapters/mysql.js +0 -188
  288. package/dist/database/adapters/mysql.js.map +0 -1
  289. package/dist/database/adapters/postgres.d.ts +0 -28
  290. package/dist/database/adapters/postgres.d.ts.map +0 -1
  291. package/dist/database/adapters/postgres.js +0 -174
  292. package/dist/database/adapters/postgres.js.map +0 -1
  293. package/dist/database/adapters/sqlite.d.ts +0 -27
  294. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  295. package/dist/database/adapters/sqlite.js +0 -149
  296. package/dist/database/adapters/sqlite.js.map +0 -1
  297. package/dist/database/index.d.ts +0 -42
  298. package/dist/database/index.d.ts.map +0 -1
  299. package/dist/database/index.js +0 -58
  300. package/dist/database/index.js.map +0 -1
  301. package/dist/database/manager.d.ts +0 -141
  302. package/dist/database/manager.d.ts.map +0 -1
  303. package/dist/database/manager.js +0 -337
  304. package/dist/database/manager.js.map +0 -1
  305. package/dist/database/migration.d.ts +0 -57
  306. package/dist/database/migration.d.ts.map +0 -1
  307. package/dist/database/migration.js +0 -329
  308. package/dist/database/migration.js.map +0 -1
  309. package/dist/database/query-builder.d.ts +0 -95
  310. package/dist/database/query-builder.d.ts.map +0 -1
  311. package/dist/database/query-builder.js +0 -404
  312. package/dist/database/query-builder.js.map +0 -1
  313. package/dist/database/sql/index.d.ts +0 -18
  314. package/dist/database/sql/index.d.ts.map +0 -1
  315. package/dist/database/sql/index.js +0 -74
  316. package/dist/database/sql/index.js.map +0 -1
  317. package/dist/database/sql/schema.d.ts +0 -38
  318. package/dist/database/sql/schema.d.ts.map +0 -1
  319. package/dist/database/sql/schema.js +0 -80
  320. package/dist/database/sql/schema.js.map +0 -1
  321. package/dist/database/synchronizer.d.ts +0 -12
  322. package/dist/database/synchronizer.d.ts.map +0 -1
  323. package/dist/database/synchronizer.js +0 -82
  324. package/dist/database/synchronizer.js.map +0 -1
  325. package/dist/database/types.d.ts +0 -184
  326. package/dist/database/types.d.ts.map +0 -1
  327. package/dist/database/types.js +0 -4
  328. package/dist/database/types.js.map +0 -1
  329. package/dist/dataloader/dataloader.d.ts +0 -23
  330. package/dist/dataloader/dataloader.d.ts.map +0 -1
  331. package/dist/dataloader/dataloader.js +0 -98
  332. package/dist/dataloader/dataloader.js.map +0 -1
  333. package/dist/dataloader/index.d.ts +0 -3
  334. package/dist/dataloader/index.d.ts.map +0 -1
  335. package/dist/dataloader/index.js +0 -19
  336. package/dist/dataloader/index.js.map +0 -1
  337. package/dist/dataloader/registry.d.ts +0 -17
  338. package/dist/dataloader/registry.d.ts.map +0 -1
  339. package/dist/dataloader/registry.js +0 -47
  340. package/dist/dataloader/registry.js.map +0 -1
  341. package/dist/dev/dep-graph.d.ts +0 -2
  342. package/dist/dev/dep-graph.d.ts.map +0 -1
  343. package/dist/dev/dep-graph.js +0 -111
  344. package/dist/dev/dep-graph.js.map +0 -1
  345. package/dist/dev/hot-reload.d.ts +0 -30
  346. package/dist/dev/hot-reload.d.ts.map +0 -1
  347. package/dist/dev/hot-reload.js +0 -262
  348. package/dist/dev/hot-reload.js.map +0 -1
  349. package/dist/docs/content/adapters.mdx +0 -199
  350. package/dist/docs/content/cache.mdx +0 -239
  351. package/dist/docs/content/circuit-breaker.mdx +0 -130
  352. package/dist/docs/content/cron.mdx +0 -109
  353. package/dist/docs/content/database.mdx +0 -278
  354. package/dist/docs/content/gateways.mdx +0 -376
  355. package/dist/docs/content/oauth.mdx +0 -179
  356. package/dist/docs/content/queues.mdx +0 -177
  357. package/dist/docs/content/rpc.mdx +0 -146
  358. package/dist/docs/content/sse.mdx +0 -159
  359. package/dist/docs/content/websockets.mdx +0 -289
  360. package/dist/docs/integrations/README.md +0 -23
  361. package/dist/docs/integrations/jwt.mdx +0 -151
  362. package/dist/docs/integrations/mongo.mdx +0 -183
  363. package/dist/docs/integrations/observability.mdx +0 -125
  364. package/dist/docs/integrations/openai.mdx +0 -108
  365. package/dist/docs/integrations/postgres.mdx +0 -190
  366. package/dist/docs/integrations/posthog.mdx +0 -122
  367. package/dist/docs/integrations/redis.mdx +0 -141
  368. package/dist/docs/integrations/resend.mdx +0 -117
  369. package/dist/docs/integrations/s3.mdx +0 -122
  370. package/dist/docs/integrations/swagger.mdx +0 -113
  371. package/dist/docs/reference/adapters.mdx +0 -130
  372. package/dist/docs/reference/auth.mdx +0 -183
  373. package/dist/docs/reference/cache.mdx +0 -132
  374. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  375. package/dist/docs/reference/queue.mdx +0 -155
  376. package/dist/docs/reference/storage.mdx +0 -116
  377. package/dist/docs/reference/swagger.mdx +0 -132
  378. package/dist/integrations/drizzle.d.ts +0 -10
  379. package/dist/integrations/drizzle.d.ts.map +0 -1
  380. package/dist/integrations/drizzle.js +0 -34
  381. package/dist/integrations/drizzle.js.map +0 -1
  382. package/dist/integrations/jwt.d.ts +0 -12
  383. package/dist/integrations/jwt.d.ts.map +0 -1
  384. package/dist/integrations/jwt.js +0 -29
  385. package/dist/integrations/jwt.js.map +0 -1
  386. package/dist/integrations/mongodb.d.ts +0 -13
  387. package/dist/integrations/mongodb.d.ts.map +0 -1
  388. package/dist/integrations/mongodb.js +0 -48
  389. package/dist/integrations/mongodb.js.map +0 -1
  390. package/dist/integrations/mongoose.d.ts +0 -13
  391. package/dist/integrations/mongoose.d.ts.map +0 -1
  392. package/dist/integrations/mongoose.js +0 -84
  393. package/dist/integrations/mongoose.js.map +0 -1
  394. package/dist/integrations/openai.d.ts +0 -12
  395. package/dist/integrations/openai.d.ts.map +0 -1
  396. package/dist/integrations/openai.js +0 -47
  397. package/dist/integrations/openai.js.map +0 -1
  398. package/dist/integrations/postgres.d.ts +0 -13
  399. package/dist/integrations/postgres.d.ts.map +0 -1
  400. package/dist/integrations/postgres.js +0 -55
  401. package/dist/integrations/postgres.js.map +0 -1
  402. package/dist/integrations/posthog.d.ts +0 -13
  403. package/dist/integrations/posthog.d.ts.map +0 -1
  404. package/dist/integrations/posthog.js +0 -49
  405. package/dist/integrations/posthog.js.map +0 -1
  406. package/dist/integrations/prisma.d.ts +0 -10
  407. package/dist/integrations/prisma.d.ts.map +0 -1
  408. package/dist/integrations/prisma.js +0 -39
  409. package/dist/integrations/prisma.js.map +0 -1
  410. package/dist/integrations/redis.d.ts +0 -12
  411. package/dist/integrations/redis.d.ts.map +0 -1
  412. package/dist/integrations/redis.js +0 -48
  413. package/dist/integrations/redis.js.map +0 -1
  414. package/dist/integrations/resend.d.ts +0 -12
  415. package/dist/integrations/resend.d.ts.map +0 -1
  416. package/dist/integrations/resend.js +0 -47
  417. package/dist/integrations/resend.js.map +0 -1
  418. package/dist/integrations/s3.d.ts +0 -15
  419. package/dist/integrations/s3.d.ts.map +0 -1
  420. package/dist/integrations/s3.js +0 -60
  421. package/dist/integrations/s3.js.map +0 -1
  422. package/dist/integrations/supabase.d.ts +0 -13
  423. package/dist/integrations/supabase.d.ts.map +0 -1
  424. package/dist/integrations/supabase.js +0 -51
  425. package/dist/integrations/supabase.js.map +0 -1
  426. package/dist/middleware/cache.d.ts +0 -21
  427. package/dist/middleware/cache.d.ts.map +0 -1
  428. package/dist/middleware/cache.js +0 -156
  429. package/dist/middleware/cache.js.map +0 -1
  430. package/dist/observability/health.d.ts +0 -23
  431. package/dist/observability/health.d.ts.map +0 -1
  432. package/dist/observability/health.js +0 -49
  433. package/dist/observability/health.js.map +0 -1
  434. package/dist/observability/index.d.ts +0 -4
  435. package/dist/observability/index.d.ts.map +0 -1
  436. package/dist/observability/index.js +0 -10
  437. package/dist/observability/index.js.map +0 -1
  438. package/dist/observability/metrics.d.ts +0 -6
  439. package/dist/observability/metrics.d.ts.map +0 -1
  440. package/dist/observability/metrics.js +0 -60
  441. package/dist/observability/metrics.js.map +0 -1
  442. package/dist/observability/otel.d.ts +0 -27
  443. package/dist/observability/otel.d.ts.map +0 -1
  444. package/dist/observability/otel.js +0 -45
  445. package/dist/observability/otel.js.map +0 -1
  446. package/dist/observability/prometheus.d.ts +0 -30
  447. package/dist/observability/prometheus.d.ts.map +0 -1
  448. package/dist/observability/prometheus.js +0 -31
  449. package/dist/observability/prometheus.js.map +0 -1
  450. package/dist/queue/client.d.ts +0 -13
  451. package/dist/queue/client.d.ts.map +0 -1
  452. package/dist/queue/client.js +0 -83
  453. package/dist/queue/client.js.map +0 -1
  454. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  455. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  456. package/dist/queue/drivers/MemoryDriver.js +0 -176
  457. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  458. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  459. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  460. package/dist/queue/drivers/RedisDriver.js +0 -130
  461. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  462. package/dist/queue/index.d.ts +0 -18
  463. package/dist/queue/index.d.ts.map +0 -1
  464. package/dist/queue/index.js +0 -37
  465. package/dist/queue/index.js.map +0 -1
  466. package/dist/queue/manager.d.ts +0 -18
  467. package/dist/queue/manager.d.ts.map +0 -1
  468. package/dist/queue/manager.js +0 -59
  469. package/dist/queue/manager.js.map +0 -1
  470. package/dist/queue/types.d.ts +0 -55
  471. package/dist/queue/types.d.ts.map +0 -1
  472. package/dist/queue/types.js.map +0 -1
  473. package/dist/queue/worker.d.ts +0 -18
  474. package/dist/queue/worker.d.ts.map +0 -1
  475. package/dist/queue/worker.js +0 -176
  476. package/dist/queue/worker.js.map +0 -1
  477. package/dist/router/gateway.d.ts.map +0 -1
  478. package/dist/router/gateway.js +0 -11
  479. package/dist/router/gateway.js.map +0 -1
  480. package/dist/server/bun-adapter.d.ts.map +0 -1
  481. package/dist/server/bun-adapter.js.map +0 -1
  482. package/dist/server/sse.d.ts +0 -16
  483. package/dist/server/sse.d.ts.map +0 -1
  484. package/dist/server/sse.js +0 -51
  485. package/dist/server/sse.js.map +0 -1
  486. package/dist/server/uws-adapter.d.ts.map +0 -1
  487. package/dist/server/uws-adapter.js.map +0 -1
  488. package/dist/storage/index.d.ts +0 -15
  489. package/dist/storage/index.d.ts.map +0 -1
  490. package/dist/storage/index.js +0 -7
  491. package/dist/storage/index.js.map +0 -1
  492. package/dist/swagger/index.d.ts +0 -9
  493. package/dist/swagger/index.d.ts.map +0 -1
  494. package/dist/swagger/index.js +0 -165
  495. package/dist/swagger/index.js.map +0 -1
  496. package/dist/threads/pool.d.ts +0 -14
  497. package/dist/threads/pool.d.ts.map +0 -1
  498. package/dist/threads/pool.js +0 -93
  499. package/dist/threads/pool.js.map +0 -1
  500. package/dist/threads/worker-runner.d.ts +0 -2
  501. package/dist/threads/worker-runner.d.ts.map +0 -1
  502. package/dist/threads/worker-runner.js +0 -71
  503. package/dist/threads/worker-runner.js.map +0 -1
  504. package/dist/validator/validator.d.ts +0 -360
  505. package/dist/validator/validator.d.ts.map +0 -1
  506. package/dist/validator/validator.js +0 -931
  507. package/dist/validator/validator.js.map +0 -1
  508. package/dist/websocket/orchestrator.d.ts +0 -11
  509. package/dist/websocket/orchestrator.d.ts.map +0 -1
  510. package/dist/websocket/orchestrator.js +0 -238
  511. package/dist/websocket/orchestrator.js.map +0 -1
  512. package/dist/websocket/server.d.ts +0 -66
  513. package/dist/websocket/server.d.ts.map +0 -1
  514. package/dist/websocket/server.js +0 -158
  515. package/dist/websocket/server.js.map +0 -1
  516. package/dist/websocket/socket.d.ts +0 -119
  517. package/dist/websocket/socket.d.ts.map +0 -1
  518. package/dist/websocket/socket.js +0 -242
  519. package/dist/websocket/socket.js.map +0 -1
@@ -5,9 +5,9 @@ nextTitle: "Modules & Plugins"
5
5
 
6
6
  # Middleware
7
7
 
8
- ExisJS comes with a collection of built-in middleware out of the box.
8
+ ExisJS comes with a collection of built-in middleware out of the box.
9
9
 
10
- ExisJS provides first-party implementations for features like CORS, Request Logging, Backpressure, and Deduplication.
10
+ ExisJS provides first-party implementations for features like CORS, Request Logging, Backpressure, In-Memory Rate Limiting, Idempotency, and Deduplication.
11
11
 
12
12
  All middleware can be imported directly from the `exisjs/middleware` package.
13
13
 
@@ -17,58 +17,41 @@ All middleware can be imported directly from the `exisjs/middleware` package.
17
17
 
18
18
  ExisJS gives you granular control over where your middleware executes:
19
19
 
20
- 1. **Globally (`server.ts`)**: Applies to every request hitting your server.
21
- 2. **Folder-Scoped (`gateway.ts`)**: Applies only to routes inside that specific folder.
20
+ 1. **Globally (`server.ts`)**: Applies to every request hitting your server via `app.use()`.
21
+ 2. **Folder-Scoped (`boundary.ts`)**: Applies to routes inside that folder and all subfolders automatically.
22
22
  3. **Route-Scoped (`route.ts`)**: Applies only to a specific endpoint.
23
23
 
24
- ```typescript filename="src/http/admin/gateway.ts"
25
- import { defineGateway } from 'exisjs/router'
24
+ ```typescript filename="src/http/admin/boundary.ts"
25
+ import { defineBoundary } from 'exisjs/router'
26
+ import type { Request, Response, Next } from 'exisjs/router'
26
27
  import { requestLogger } from 'exisjs/middleware'
27
28
 
28
- // This logger will ONLY run for requests to /admin/*
29
- export default defineGateway({
30
- middlewares: [
31
- requestLogger({ level: 'debug' })
32
- ]
33
- })
29
+ export const config = defineBoundary({})
30
+
31
+ // Auto-detected chain step for /admin/*
32
+ export const logger = requestLogger({ level: 'debug' })
34
33
  ```
35
34
 
36
35
  ### Middleware vs Inline Execution
37
36
 
38
- It is critical to understand that middleware executes **before** your route handler. If you are using [Custom Typed Contexts](/docs/requests#strongly-typed-context--native-destructuring) to destructure variables (e.g., `async handle({ user })`), you **must** use middleware to populate `req.user`.
39
-
40
- If you try to call an authentication function *inline* inside the handler, the `user` variable will be `undefined` because destructuring occurs at the moment the handler is invoked—before the inline function has a chance to execute!
41
-
42
- ```typescript
43
- // ❌ BAD: Destructuring happens before requireAuth mutates the request
44
- create: route.post('/', {
45
- async handle({ user, req }) {
46
- requireAuth(req);
47
- console.log(user); // undefined
48
- }
49
- })
50
-
51
- // ✅ GOOD: Middleware runs first, so `user` is fully populated and strongly typed
52
- create: route.post('/', {
53
- middleware: [requireAuth],
54
- async handle({ user }) {
55
- console.log(user); // Populated and typed
56
- }
57
- })
58
- ```
37
+ Middleware executes **before** your route handler. If you are using custom typed contexts to destructure variables (e.g., `async handle({ user })`), you must use middleware to populate `req.user`.
59
38
 
60
39
  #### Functional Paradigm
61
40
 
62
41
  ```typescript filename="src/http/route.ts"
63
42
  import { controller, route } from 'exisjs/router'
64
43
  import { validate } from 'exisjs/middleware'
44
+ import { tex } from 'exisjs/validator'
45
+
46
+ const mySchema = {
47
+ body: tex.object({ name: tex.string() })
48
+ }
65
49
 
66
50
  export default controller({
67
- // This middleware ONLY runs for this specific endpoint
68
51
  create: route.post('/', {
69
52
  middlewares: [validate(mySchema)],
70
- handle(req, res) {
71
- return { ok: true }
53
+ handle({ req }) {
54
+ return { ok: true, name: req.body.name }
72
55
  }
73
56
  })
74
57
  })
@@ -79,10 +62,14 @@ export default controller({
79
62
  ```typescript filename="src/http/route.ts"
80
63
  import { Controller, Post, Use } from 'exisjs/decorators'
81
64
  import { validate } from 'exisjs/middleware'
65
+ import { tex } from 'exisjs/validator'
66
+
67
+ const mySchema = {
68
+ body: tex.object({ name: tex.string() })
69
+ }
82
70
 
83
71
  @Controller()
84
72
  export default class MyController {
85
- // This middleware ONLY runs for this specific endpoint
86
73
  @Use(validate(mySchema))
87
74
  @Post('/')
88
75
  async create() {
@@ -95,9 +82,9 @@ export default class MyController {
95
82
 
96
83
  ## 1. CORS
97
84
 
98
- The `cors` middleware handles Cross-Origin Resource Sharing. It is configurable and optimized for low overhead on preflight requests.
85
+ The `cors` middleware handles Cross-Origin Resource Sharing.
99
86
 
100
- The recommended practice in ExisJS is to configure CORS globally in your **`exis.config.ts`** file (the Single Source of Truth). The framework will automatically merge and apply it globally for you.
87
+ The recommended practice in ExisJS is to configure CORS globally in your **`exis.config.ts`** file or per-folder in `boundary.ts`.
101
88
 
102
89
  ```typescript filename="exis.config.ts"
103
90
  import { defineConfig } from 'exisjs/config'
@@ -108,65 +95,30 @@ export default async () => defineConfig({
108
95
  methods: ['GET', 'POST', 'OPTIONS'],
109
96
  credentials: true,
110
97
  maxAge: 86400,
111
- preflightContinue: true // Set this to true if you want OPTIONS requests to hit your custom route.options() handlers!
112
98
  }
113
99
  })
114
100
  ```
115
101
 
116
- By default, ExisJS intercepts `OPTIONS` requests at the middleware level and responds with a `204 No Content` (and the appropriate CORS headers) to save server resources. However, if you need to run custom logic on preflight requests—such as hitting a specific `route.options('/', ...)` handler or a `@Options()` decorated controller method—you can set `preflightContinue: true`.
117
-
118
- You can also configure CORS locally per-route by passing it to your controller config or gateway.
119
-
120
102
  ---
121
103
 
122
104
  ## 2. Request Logger
123
105
 
124
- ExisJS uses **Pino** under the hood. The `requestLogger` injects a request-scoped logger instance (`req.log`) and times response cycles automatically.
106
+ ExisJS uses Pino under the hood. The `requestLogger` injects a request-scoped logger instance (`req.log`) and times response cycles automatically.
125
107
 
126
108
  ```typescript filename="src/http/server.ts"
127
109
  import { requestLogger } from 'exisjs/middleware'
128
110
 
129
111
  app.use(requestLogger({
130
112
  level: 'debug',
131
- pretty: true // Enable beautiful CLI formatting
113
+ pretty: true
132
114
  }))
133
115
  ```
134
116
 
135
- #### Functional Paradigm
136
-
137
- ```typescript filename="src/http/route.ts"
138
- import { controller, route } from 'exisjs/router'
139
-
140
- export default controller({
141
- index: route.get('/', {
142
- handle(req, res) {
143
- req.log.info({ userId: 123 }, "User hit the index route")
144
- return { ok: true }
145
- }
146
- })
147
- })
148
- ```
149
-
150
- #### Class-Based (OOP) Paradigm
151
-
152
- ```typescript filename="src/http/route.ts"
153
- import { Controller, Get, Req } from 'exisjs/decorators'
154
-
155
- @Controller()
156
- export default class MyController {
157
- @Get('/')
158
- async index(@Req() req: any) {
159
- req.log.info({ userId: 123 }, "User hit the index route")
160
- return { ok: true }
161
- }
162
- }
163
- ```
164
-
165
117
  ---
166
118
 
167
119
  ## 3. Request ID
168
120
 
169
- Injects a unique `X-Request-Id` into every incoming request and outgoing response header. It natively supports distributed tracing headers (`traceparent`, `x-b3-traceid`).
121
+ Injects a unique `X-Request-Id` into every incoming request and outgoing response header. Supports distributed tracing headers (`traceparent`, `x-b3-traceid`).
170
122
 
171
123
  ```typescript filename="src/http/server.ts"
172
124
  import { requestId } from 'exisjs/middleware'
@@ -174,192 +126,37 @@ import { requestId } from 'exisjs/middleware'
174
126
  app.use(requestId())
175
127
  ```
176
128
 
177
- #### Functional Paradigm
178
-
179
- ```typescript filename="src/http/route.ts"
180
- import { controller, route } from 'exisjs/router'
181
-
182
- export default controller({
183
- index: route.get('/', {
184
- handle(req, res) {
185
- console.log("Trace ID:", req.requestId)
186
- return { ok: true }
187
- }
188
- })
189
- })
190
- ```
191
-
192
- #### Class-Based (OOP) Paradigm
193
-
194
- ```typescript filename="src/http/route.ts"
195
- import { Controller, Get, Req } from 'exisjs/decorators'
196
-
197
- @Controller()
198
- export default class MyController {
199
- @Get('/')
200
- async index(@Req() req: any) {
201
- console.log("Trace ID:", req.requestId)
202
- return { ok: true }
203
- }
204
- }
205
- ```
206
-
207
- ---
208
-
209
- ## 4. Static File Serving
210
-
211
- A static file server that resolves MIME types, streams files, and provides Cache-Control configuration out of the box.
212
-
213
- ```typescript
214
- import { serveStatic } from 'exisjs/middleware'
215
- import path from 'node:path'
216
-
217
- app.use('/public', serveStatic(path.join(process.cwd(), 'public'), {
218
- maxAge: 31536000 // Cache for 1 year
219
- }))
220
- ```
221
-
222
129
  ---
223
130
 
224
- ## 5. Security Middlewares
225
-
226
- ExisJS bundles several security middlewares. (We will cover these in the Security documentation, but here is a preview):
131
+ ## 4. Rate Limiting (In-Memory / Native Off-Heap)
227
132
 
228
- - **`helmet()`**: Automatically sets 14+ secure HTTP headers.
229
- - **`hpp()`**: Prevents HTTP Parameter Pollution attacks.
230
- - **`dbSanitize()`**: A universal scraper that protects against NoSQL injection patterns (`$where` and other malicious operators).
231
- - **`timeout(ms)`**: Kills requests that hang longer than a specified duration.
232
- - **`ipFilter()`**: Restricts access based on IP Whitelists/Blacklists.
133
+ ExisJS provides high-performance rate limiting powered by Rust native memory:
233
134
 
234
- ```typescript
235
- import { helmet, timeout, dbSanitize } from 'exisjs/middleware'
236
-
237
- app.use(helmet())
238
- app.use(dbSanitize({ mongo: true }))
239
- app.use(timeout(5000)) // 5 second timeout
240
- ```
241
-
242
- ---
135
+ ```typescript filename="src/http/boundary.ts"
136
+ import { rateLimit } from 'exisjs/middleware'
243
137
 
244
- ## 6. Advanced Performance Middlewares
245
-
246
- These middlewares provide additional scaling and performance capabilities.
247
-
248
- - **`cache()`**: An in-memory route caching engine. Requires a `keyGenerator` to prevent data leaks.
249
- - **`dedupe()`**: Request deduplication (In-flight request collapsing). If 1,000 users hit a heavy `/stats` route at the exact same millisecond, ExisJS will only compute it **once**, and send the same response to all 1,000 users simultaneously. Requires a `keyGenerator`.
250
- - **`backpressure()`**: Protects your server from traffic spikes by shedding load or queuing requests when the Node.js Event Loop lags.
251
-
252
- > [!WARNING]
253
- > **Authentication Leak Hazard**: When using `cache()` or `dedupe()` on authenticated routes, you **must** include the user's ID or session token in your `keyGenerator`. Failing to do so will result in User B receiving a cached/deduped response generated for User A.
254
-
255
- ---
256
-
257
- ## 7. Interceptors & Error Filters
258
-
259
- As covered in our [Error Handling](/docs/errors) guide, you can centrally mutate responses or catch specific Exception classes using `intercept()` and `catchError()`.
260
-
261
- ```typescript
262
- import { intercept, catchError } from 'exisjs/middleware'
263
-
264
- // Wrap all responses in { data: ... }
265
- app.use(intercept((data) => ({ data })))
266
-
267
- // Catch specific errors
268
- app.use(catchError(DatabaseError, (err, req, res) => {
269
- res.status(503).json({ error: 'Database Offline' })
270
- }))
271
- ```
272
-
273
- ---
274
-
275
- ## 8. Schema Validation
276
-
277
- ExisJS includes a validation engine. You can validate `body`, `query`, or `params` directly at the middleware layer. If validation fails, it automatically rejects the request with a structured HTTP 400 JSON response.
278
-
279
- #### Functional Paradigm
280
-
281
- ```typescript filename="src/http/users/route.ts"
282
- import { controller, route } from 'exisjs/router'
283
- import { validate } from 'exisjs/middleware'
284
- import { tex } from 'exisjs/validator'
285
-
286
- const createUserSchema = {
287
- body: tex.object({
288
- email: tex.email(),
289
- age: tex.number({ min: 18 })
290
- })
291
- }
292
-
293
- export default controller({
294
- // Automatically rejects invalid payloads with 400 Bad Request
295
- create: route.post('/', {
296
- middlewares: [validate(createUserSchema)],
297
- handle(req, res) {
298
- // req.body is fully validated, but we also type-cast it safely
299
- const body = req.body as { email: string, age: number }
300
-
301
- return { success: true, email: body.email }
302
- }
303
- })
138
+ export const limiter = rateLimit({
139
+ windowMs: 60000,
140
+ max: 100,
304
141
  })
305
142
  ```
306
143
 
307
- #### Class-Based (OOP) Paradigm
308
-
309
- ```typescript filename="src/http/users/route.ts"
310
- import { Controller, Post, Use, Body } from 'exisjs/decorators'
311
- import { validate } from 'exisjs/middleware'
312
- import { tex } from 'exisjs/validator'
313
-
314
- const createUserSchema = {
315
- body: tex.object({
316
- email: tex.email(),
317
- age: tex.number({ min: 18 })
318
- })
319
- }
320
-
321
- @Controller()
322
- export default class UsersController {
323
- // Automatically rejects invalid payloads with 400 Bad Request
324
- @Use(validate(createUserSchema))
325
- @Post('/')
326
- async create(@Body() body: { email: string, age: number }) {
327
- return { success: true, email: body.email }
328
- }
329
- }
330
- ```
144
+ > [!NOTE]
145
+ > Core rate limiting runs completely off-heap in-memory. For Redis-backed distributed rate limiting across clusters, use `@exisjs/cache`.
331
146
 
332
147
  ---
333
148
 
334
- ## 9. Idempotency
335
-
336
- Idempotency ensures that retrying an identical request multiple times (e.g., due to network timeouts) will not result in duplicate operations on the server. ExisJS provides a Redis-backed (or in-memory) idempotency engine.
337
-
338
- #### Functional Paradigm
339
-
340
- ```typescript
341
- import { controller, route } from 'exisjs/router'
342
- import { IdempotentMiddleware } from 'exisjs/middleware'
343
-
344
- export default controller({
345
- checkout: route.post('/checkout', {
346
- middlewares: [IdempotentMiddleware({ ttl: 86400, headerName: 'Idempotency-Key' })],
347
- handle(req, res) {
348
- return { success: true }
349
- }
350
- })
351
- })
352
- ```
149
+ ## 5. Idempotency (In-Memory / Native Off-Heap)
353
150
 
354
- #### Class-Based (OOP) Paradigm
151
+ Idempotency caches responses based on the `Idempotency-Key` header, preventing duplicate mutations:
355
152
 
356
- ```typescript
153
+ ```typescript filename="src/http/checkout/route.ts"
357
154
  import { Controller, Post, Idempotent } from 'exisjs/decorators'
358
155
 
359
- @Controller()
156
+ @Controller('/checkout')
360
157
  export default class CheckoutController {
361
- @Idempotent({ ttl: 86400 }) // Caches the response for 24 hours based on the Idempotency-Key header
362
- @Post('/checkout')
158
+ @Idempotent({ ttlMs: 86400000 })
159
+ @Post('/')
363
160
  async checkout() {
364
161
  return { success: true }
365
162
  }
@@ -368,74 +165,51 @@ export default class CheckoutController {
368
165
 
369
166
  ---
370
167
 
371
- ## 10. Cache Engine
168
+ ## 6. Request Deduplication (`dedupe`)
372
169
 
373
- ExisJS provides a built-in Cache Engine for `GET` requests. It allows you to reduce database load and response times for frequently requested data.
170
+ If multiple clients request the exact same resource concurrently, `dedupe` collapses identical in-flight requests into a single operation:
374
171
 
375
- #### Functional Paradigm
376
-
377
- ```typescript
172
+ ```typescript filename="src/http/stats/route.ts"
378
173
  import { controller, route } from 'exisjs/router'
379
- import { cache } from 'exisjs/middleware'
174
+ import { dedupe } from 'exisjs/middleware'
380
175
 
381
176
  export default controller({
382
- popular: route.get('/popular', {
383
- middlewares: [
384
- cache({
385
- ttlMs: 60000,
386
- keyGenerator: (req) => req.url // Critical: Define how cache keys are built
387
- })
388
- ],
389
- handle(req, res) {
390
- return { success: true, books: [] }
177
+ getStats: route.get('/', {
178
+ middlewares: [dedupe({ ttlMs: 5000 })],
179
+ async handle() {
180
+ return { activeUsers: 1000 }
391
181
  }
392
182
  })
393
183
  })
394
184
  ```
395
185
 
396
- #### Class-Based (OOP) Paradigm
186
+ ---
187
+
188
+ ## 7. Static File Serving
189
+
190
+ A static file server that resolves MIME types and streams files:
397
191
 
398
192
  ```typescript
399
- import { Controller, Get, Cache } from 'exisjs/decorators'
193
+ import { serveStatic } from 'exisjs/middleware'
194
+ import path from 'node:path'
400
195
 
401
- @Controller()
402
- export default class BooksController {
403
- @Cache({ ttlMs: 60000, keyGenerator: (req) => req.url }) // Caches the response for 60 seconds
404
- @Get('/popular')
405
- async getPopular() {
406
- return { success: true, books: [] }
407
- }
408
- }
196
+ app.use('/public', serveStatic(path.join(process.cwd(), 'public'), {
197
+ maxAge: 31536000
198
+ }))
409
199
  ```
410
200
 
411
201
  ---
412
202
 
413
- ## 11. Compression (Gzip / Brotli / Deflate)
414
-
415
- ExisJS includes a stream-based Compression middleware. It natively hooks into the `uWebSockets` core and compresses JSON, streams, and text on-the-fly, reducing your outbound network bandwidth.
203
+ ## 8. Compression (Gzip / Brotli / Deflate)
416
204
 
417
- The best practice is to configure Compression globally in your **`exis.config.ts`**. By default, if `compression: true` is passed, the framework will add the `compress` middleware for you automatically.
205
+ Stream-based compression middleware supporting Gzip, Deflate, and Brotli:
418
206
 
419
207
  ```typescript filename="exis.config.ts"
420
208
  import type { ExisConfig } from 'exisjs/config'
421
209
 
422
210
  const config: ExisConfig = {
423
- // Enables Gzip, Brotli, and Deflate compression globally for all routes
424
- compression: true,
211
+ compression: true,
425
212
  }
426
213
 
427
214
  export default config
428
215
  ```
429
-
430
- If you prefer to manually apply it to specific routes or gateways instead of globally, you can import it:
431
-
432
- ```typescript filename="src/http/api/gateway.ts"
433
- import { defineGateway } from 'exisjs/router'
434
- import { compress } from 'exisjs/middleware'
435
-
436
- export default defineGateway({
437
- middlewares: [
438
- compress() // Only compress responses within this Gateway
439
- ]
440
- })
441
- ```