exisjs 0.6.1 → 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 (517) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +2 -8
  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 +33 -44
  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-server.js +10 -0
  74. package/dist/lib/start-server.js.map +1 -1
  75. package/dist/logger/index.d.ts +81 -0
  76. package/dist/logger/index.d.ts.map +1 -0
  77. package/dist/logger/index.js +142 -0
  78. package/dist/logger/index.js.map +1 -0
  79. package/dist/middleware/dedupe.d.ts +1 -1
  80. package/dist/middleware/dedupe.js +1 -1
  81. package/dist/middleware/middleware.d.ts +3 -5
  82. package/dist/middleware/middleware.d.ts.map +1 -1
  83. package/dist/middleware/middleware.js +2 -6
  84. package/dist/middleware/middleware.js.map +1 -1
  85. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  86. package/dist/router/boundary.d.ts.map +1 -0
  87. package/dist/router/boundary.js +11 -0
  88. package/dist/router/boundary.js.map +1 -0
  89. package/dist/router/index.d.ts +3 -6
  90. package/dist/router/index.d.ts.map +1 -1
  91. package/dist/router/index.js +3 -7
  92. package/dist/router/index.js.map +1 -1
  93. package/dist/router/route-builder.d.ts +0 -28
  94. package/dist/router/route-builder.d.ts.map +1 -1
  95. package/dist/router/route-builder.js +0 -4
  96. package/dist/router/route-builder.js.map +1 -1
  97. package/dist/router/route-scanner.d.ts +1 -2
  98. package/dist/router/route-scanner.d.ts.map +1 -1
  99. package/dist/router/route-scanner.js +216 -193
  100. package/dist/router/route-scanner.js.map +1 -1
  101. package/dist/router/router.d.ts +4 -6
  102. package/dist/router/router.d.ts.map +1 -1
  103. package/dist/router/router.js +36 -72
  104. package/dist/router/router.js.map +1 -1
  105. package/dist/router/types.d.ts +2 -6
  106. package/dist/router/types.d.ts.map +1 -1
  107. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  108. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  109. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  110. package/dist/server/adapters/bun-adapter.js.map +1 -0
  111. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  112. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  113. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  114. package/dist/server/adapters/uws-adapter.js.map +1 -0
  115. package/dist/server/app.d.ts +9 -30
  116. package/dist/server/app.d.ts.map +1 -1
  117. package/dist/server/app.js +19 -134
  118. package/dist/server/app.js.map +1 -1
  119. package/dist/server/bootstrapper.d.ts +4 -15
  120. package/dist/server/bootstrapper.d.ts.map +1 -1
  121. package/dist/server/bootstrapper.js +30 -229
  122. package/dist/server/bootstrapper.js.map +1 -1
  123. package/dist/server/define.d.ts +2 -2
  124. package/dist/server/define.d.ts.map +1 -1
  125. package/dist/server/define.js +3 -3
  126. package/dist/server/define.js.map +1 -1
  127. package/dist/server/engines/bun-engine.d.ts +16 -0
  128. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  129. package/dist/server/engines/bun-engine.js +41 -0
  130. package/dist/server/engines/bun-engine.js.map +1 -0
  131. package/dist/server/engines/engine.d.ts +16 -0
  132. package/dist/server/engines/engine.d.ts.map +1 -0
  133. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  134. package/dist/server/engines/engine.js.map +1 -0
  135. package/dist/server/engines/node-engine.d.ts +22 -0
  136. package/dist/server/engines/node-engine.d.ts.map +1 -0
  137. package/dist/server/engines/node-engine.js +130 -0
  138. package/dist/server/engines/node-engine.js.map +1 -0
  139. package/dist/server/engines/uws-engine.d.ts +16 -0
  140. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  141. package/dist/server/engines/uws-engine.js +48 -0
  142. package/dist/server/engines/uws-engine.js.map +1 -0
  143. package/dist/server/request-handler.d.ts +0 -1
  144. package/dist/server/request-handler.d.ts.map +1 -1
  145. package/dist/server/request-handler.js +74 -48
  146. package/dist/server/request-handler.js.map +1 -1
  147. package/dist/server/request.d.ts +0 -8
  148. package/dist/server/request.d.ts.map +1 -1
  149. package/dist/server/request.js +0 -16
  150. package/dist/server/request.js.map +1 -1
  151. package/dist/utils/time.d.ts +6 -0
  152. package/dist/utils/time.d.ts.map +1 -0
  153. package/dist/utils/time.js +15 -0
  154. package/dist/utils/time.js.map +1 -0
  155. package/dist/validator/index.d.ts +1 -7
  156. package/dist/validator/index.d.ts.map +1 -1
  157. package/dist/validator/index.js +1 -5
  158. package/dist/validator/index.js.map +1 -1
  159. package/dist/validator/tex-types.d.ts +15 -2
  160. package/dist/validator/tex-types.d.ts.map +1 -1
  161. package/dist/validator/tex-types.js +8 -0
  162. package/dist/validator/tex-types.js.map +1 -1
  163. package/dist/validator/tex.d.ts.map +1 -1
  164. package/dist/validator/tex.js +21 -2
  165. package/dist/validator/tex.js.map +1 -1
  166. package/package.json +9 -151
  167. package/dist/adapters/aws-lambda.d.ts +0 -21
  168. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  169. package/dist/adapters/aws-lambda.js +0 -125
  170. package/dist/adapters/aws-lambda.js.map +0 -1
  171. package/dist/adapters/bun.d.ts +0 -9
  172. package/dist/adapters/bun.d.ts.map +0 -1
  173. package/dist/adapters/bun.js +0 -23
  174. package/dist/adapters/bun.js.map +0 -1
  175. package/dist/adapters/cloudflare.d.ts +0 -10
  176. package/dist/adapters/cloudflare.d.ts.map +0 -1
  177. package/dist/adapters/cloudflare.js +0 -22
  178. package/dist/adapters/cloudflare.js.map +0 -1
  179. package/dist/adapters/deno.d.ts +0 -7
  180. package/dist/adapters/deno.d.ts.map +0 -1
  181. package/dist/adapters/deno.js +0 -21
  182. package/dist/adapters/deno.js.map +0 -1
  183. package/dist/adapters/fastly.d.ts +0 -6
  184. package/dist/adapters/fastly.d.ts.map +0 -1
  185. package/dist/adapters/fastly.js +0 -20
  186. package/dist/adapters/fastly.js.map +0 -1
  187. package/dist/adapters/fetch.d.ts +0 -30
  188. package/dist/adapters/fetch.d.ts.map +0 -1
  189. package/dist/adapters/fetch.js +0 -119
  190. package/dist/adapters/fetch.js.map +0 -1
  191. package/dist/adapters/index.d.ts +0 -9
  192. package/dist/adapters/index.d.ts.map +0 -1
  193. package/dist/adapters/index.js +0 -28
  194. package/dist/adapters/index.js.map +0 -1
  195. package/dist/adapters/netlify.d.ts +0 -8
  196. package/dist/adapters/netlify.d.ts.map +0 -1
  197. package/dist/adapters/netlify.js +0 -20
  198. package/dist/adapters/netlify.js.map +0 -1
  199. package/dist/adapters/vercel.d.ts +0 -17
  200. package/dist/adapters/vercel.d.ts.map +0 -1
  201. package/dist/adapters/vercel.js +0 -23
  202. package/dist/adapters/vercel.js.map +0 -1
  203. package/dist/auth/index.d.ts +0 -8
  204. package/dist/auth/index.d.ts.map +0 -1
  205. package/dist/auth/index.js +0 -49
  206. package/dist/auth/index.js.map +0 -1
  207. package/dist/auth/jwt.d.ts +0 -20
  208. package/dist/auth/jwt.d.ts.map +0 -1
  209. package/dist/auth/jwt.js +0 -59
  210. package/dist/auth/jwt.js.map +0 -1
  211. package/dist/auth/oauth/core.d.ts +0 -96
  212. package/dist/auth/oauth/core.d.ts.map +0 -1
  213. package/dist/auth/oauth/core.js +0 -203
  214. package/dist/auth/oauth/core.js.map +0 -1
  215. package/dist/auth/oauth/index.d.ts +0 -45
  216. package/dist/auth/oauth/index.d.ts.map +0 -1
  217. package/dist/auth/oauth/index.js +0 -64
  218. package/dist/auth/oauth/index.js.map +0 -1
  219. package/dist/auth/oauth/middleware.d.ts +0 -63
  220. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  221. package/dist/auth/oauth/middleware.js +0 -164
  222. package/dist/auth/oauth/middleware.js.map +0 -1
  223. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  224. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  225. package/dist/auth/oauth/providers/custom.js +0 -204
  226. package/dist/auth/oauth/providers/custom.js.map +0 -1
  227. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  228. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  229. package/dist/auth/oauth/providers/discord.js +0 -130
  230. package/dist/auth/oauth/providers/discord.js.map +0 -1
  231. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  232. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  233. package/dist/auth/oauth/providers/facebook.js +0 -124
  234. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  235. package/dist/auth/oauth/providers/github.d.ts +0 -25
  236. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  237. package/dist/auth/oauth/providers/github.js +0 -132
  238. package/dist/auth/oauth/providers/github.js.map +0 -1
  239. package/dist/auth/oauth/providers/google.d.ts +0 -23
  240. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  241. package/dist/auth/oauth/providers/google.js +0 -134
  242. package/dist/auth/oauth/providers/google.js.map +0 -1
  243. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  244. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  245. package/dist/auth/oauth/providers/microsoft.js +0 -136
  246. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  247. package/dist/auth/oauth/types.d.ts +0 -158
  248. package/dist/auth/oauth/types.d.ts.map +0 -1
  249. package/dist/auth/oauth/types.js +0 -4
  250. package/dist/auth/oauth/types.js.map +0 -1
  251. package/dist/auth/password.d.ts +0 -25
  252. package/dist/auth/password.d.ts.map +0 -1
  253. package/dist/auth/password.js +0 -93
  254. package/dist/auth/password.js.map +0 -1
  255. package/dist/auth/rbac.d.ts +0 -10
  256. package/dist/auth/rbac.d.ts.map +0 -1
  257. package/dist/auth/rbac.js +0 -34
  258. package/dist/auth/rbac.js.map +0 -1
  259. package/dist/auth/session.d.ts +0 -26
  260. package/dist/auth/session.d.ts.map +0 -1
  261. package/dist/auth/session.js +0 -134
  262. package/dist/auth/session.js.map +0 -1
  263. package/dist/cache/index.d.ts +0 -4
  264. package/dist/cache/index.d.ts.map +0 -1
  265. package/dist/cache/index.js +0 -25
  266. package/dist/cache/index.js.map +0 -1
  267. package/dist/cache/store.d.ts +0 -58
  268. package/dist/cache/store.d.ts.map +0 -1
  269. package/dist/cache/store.js +0 -298
  270. package/dist/cache/store.js.map +0 -1
  271. package/dist/cron/parser.d.ts +0 -2
  272. package/dist/cron/parser.d.ts.map +0 -1
  273. package/dist/cron/parser.js +0 -52
  274. package/dist/cron/parser.js.map +0 -1
  275. package/dist/cron/scheduler.d.ts +0 -23
  276. package/dist/cron/scheduler.d.ts.map +0 -1
  277. package/dist/cron/scheduler.js +0 -114
  278. package/dist/cron/scheduler.js.map +0 -1
  279. package/dist/database/adapters/mongodb.d.ts +0 -58
  280. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  281. package/dist/database/adapters/mongodb.js +0 -264
  282. package/dist/database/adapters/mongodb.js.map +0 -1
  283. package/dist/database/adapters/mysql.d.ts +0 -27
  284. package/dist/database/adapters/mysql.d.ts.map +0 -1
  285. package/dist/database/adapters/mysql.js +0 -188
  286. package/dist/database/adapters/mysql.js.map +0 -1
  287. package/dist/database/adapters/postgres.d.ts +0 -28
  288. package/dist/database/adapters/postgres.d.ts.map +0 -1
  289. package/dist/database/adapters/postgres.js +0 -174
  290. package/dist/database/adapters/postgres.js.map +0 -1
  291. package/dist/database/adapters/sqlite.d.ts +0 -27
  292. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  293. package/dist/database/adapters/sqlite.js +0 -149
  294. package/dist/database/adapters/sqlite.js.map +0 -1
  295. package/dist/database/index.d.ts +0 -42
  296. package/dist/database/index.d.ts.map +0 -1
  297. package/dist/database/index.js +0 -58
  298. package/dist/database/index.js.map +0 -1
  299. package/dist/database/manager.d.ts +0 -141
  300. package/dist/database/manager.d.ts.map +0 -1
  301. package/dist/database/manager.js +0 -337
  302. package/dist/database/manager.js.map +0 -1
  303. package/dist/database/migration.d.ts +0 -57
  304. package/dist/database/migration.d.ts.map +0 -1
  305. package/dist/database/migration.js +0 -329
  306. package/dist/database/migration.js.map +0 -1
  307. package/dist/database/query-builder.d.ts +0 -95
  308. package/dist/database/query-builder.d.ts.map +0 -1
  309. package/dist/database/query-builder.js +0 -404
  310. package/dist/database/query-builder.js.map +0 -1
  311. package/dist/database/sql/index.d.ts +0 -18
  312. package/dist/database/sql/index.d.ts.map +0 -1
  313. package/dist/database/sql/index.js +0 -74
  314. package/dist/database/sql/index.js.map +0 -1
  315. package/dist/database/sql/schema.d.ts +0 -38
  316. package/dist/database/sql/schema.d.ts.map +0 -1
  317. package/dist/database/sql/schema.js +0 -80
  318. package/dist/database/sql/schema.js.map +0 -1
  319. package/dist/database/synchronizer.d.ts +0 -12
  320. package/dist/database/synchronizer.d.ts.map +0 -1
  321. package/dist/database/synchronizer.js +0 -82
  322. package/dist/database/synchronizer.js.map +0 -1
  323. package/dist/database/types.d.ts +0 -184
  324. package/dist/database/types.d.ts.map +0 -1
  325. package/dist/database/types.js +0 -4
  326. package/dist/database/types.js.map +0 -1
  327. package/dist/dataloader/dataloader.d.ts +0 -23
  328. package/dist/dataloader/dataloader.d.ts.map +0 -1
  329. package/dist/dataloader/dataloader.js +0 -98
  330. package/dist/dataloader/dataloader.js.map +0 -1
  331. package/dist/dataloader/index.d.ts +0 -3
  332. package/dist/dataloader/index.d.ts.map +0 -1
  333. package/dist/dataloader/index.js +0 -19
  334. package/dist/dataloader/index.js.map +0 -1
  335. package/dist/dataloader/registry.d.ts +0 -17
  336. package/dist/dataloader/registry.d.ts.map +0 -1
  337. package/dist/dataloader/registry.js +0 -47
  338. package/dist/dataloader/registry.js.map +0 -1
  339. package/dist/dev/dep-graph.d.ts +0 -2
  340. package/dist/dev/dep-graph.d.ts.map +0 -1
  341. package/dist/dev/dep-graph.js +0 -111
  342. package/dist/dev/dep-graph.js.map +0 -1
  343. package/dist/dev/hot-reload.d.ts +0 -30
  344. package/dist/dev/hot-reload.d.ts.map +0 -1
  345. package/dist/dev/hot-reload.js +0 -262
  346. package/dist/dev/hot-reload.js.map +0 -1
  347. package/dist/docs/content/adapters.mdx +0 -199
  348. package/dist/docs/content/cache.mdx +0 -239
  349. package/dist/docs/content/circuit-breaker.mdx +0 -130
  350. package/dist/docs/content/cron.mdx +0 -109
  351. package/dist/docs/content/database.mdx +0 -278
  352. package/dist/docs/content/gateways.mdx +0 -376
  353. package/dist/docs/content/oauth.mdx +0 -179
  354. package/dist/docs/content/queues.mdx +0 -177
  355. package/dist/docs/content/rpc.mdx +0 -146
  356. package/dist/docs/content/sse.mdx +0 -159
  357. package/dist/docs/content/websockets.mdx +0 -289
  358. package/dist/docs/integrations/README.md +0 -23
  359. package/dist/docs/integrations/jwt.mdx +0 -151
  360. package/dist/docs/integrations/mongo.mdx +0 -183
  361. package/dist/docs/integrations/observability.mdx +0 -125
  362. package/dist/docs/integrations/openai.mdx +0 -108
  363. package/dist/docs/integrations/postgres.mdx +0 -190
  364. package/dist/docs/integrations/posthog.mdx +0 -122
  365. package/dist/docs/integrations/redis.mdx +0 -141
  366. package/dist/docs/integrations/resend.mdx +0 -117
  367. package/dist/docs/integrations/s3.mdx +0 -122
  368. package/dist/docs/integrations/swagger.mdx +0 -113
  369. package/dist/docs/reference/adapters.mdx +0 -130
  370. package/dist/docs/reference/auth.mdx +0 -183
  371. package/dist/docs/reference/cache.mdx +0 -132
  372. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  373. package/dist/docs/reference/queue.mdx +0 -155
  374. package/dist/docs/reference/storage.mdx +0 -116
  375. package/dist/docs/reference/swagger.mdx +0 -132
  376. package/dist/integrations/drizzle.d.ts +0 -10
  377. package/dist/integrations/drizzle.d.ts.map +0 -1
  378. package/dist/integrations/drizzle.js +0 -34
  379. package/dist/integrations/drizzle.js.map +0 -1
  380. package/dist/integrations/jwt.d.ts +0 -12
  381. package/dist/integrations/jwt.d.ts.map +0 -1
  382. package/dist/integrations/jwt.js +0 -29
  383. package/dist/integrations/jwt.js.map +0 -1
  384. package/dist/integrations/mongodb.d.ts +0 -13
  385. package/dist/integrations/mongodb.d.ts.map +0 -1
  386. package/dist/integrations/mongodb.js +0 -48
  387. package/dist/integrations/mongodb.js.map +0 -1
  388. package/dist/integrations/mongoose.d.ts +0 -13
  389. package/dist/integrations/mongoose.d.ts.map +0 -1
  390. package/dist/integrations/mongoose.js +0 -84
  391. package/dist/integrations/mongoose.js.map +0 -1
  392. package/dist/integrations/openai.d.ts +0 -12
  393. package/dist/integrations/openai.d.ts.map +0 -1
  394. package/dist/integrations/openai.js +0 -47
  395. package/dist/integrations/openai.js.map +0 -1
  396. package/dist/integrations/postgres.d.ts +0 -13
  397. package/dist/integrations/postgres.d.ts.map +0 -1
  398. package/dist/integrations/postgres.js +0 -55
  399. package/dist/integrations/postgres.js.map +0 -1
  400. package/dist/integrations/posthog.d.ts +0 -13
  401. package/dist/integrations/posthog.d.ts.map +0 -1
  402. package/dist/integrations/posthog.js +0 -49
  403. package/dist/integrations/posthog.js.map +0 -1
  404. package/dist/integrations/prisma.d.ts +0 -10
  405. package/dist/integrations/prisma.d.ts.map +0 -1
  406. package/dist/integrations/prisma.js +0 -39
  407. package/dist/integrations/prisma.js.map +0 -1
  408. package/dist/integrations/redis.d.ts +0 -12
  409. package/dist/integrations/redis.d.ts.map +0 -1
  410. package/dist/integrations/redis.js +0 -48
  411. package/dist/integrations/redis.js.map +0 -1
  412. package/dist/integrations/resend.d.ts +0 -12
  413. package/dist/integrations/resend.d.ts.map +0 -1
  414. package/dist/integrations/resend.js +0 -47
  415. package/dist/integrations/resend.js.map +0 -1
  416. package/dist/integrations/s3.d.ts +0 -15
  417. package/dist/integrations/s3.d.ts.map +0 -1
  418. package/dist/integrations/s3.js +0 -60
  419. package/dist/integrations/s3.js.map +0 -1
  420. package/dist/integrations/supabase.d.ts +0 -13
  421. package/dist/integrations/supabase.d.ts.map +0 -1
  422. package/dist/integrations/supabase.js +0 -51
  423. package/dist/integrations/supabase.js.map +0 -1
  424. package/dist/middleware/cache.d.ts +0 -21
  425. package/dist/middleware/cache.d.ts.map +0 -1
  426. package/dist/middleware/cache.js +0 -156
  427. package/dist/middleware/cache.js.map +0 -1
  428. package/dist/observability/health.d.ts +0 -23
  429. package/dist/observability/health.d.ts.map +0 -1
  430. package/dist/observability/health.js +0 -49
  431. package/dist/observability/health.js.map +0 -1
  432. package/dist/observability/index.d.ts +0 -4
  433. package/dist/observability/index.d.ts.map +0 -1
  434. package/dist/observability/index.js +0 -10
  435. package/dist/observability/index.js.map +0 -1
  436. package/dist/observability/metrics.d.ts +0 -6
  437. package/dist/observability/metrics.d.ts.map +0 -1
  438. package/dist/observability/metrics.js +0 -60
  439. package/dist/observability/metrics.js.map +0 -1
  440. package/dist/observability/otel.d.ts +0 -27
  441. package/dist/observability/otel.d.ts.map +0 -1
  442. package/dist/observability/otel.js +0 -45
  443. package/dist/observability/otel.js.map +0 -1
  444. package/dist/observability/prometheus.d.ts +0 -30
  445. package/dist/observability/prometheus.d.ts.map +0 -1
  446. package/dist/observability/prometheus.js +0 -31
  447. package/dist/observability/prometheus.js.map +0 -1
  448. package/dist/queue/client.d.ts +0 -13
  449. package/dist/queue/client.d.ts.map +0 -1
  450. package/dist/queue/client.js +0 -83
  451. package/dist/queue/client.js.map +0 -1
  452. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  453. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  454. package/dist/queue/drivers/MemoryDriver.js +0 -176
  455. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  456. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  457. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  458. package/dist/queue/drivers/RedisDriver.js +0 -130
  459. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  460. package/dist/queue/index.d.ts +0 -18
  461. package/dist/queue/index.d.ts.map +0 -1
  462. package/dist/queue/index.js +0 -37
  463. package/dist/queue/index.js.map +0 -1
  464. package/dist/queue/manager.d.ts +0 -18
  465. package/dist/queue/manager.d.ts.map +0 -1
  466. package/dist/queue/manager.js +0 -59
  467. package/dist/queue/manager.js.map +0 -1
  468. package/dist/queue/types.d.ts +0 -55
  469. package/dist/queue/types.d.ts.map +0 -1
  470. package/dist/queue/types.js.map +0 -1
  471. package/dist/queue/worker.d.ts +0 -18
  472. package/dist/queue/worker.d.ts.map +0 -1
  473. package/dist/queue/worker.js +0 -176
  474. package/dist/queue/worker.js.map +0 -1
  475. package/dist/router/gateway.d.ts.map +0 -1
  476. package/dist/router/gateway.js +0 -11
  477. package/dist/router/gateway.js.map +0 -1
  478. package/dist/server/bun-adapter.d.ts.map +0 -1
  479. package/dist/server/bun-adapter.js.map +0 -1
  480. package/dist/server/sse.d.ts +0 -16
  481. package/dist/server/sse.d.ts.map +0 -1
  482. package/dist/server/sse.js +0 -51
  483. package/dist/server/sse.js.map +0 -1
  484. package/dist/server/uws-adapter.d.ts.map +0 -1
  485. package/dist/server/uws-adapter.js.map +0 -1
  486. package/dist/storage/index.d.ts +0 -15
  487. package/dist/storage/index.d.ts.map +0 -1
  488. package/dist/storage/index.js +0 -7
  489. package/dist/storage/index.js.map +0 -1
  490. package/dist/swagger/index.d.ts +0 -9
  491. package/dist/swagger/index.d.ts.map +0 -1
  492. package/dist/swagger/index.js +0 -165
  493. package/dist/swagger/index.js.map +0 -1
  494. package/dist/threads/pool.d.ts +0 -14
  495. package/dist/threads/pool.d.ts.map +0 -1
  496. package/dist/threads/pool.js +0 -93
  497. package/dist/threads/pool.js.map +0 -1
  498. package/dist/threads/worker-runner.d.ts +0 -2
  499. package/dist/threads/worker-runner.d.ts.map +0 -1
  500. package/dist/threads/worker-runner.js +0 -71
  501. package/dist/threads/worker-runner.js.map +0 -1
  502. package/dist/validator/validator.d.ts +0 -360
  503. package/dist/validator/validator.d.ts.map +0 -1
  504. package/dist/validator/validator.js +0 -931
  505. package/dist/validator/validator.js.map +0 -1
  506. package/dist/websocket/orchestrator.d.ts +0 -11
  507. package/dist/websocket/orchestrator.d.ts.map +0 -1
  508. package/dist/websocket/orchestrator.js +0 -238
  509. package/dist/websocket/orchestrator.js.map +0 -1
  510. package/dist/websocket/server.d.ts +0 -66
  511. package/dist/websocket/server.d.ts.map +0 -1
  512. package/dist/websocket/server.js +0 -158
  513. package/dist/websocket/server.js.map +0 -1
  514. package/dist/websocket/socket.d.ts +0 -119
  515. package/dist/websocket/socket.d.ts.map +0 -1
  516. package/dist/websocket/socket.js +0 -242
  517. 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
- ```