@kabyeon/nexusjs 0.6.5

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 (669) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +860 -0
  3. package/dist/auth/auth.controller.d.ts +175 -0
  4. package/dist/auth/auth.controller.d.ts.map +1 -0
  5. package/dist/auth/auth.d.ts +47 -0
  6. package/dist/auth/auth.d.ts.map +1 -0
  7. package/dist/auth/auth.module.d.ts +34 -0
  8. package/dist/auth/auth.module.d.ts.map +1 -0
  9. package/dist/auth/auth.service.d.ts +192 -0
  10. package/dist/auth/auth.service.d.ts.map +1 -0
  11. package/dist/auth/decorators/current-user.d.ts +58 -0
  12. package/dist/auth/decorators/current-user.d.ts.map +1 -0
  13. package/dist/auth/index.d.ts +43 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +730 -0
  16. package/dist/auth/index.js.map +25 -0
  17. package/dist/auth/middleware.d.ts +50 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/types.d.ts +135 -0
  20. package/dist/auth/types.d.ts.map +1 -0
  21. package/dist/cache/cache.module.d.ts +22 -0
  22. package/dist/cache/cache.module.d.ts.map +1 -0
  23. package/dist/cache/cache.service.d.ts +37 -0
  24. package/dist/cache/cache.service.d.ts.map +1 -0
  25. package/dist/cache/index.d.ts +9 -0
  26. package/dist/cache/index.d.ts.map +1 -0
  27. package/dist/cache/index.js +814 -0
  28. package/dist/cache/index.js.map +25 -0
  29. package/dist/cache/stores/drizzle.d.ts +76 -0
  30. package/dist/cache/stores/drizzle.d.ts.map +1 -0
  31. package/dist/cache/stores/index.d.ts +10 -0
  32. package/dist/cache/stores/index.d.ts.map +1 -0
  33. package/dist/cache/stores/memory.d.ts +34 -0
  34. package/dist/cache/stores/memory.d.ts.map +1 -0
  35. package/dist/cache/stores/redis.d.ts +46 -0
  36. package/dist/cache/stores/redis.d.ts.map +1 -0
  37. package/dist/cache/types.d.ts +88 -0
  38. package/dist/cache/types.d.ts.map +1 -0
  39. package/dist/cli/commands/config.d.ts +44 -0
  40. package/dist/cli/commands/config.d.ts.map +1 -0
  41. package/dist/cli/commands/db-generate.d.ts +20 -0
  42. package/dist/cli/commands/db-generate.d.ts.map +1 -0
  43. package/dist/cli/commands/db-migrate.d.ts +33 -0
  44. package/dist/cli/commands/db-migrate.d.ts.map +1 -0
  45. package/dist/cli/commands/db-seed.d.ts +43 -0
  46. package/dist/cli/commands/db-seed.d.ts.map +1 -0
  47. package/dist/cli/commands/index.d.ts +11 -0
  48. package/dist/cli/commands/index.d.ts.map +1 -0
  49. package/dist/cli/commands/info.d.ts +11 -0
  50. package/dist/cli/commands/info.d.ts.map +1 -0
  51. package/dist/cli/commands/init.d.ts +38 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/make-auth.d.ts +17 -0
  54. package/dist/cli/commands/make-auth.d.ts.map +1 -0
  55. package/dist/cli/commands/make-controller.d.ts +16 -0
  56. package/dist/cli/commands/make-controller.d.ts.map +1 -0
  57. package/dist/cli/commands/make-crud.d.ts +28 -0
  58. package/dist/cli/commands/make-crud.d.ts.map +1 -0
  59. package/dist/cli/commands/make-listener.d.ts +15 -0
  60. package/dist/cli/commands/make-listener.d.ts.map +1 -0
  61. package/dist/cli/commands/make-middleware.d.ts +7 -0
  62. package/dist/cli/commands/make-middleware.d.ts.map +1 -0
  63. package/dist/cli/commands/make-migration.d.ts +21 -0
  64. package/dist/cli/commands/make-migration.d.ts.map +1 -0
  65. package/dist/cli/commands/make-model.d.ts +22 -0
  66. package/dist/cli/commands/make-model.d.ts.map +1 -0
  67. package/dist/cli/commands/make-module.d.ts +11 -0
  68. package/dist/cli/commands/make-module.d.ts.map +1 -0
  69. package/dist/cli/commands/make-queue.d.ts +17 -0
  70. package/dist/cli/commands/make-queue.d.ts.map +1 -0
  71. package/dist/cli/commands/make-schedule.d.ts +17 -0
  72. package/dist/cli/commands/make-schedule.d.ts.map +1 -0
  73. package/dist/cli/commands/make-service.d.ts +7 -0
  74. package/dist/cli/commands/make-service.d.ts.map +1 -0
  75. package/dist/cli/commands/make-session.d.ts +15 -0
  76. package/dist/cli/commands/make-session.d.ts.map +1 -0
  77. package/dist/cli/commands/make-validator.d.ts +7 -0
  78. package/dist/cli/commands/make-validator.d.ts.map +1 -0
  79. package/dist/cli/commands/new.d.ts +14 -0
  80. package/dist/cli/commands/new.d.ts.map +1 -0
  81. package/dist/cli/commands/repl.d.ts +42 -0
  82. package/dist/cli/commands/repl.d.ts.map +1 -0
  83. package/dist/cli/commands/route-list.d.ts +12 -0
  84. package/dist/cli/commands/route-list.d.ts.map +1 -0
  85. package/dist/cli/core/args.d.ts +29 -0
  86. package/dist/cli/core/args.d.ts.map +1 -0
  87. package/dist/cli/core/config.d.ts +137 -0
  88. package/dist/cli/core/config.d.ts.map +1 -0
  89. package/dist/cli/core/fs.d.ts +38 -0
  90. package/dist/cli/core/fs.d.ts.map +1 -0
  91. package/dist/cli/core/index.d.ts +42 -0
  92. package/dist/cli/core/index.d.ts.map +1 -0
  93. package/dist/cli/core/logger.d.ts +46 -0
  94. package/dist/cli/core/logger.d.ts.map +1 -0
  95. package/dist/cli/core/loose-json.d.ts +26 -0
  96. package/dist/cli/core/loose-json.d.ts.map +1 -0
  97. package/dist/cli/core/prompts.d.ts +22 -0
  98. package/dist/cli/core/prompts.d.ts.map +1 -0
  99. package/dist/cli/core/template.d.ts +26 -0
  100. package/dist/cli/core/template.d.ts.map +1 -0
  101. package/dist/cli/index.d.ts +1 -0
  102. package/dist/cli/index.d.ts.map +1 -0
  103. package/dist/cli/index.js +6136 -0
  104. package/dist/cli/index.js.map +91 -0
  105. package/dist/cli/templates/controller/adonis.d.ts +10 -0
  106. package/dist/cli/templates/controller/adonis.d.ts.map +1 -0
  107. package/dist/cli/templates/controller/functional.d.ts +9 -0
  108. package/dist/cli/templates/controller/functional.d.ts.map +1 -0
  109. package/dist/cli/templates/controller/nest.d.ts +17 -0
  110. package/dist/cli/templates/controller/nest.d.ts.map +1 -0
  111. package/dist/cli/templates/crud/controller.d.ts +8 -0
  112. package/dist/cli/templates/crud/controller.d.ts.map +1 -0
  113. package/dist/cli/templates/crud/dto.d.ts +8 -0
  114. package/dist/cli/templates/crud/dto.d.ts.map +1 -0
  115. package/dist/cli/templates/crud/index.d.ts +33 -0
  116. package/dist/cli/templates/crud/index.d.ts.map +1 -0
  117. package/dist/cli/templates/crud/module.d.ts +6 -0
  118. package/dist/cli/templates/crud/module.d.ts.map +1 -0
  119. package/dist/cli/templates/crud/test.d.ts +10 -0
  120. package/dist/cli/templates/crud/test.d.ts.map +1 -0
  121. package/dist/cli/templates/index.d.ts +39 -0
  122. package/dist/cli/templates/index.d.ts.map +1 -0
  123. package/dist/cli/templates/middleware/middleware.d.ts +8 -0
  124. package/dist/cli/templates/middleware/middleware.d.ts.map +1 -0
  125. package/dist/cli/templates/migration/drizzle.d.ts +12 -0
  126. package/dist/cli/templates/migration/drizzle.d.ts.map +1 -0
  127. package/dist/cli/templates/migration/sql.d.ts +10 -0
  128. package/dist/cli/templates/migration/sql.d.ts.map +1 -0
  129. package/dist/cli/templates/model/drizzle-dialect.d.ts +29 -0
  130. package/dist/cli/templates/model/drizzle-dialect.d.ts.map +1 -0
  131. package/dist/cli/templates/model/drizzle.d.ts +14 -0
  132. package/dist/cli/templates/model/drizzle.d.ts.map +1 -0
  133. package/dist/cli/templates/model/kysely.d.ts +12 -0
  134. package/dist/cli/templates/model/kysely.d.ts.map +1 -0
  135. package/dist/cli/templates/model/prisma.d.ts +12 -0
  136. package/dist/cli/templates/model/prisma.d.ts.map +1 -0
  137. package/dist/cli/templates/module/module.d.ts +16 -0
  138. package/dist/cli/templates/module/module.d.ts.map +1 -0
  139. package/dist/cli/templates/project/drizzle.config.d.ts +12 -0
  140. package/dist/cli/templates/project/drizzle.config.d.ts.map +1 -0
  141. package/dist/cli/templates/project/nx.config.d.ts +7 -0
  142. package/dist/cli/templates/project/nx.config.d.ts.map +1 -0
  143. package/dist/cli/templates/repository/repository.d.ts +13 -0
  144. package/dist/cli/templates/repository/repository.d.ts.map +1 -0
  145. package/dist/cli/templates/service/service.d.ts +12 -0
  146. package/dist/cli/templates/service/service.d.ts.map +1 -0
  147. package/dist/cli/templates/validator/validator.d.ts +8 -0
  148. package/dist/cli/templates/validator/validator.d.ts.map +1 -0
  149. package/dist/config/config.module.d.ts +39 -0
  150. package/dist/config/config.module.d.ts.map +1 -0
  151. package/dist/config/config.service.d.ts +47 -0
  152. package/dist/config/config.service.d.ts.map +1 -0
  153. package/dist/config/index.d.ts +39 -0
  154. package/dist/config/index.d.ts.map +1 -0
  155. package/dist/config/index.js +436 -0
  156. package/dist/config/index.js.map +21 -0
  157. package/dist/config/types.d.ts +78 -0
  158. package/dist/config/types.d.ts.map +1 -0
  159. package/dist/core/application.d.ts +77 -0
  160. package/dist/core/application.d.ts.map +1 -0
  161. package/dist/core/constants.d.ts +48 -0
  162. package/dist/core/constants.d.ts.map +1 -0
  163. package/dist/core/decorators/controller.d.ts +21 -0
  164. package/dist/core/decorators/controller.d.ts.map +1 -0
  165. package/dist/core/decorators/http-methods.d.ts +33 -0
  166. package/dist/core/decorators/http-methods.d.ts.map +1 -0
  167. package/dist/core/decorators/index.d.ts +12 -0
  168. package/dist/core/decorators/index.d.ts.map +1 -0
  169. package/dist/core/decorators/injectable.d.ts +42 -0
  170. package/dist/core/decorators/injectable.d.ts.map +1 -0
  171. package/dist/core/decorators/metadata.d.ts +7 -0
  172. package/dist/core/decorators/metadata.d.ts.map +1 -0
  173. package/dist/core/decorators/module.d.ts +23 -0
  174. package/dist/core/decorators/module.d.ts.map +1 -0
  175. package/dist/core/decorators/params.d.ts +33 -0
  176. package/dist/core/decorators/params.d.ts.map +1 -0
  177. package/dist/core/decorators/repository.d.ts +24 -0
  178. package/dist/core/decorators/repository.d.ts.map +1 -0
  179. package/dist/core/decorators/validate.d.ts +21 -0
  180. package/dist/core/decorators/validate.d.ts.map +1 -0
  181. package/dist/core/di/container.d.ts +70 -0
  182. package/dist/core/di/container.d.ts.map +1 -0
  183. package/dist/core/di/index.d.ts +9 -0
  184. package/dist/core/di/index.d.ts.map +1 -0
  185. package/dist/core/di/request-middleware.d.ts +36 -0
  186. package/dist/core/di/request-middleware.d.ts.map +1 -0
  187. package/dist/core/di/request-scope.d.ts +45 -0
  188. package/dist/core/di/request-scope.d.ts.map +1 -0
  189. package/dist/core/di/scanner.d.ts +36 -0
  190. package/dist/core/di/scanner.d.ts.map +1 -0
  191. package/dist/core/di/tokens.d.ts +98 -0
  192. package/dist/core/di/tokens.d.ts.map +1 -0
  193. package/dist/core/http/context.d.ts +30 -0
  194. package/dist/core/http/context.d.ts.map +1 -0
  195. package/dist/core/http/index.d.ts +8 -0
  196. package/dist/core/http/index.d.ts.map +1 -0
  197. package/dist/core/http/middleware.d.ts +31 -0
  198. package/dist/core/http/middleware.d.ts.map +1 -0
  199. package/dist/core/http/router.d.ts +46 -0
  200. package/dist/core/http/router.d.ts.map +1 -0
  201. package/dist/core/http/server.d.ts +58 -0
  202. package/dist/core/http/server.d.ts.map +1 -0
  203. package/dist/core/index.d.ts +20 -0
  204. package/dist/core/index.d.ts.map +1 -0
  205. package/dist/core/orm/drizzle-adapter.d.ts +73 -0
  206. package/dist/core/orm/drizzle-adapter.d.ts.map +1 -0
  207. package/dist/core/orm/index.d.ts +5 -0
  208. package/dist/core/orm/index.d.ts.map +1 -0
  209. package/dist/core/runtime/bun.d.ts +13 -0
  210. package/dist/core/runtime/bun.d.ts.map +1 -0
  211. package/dist/core/runtime/cloudflare.d.ts +18 -0
  212. package/dist/core/runtime/cloudflare.d.ts.map +1 -0
  213. package/dist/core/runtime/index.d.ts +11 -0
  214. package/dist/core/runtime/index.d.ts.map +1 -0
  215. package/dist/core/runtime/node.d.ts +10 -0
  216. package/dist/core/runtime/node.d.ts.map +1 -0
  217. package/dist/core/validation/index.d.ts +5 -0
  218. package/dist/core/validation/index.d.ts.map +1 -0
  219. package/dist/core/validation/validator.d.ts +46 -0
  220. package/dist/core/validation/validator.d.ts.map +1 -0
  221. package/dist/crypto/encryption.d.ts +71 -0
  222. package/dist/crypto/encryption.d.ts.map +1 -0
  223. package/dist/crypto/hash.d.ts +52 -0
  224. package/dist/crypto/hash.d.ts.map +1 -0
  225. package/dist/crypto/index.d.ts +49 -0
  226. package/dist/crypto/index.d.ts.map +1 -0
  227. package/dist/crypto/index.js +533 -0
  228. package/dist/crypto/index.js.map +14 -0
  229. package/dist/crypto/module.d.ts +28 -0
  230. package/dist/crypto/module.d.ts.map +1 -0
  231. package/dist/crypto/types.d.ts +81 -0
  232. package/dist/crypto/types.d.ts.map +1 -0
  233. package/dist/drive/drive.module.d.ts +20 -0
  234. package/dist/drive/drive.module.d.ts.map +1 -0
  235. package/dist/drive/drive.service.d.ts +21 -0
  236. package/dist/drive/drive.service.d.ts.map +1 -0
  237. package/dist/drive/drivers/index.d.ts +9 -0
  238. package/dist/drive/drivers/index.d.ts.map +1 -0
  239. package/dist/drive/drivers/local.d.ts +24 -0
  240. package/dist/drive/drivers/local.d.ts.map +1 -0
  241. package/dist/drive/drivers/memory.d.ts +19 -0
  242. package/dist/drive/drivers/memory.d.ts.map +1 -0
  243. package/dist/drive/drivers/s3.d.ts +44 -0
  244. package/dist/drive/drivers/s3.d.ts.map +1 -0
  245. package/dist/drive/index.d.ts +9 -0
  246. package/dist/drive/index.d.ts.map +1 -0
  247. package/dist/drive/index.js +714 -0
  248. package/dist/drive/index.js.map +25 -0
  249. package/dist/drive/types.d.ts +97 -0
  250. package/dist/drive/types.d.ts.map +1 -0
  251. package/dist/drizzle/decorators/columns.d.ts +16 -0
  252. package/dist/drizzle/decorators/columns.d.ts.map +1 -0
  253. package/dist/drizzle/decorators/index.d.ts +6 -0
  254. package/dist/drizzle/decorators/index.d.ts.map +1 -0
  255. package/dist/drizzle/drivers/base.d.ts +32 -0
  256. package/dist/drizzle/drivers/base.d.ts.map +1 -0
  257. package/dist/drizzle/drivers/bun-sqlite.d.ts +6 -0
  258. package/dist/drizzle/drivers/bun-sqlite.d.ts.map +1 -0
  259. package/dist/drizzle/drivers/d1.d.ts +7 -0
  260. package/dist/drizzle/drivers/d1.d.ts.map +1 -0
  261. package/dist/drizzle/drivers/index.d.ts +14 -0
  262. package/dist/drizzle/drivers/index.d.ts.map +1 -0
  263. package/dist/drizzle/drivers/mysql.d.ts +6 -0
  264. package/dist/drizzle/drivers/mysql.d.ts.map +1 -0
  265. package/dist/drizzle/drivers/postgres.d.ts +12 -0
  266. package/dist/drizzle/drivers/postgres.d.ts.map +1 -0
  267. package/dist/drizzle/drivers/sqlite.d.ts +8 -0
  268. package/dist/drizzle/drivers/sqlite.d.ts.map +1 -0
  269. package/dist/drizzle/drizzle.module.d.ts +29 -0
  270. package/dist/drizzle/drizzle.module.d.ts.map +1 -0
  271. package/dist/drizzle/drizzle.service.d.ts +52 -0
  272. package/dist/drizzle/drizzle.service.d.ts.map +1 -0
  273. package/dist/drizzle/index.d.ts +13 -0
  274. package/dist/drizzle/index.d.ts.map +1 -0
  275. package/dist/drizzle/index.js +979 -0
  276. package/dist/drizzle/index.js.map +32 -0
  277. package/dist/drizzle/model.d.ts +26 -0
  278. package/dist/drizzle/model.d.ts.map +1 -0
  279. package/dist/drizzle/raw-query.d.ts +41 -0
  280. package/dist/drizzle/raw-query.d.ts.map +1 -0
  281. package/dist/drizzle/repository/index.d.ts +6 -0
  282. package/dist/drizzle/repository/index.d.ts.map +1 -0
  283. package/dist/drizzle/repository/repository.d.ts +60 -0
  284. package/dist/drizzle/repository/repository.d.ts.map +1 -0
  285. package/dist/drizzle/types.d.ts +160 -0
  286. package/dist/drizzle/types.d.ts.map +1 -0
  287. package/dist/events/decorators/on-event.d.ts +49 -0
  288. package/dist/events/decorators/on-event.d.ts.map +1 -0
  289. package/dist/events/emitter.d.ts +52 -0
  290. package/dist/events/emitter.d.ts.map +1 -0
  291. package/dist/events/event.service.d.ts +27 -0
  292. package/dist/events/event.service.d.ts.map +1 -0
  293. package/dist/events/events.module.d.ts +35 -0
  294. package/dist/events/events.module.d.ts.map +1 -0
  295. package/dist/events/index.d.ts +43 -0
  296. package/dist/events/index.d.ts.map +1 -0
  297. package/dist/events/index.js +646 -0
  298. package/dist/events/index.js.map +23 -0
  299. package/dist/events/types.d.ts +120 -0
  300. package/dist/events/types.d.ts.map +1 -0
  301. package/dist/grpc/decorators.d.ts +34 -0
  302. package/dist/grpc/decorators.d.ts.map +1 -0
  303. package/dist/grpc/index.d.ts +70 -0
  304. package/dist/grpc/index.d.ts.map +1 -0
  305. package/dist/grpc/index.js +528 -0
  306. package/dist/grpc/index.js.map +22 -0
  307. package/dist/grpc/module.d.ts +32 -0
  308. package/dist/grpc/module.d.ts.map +1 -0
  309. package/dist/grpc/service.d.ts +60 -0
  310. package/dist/grpc/service.d.ts.map +1 -0
  311. package/dist/grpc/types.d.ts +79 -0
  312. package/dist/grpc/types.d.ts.map +1 -0
  313. package/dist/health/health.controller.d.ts +61 -0
  314. package/dist/health/health.controller.d.ts.map +1 -0
  315. package/dist/health/health.module.d.ts +29 -0
  316. package/dist/health/health.module.d.ts.map +1 -0
  317. package/dist/health/health.service.d.ts +34 -0
  318. package/dist/health/health.service.d.ts.map +1 -0
  319. package/dist/health/index.d.ts +38 -0
  320. package/dist/health/index.d.ts.map +1 -0
  321. package/dist/health/index.js +599 -0
  322. package/dist/health/index.js.map +25 -0
  323. package/dist/health/indicators/drizzle.d.ts +18 -0
  324. package/dist/health/indicators/drizzle.d.ts.map +1 -0
  325. package/dist/health/indicators/index.d.ts +59 -0
  326. package/dist/health/indicators/index.d.ts.map +1 -0
  327. package/dist/health/types.d.ts +105 -0
  328. package/dist/health/types.d.ts.map +1 -0
  329. package/dist/i18n/decorators.d.ts +14 -0
  330. package/dist/i18n/decorators.d.ts.map +1 -0
  331. package/dist/i18n/index.d.ts +48 -0
  332. package/dist/i18n/index.d.ts.map +1 -0
  333. package/dist/i18n/index.js +589 -0
  334. package/dist/i18n/index.js.map +17 -0
  335. package/dist/i18n/middleware.d.ts +26 -0
  336. package/dist/i18n/middleware.d.ts.map +1 -0
  337. package/dist/i18n/module.d.ts +39 -0
  338. package/dist/i18n/module.d.ts.map +1 -0
  339. package/dist/i18n/service.d.ts +130 -0
  340. package/dist/i18n/service.d.ts.map +1 -0
  341. package/dist/i18n/types.d.ts +65 -0
  342. package/dist/i18n/types.d.ts.map +1 -0
  343. package/dist/index.d.ts +2 -0
  344. package/dist/index.js +2056 -0
  345. package/dist/index.js.map +53 -0
  346. package/dist/limiter/backends/drizzle.d.ts +40 -0
  347. package/dist/limiter/backends/drizzle.d.ts.map +1 -0
  348. package/dist/limiter/backends/index.d.ts +6 -0
  349. package/dist/limiter/backends/index.d.ts.map +1 -0
  350. package/dist/limiter/backends/memory.d.ts +28 -0
  351. package/dist/limiter/backends/memory.d.ts.map +1 -0
  352. package/dist/limiter/index.d.ts +9 -0
  353. package/dist/limiter/index.d.ts.map +1 -0
  354. package/dist/limiter/index.js +640 -0
  355. package/dist/limiter/index.js.map +25 -0
  356. package/dist/limiter/limiter.middleware.d.ts +11 -0
  357. package/dist/limiter/limiter.middleware.d.ts.map +1 -0
  358. package/dist/limiter/limiter.module.d.ts +23 -0
  359. package/dist/limiter/limiter.module.d.ts.map +1 -0
  360. package/dist/limiter/limiter.service.d.ts +18 -0
  361. package/dist/limiter/limiter.service.d.ts.map +1 -0
  362. package/dist/limiter/types.d.ts +99 -0
  363. package/dist/limiter/types.d.ts.map +1 -0
  364. package/dist/logger/index.d.ts +36 -0
  365. package/dist/logger/index.d.ts.map +1 -0
  366. package/dist/logger/index.js +538 -0
  367. package/dist/logger/index.js.map +22 -0
  368. package/dist/logger/logger.module.d.ts +35 -0
  369. package/dist/logger/logger.module.d.ts.map +1 -0
  370. package/dist/logger/logger.service.d.ts +55 -0
  371. package/dist/logger/logger.service.d.ts.map +1 -0
  372. package/dist/logger/transports/index.d.ts +35 -0
  373. package/dist/logger/transports/index.d.ts.map +1 -0
  374. package/dist/logger/types.d.ts +58 -0
  375. package/dist/logger/types.d.ts.map +1 -0
  376. package/dist/mail/index.d.ts +9 -0
  377. package/dist/mail/index.d.ts.map +1 -0
  378. package/dist/mail/index.js +479 -0
  379. package/dist/mail/index.js.map +25 -0
  380. package/dist/mail/mail.module.d.ts +21 -0
  381. package/dist/mail/mail.module.d.ts.map +1 -0
  382. package/dist/mail/mail.service.d.ts +18 -0
  383. package/dist/mail/mail.service.d.ts.map +1 -0
  384. package/dist/mail/transports/file.d.ts +19 -0
  385. package/dist/mail/transports/file.d.ts.map +1 -0
  386. package/dist/mail/transports/index.d.ts +9 -0
  387. package/dist/mail/transports/index.d.ts.map +1 -0
  388. package/dist/mail/transports/null.d.ts +11 -0
  389. package/dist/mail/transports/null.d.ts.map +1 -0
  390. package/dist/mail/transports/smtp.d.ts +40 -0
  391. package/dist/mail/transports/smtp.d.ts.map +1 -0
  392. package/dist/mail/types.d.ts +73 -0
  393. package/dist/mail/types.d.ts.map +1 -0
  394. package/dist/metrics/controller.d.ts +27 -0
  395. package/dist/metrics/controller.d.ts.map +1 -0
  396. package/dist/metrics/counter.d.ts +36 -0
  397. package/dist/metrics/counter.d.ts.map +1 -0
  398. package/dist/metrics/decorators/counted.d.ts +26 -0
  399. package/dist/metrics/decorators/counted.d.ts.map +1 -0
  400. package/dist/metrics/decorators/index.d.ts +3 -0
  401. package/dist/metrics/decorators/index.d.ts.map +1 -0
  402. package/dist/metrics/decorators/timed.d.ts +25 -0
  403. package/dist/metrics/decorators/timed.d.ts.map +1 -0
  404. package/dist/metrics/gauge.d.ts +38 -0
  405. package/dist/metrics/gauge.d.ts.map +1 -0
  406. package/dist/metrics/histogram.d.ts +52 -0
  407. package/dist/metrics/histogram.d.ts.map +1 -0
  408. package/dist/metrics/index.d.ts +35 -0
  409. package/dist/metrics/index.d.ts.map +1 -0
  410. package/dist/metrics/index.js +1033 -0
  411. package/dist/metrics/index.js.map +21 -0
  412. package/dist/metrics/module.d.ts +33 -0
  413. package/dist/metrics/module.d.ts.map +1 -0
  414. package/dist/metrics/registry.d.ts +52 -0
  415. package/dist/metrics/registry.d.ts.map +1 -0
  416. package/dist/metrics/service.d.ts +42 -0
  417. package/dist/metrics/service.d.ts.map +1 -0
  418. package/dist/metrics/summary.d.ts +50 -0
  419. package/dist/metrics/summary.d.ts.map +1 -0
  420. package/dist/metrics/types.d.ts +115 -0
  421. package/dist/metrics/types.d.ts.map +1 -0
  422. package/dist/openapi/decorators/body.d.ts +9 -0
  423. package/dist/openapi/decorators/body.d.ts.map +1 -0
  424. package/dist/openapi/decorators/index.d.ts +11 -0
  425. package/dist/openapi/decorators/index.d.ts.map +1 -0
  426. package/dist/openapi/decorators/operation.d.ts +9 -0
  427. package/dist/openapi/decorators/operation.d.ts.map +1 -0
  428. package/dist/openapi/decorators/param.d.ts +17 -0
  429. package/dist/openapi/decorators/param.d.ts.map +1 -0
  430. package/dist/openapi/decorators/property.d.ts +24 -0
  431. package/dist/openapi/decorators/property.d.ts.map +1 -0
  432. package/dist/openapi/decorators/response.d.ts +10 -0
  433. package/dist/openapi/decorators/response.d.ts.map +1 -0
  434. package/dist/openapi/decorators/security.d.ts +9 -0
  435. package/dist/openapi/decorators/security.d.ts.map +1 -0
  436. package/dist/openapi/decorators/tags.d.ts +2 -0
  437. package/dist/openapi/decorators/tags.d.ts.map +1 -0
  438. package/dist/openapi/index.d.ts +10 -0
  439. package/dist/openapi/index.d.ts.map +1 -0
  440. package/dist/openapi/index.js +974 -0
  441. package/dist/openapi/index.js.map +31 -0
  442. package/dist/openapi/openapi.module.d.ts +46 -0
  443. package/dist/openapi/openapi.module.d.ts.map +1 -0
  444. package/dist/openapi/openapi.service.d.ts +55 -0
  445. package/dist/openapi/openapi.service.d.ts.map +1 -0
  446. package/dist/openapi/scalar.d.ts +16 -0
  447. package/dist/openapi/scalar.d.ts.map +1 -0
  448. package/dist/openapi/types.d.ts +266 -0
  449. package/dist/openapi/types.d.ts.map +1 -0
  450. package/dist/openapi/zod-to-json-schema.d.ts +34 -0
  451. package/dist/openapi/zod-to-json-schema.d.ts.map +1 -0
  452. package/dist/package.json +59 -0
  453. package/dist/queue/backends/bullmq.d.ts +41 -0
  454. package/dist/queue/backends/bullmq.d.ts.map +1 -0
  455. package/dist/queue/backends/cloudflare.d.ts +84 -0
  456. package/dist/queue/backends/cloudflare.d.ts.map +1 -0
  457. package/dist/queue/backends/index.d.ts +7 -0
  458. package/dist/queue/backends/index.d.ts.map +1 -0
  459. package/dist/queue/backends/memory.d.ts +24 -0
  460. package/dist/queue/backends/memory.d.ts.map +1 -0
  461. package/dist/queue/decorators/on-queue-ready.d.ts +43 -0
  462. package/dist/queue/decorators/on-queue-ready.d.ts.map +1 -0
  463. package/dist/queue/index.d.ts +57 -0
  464. package/dist/queue/index.d.ts.map +1 -0
  465. package/dist/queue/index.js +961 -0
  466. package/dist/queue/index.js.map +25 -0
  467. package/dist/queue/queue.module.d.ts +46 -0
  468. package/dist/queue/queue.module.d.ts.map +1 -0
  469. package/dist/queue/queue.service.d.ts +61 -0
  470. package/dist/queue/queue.service.d.ts.map +1 -0
  471. package/dist/queue/types.d.ts +204 -0
  472. package/dist/queue/types.d.ts.map +1 -0
  473. package/dist/redis/adapters/bun.d.ts +27 -0
  474. package/dist/redis/adapters/bun.d.ts.map +1 -0
  475. package/dist/redis/adapters/cloudflare.d.ts +51 -0
  476. package/dist/redis/adapters/cloudflare.d.ts.map +1 -0
  477. package/dist/redis/adapters/index.d.ts +29 -0
  478. package/dist/redis/adapters/index.d.ts.map +1 -0
  479. package/dist/redis/adapters/memory.d.ts +28 -0
  480. package/dist/redis/adapters/memory.d.ts.map +1 -0
  481. package/dist/redis/adapters/node.d.ts +36 -0
  482. package/dist/redis/adapters/node.d.ts.map +1 -0
  483. package/dist/redis/index.d.ts +33 -0
  484. package/dist/redis/index.d.ts.map +1 -0
  485. package/dist/redis/index.js +667 -0
  486. package/dist/redis/index.js.map +25 -0
  487. package/dist/redis/module.d.ts +32 -0
  488. package/dist/redis/module.d.ts.map +1 -0
  489. package/dist/redis/types.d.ts +146 -0
  490. package/dist/redis/types.d.ts.map +1 -0
  491. package/dist/schedule/backends/cloudflare.d.ts +55 -0
  492. package/dist/schedule/backends/cloudflare.d.ts.map +1 -0
  493. package/dist/schedule/backends/index.d.ts +3 -0
  494. package/dist/schedule/backends/index.d.ts.map +1 -0
  495. package/dist/schedule/backends/memory.d.ts +39 -0
  496. package/dist/schedule/backends/memory.d.ts.map +1 -0
  497. package/dist/schedule/cron-parser.d.ts +48 -0
  498. package/dist/schedule/cron-parser.d.ts.map +1 -0
  499. package/dist/schedule/decorators/cron.d.ts +71 -0
  500. package/dist/schedule/decorators/cron.d.ts.map +1 -0
  501. package/dist/schedule/index.d.ts +51 -0
  502. package/dist/schedule/index.d.ts.map +1 -0
  503. package/dist/schedule/index.js +1108 -0
  504. package/dist/schedule/index.js.map +25 -0
  505. package/dist/schedule/schedule.module.d.ts +44 -0
  506. package/dist/schedule/schedule.module.d.ts.map +1 -0
  507. package/dist/schedule/schedule.service.d.ts +51 -0
  508. package/dist/schedule/schedule.service.d.ts.map +1 -0
  509. package/dist/schedule/types.d.ts +150 -0
  510. package/dist/schedule/types.d.ts.map +1 -0
  511. package/dist/session/backends/cookie.d.ts +56 -0
  512. package/dist/session/backends/cookie.d.ts.map +1 -0
  513. package/dist/session/backends/drizzle.d.ts +65 -0
  514. package/dist/session/backends/drizzle.d.ts.map +1 -0
  515. package/dist/session/backends/index.d.ts +6 -0
  516. package/dist/session/backends/index.d.ts.map +1 -0
  517. package/dist/session/backends/memory.d.ts +32 -0
  518. package/dist/session/backends/memory.d.ts.map +1 -0
  519. package/dist/session/backends/redis.d.ts +53 -0
  520. package/dist/session/backends/redis.d.ts.map +1 -0
  521. package/dist/session/decorators/current-session.d.ts +56 -0
  522. package/dist/session/decorators/current-session.d.ts.map +1 -0
  523. package/dist/session/index.d.ts +42 -0
  524. package/dist/session/index.d.ts.map +1 -0
  525. package/dist/session/index.js +1498 -0
  526. package/dist/session/index.js.map +28 -0
  527. package/dist/session/session-middleware.d.ts +29 -0
  528. package/dist/session/session-middleware.d.ts.map +1 -0
  529. package/dist/session/session.module.d.ts +35 -0
  530. package/dist/session/session.module.d.ts.map +1 -0
  531. package/dist/session/session.service.d.ts +49 -0
  532. package/dist/session/session.service.d.ts.map +1 -0
  533. package/dist/session/types.d.ts +201 -0
  534. package/dist/session/types.d.ts.map +1 -0
  535. package/dist/shield/guards/csrf.d.ts +33 -0
  536. package/dist/shield/guards/csrf.d.ts.map +1 -0
  537. package/dist/shield/guards/headers.d.ts +22 -0
  538. package/dist/shield/guards/headers.d.ts.map +1 -0
  539. package/dist/shield/guards/index.d.ts +6 -0
  540. package/dist/shield/guards/index.d.ts.map +1 -0
  541. package/dist/shield/index.d.ts +8 -0
  542. package/dist/shield/index.d.ts.map +1 -0
  543. package/dist/shield/index.js +728 -0
  544. package/dist/shield/index.js.map +25 -0
  545. package/dist/shield/shield.module.d.ts +25 -0
  546. package/dist/shield/shield.module.d.ts.map +1 -0
  547. package/dist/shield/shield.service.d.ts +21 -0
  548. package/dist/shield/shield.service.d.ts.map +1 -0
  549. package/dist/shield/types.d.ts +95 -0
  550. package/dist/shield/types.d.ts.map +1 -0
  551. package/dist/sse/index.d.ts +7 -0
  552. package/dist/sse/index.d.ts.map +1 -0
  553. package/dist/sse/index.js +214 -0
  554. package/dist/sse/index.js.map +13 -0
  555. package/dist/sse/sse-stream.d.ts +46 -0
  556. package/dist/sse/sse-stream.d.ts.map +1 -0
  557. package/dist/sse/sse.d.ts +24 -0
  558. package/dist/sse/sse.d.ts.map +1 -0
  559. package/dist/sse/types.d.ts +84 -0
  560. package/dist/sse/types.d.ts.map +1 -0
  561. package/dist/static/index.d.ts +41 -0
  562. package/dist/static/index.d.ts.map +1 -0
  563. package/dist/static/index.js +313 -0
  564. package/dist/static/index.js.map +13 -0
  565. package/dist/static/static.module.d.ts +41 -0
  566. package/dist/static/static.module.d.ts.map +1 -0
  567. package/dist/static/static.service.d.ts +38 -0
  568. package/dist/static/static.service.d.ts.map +1 -0
  569. package/dist/tracing/decorators/index.d.ts +2 -0
  570. package/dist/tracing/decorators/index.d.ts.map +1 -0
  571. package/dist/tracing/decorators/trace.d.ts +37 -0
  572. package/dist/tracing/decorators/trace.d.ts.map +1 -0
  573. package/dist/tracing/hono-instrumentation.d.ts +21 -0
  574. package/dist/tracing/hono-instrumentation.d.ts.map +1 -0
  575. package/dist/tracing/index.d.ts +29 -0
  576. package/dist/tracing/index.d.ts.map +1 -0
  577. package/dist/tracing/index.js +782 -0
  578. package/dist/tracing/index.js.map +24 -0
  579. package/dist/tracing/module.d.ts +45 -0
  580. package/dist/tracing/module.d.ts.map +1 -0
  581. package/dist/tracing/propagation.d.ts +53 -0
  582. package/dist/tracing/propagation.d.ts.map +1 -0
  583. package/dist/tracing/service.d.ts +95 -0
  584. package/dist/tracing/service.d.ts.map +1 -0
  585. package/dist/tracing/types.d.ts +90 -0
  586. package/dist/tracing/types.d.ts.map +1 -0
  587. package/dist/upload/decorators/index.d.ts +6 -0
  588. package/dist/upload/decorators/index.d.ts.map +1 -0
  589. package/dist/upload/decorators/upload.d.ts +16 -0
  590. package/dist/upload/decorators/upload.d.ts.map +1 -0
  591. package/dist/upload/decorators/uploaded-file.d.ts +10 -0
  592. package/dist/upload/decorators/uploaded-file.d.ts.map +1 -0
  593. package/dist/upload/index.d.ts +9 -0
  594. package/dist/upload/index.d.ts.map +1 -0
  595. package/dist/upload/index.js +553 -0
  596. package/dist/upload/index.js.map +25 -0
  597. package/dist/upload/types.d.ts +103 -0
  598. package/dist/upload/types.d.ts.map +1 -0
  599. package/dist/upload/upload.middleware.d.ts +15 -0
  600. package/dist/upload/upload.middleware.d.ts.map +1 -0
  601. package/dist/upload/upload.module.d.ts +33 -0
  602. package/dist/upload/upload.module.d.ts.map +1 -0
  603. package/dist/upload/upload.service.d.ts +29 -0
  604. package/dist/upload/upload.service.d.ts.map +1 -0
  605. package/dist/view/edge.d.ts +23 -0
  606. package/dist/view/edge.d.ts.map +1 -0
  607. package/dist/view/eta.d.ts +30 -0
  608. package/dist/view/eta.d.ts.map +1 -0
  609. package/dist/view/index.d.ts +34 -0
  610. package/dist/view/index.d.ts.map +1 -0
  611. package/dist/view/index.js +240 -0
  612. package/dist/view/index.js.map +14 -0
  613. package/dist/view/inertia/default-ssr.d.ts +15 -0
  614. package/dist/view/inertia/default-ssr.d.ts.map +1 -0
  615. package/dist/view/inertia/form-helper.d.ts +102 -0
  616. package/dist/view/inertia/form-helper.d.ts.map +1 -0
  617. package/dist/view/inertia/form-middleware.d.ts +53 -0
  618. package/dist/view/inertia/form-middleware.d.ts.map +1 -0
  619. package/dist/view/inertia/helpers.d.ts +149 -0
  620. package/dist/view/inertia/helpers.d.ts.map +1 -0
  621. package/dist/view/inertia/index.d.ts +18 -0
  622. package/dist/view/inertia/index.d.ts.map +1 -0
  623. package/dist/view/inertia/inertia-adapter.d.ts +93 -0
  624. package/dist/view/inertia/inertia-adapter.d.ts.map +1 -0
  625. package/dist/view/inertia/inertia-response.d.ts +51 -0
  626. package/dist/view/inertia/inertia-response.d.ts.map +1 -0
  627. package/dist/view/inertia/ssr/index.d.ts +13 -0
  628. package/dist/view/inertia/ssr/index.d.ts.map +1 -0
  629. package/dist/view/inertia/ssr/react-adapter.d.ts +33 -0
  630. package/dist/view/inertia/ssr/react-adapter.d.ts.map +1 -0
  631. package/dist/view/inertia/ssr/registry.d.ts +42 -0
  632. package/dist/view/inertia/ssr/registry.d.ts.map +1 -0
  633. package/dist/view/inertia/ssr/solid-adapter.d.ts +31 -0
  634. package/dist/view/inertia/ssr/solid-adapter.d.ts.map +1 -0
  635. package/dist/view/inertia/ssr/svelte-adapter.d.ts +31 -0
  636. package/dist/view/inertia/ssr/svelte-adapter.d.ts.map +1 -0
  637. package/dist/view/inertia/ssr/vue-adapter.d.ts +26 -0
  638. package/dist/view/inertia/ssr/vue-adapter.d.ts.map +1 -0
  639. package/dist/view/inertia/types.d.ts +131 -0
  640. package/dist/view/inertia/types.d.ts.map +1 -0
  641. package/dist/view/rendu.d.ts +11 -0
  642. package/dist/view/rendu.d.ts.map +1 -0
  643. package/dist/view/types.d.ts +52 -0
  644. package/dist/view/types.d.ts.map +1 -0
  645. package/dist/view/view-engine.d.ts +28 -0
  646. package/dist/view/view-engine.d.ts.map +1 -0
  647. package/dist/ws/client.d.ts +42 -0
  648. package/dist/ws/client.d.ts.map +1 -0
  649. package/dist/ws/decorators.d.ts +44 -0
  650. package/dist/ws/decorators.d.ts.map +1 -0
  651. package/dist/ws/index.d.ts +57 -0
  652. package/dist/ws/index.d.ts.map +1 -0
  653. package/dist/ws/index.js +796 -0
  654. package/dist/ws/index.js.map +26 -0
  655. package/dist/ws/module.d.ts +48 -0
  656. package/dist/ws/module.d.ts.map +1 -0
  657. package/dist/ws/runtime/bun.d.ts +41 -0
  658. package/dist/ws/runtime/bun.d.ts.map +1 -0
  659. package/dist/ws/runtime/index.d.ts +14 -0
  660. package/dist/ws/runtime/index.d.ts.map +1 -0
  661. package/dist/ws/runtime/node.d.ts +46 -0
  662. package/dist/ws/runtime/node.d.ts.map +1 -0
  663. package/dist/ws/runtime/types.d.ts +18 -0
  664. package/dist/ws/runtime/types.d.ts.map +1 -0
  665. package/dist/ws/service.d.ts +65 -0
  666. package/dist/ws/service.d.ts.map +1 -0
  667. package/dist/ws/types.d.ts +77 -0
  668. package/dist/ws/types.d.ts.map +1 -0
  669. package/package.json +262 -0
@@ -0,0 +1,28 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/session/backends/drizzle.ts", "../src/core/constants.ts", "../src/core/decorators/controller.ts", "../src/core/decorators/http-methods.ts", "../src/core/decorators/params.ts", "../src/core/decorators/validate.ts", "../src/session/backends/memory.ts", "../src/crypto/encryption.ts", "../src/session/backends/cookie.ts", "../src/session/backends/redis.ts", "../src/core/decorators/module.ts", "../src/core/decorators/index.ts", "../src/core/decorators/injectable.ts", "../src/core/decorators/repository.ts", "../src/core/decorators/metadata.ts", "../src/session/session.service.ts", "../src/session/session.module.ts", "../src/session/decorators/current-session.ts", "../src/session/session-middleware.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * `DrizzleSessionStorage` — session storage backed by any Drizzle database.\n *\n * import { DrizzleService } from 'nexusjs/drizzle';\n * import { SessionService } from 'nexusjs/session';\n *\n * const db = new DrizzleService({ dialect: 'postgres', connection: {... } });\n * await db.open();\n * await db.raw`CREATE TABLE IF NOT EXISTS nexus_sessions (...)`.execute();\n *\n * const storage = new DrizzleSessionStorage(db, 'nexus_sessions');\n * const session = new SessionService({ backend: 'drizzle', drizzle: { storage } });\n *\n * Schema (managed by the user / migrations):\n *\n * CREATE TABLE nexus_sessions (\n * id TEXT PRIMARY KEY,\n * user_id TEXT,\n * data JSONB,\n * created_at TIMESTAMP NOT NULL,\n * last_seen_at TIMESTAMP NOT NULL,\n * expires_at TIMESTAMP NOT NULL,\n * absolute_expires_at TIMESTAMP,\n * metadata JSONB\n * );\n */\nimport type { DrizzleService } from \"../../drizzle/drizzle.service.js\";\nimport type {\n\tSessionStorage,\n\tSessionRecord,\n\tSessionData,\n\tCreateSessionOptions,\n\tUpdateSessionOptions,\n\tSessionQuery,\n\tSessionMetadata,\n} from \"../types.js\";\n\nexport interface DrizzleSessionOptions {\n\t/** DrizzleService instance. */\n\tdb: DrizzleService;\n\t/** Table name. Default: 'nexus_sessions'. */\n\ttableName?: string;\n\t/** Column mapping. Override to match your schema. */\n\tcolumns?: {\n\t\tid?: string;\n\t\tuserId?: string;\n\t\tdata?: string;\n\t\tcreatedAt?: string;\n\t\tlastSeenAt?: string;\n\t\texpiresAt?: string;\n\t\tabsoluteExpiresAt?: string;\n\t\tmetadata?: string;\n\t};\n}\n\nexport class DrizzleSessionStorage implements SessionStorage {\n\treadonly name = \"database\" as const;\n\n\tprivate db: DrizzleService;\n\tprivate tableName: string;\n\tprivate cols: Required<NonNullable<DrizzleSessionOptions[\"columns\"]>>;\n\n\tconstructor(options: DrizzleSessionOptions) {\n\t\tthis.db = options.db;\n\t\tthis.tableName = options.tableName ?? \"nexus_sessions\";\n\t\tthis.cols = {\n\t\t\tid: options.columns?.id ?? \"id\",\n\t\t\tuserId: options.columns?.userId ?? \"user_id\",\n\t\t\tdata: options.columns?.data ?? \"data\",\n\t\t\tcreatedAt: options.columns?.createdAt ?? \"created_at\",\n\t\t\tlastSeenAt: options.columns?.lastSeenAt ?? \"last_seen_at\",\n\t\t\texpiresAt: options.columns?.expiresAt ?? \"expires_at\",\n\t\t\tabsoluteExpiresAt:\n\t\t\t\toptions.columns?.absoluteExpiresAt ?? \"absolute_expires_at\",\n\t\t\tmetadata: options.columns?.metadata ?? \"metadata\",\n\t\t};\n\t}\n\n\tasync create<T = SessionData>(\n\t\topts: CreateSessionOptions<T>,\n\t): Promise<SessionRecord<T>> {\n\t\tconst now = new Date();\n\t\tconst record: SessionRecord<T> = {\n\t\t\tid: opts.id ?? randomId(),\n\t\t\tuserId: null,\n\t\t\tdata: (opts.data ?? {}) as T,\n\t\t\tcreatedAt: now,\n\t\t\tlastSeenAt: now,\n\t\t\texpiresAt: new Date(\n\t\t\t\tnow.getTime() + (opts.ttlSeconds ?? 60 * 60 * 24 * 7) * 1000,\n\t\t\t),\n\t\t};\n\t\tif (opts.absoluteTtlSeconds) {\n\t\t\trecord.absoluteExpiresAt = new Date(\n\t\t\t\tnow.getTime() + opts.absoluteTtlSeconds * 1000,\n\t\t\t);\n\t\t}\n\t\tif (opts.metadata) record.metadata = opts.metadata;\n\n\t\tawait this.db.rawQuery(\n\t\t\t`INSERT INTO ${this.tableName} (${this.cols.id}, ${this.cols.userId}, ${this.cols.data}, ${this.cols.createdAt}, ${this.cols.lastSeenAt}, ${this.cols.expiresAt}, ${this.cols.absoluteExpiresAt}, ${this.cols.metadata})\n\t\t\t VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n\t\t\t[\n\t\t\t\trecord.id,\n\t\t\t\trecord.userId,\n\t\t\t\tJSON.stringify(record.data),\n\t\t\t\ttoTimestamp(record.createdAt),\n\t\t\t\ttoTimestamp(record.lastSeenAt),\n\t\t\t\ttoTimestamp(record.expiresAt),\n\t\t\t\trecord.absoluteExpiresAt ? toTimestamp(record.absoluteExpiresAt) : null,\n\t\t\t\trecord.metadata ? JSON.stringify(record.metadata) : null,\n\t\t\t],\n\t\t);\n\t\treturn record;\n\t}\n\n\tasync read(id: string): Promise<SessionRecord | null> {\n\t\tconst rows = await this.db.rawQuery<SessionRow>(\n\t\t\t`SELECT * FROM ${this.tableName} WHERE ${this.cols.id} = ? LIMIT 1`,\n\t\t\t[id],\n\t\t);\n\t\treturn rows[0] ? this.rowToRecord(rows[0]) : null;\n\t}\n\n\tasync readMany(query: SessionQuery = {}): Promise<SessionRecord[]> {\n\t\tconst where: string[] = [];\n\t\tconst params: unknown[] = [];\n\t\tif (query.userId !== undefined) {\n\t\t\twhere.push(`${this.cols.userId} = ?`);\n\t\t\tparams.push(query.userId);\n\t\t}\n\t\tconst whereSql = where.length > 0 ? `WHERE ${where.join(\" AND \")}` : \"\";\n\t\tconst limit = query.limit ?? 1000;\n\t\tconst rows = await this.db.rawQuery<SessionRow>(\n\t\t\t`SELECT * FROM ${this.tableName} ${whereSql} ORDER BY ${this.cols.createdAt} DESC LIMIT ?`,\n\t\t\t[...params, limit],\n\t\t);\n\t\treturn rows.map((r) => this.rowToRecord(r));\n\t}\n\n\tasync update<T = SessionData>(\n\t\tid: string,\n\t\topts: UpdateSessionOptions<T>,\n\t): Promise<SessionRecord<T> | null> {\n\t\tconst sets: string[] = [];\n\t\tconst params: unknown[] = [];\n\t\tif (opts.dataPatch !== undefined) {\n\t\t\tsets.push(`${this.cols.data} = ?`);\n\t\t\tparams.push(JSON.stringify(opts.dataPatch));\n\t\t}\n\t\tif (opts.extendSeconds !== undefined) {\n\t\t\tsets.push(`${this.cols.expiresAt} = ?`);\n\t\t\tparams.push(\n\t\t\t\ttoTimestamp(new Date(Date.now() + opts.extendSeconds * 1000)),\n\t\t\t);\n\t\t}\n\t\tif (sets.length === 0)\n\t\t\treturn this.read(id) as Promise<SessionRecord<T> | null>;\n\t\tsets.push(`${this.cols.lastSeenAt} = ?`);\n\t\tparams.push(toTimestamp(new Date()));\n\t\tparams.push(id);\n\t\tawait this.db.rawQuery(\n\t\t\t`UPDATE ${this.tableName} SET ${sets.join(\", \")} WHERE ${this.cols.id} = ?`,\n\t\t\tparams,\n\t\t);\n\t\treturn this.read(id) as Promise<SessionRecord<T> | null>;\n\t}\n\n\tasync touch(id: string): Promise<SessionRecord | null> {\n\t\tawait this.db.rawQuery(\n\t\t\t`UPDATE ${this.tableName} SET ${this.cols.lastSeenAt} = ? WHERE ${this.cols.id} = ?`,\n\t\t\t[toTimestamp(new Date()), id],\n\t\t);\n\t\treturn this.read(id);\n\t}\n\n\tasync destroy(id: string): Promise<boolean> {\n\t\tconst existing = await this.read(id);\n\t\tif (!existing) return false;\n\t\tawait this.db.rawQuery(\n\t\t\t`DELETE FROM ${this.tableName} WHERE ${this.cols.id} = ?`,\n\t\t\t[id],\n\t\t);\n\t\treturn true;\n\t}\n\n\tasync destroyMany(query: SessionQuery = {}): Promise<number> {\n\t\tconst where: string[] = [];\n\t\tconst params: unknown[] = [];\n\t\tif (query.userId !== undefined) {\n\t\t\twhere.push(`${this.cols.userId} = ?`);\n\t\t\tparams.push(query.userId);\n\t\t}\n\t\tconst whereSql = where.length > 0 ? `WHERE ${where.join(\" AND \")}` : \"\";\n\t\tawait this.db.rawQuery(`DELETE FROM ${this.tableName} ${whereSql}`, params);\n\t\treturn 0; // not all dialects return rowCount; treat as unknown\n\t}\n\n\tasync gc(): Promise<number> {\n\t\tawait this.db.rawQuery(\n\t\t\t`DELETE FROM ${this.tableName} WHERE ${this.cols.expiresAt} < ?`,\n\t\t\t[toTimestamp(new Date())],\n\t\t);\n\t\treturn 0;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait this.db.rawQuery(`DELETE FROM ${this.tableName}`);\n\t}\n\n\tasync start(): Promise<void> {\n\t\t// No background timer — the DB is the source of truth.\n\t}\n\n\tasync stop(): Promise<void> {\n\t\t// No background tasks to stop.\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\tprivate rowToRecord(row: SessionRow): SessionRecord {\n\t\tconst r: SessionRecord = {\n\t\t\tid: String(row[this.cols.id]),\n\t\t\tuserId: row[this.cols.userId] as string | null,\n\t\t\tdata: parseJson(row[this.cols.data]) ?? {},\n\t\t\tcreatedAt: fromTimestamp(row[this.cols.createdAt]),\n\t\t\tlastSeenAt: fromTimestamp(row[this.cols.lastSeenAt]),\n\t\t\texpiresAt: fromTimestamp(row[this.cols.expiresAt]),\n\t\t};\n\t\tconst abs = row[this.cols.absoluteExpiresAt];\n\t\tif (abs) r.absoluteExpiresAt = fromTimestamp(abs);\n\t\tconst meta = row[this.cols.metadata];\n\t\tif (meta) r.metadata = parseJson(meta) as SessionMetadata;\n\t\treturn r;\n\t}\n}\n\ninterface SessionRow {\n\t[key: string]: unknown;\n}\n\nfunction toTimestamp(d: Date): string {\n\treturn d.toISOString();\n}\n\nfunction fromTimestamp(v: unknown): Date {\n\tif (v instanceof Date) return v;\n\tif (typeof v === \"string\") return new Date(v);\n\tif (typeof v === \"number\") return new Date(v);\n\treturn new Date();\n}\n\nfunction parseJson(v: unknown): any {\n\tif (typeof v !== \"string\") return v;\n\ttry {\n\t\treturn JSON.parse(v);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction randomId(bytes = 24): string {\n\tconst arr = new Uint8Array(bytes);\n\tcrypto.getRandomValues(arr);\n\treturn Buffer.from(arr).toString(\"base64url\");\n}\n",
6
+ "/**\n * Metadata keys used by reflect-metadata for storing decorator data.\n *\n * These constants are the contract between decorators and the framework\n * core (DI container, router, validator).\n */\nexport const METADATA_KEY = {\n\t/** Marks a class as a Nest-style controller, stores route prefix. */\n\tCONTROLLER: \"nexus:controller\",\n\n\t/** Marks a class as an injectable provider. */\n\tINJECTABLE: \"nexus:injectable\",\n\n\t/** Marks a class as a repository. */\n\tREPOSITORY: \"nexus:repository\",\n\n\t/** Marks a class as a module. Stores module options. */\n\tMODULE: \"nexus:module\",\n\n\t/** HTTP method routes registered on a controller (Get/Post/...). */\n\tROUTES: \"nexus:routes\",\n\n\t/** Method parameter type metadata (body/query/param/headers/ctx). */\n\tPARAMS: \"nexus:params\",\n\n\t/** Validation schema per method (Zod schema or class). */\n\tVALIDATE: \"nexus:validate\",\n\n\t/** Class-level design:paramtypes (built-in). */\n\tPARAMTYPES: \"design:paramtypes\",\n\n\t/** Class-level design:type (built-in). */\n\tTYPE: \"design:type\",\n\n\t/** Class-level design:returntype (built-in). */\n\tRETURNTYPE: \"design:returntype\",\n\n\t/** Provider token to inject for a parameter (for custom tokens). */\n\tINJECT: \"nexus:inject\",\n} as const;\n\nexport type MetadataKey = (typeof METADATA_KEY)[keyof typeof METADATA_KEY];\n\n/** Available parameter decorator locations. */\nexport const PARAM_TYPES = {\n\tREQUEST: 0,\n\tRESPONSE: 1,\n\tNEXT: 2,\n\tBODY: 3,\n\tQUERY: 4,\n\tPARAM: 5,\n\tHEADERS: 6,\n\tCTX: 7,\n\tUSER: 8,\n} as const;\n\nexport type ParamType = (typeof PARAM_TYPES)[keyof typeof PARAM_TYPES];\n\n/** HTTP methods supported by the router. */\nexport const HTTP_METHODS = [\n\t\"GET\",\n\t\"POST\",\n\t\"PUT\",\n\t\"DELETE\",\n\t\"PATCH\",\n\t\"OPTIONS\",\n\t\"HEAD\",\n] as const;\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n",
7
+ "/**\n * @Controller decorator.\n *\n * Marks a class as a controller and registers a route prefix.\n * Routes inside the controller class are decorated with @Get/@Post/etc.\n *\n * @example\n * ```ts\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * list() { ... }\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ControllerMetadata } from \"../di/tokens.js\";\n\nexport function Controller(prefix: string = \"/\"): ClassDecorator {\n\treturn (target: object) => {\n\t\tconst normalized = normalizePrefix(prefix);\n\t\tconst meta: ControllerMetadata = { prefix: normalized };\n\t\tReflect.defineMetadata(METADATA_KEY.CONTROLLER, meta, target);\n\t};\n}\n\nexport function getControllerMetadata(target: any): ControllerMetadata {\n\treturn (\n\t\tReflect.getMetadata(METADATA_KEY.CONTROLLER, target) ?? { prefix: \"/\" }\n\t);\n}\n\nexport function isController(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.CONTROLLER, target);\n}\n\n/**\n * Normalize a prefix so we can safely concatenate it with handler paths.\n * - Empty string becomes '/'.\n * - Trailing slashes are trimmed (we re-add them on the join).\n * - No leading slash is added; the router always joins with `/`.\n */\nfunction normalizePrefix(prefix: string): string {\n\tif (!prefix) return \"\";\n\tif (prefix !== \"/\" && prefix.endsWith(\"/\")) {\n\t\treturn prefix.slice(0, -1);\n\t}\n\treturn prefix;\n}\n",
8
+ "/**\n * HTTP method decorators.\n *\n * `@Get`, `@Post`, `@Put`, `@Delete`, `@Patch`, `@Options`, `@Head` mark a\n * controller method as a route handler. The path argument is appended to\n * the controller's prefix.\n *\n * @example\n * ```ts\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * list() {}\n *\n * @Post('/')\n * create(@Body() body: CreateUserDto) {}\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { HTTP_METHODS, METADATA_KEY, type HttpMethod } from \"../constants.js\";\nimport type { RouteMetadata } from \"../di/tokens.js\";\n\nfunction defineRoute(method: HttpMethod, path: string): MethodDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol,\n\t\tdescriptor: PropertyDescriptor,\n\t) => {\n\t\tconst routes: RouteMetadata[] =\n\t\t\tReflect.getMetadata(METADATA_KEY.ROUTES, target.constructor) ?? [];\n\n\t\troutes.push({\n\t\t\tmethod,\n\t\t\tpath: normalizePath(path),\n\t\t\tpropertyKey,\n\t\t\thandler: descriptor.value,\n\t\t});\n\n\t\tReflect.defineMetadata(METADATA_KEY.ROUTES, routes, target.constructor);\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\tif (!path || path === \"/\") return \"/\";\n\treturn path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nexport const Get = (path: string = \"/\") => defineRoute(\"GET\", path);\nexport const Post = (path: string = \"/\") => defineRoute(\"POST\", path);\nexport const Put = (path: string = \"/\") => defineRoute(\"PUT\", path);\nexport const Delete = (path: string = \"/\") => defineRoute(\"DELETE\", path);\nexport const Patch = (path: string = \"/\") => defineRoute(\"PATCH\", path);\nexport const Options = (path: string = \"/\") => defineRoute(\"OPTIONS\", path);\nexport const Head = (path: string = \"/\") => defineRoute(\"HEAD\", path);\n\nexport function getRoutes(target: any): RouteMetadata[] {\n\treturn Reflect.getMetadata(METADATA_KEY.ROUTES, target) ?? [];\n}\n\nexport { HTTP_METHODS };\nexport type { RouteMetadata };\n",
9
+ "/**\n * Parameter decorators.\n *\n * These mark a controller method argument as a source of request data:\n * - `@Req()` → Hono context\n * - `@Res()` → Response helper\n * - `@Next()` → next() callback (for middleware-style handlers)\n * - `@Body()` → request body (parsed)\n * - `@Query('key')` → a single query param, or full query object\n * - `@Param('key')` → a single path param, or full params object\n * - `@Headers('k')` → a single header, or full headers object\n * - `@Ctx()` → Hono context (alias for @Req)\n * - `@User()` → authenticated user (resolved via auth provider)\n *\n * The metadata is read by the router at mount time to build the\n * handler invocation list.\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY, PARAM_TYPES } from \"../constants.js\";\nimport type { ParamMetadata } from \"../di/tokens.js\";\n\nexport function createParamDecorator(\n\ttype: number,\n\tdata?: string | object,\n): ParameterDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol | undefined,\n\t\tparameterIndex: number,\n\t) => {\n\t\t// Method parameter: target is the prototype, propertyKey is the method name.\n\t\t// Constructor parameter: target is the class, propertyKey is undefined.\n\t\tif (propertyKey !== undefined) {\n\t\t\tconst params: ParamMetadata[] =\n\t\t\t\tReflect.getMetadata(METADATA_KEY.PARAMS, target, propertyKey) ?? [];\n\t\t\tparams.push({\n\t\t\t\tindex: parameterIndex,\n\t\t\t\ttype,\n\t\t\t\tname: typeof data === \"string\" ? data : undefined,\n\t\t\t\tdata: typeof data === \"object\" ? data : undefined,\n\t\t\t});\n\t\t\tReflect.defineMetadata(METADATA_KEY.PARAMS, params, target, propertyKey);\n\t\t} else {\n\t\t\tconst params: ParamMetadata[] =\n\t\t\t\tReflect.getMetadata(METADATA_KEY.PARAMS, target) ?? [];\n\t\t\tparams.push({\n\t\t\t\tindex: parameterIndex,\n\t\t\t\ttype,\n\t\t\t\tname: typeof data === \"string\" ? data : undefined,\n\t\t\t\tdata: typeof data === \"object\" ? data : undefined,\n\t\t\t});\n\t\t\tReflect.defineMetadata(METADATA_KEY.PARAMS, params, target);\n\t\t}\n\t};\n}\n\nexport const Req = () => createParamDecorator(PARAM_TYPES.REQUEST);\nexport const Res = () => createParamDecorator(PARAM_TYPES.RESPONSE);\nexport const Next = () => createParamDecorator(PARAM_TYPES.NEXT);\nexport const Body = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.BODY, key);\nexport const Query = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.QUERY, key);\nexport const Param = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.PARAM, key);\nexport const Headers = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.HEADERS, key);\nexport const Ctx = () => createParamDecorator(PARAM_TYPES.CTX);\nexport const User = () => createParamDecorator(PARAM_TYPES.USER);\n\nexport function getParamMetadata(\n\ttarget: any,\n\tpropertyKey: string | symbol,\n): ParamMetadata[] {\n\treturn Reflect.getMetadata(METADATA_KEY.PARAMS, target, propertyKey) ?? [];\n}\n\nexport { PARAM_TYPES };\n",
10
+ "/**\n * @Validate decorator.\n *\n * Attaches Zod schemas (or class validators) to a route handler. Each\n * schema is run against the corresponding request part before the handler\n * executes; failed validation throws or returns a 400 response.\n *\n * @example\n * ```ts\n * const UserSchema = z.object({ name: z.string(), email: z.email() });\n *\n * @Post('/')\n * @Validate({ body: UserSchema })\n * create(@Body() body: z.infer<typeof UserSchema>) { ... }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ValidationMetadata } from \"../di/tokens.js\";\n\nexport function Validate(options: ValidationMetadata): MethodDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol,\n\t\tdescriptor: PropertyDescriptor,\n\t) => {\n\t\tReflect.defineMetadata(\n\t\t\tMETADATA_KEY.VALIDATE,\n\t\t\toptions,\n\t\t\ttarget.constructor,\n\t\t\tpropertyKey,\n\t\t);\n\t};\n}\n\nexport function getValidationMetadata(\n\ttarget: any,\n\tpropertyKey: string | symbol,\n): ValidationMetadata | undefined {\n\treturn Reflect.getMetadata(METADATA_KEY.VALIDATE, target, propertyKey);\n}\n",
11
+ "/**\n * In-memory session storage.\n *\n * LRU-evicting map for tests and single-instance dev. The same map is\n * also useful for mocking in unit tests — `create()` / `read()` /\n * `update()` / `destroy()` round-trip without any I/O.\n */\n\nimport type {\n\tSessionStorage,\n\tSessionRecord,\n\tSessionData,\n\tCreateSessionOptions,\n\tUpdateSessionOptions,\n\tSessionQuery,\n} from \"../types.js\";\n\nexport interface MemoryStorageOptions {\n\t/** GC interval in ms. Default: 60_000. */\n\tgcIntervalMs?: number;\n\t/** Max sessions in memory before evicting LRU. Default: 100_000. */\n\tmaxSessions?: number;\n}\n\nfunction randomId(bytes = 24): string {\n\tconst arr = new Uint8Array(bytes);\n\tcrypto.getRandomValues(arr);\n\treturn Buffer.from(arr).toString(\"base64url\");\n}\n\nexport class MemorySessionStorage implements SessionStorage {\n\treadonly name = \"memory\" as const;\n\t#sessions = new Map<string, SessionRecord>();\n\t#gcHandle: ReturnType<typeof setInterval> | null = null;\n\t#maxSessions: number;\n\t#gcIntervalMs: number;\n\n\tconstructor(options: MemoryStorageOptions = {}) {\n\t\tthis.#maxSessions = options.maxSessions ?? 100_000;\n\t\tthis.#gcIntervalMs = options.gcIntervalMs ?? 60_000;\n\t}\n\n\t/** Start the GC interval. Idempotent. */\n\tstart(): void {\n\t\tif (this.#gcHandle) return;\n\t\tthis.#gcHandle = setInterval(() => void this.gc(), this.#gcIntervalMs);\n\t\tconst h = this.#gcHandle as { unref?: () => void };\n\t\tif (typeof h.unref === \"function\") h.unref();\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (this.#gcHandle) clearInterval(this.#gcHandle);\n\t\tthis.#gcHandle = null;\n\t}\n\n\t// ===========================================================================\n\t// SessionStorage API\n\t// ===========================================================================\n\n\tasync create<T = SessionData>(\n\t\topts: CreateSessionOptions<T>,\n\t): Promise<SessionRecord<T>> {\n\t\tconst now = new Date();\n\t\tconst ttl = (opts.ttlSeconds ?? 60 * 60 * 24 * 7) * 1000;\n\t\tconst record: SessionRecord<T> = {\n\t\t\tid: opts.id ?? randomId(),\n\t\t\tuserId: null,\n\t\t\tdata: (opts.data ?? {}) as T,\n\t\t\tcreatedAt: now,\n\t\t\tlastSeenAt: now,\n\t\t\texpiresAt: new Date(now.getTime() + ttl),\n\t\t};\n\t\tif (opts.absoluteTtlSeconds) {\n\t\t\trecord.absoluteExpiresAt = new Date(\n\t\t\t\tnow.getTime() + opts.absoluteTtlSeconds * 1000,\n\t\t\t);\n\t\t}\n\t\tif (opts.metadata) record.metadata = opts.metadata;\n\t\tthis.#sessions.set(record.id, record as unknown as SessionRecord);\n\t\tthis.#evictIfFull();\n\t\treturn record;\n\t}\n\n\tasync read(id: string): Promise<SessionRecord | null> {\n\t\tconst r = this.#sessions.get(id);\n\t\tif (!r) return null;\n\t\tif (this.#isExpired(r)) {\n\t\t\tthis.#sessions.delete(id);\n\t\t\treturn null;\n\t\t}\n\t\t// Touch — sliding expiry.\n\t\tconst now = new Date();\n\t\tr.lastSeenAt = now;\n\t\tr.expiresAt = new Date(\n\t\t\tnow.getTime() +\n\t\t\t\tMath.max(60_000, r.expiresAt.getTime() - r.lastSeenAt.getTime()),\n\t\t);\n\t\tthis.#sessions.set(id, r); // refresh LRU position\n\t\treturn r;\n\t}\n\n\tasync readMany(query: SessionQuery = {}): Promise<SessionRecord[]> {\n\t\tconst now = Date.now();\n\t\tconst list: SessionRecord[] = [];\n\t\tfor (const r of this.#sessions.values()) {\n\t\t\tif (this.#isExpired(r)) continue;\n\t\t\tif (query.userId !== undefined && r.userId !== query.userId) continue;\n\t\t\tif (query.metadata) {\n\t\t\t\tif (\n\t\t\t\t\tquery.metadata.ipAddress &&\n\t\t\t\t\tr.metadata?.ipAddress !== query.metadata.ipAddress\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (\n\t\t\t\t\tquery.metadata.userAgent &&\n\t\t\t\t\tr.metadata?.userAgent !== query.metadata.userAgent\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(r);\n\t\t\tif (query.limit && list.length >= (query.offset ?? 0) + query.limit)\n\t\t\t\tbreak;\n\t\t}\n\t\tconst offset = query.offset ?? 0;\n\t\tconst limit = query.limit ?? list.length;\n\t\treturn list.slice(offset, offset + limit);\n\t}\n\n\tasync update<T = SessionData>(\n\t\tid: string,\n\t\topts: UpdateSessionOptions<T>,\n\t): Promise<SessionRecord<T> | null> {\n\t\tconst r = this.#sessions.get(id);\n\t\tif (!r) return null;\n\t\tif (this.#isExpired(r)) {\n\t\t\tthis.#sessions.delete(id);\n\t\t\treturn null;\n\t\t}\n\t\tif (opts.dataPatch) {\n\t\t\tr.data = { ...r.data, ...opts.dataPatch } as SessionData;\n\t\t}\n\t\tif (opts.extendSeconds !== undefined) {\n\t\t\tconst newExpiry = Date.now() + opts.extendSeconds * 1000;\n\t\t\tif (!r.absoluteExpiresAt || newExpiry < r.absoluteExpiresAt.getTime()) {\n\t\t\t\tr.expiresAt = new Date(newExpiry);\n\t\t\t}\n\t\t}\n\t\tr.lastSeenAt = new Date();\n\t\tthis.#sessions.set(id, r);\n\t\treturn r as unknown as SessionRecord<T>;\n\t}\n\n\tasync destroy(id: string): Promise<boolean> {\n\t\treturn this.#sessions.delete(id);\n\t}\n\n\tasync destroyMany(query: SessionQuery): Promise<number> {\n\t\tconst ids: string[] = [];\n\t\tfor (const [id, r] of this.#sessions) {\n\t\t\tif (query.userId !== undefined && r.userId !== query.userId) continue;\n\t\t\tids.push(id);\n\t\t}\n\t\tfor (const id of ids) this.#sessions.delete(id);\n\t\treturn ids.length;\n\t}\n\n\tasync touch(id: string): Promise<SessionRecord | null> {\n\t\treturn this.read(id);\n\t}\n\n\tasync gc(): Promise<number> {\n\t\tconst now = Date.now();\n\t\tlet removed = 0;\n\t\tfor (const [id, r] of this.#sessions) {\n\t\t\tif (this.#isExpired(r, now)) {\n\t\t\t\tthis.#sessions.delete(id);\n\t\t\t\tremoved++;\n\t\t\t}\n\t\t}\n\t\treturn removed;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.#sessions.clear();\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\t#isExpired(r: SessionRecord, now = Date.now()): boolean {\n\t\tif (r.expiresAt.getTime() <= now) return true;\n\t\tif (r.absoluteExpiresAt && r.absoluteExpiresAt.getTime() <= now)\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\t#evictIfFull(): void {\n\t\tif (this.#sessions.size <= this.#maxSessions) return;\n\t\t// LRU: delete the oldest-touched entry (Map preserves insertion order;\n\t\t// since we re-`set()` on touch, the first key is the least recently touched).\n\t\tconst oldest = this.#sessions.keys().next().value;\n\t\tif (oldest) this.#sessions.delete(oldest);\n\t}\n}\n",
12
+ "/**\n * `EncryptionService` — AES-256-GCM symmetric encryption + HMAC\n * sign/unsign helpers.\n *\n * Use cases:\n * - **Encrypt** sensitive data before storing it (e.g. session\n * blobs in cookies or DB).\n * - **Sign** stateless values that need to be tamper-proof (e.g.\n * session IDs, CSRF tokens, password-reset links, signed URLs).\n *\n * The service derives two 32-byte keys from the user's master\n * `key` config: one for AES-GCM, one for HMAC. The keys are\n * distinct (HKDF-SHA256 with a per-purpose salt) so a leak of one\n * doesn't compromise the other.\n *\n * Encrypted format (v1):\n * `v1.<base64url(iv)>.<base64url(tag)>.<base64url(ciphertext)>`\n * where `iv` is 12 bytes and `tag` is 16 bytes (GCM auth tag).\n *\n * Signed format:\n * `<base64url(value)>.<base64url(hmac)>`\n */\n\nimport {\n\tcreateCipheriv,\n\tcreateDecipheriv,\n\tcreateHmac,\n\thkdfSync,\n\trandomBytes,\n\ttimingSafeEqual,\n} from \"node:crypto\";\nimport type { EncryptedValue, EncryptOptions, SignedValue } from \"./types.js\";\n\nconst VERSION = \"v1\";\nconst IV_BYTES = 12;\nconst TAG_BYTES = 16;\n\nexport class EncryptionService {\n\tprivate readonly aesKey: Buffer;\n\tprivate readonly hmacKey: Buffer;\n\n\tconstructor(masterKey: string) {\n\t\tconst derived = deriveKeys(masterKey);\n\t\tthis.aesKey = derived.aes;\n\t\tthis.hmacKey = derived.hmac;\n\t}\n\n\t/* ---------------- encrypt / decrypt ---------------- */\n\n\t/**\n\t * Encrypt a string. The output is self-describing and includes\n\t * the IV, auth tag, expiry, and purpose (if any) in the MAC.\n\t *\n\t * Format: `v1.<iv>.<tag>.<ciphertext>.<mac>`\n\t */\n\tencrypt(value: string, options: EncryptOptions = {}): EncryptedValue {\n\t\tconst iv = randomBytes(IV_BYTES);\n\t\tconst cipher = createCipheriv(\"aes-256-gcm\", this.aesKey, iv);\n\t\tconst plaintext = Buffer.from(value, \"utf8\");\n\t\tconst ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n\t\tconst tag = cipher.getAuthTag();\n\n\t\tconst expiry = encodeExpiry(options.expiresAt);\n\t\tconst purposeBuf = Buffer.from(options.purpose ?? \"\", \"utf8\");\n\t\tconst mac = this.macOver([VERSION, iv, tag, ciphertext, expiry, purposeBuf]);\n\n\t\treturn [\n\t\t\tVERSION,\n\t\t\tb64(iv),\n\t\t\tb64(tag),\n\t\t\tb64(ciphertext),\n\t\t\tb64(expiry),\n\t\t\tb64(purposeBuf),\n\t\t\tb64(mac),\n\t\t].join(\".\");\n\t}\n\n\t/**\n\t * Decrypt a value previously produced by `encrypt()`. Throws\n\t * if the value is malformed, the MAC doesn't match, the\n\t * purpose doesn't match, or the expiry has passed.\n\t */\n\tdecrypt<T = string>(payload: string): T {\n\t\tconst parsed = parseV1(payload);\n\t\tif (!parsed) throw new Error(\"Encrypted payload is malformed\");\n\n\t\t// Verify MAC over the canonical (VERSION, IV, tag, ct, expiry, purpose) tuple.\n\t\tconst expectedMac = this.macOver([\n\t\t\tVERSION,\n\t\t\tparsed.iv,\n\t\t\tparsed.tag,\n\t\t\tparsed.ciphertext,\n\t\t\tparsed.expiry,\n\t\t\tparsed.purpose,\n\t\t]);\n\t\tif (!constantTimeEqual(expectedMac, parsed.mac)) {\n\t\t\tthrow new Error(\"Encrypted payload failed integrity check\");\n\t\t}\n\n\t\t// Check expiry.\n\t\tif (parsed.expiry.length > 0) {\n\t\t\tconst expiryMs = parseExpiry(parsed.expiry.toString(\"utf8\"));\n\t\t\tif (expiryMs > 0 && Date.now() > expiryMs) {\n\t\t\t\tthrow new Error(\"Encrypted payload has expired\");\n\t\t\t}\n\t\t}\n\n\t\tconst decipher = createDecipheriv(\"aes-256-gcm\", this.aesKey, parsed.iv);\n\t\tdecipher.setAuthTag(parsed.tag);\n\t\tconst plaintext = Buffer.concat([\n\t\t\tdecipher.update(parsed.ciphertext),\n\t\t\tdecipher.final(),\n\t\t]);\n\t\treturn plaintext.toString(\"utf8\") as unknown as T;\n\t}\n\n\t/** True if the string was produced by `encrypt()`. */\n\tisEncrypted(value: string): boolean {\n\t\tif (typeof value !== \"string\") return false;\n\t\treturn value.startsWith(VERSION + \".\");\n\t}\n\n\t/* ---------------- HMAC sign / unsign ---------------- */\n\n\t/**\n\t * Sign a string with the framework's HMAC key. The output is\n\t * `<base64url(value)>.<base64url(hmac)>`.\n\t *\n\t * Useful for stateless session cookies, CSRF tokens, etc.\n\t */\n\tsign(value: string, purpose = \"\"): SignedValue {\n\t\tconst mac = createHmac(\"sha256\", this.hmacKey)\n\t\t\t.update(purpose)\n\t\t\t.update(\"|\")\n\t\t\t.update(value)\n\t\t\t.digest();\n\t\treturn `${b64(Buffer.from(value, \"utf8\"))}.${b64(mac)}`;\n\t}\n\n\t/**\n\t * Sign a pre-encoded value (no extra b64-encoding). The output\n\t * is just the base64url MAC. Useful for cookie / token formats\n\t * where the value is already b64-encoded.\n\t *\n\t * The caller is responsible for joining the value and signature.\n\t */\n\tsignRaw(value: string, purpose = \"\"): string {\n\t\tconst mac = createHmac(\"sha256\", this.hmacKey)\n\t\t\t.update(purpose)\n\t\t\t.update(\"|\")\n\t\t\t.update(value)\n\t\t\t.digest();\n\t\treturn b64(mac);\n\t}\n\n\t/**\n\t * Verify a raw signature (from `signRaw`) against a pre-encoded\n\t * value. Returns `true` on match, `false` otherwise.\n\t */\n\tverifyRaw(value: string, signature: string, purpose = \"\"): boolean {\n\t\tconst expected = createHmac(\"sha256\", this.hmacKey)\n\t\t\t.update(purpose)\n\t\t\t.update(\"|\")\n\t\t\t.update(value)\n\t\t\t.digest();\n\t\tconst given = fromB64(signature);\n\t\tif (!given) return false;\n\t\treturn constantTimeEqual(given, expected);\n\t}\n\n\t/**\n\t * Verify and extract a previously signed value. Returns the\n\t * original value on success, `null` on failure (malformed,\n\t * wrong purpose, MAC mismatch).\n\t */\n\tunsign(signed: string, purpose = \"\"): string | null {\n\t\tconst dot = signed.lastIndexOf(\".\");\n\t\tif (dot < 1 || dot === signed.length - 1) return null;\n\t\tconst valueB64 = signed.slice(0, dot);\n\t\tconst macB64 = signed.slice(dot + 1);\n\t\tconst value = fromB64(valueB64);\n\t\tconst mac = fromB64(macB64);\n\t\tif (!value || !mac) return null;\n\t\tconst expected = createHmac(\"sha256\", this.hmacKey)\n\t\t\t.update(purpose)\n\t\t\t.update(\"|\")\n\t\t\t.update(value)\n\t\t\t.digest();\n\t\tif (!constantTimeEqual(mac, expected)) return null;\n\t\treturn value.toString(\"utf8\");\n\t}\n\n\t/* ---------------- internals ---------------- */\n\n\tprivate macOver(parts: Array<Buffer | string>): Buffer {\n\t\tconst h = createHmac(\"sha256\", this.hmacKey);\n\t\tfor (const p of parts) {\n\t\t\th.update(\"|\");\n\t\t\th.update(p as Buffer);\n\t\t}\n\t\treturn h.digest();\n\t}\n}\n\n/* ------------------------------------------------------------------ *\n * Helpers\n * ------------------------------------------------------------------ */\n\nfunction b64(buf: Buffer): string {\n\treturn buf.toString(\"base64url\");\n}\n\nfunction fromB64(s: string): Buffer | null {\n\ttry {\n\t\treturn Buffer.from(s, \"base64url\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction constantTimeEqual(a: Buffer, b: Buffer): boolean {\n\tif (a.length !== b.length) return false;\n\treturn timingSafeEqual(a, b);\n}\n\nfunction encodeExpiry(expiresAt: number | string | Date | undefined): Buffer {\n\tif (expiresAt === undefined) return Buffer.alloc(0);\n\tlet ms: number;\n\tif (typeof expiresAt === \"number\") {\n\t\tms = expiresAt > 1e12 ? expiresAt : Date.now() + expiresAt * 1000;\n\t} else if (typeof expiresAt === \"string\") {\n\t\t// Numeric string = seconds from now\n\t\tconst asNum = Number(expiresAt);\n\t\tif (!isNaN(asNum) && asNum > 0) {\n\t\t\tms = asNum > 1e12 ? asNum : Date.now() + asNum * 1000;\n\t\t} else {\n\t\t\tms = Date.parse(expiresAt);\n\t\t}\n\t} else {\n\t\tms = expiresAt.getTime();\n\t}\n\tif (!isFinite(ms)) return Buffer.alloc(0);\n\treturn Buffer.from(String(ms), \"utf8\");\n}\n\nfunction parseExpiry(s: string): number {\n\tconst n = Number(s);\n\treturn isFinite(n) ? n : 0;\n}\n\ninterface ParsedV1 {\n\tiv: Buffer;\n\ttag: Buffer;\n\tciphertext: Buffer;\n\texpiry: Buffer;\n\tpurpose: Buffer;\n\tmac: Buffer;\n}\n\nfunction parseV1(s: string): ParsedV1 | null {\n\tif (typeof s !== \"string\" || !s.startsWith(VERSION + \".\")) return null;\n\tconst parts = s.split(\".\");\n\t// v1, iv, tag, ct, expiry, purpose, mac = 7 parts\n\tif (parts.length !== 7) return null;\n\tconst [, ivB64, tagB64, ctB64, expB64, purposeB64, macB64] = parts;\n\tconst iv = fromB64(ivB64);\n\tconst tag = fromB64(tagB64);\n\tconst ct = fromB64(ctB64);\n\tconst exp = fromB64(expB64);\n\tconst purpose = fromB64(purposeB64);\n\tconst mac = fromB64(macB64);\n\tif (!iv || !tag || !ct || !exp || !purpose || !mac) return null;\n\tif (iv.length !== IV_BYTES) return null;\n\tif (tag.length !== TAG_BYTES) return null;\n\treturn { iv, tag, ciphertext: ct, expiry: exp, purpose, mac };\n}\n\n/* ------------------------------------------------------------------ *\n * Key derivation — HKDF-SHA256, two sub-keys\n * ------------------------------------------------------------------ */\n\nfunction deriveKeys(masterKey: string): { aes: Buffer; hmac: Buffer } {\n\t// Convert the master to bytes. We accept any string; if it\n\t// happens to be base64 and is at least 32 bytes, decode it.\n\tlet input: Buffer;\n\ttry {\n\t\tconst decoded = Buffer.from(masterKey, \"base64\");\n\t\tif (\n\t\t\tdecoded.length >= 32 &&\n\t\t\t// The \"decoded\" path is valid only if the string is\n\t\t\t// actually base64 (would be a real try/catch).\n\t\t\tmasterKey.length % 4 === 0\n\t\t) {\n\t\t\tinput = decoded;\n\t\t} else {\n\t\t\tinput = Buffer.from(masterKey, \"utf8\");\n\t\t}\n\t} catch {\n\t\tinput = Buffer.from(masterKey, \"utf8\");\n\t}\n\n\tconst ikm = input.length < 32 ? padKey(input) : input;\n\tconst out = hkdfSync(\"sha256\", ikm, Buffer.alloc(0), \"nexus:crypto:v1\", 64);\n\tconst outBuf = Buffer.from(out);\n\treturn {\n\t\taes: Buffer.from(outBuf.subarray(0, 32)),\n\t\thmac: Buffer.from(outBuf.subarray(32, 64)),\n\t};\n}\n\nfunction padKey(input: Buffer): Buffer {\n\t// Pad to 32 bytes by appending SHA-256 of the key (so the\n\t// result is deterministic and at least 32 bytes long).\n\tconst hash = createHmac(\"sha256\", \"nexus:crypto:pad\").update(input).digest();\n\tconst out = Buffer.alloc(32);\n\tinput.copy(out, 0, 0, Math.min(input.length, 32));\n\thash.copy(out, input.length < 32 ? input.length : 0, 0, 32 - Math.min(input.length, 32));\n\treturn out;\n}\n",
13
+ "/**\n * Cookie session storage — encodes the entire session record inside\n * a single signed cookie. No server-side state. Ideal for edge\n * runtimes (Workers, Vercel) where shared storage isn't available.\n *\n * The signature is produced by `EncryptionService` (HMAC-SHA256\n * with HKDF-derived key). The `secret` config is the master key —\n * the framework derives a separate HMAC sub-key from it.\n *\n * Cookie format: `<base64url(payload)>.<base64url(hmac)>`\n *\n * - The payload is the JSON-serialized SessionRecord.\n * - The HMAC is over the payload using the framework's\n * `EncryptionService.sign(..., \"session\")` with a purpose tag\n * so a session token can't be replayed as a CSRF token, etc.\n * - The two are joined with `.`. On read we recompute the HMAC and\n * compare in constant time.\n *\n * Expired sessions are detected by inspecting `expiresAt` after\n * decoding — we don't need server state for that.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport { EncryptionService } from \"../../crypto/encryption.js\";\nimport type {\n\tSessionStorage,\n\tSessionRecord,\n\tSessionData,\n\tCreateSessionOptions,\n\tUpdateSessionOptions,\n\tSessionQuery,\n\tSessionMetadata,\n\tCookieStorageOptions,\n} from \"../types.js\";\n\nfunction b64urlEncode(buf: Buffer | string): string {\n\tconst b = typeof buf === \"string\" ? Buffer.from(buf, \"utf8\") : buf;\n\treturn b\n\t\t.toString(\"base64\")\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/, \"\");\n}\n\nfunction b64urlDecode(s: string): Buffer {\n\tconst padded = s + \"=\".repeat((4 - (s.length % 4)) % 4);\n\treturn Buffer.from(padded.replace(/-/g, \"+\").replace(/_/g, \"/\"), \"base64\");\n}\n\nfunction randomId(bytes = 24): string {\n\tconst arr = new Uint8Array(bytes);\n\tcrypto.getRandomValues(arr);\n\treturn b64urlEncode(Buffer.from(arr));\n}\n\nfunction safeEq(a: string, b: string): boolean {\n\tconst ab = Buffer.from(a);\n\tconst bb = Buffer.from(b);\n\tif (ab.length !== bb.length) return false;\n\treturn timingSafeEqual(ab, bb);\n}\n\n/**\n * Encode a SessionRecord into a signed cookie value.\n * Public so `authMiddleware` (or any other integration) can set the\n * cookie after `sessionService.create(...)`.\n */\nexport function encodeSessionCookie(\n\trecord: SessionRecord,\n\tsecret: string,\n): string {\n\tconst enc = new EncryptionService(secret);\n\tconst payload = b64urlEncode(\n\t\tJSON.stringify({\n\t\t\tid: record.id,\n\t\t\tuserId: record.userId,\n\t\t\tdata: record.data,\n\t\t\tcreatedAt: record.createdAt.toISOString(),\n\t\t\tlastSeenAt: record.lastSeenAt.toISOString(),\n\t\t\texpiresAt: record.expiresAt.toISOString(),\n\t\t\t...(record.absoluteExpiresAt\n\t\t\t\t? { absoluteExpiresAt: record.absoluteExpiresAt.toISOString() }\n\t\t\t\t: {}),\n\t\t\t...(record.metadata ? { metadata: record.metadata } : {}),\n\t\t}),\n\t);\n\t// Sign the b64 payload with purpose \"session\". The HMAC is\n\t// produced by EncryptionService (HKDF-derived key + purpose tag),\n\t// so a session token can't be replayed as another purpose.\n\tconst sig = enc.signRaw(payload, \"session\");\n\treturn `${payload}.${sig}`;\n}\n\n/** Decode + verify a signed cookie value. Returns null on tampering. */\nexport function decodeSessionCookie<T = SessionData>(\n\tcookieValue: string,\n\tsecret: string,\n): SessionRecord<T> | null {\n\tconst enc = new EncryptionService(secret);\n\tconst lastDot = cookieValue.lastIndexOf(\".\");\n\tif (lastDot < 1) return null;\n\tconst payload = cookieValue.slice(0, lastDot);\n\tconst sig = cookieValue.slice(lastDot + 1);\n\tif (!enc.verifyRaw(payload, sig, \"session\")) return null;\n\ttry {\n\t\tconst obj = JSON.parse(b64urlDecode(payload).toString(\"utf8\")) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t\tconst record: SessionRecord<T> = {\n\t\t\tid: String(obj[\"id\"]),\n\t\t\tuserId: (obj[\"userId\"] as string | null) ?? null,\n\t\t\tdata: (obj[\"data\"] as T) ?? ({} as T),\n\t\t\tcreatedAt: new Date(String(obj[\"createdAt\"])),\n\t\t\tlastSeenAt: new Date(String(obj[\"lastSeenAt\"])),\n\t\t\texpiresAt: new Date(String(obj[\"expiresAt\"])),\n\t\t};\n\t\tconst abs = obj[\"absoluteExpiresAt\"];\n\t\tif (typeof abs === \"string\") record.absoluteExpiresAt = new Date(abs);\n\t\tconst meta = obj[\"metadata\"];\n\t\tif (meta && typeof meta === \"object\") {\n\t\t\trecord.metadata = meta as SessionMetadata;\n\t\t}\n\t\treturn record;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport class CookieSessionStorage implements SessionStorage {\n\treadonly name = \"cookie\" as const;\n\t#secret: string;\n\t#cookieName: string;\n\t#defaultTtl: number;\n\t#cookieOptions: NonNullable<CookieStorageOptions[\"cookieOptions\"]>;\n\n\tconstructor(options: CookieStorageOptions) {\n\t\tif (!options.secret || options.secret.length < 16) {\n\t\t\tthrow new Error(\"[session/cookie] secret must be at least 16 chars\");\n\t\t}\n\t\tthis.#secret = options.secret;\n\t\tthis.#cookieName = options.cookieName ?? \"nexus.sess\";\n\t\tthis.#defaultTtl = options.defaultTtlSeconds ?? 60 * 60 * 24 * 7;\n\t\tthis.#cookieOptions = options.cookieOptions ?? {};\n\t}\n\n\tget cookieName(): string {\n\t\treturn this.#cookieName;\n\t}\n\n\tget cookieOptions(): NonNullable<CookieStorageOptions[\"cookieOptions\"]> {\n\t\treturn this.#cookieOptions;\n\t}\n\n\t/** Build a `Set-Cookie` header value for a freshly-created session. */\n\tbuildSetCookie(record: SessionRecord): string {\n\t\tconst value = encodeSessionCookie(record, this.#secret);\n\t\tconst opts = this.#cookieOptions;\n\t\tconst parts = [`${this.#cookieName}=${value}`];\n\t\tparts.push(`Path=${opts.path ?? \"/\"}`);\n\t\tif (opts.domain) parts.push(`Domain=${opts.domain}`);\n\t\tif (opts.httpOnly ?? true) parts.push(\"HttpOnly\");\n\t\tif (opts.secure ?? process.env[\"NODE_ENV\"] === \"production\")\n\t\t\tparts.push(\"Secure\");\n\t\tparts.push(`SameSite=${(opts.sameSite ?? \"lax\").toUpperCase()}`);\n\t\tconst maxAge =\n\t\t\topts.maxAgeSeconds ??\n\t\t\tMath.max(1, Math.floor((record.expiresAt.getTime() - Date.now()) / 1000));\n\t\tparts.push(`Max-Age=${maxAge}`);\n\t\tif (opts.partitioned) parts.push(\"Partitioned\");\n\t\treturn parts.join(\"; \");\n\t}\n\n\t/** Build a `Set-Cookie` header that clears the cookie. */\n\tbuildClearCookie(): string {\n\t\tconst opts = this.#cookieOptions;\n\t\treturn [\n\t\t\t`${this.#cookieName}=`,\n\t\t\t`Path=${opts.path ?? \"/\"}`,\n\t\t\t`Max-Age=0`,\n\t\t\topts.domain ? `Domain=${opts.domain}` : \"\",\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"; \");\n\t}\n\n\t// ===========================================================================\n\t// SessionStorage API\n\t// ===========================================================================\n\n\tasync create<T = SessionData>(\n\t\topts: CreateSessionOptions<T>,\n\t): Promise<SessionRecord<T>> {\n\t\tconst now = new Date();\n\t\tconst ttl = (opts.ttlSeconds ?? this.#defaultTtl) * 1000;\n\t\tconst record: SessionRecord<T> = {\n\t\t\tid: opts.id ?? randomId(),\n\t\t\tuserId: null,\n\t\t\tdata: (opts.data ?? {}) as T,\n\t\t\tcreatedAt: now,\n\t\t\tlastSeenAt: now,\n\t\t\texpiresAt: new Date(now.getTime() + ttl),\n\t\t};\n\t\tif (opts.absoluteTtlSeconds) {\n\t\t\trecord.absoluteExpiresAt = new Date(\n\t\t\t\tnow.getTime() + opts.absoluteTtlSeconds * 1000,\n\t\t\t);\n\t\t}\n\t\tif (opts.metadata) record.metadata = opts.metadata;\n\t\treturn record;\n\t}\n\n\t/** No server-side state — `read` is a no-op for cookie storage. */\n\tasync read(): Promise<SessionRecord | null> {\n\t\treturn null;\n\t}\n\n\tasync readMany(query?: SessionQuery): Promise<SessionRecord[]> {\n\t\tvoid query;\n\t\treturn [];\n\t}\n\n\tasync update<T = SessionData>(\n\t\t_id: string,\n\t\topts: UpdateSessionOptions<T>,\n\t): Promise<SessionRecord<T> | null> {\n\t\t// No state to mutate. Callers should call `create()` with the\n\t\t// updated fields, then re-set the cookie.\n\t\tvoid opts;\n\t\treturn null;\n\t}\n\n\tasync destroy(): Promise<boolean> {\n\t\treturn true;\n\t}\n\n\tasync destroyMany(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tasync touch(): Promise<SessionRecord | null> {\n\t\treturn null;\n\t}\n\n\tasync gc(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\t// no-op\n\t}\n\n\t/** Decode a session cookie value into a SessionRecord (verification included). */\n\tdecode(cookieValue: string): SessionRecord | null {\n\t\treturn decodeSessionCookie(cookieValue, this.#secret);\n\t}\n\n\t/** Encode a SessionRecord for the Set-Cookie header value. */\n\tencode(record: SessionRecord): string {\n\t\treturn encodeSessionCookie(record, this.#secret);\n\t}\n}\n",
14
+ "/**\n * `RedisSessionStorage` — session storage backed by `nexusjs/redis`.\n *\n * Works on **Bun** (`Bun.redis`), **Node** (`ioredis`), and any\n * other runtime via the runtime-aware `nexusjs/redis` package. For\n * Cloudflare Workers / Pages KV storage, use\n * `CloudflareKVSessionStorage` instead — same API, different\n * adapter.\n *\n * Each session is stored as a JSON-serialized `SessionRecord`\n * under `<prefix><id>`. Expiry is enforced via the KV store's\n * own TTL (Redis `EX`, KV `expirationTtl`).\n *\n * import { SessionService } from 'nexusjs/session';\n * import { RedisSessionStorage, createRedisClient } from 'nexusjs/redis';\n *\n * const redis = createRedisClient({ url: 'redis://localhost:6379' });\n * const storage = new RedisSessionStorage(redis, { keyPrefix: 'sess:' });\n *\n * Per-user lookups: a per-user index key\n * `<prefix>user:<crc32(userId)>` stores the list of session ids\n * for that user. The index is updated on `create` / `update`\n * and pruned by `gc()`.\n */\n\nimport type { RedisClient } from \"../../redis/types.js\";\nimport type {\n\tSessionStorage,\n\tSessionRecord,\n\tSessionData,\n\tCreateSessionOptions,\n\tUpdateSessionOptions,\n\tSessionQuery,\n} from \"../types.js\";\n\nconst DEFAULT_KEY_PREFIX = \"session:\";\n\nexport class RedisSessionStorage implements SessionStorage {\n\treadonly name: \"redis\" | \"cloudflare-kv\" = \"redis\" as const;\n\t#client: RedisClient;\n\t#keyPrefix: string;\n\n\tconstructor(client: RedisClient, options: { keyPrefix?: string } = {}) {\n\t\tthis.#client = client;\n\t\tthis.#keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;\n\t}\n\n\t#key(id: string): string {\n\t\treturn `${this.#keyPrefix}${id}`;\n\t}\n\n\t#indexKey(userId: string): string {\n\t\treturn `${this.#keyPrefix}user:${crc32(userId)}`;\n\t}\n\n\t#recordToJSON(record: SessionRecord): string {\n\t\treturn JSON.stringify({\n\t\t\tid: record.id,\n\t\t\tuserId: record.userId,\n\t\t\tdata: record.data,\n\t\t\tcreatedAt: record.createdAt.toISOString(),\n\t\t\tlastSeenAt: record.lastSeenAt.toISOString(),\n\t\t\texpiresAt: record.expiresAt.toISOString(),\n\t\t\t...(record.absoluteExpiresAt\n\t\t\t\t? { absoluteExpiresAt: record.absoluteExpiresAt.toISOString() }\n\t\t\t\t: {}),\n\t\t\t...(record.metadata ? { metadata: record.metadata } : {}),\n\t\t});\n\t}\n\n\t#recordFromJSON(s: string): SessionRecord | null {\n\t\ttry {\n\t\t\tconst obj = JSON.parse(s) as Record<string, unknown>;\n\t\t\tconst record: SessionRecord = {\n\t\t\t\tid: String(obj[\"id\"]),\n\t\t\t\tuserId: (obj[\"userId\"] as string | null) ?? null,\n\t\t\t\tdata: (obj[\"data\"] as SessionData) ?? ({} as SessionData),\n\t\t\t\tcreatedAt: new Date(String(obj[\"createdAt\"])),\n\t\t\t\tlastSeenAt: new Date(String(obj[\"lastSeenAt\"])),\n\t\t\t\texpiresAt: new Date(String(obj[\"expiresAt\"])),\n\t\t\t};\n\t\t\tconst abs = obj[\"absoluteExpiresAt\"];\n\t\t\tif (typeof abs === \"string\") record.absoluteExpiresAt = new Date(abs);\n\t\t\tconst meta = obj[\"metadata\"];\n\t\t\tif (meta && typeof meta === \"object\") {\n\t\t\t\trecord.metadata = meta as SessionRecord[\"metadata\"];\n\t\t\t}\n\t\t\treturn record;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t#ttlSeconds(record: SessionRecord): number {\n\t\tconst now = Date.now();\n\t\tconst exp = record.expiresAt.getTime();\n\t\treturn Math.max(1, Math.floor((exp - now) / 1000));\n\t}\n\n\tasync create<T = SessionData>(\n\t\topts: CreateSessionOptions<T>,\n\t): Promise<SessionRecord<T>> {\n\t\tconst now = new Date();\n\t\tconst ttl = (opts.ttlSeconds ?? 60 * 60 * 24 * 7) * 1000;\n\t\tconst record: SessionRecord<T> = {\n\t\t\tid: opts.id ?? randomId(),\n\t\t\tuserId: null,\n\t\t\tdata: (opts.data ?? {}) as T,\n\t\t\tcreatedAt: now,\n\t\t\tlastSeenAt: now,\n\t\t\texpiresAt: new Date(now.getTime() + ttl),\n\t\t};\n\t\tif (opts.absoluteTtlSeconds) {\n\t\t\trecord.absoluteExpiresAt = new Date(\n\t\t\t\tnow.getTime() + opts.absoluteTtlSeconds * 1000,\n\t\t\t);\n\t\t}\n\t\tif (opts.userId !== undefined) record.userId = opts.userId;\n\t\tif (opts.metadata) record.metadata = opts.metadata;\n\t\t// Persist immediately. The session service treats create() as\n\t\t// side-effecting; without this, the rest of the lifecycle\n\t\t// (read/update/destroy) operates on a record that was never\n\t\t// written.\n\t\tawait this.#client.set(this.#key(record.id), this.#recordToJSON(record as SessionRecord), {\n\t\t\tex: Math.max(1, Math.floor((record.expiresAt.getTime() - Date.now()) / 1000)),\n\t\t});\n\t\tif (record.userId) await this.#addToIndex(record.userId, record.id);\n\t\treturn record;\n\t}\n\n\tasync read(id: string): Promise<SessionRecord | null> {\n\t\tconst raw = await this.#client.get(this.#key(id));\n\t\tif (raw === null) return null;\n\t\tconst record = this.#recordFromJSON(raw);\n\t\tif (!record) return null;\n\t\t// Defensive absolute-expiry check.\n\t\tif (\n\t\t\trecord.absoluteExpiresAt &&\n\t\t\trecord.absoluteExpiresAt.getTime() <= Date.now()\n\t\t) {\n\t\t\tawait this.#client.del(this.#key(id));\n\t\t\treturn null;\n\t\t}\n\t\treturn record;\n\t}\n\n\tasync readMany(query?: SessionQuery): Promise<SessionRecord[]> {\n\t\tif (query?.userId) {\n\t\t\tconst idxKey = this.#indexKey(query.userId);\n\t\t\tconst idx = await this.#client.get(idxKey);\n\t\t\tconst ids: string[] = idx ? safeParseStringArray(idx) : [];\n\t\t\tconst out: SessionRecord[] = [];\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst r = await this.read(id);\n\t\t\t\tif (r) out.push(r);\n\t\t\t\telse if (query.metadata === undefined) {\n\t\t\t\t\t// Session expired; remove from index lazily.\n\t\t\t\t\tawait this.#removeFromIndex(query.userId, id);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn applyPagination(out, query);\n\t\t}\n\t\t// Full scan via the KV store's SCAN-equivalent.\n\t\tconst out: SessionRecord[] = [];\n\t\tlet cursor: string | number = \"0\";\n\t\tdo {\n\t\t\tconst res = await this.#client.scan({\n\t\t\t\tmatch: `${this.#keyPrefix}*`,\n\t\t\t\tcursor,\n\t\t\t\tcount: 100,\n\t\t\t});\n\t\t\tfor (const k of res.keys) {\n\t\t\t\tif (k.startsWith(`${this.#keyPrefix}user:`)) continue; // skip index\n\t\t\t\tconst id = k.startsWith(this.#keyPrefix)\n\t\t\t\t\t? k.slice(this.#keyPrefix.length)\n\t\t\t\t\t: k;\n\t\t\t\tconst r = await this.read(id);\n\t\t\t\tif (r) out.push(r);\n\t\t\t}\n\t\t\tcursor = res.cursor;\n\t\t} while (cursor !== \"0\" && cursor !== 0);\n\t\treturn applyPagination(out, query);\n\t}\n\n\tasync update<T = SessionData>(\n\t\tid: string,\n\t\topts: UpdateSessionOptions<T>,\n\t): Promise<SessionRecord<T> | null> {\n\t\tconst existing = (await this.read(id)) as SessionRecord<T> | null;\n\t\tif (!existing) return null;\n\t\tconst next: SessionRecord<T> = {\n\t\t\t...existing,\n\t\t\tlastSeenAt: new Date(),\n\t\t};\n\t\tif (opts.dataPatch) {\n\t\t\tnext.data = { ...(existing.data as object), ...(opts.dataPatch as object) } as T;\n\t\t}\n\t\tif (opts.extendSeconds !== undefined) {\n\t\t\tconst newExpiry = Date.now() + opts.extendSeconds * 1000;\n\t\t\tif (\n\t\t\t\t!next.absoluteExpiresAt ||\n\t\t\t\tnewExpiry < next.absoluteExpiresAt.getTime()\n\t\t\t) {\n\t\t\t\tnext.expiresAt = new Date(newExpiry);\n\t\t\t}\n\t\t}\n\t\tconst userIdChanged = opts.userId !== undefined && opts.userId !== existing.userId;\n\t\tif (opts.userId !== undefined) next.userId = opts.userId;\n\t\tawait this.#client.set(this.#key(id), this.#recordToJSON(next as SessionRecord), {\n\t\t\tex: this.#ttlSeconds(next as SessionRecord),\n\t\t});\n\t\tif (userIdChanged) {\n\t\t\tawait this.#removeFromIndex(existing.userId, id);\n\t\t}\n\t\tif (next.userId) await this.#addToIndex(next.userId, id);\n\t\treturn next;\n\t}\n\n\tasync destroy(id: string): Promise<boolean> {\n\t\tconst existing = await this.read(id);\n\t\tif (!existing) return false;\n\t\tif (existing.userId) await this.#removeFromIndex(existing.userId, id);\n\t\tawait this.#client.del(this.#key(id));\n\t\treturn true;\n\t}\n\n\tasync destroyMany(query: SessionQuery): Promise<number> {\n\t\tconst sessions = await this.readMany(query);\n\t\tfor (const s of sessions) await this.destroy(s.id);\n\t\treturn sessions.length;\n\t}\n\n\tasync touch(id: string): Promise<SessionRecord | null> {\n\t\tconst existing = await this.read(id);\n\t\tif (!existing) return null;\n\t\tconst next: SessionRecord = {\n\t\t\t...existing,\n\t\t\tlastSeenAt: new Date(),\n\t\t\texpiresAt: new Date(\n\t\t\t\tDate.now() + 60 * 60 * 24 * 7 * 1000, // 7d\n\t\t\t),\n\t\t};\n\t\tawait this.#client.set(this.#key(id), this.#recordToJSON(next as SessionRecord), {\n\t\t\tex: this.#ttlSeconds(next),\n\t\t});\n\t\treturn next;\n\t}\n\n\tasync gc(): Promise<number> {\n\t\t// KV stores evict on TTL; this sweeps orphaned index entries.\n\t\tlet cursor: string | number = \"0\";\n\t\tlet removed = 0;\n\t\tdo {\n\t\t\tconst res = await this.#client.scan({\n\t\t\t\tmatch: `${this.#keyPrefix}user:*`,\n\t\t\t\tcursor,\n\t\t\t\tcount: 100,\n\t\t\t});\n\t\t\tfor (const k of res.keys) {\n\t\t\t\tconst raw = await this.#client.get(this.#keyPrefix + k);\n\t\t\t\tconst ids = raw ? safeParseStringArray(raw) : [];\n\t\t\t\tconst live: string[] = [];\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (await this.read(id)) live.push(id);\n\t\t\t\t}\n\t\t\t\tif (live.length === 0) {\n\t\t\t\t\tawait this.#client.del(this.#keyPrefix + k);\n\t\t\t\t\tremoved++;\n\t\t\t\t} else if (live.length !== ids.length) {\n\t\t\t\t\tawait this.#client.set(\n\t\t\t\t\t\tthis.#keyPrefix + k,\n\t\t\t\t\t\tJSON.stringify(live),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcursor = res.cursor;\n\t\t} while (cursor !== \"0\" && cursor !== 0);\n\t\treturn removed;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tlet cursor: string | number = \"0\";\n\t\tdo {\n\t\t\tconst res = await this.#client.scan({\n\t\t\t\tmatch: `${this.#keyPrefix}*`,\n\t\t\t\tcursor,\n\t\t\t\tcount: 100,\n\t\t\t});\n\t\t\tfor (const k of res.keys) {\n\t\t\t\tawait this.#client.del(this.#keyPrefix + k);\n\t\t\t}\n\t\t\tcursor = res.cursor;\n\t\t} while (cursor !== \"0\" && cursor !== 0);\n\t}\n\n\tasync stop(): Promise<void> {\n\t\t// Some adapters (NodeRedis) have sockets to close. Memory /\n\t\t// Bun / Cloudflare adapters are no-ops here, so we just\n\t\t// call close() which is safe to call multiple times.\n\t\tawait this.#client.close();\n\t}\n\n\t/* ------------- internals ------------- */\n\n\tasync #addToIndex(userId: string, sessionId: string): Promise<void> {\n\t\tconst k = this.#indexKey(userId);\n\t\tconst raw = await this.#client.get(k);\n\t\tconst ids = raw ? safeParseStringArray(raw) : [];\n\t\tif (!ids.includes(sessionId)) ids.push(sessionId);\n\t\tawait this.#client.set(k, JSON.stringify(ids));\n\t}\n\n\tasync #removeFromIndex(\n\t\tuserId: string | null,\n\t\tsessionId: string,\n\t): Promise<void> {\n\t\tif (!userId) return;\n\t\tconst k = this.#indexKey(userId);\n\t\tconst raw = await this.#client.get(k);\n\t\tif (!raw) return;\n\t\tconst ids = safeParseStringArray(raw).filter((id) => id !== sessionId);\n\t\tif (ids.length === 0) {\n\t\t\tawait this.#client.del(k);\n\t\t} else {\n\t\t\tawait this.#client.set(k, JSON.stringify(ids));\n\t\t}\n\t}\n}\n\n/**\n * `CloudflareKVSessionStorage` — Cloudflare Workers KV backed\n * session storage. Same interface as `RedisSessionStorage`; the\n * underlying `RedisClient` is a `CloudflareKVAdapter` from\n * `nexusjs/redis`.\n */\nexport class CloudflareKVSessionStorage extends RedisSessionStorage {\n\toverride readonly name: \"cloudflare-kv\" = \"cloudflare-kv\" as const;\n}\n\nfunction randomId(bytes = 24): string {\n\tconst arr = new Uint8Array(bytes);\n\tcrypto.getRandomValues(arr);\n\tlet s = \"\";\n\tfor (const b of arr) s += String.fromCharCode(b);\n\treturn btoa(s).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction safeParseStringArray(raw: string): string[] {\n\ttry {\n\t\tconst v = JSON.parse(raw);\n\t\treturn Array.isArray(v) ? v.filter((x) => typeof x === \"string\") : [];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction applyPagination(\n\tlist: SessionRecord[],\n\tquery: SessionQuery | undefined,\n): SessionRecord[] {\n\tif (!query) return list;\n\tconst offset = query.offset ?? 0;\n\tconst limit = query.limit ?? list.length;\n\treturn list.slice(offset, offset + limit);\n}\n\n/** Tiny CRC32 for deterministic index keying. */\nfunction crc32(s: string): string {\n\tlet c = 0xffffffff;\n\tfor (let i = 0; i < s.length; i++) {\n\t\tc ^= s.charCodeAt(i);\n\t\tfor (let k = 0; k < 8; k++) {\n\t\t\tc = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n\t\t}\n\t}\n\treturn (c ^ 0xffffffff).toString(16);\n}\n",
15
+ "/**\n * @Module decorator.\n *\n * Marks a class as a Nest-style module: a logical grouping of\n * controllers and providers with explicit imports/exports.\n *\n * @example\n * ```ts\n * @Module({\n * imports: [UserModule],\n * controllers: [UserController],\n * providers: [UserService],\n * exports: [UserService],\n * })\n * class AppModule {}\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ModuleOptions, Type } from \"../di/tokens.js\";\n\nexport function Module(options: ModuleOptions = {}): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(METADATA_KEY.MODULE, options, target);\n\t};\n}\n\n/** Read the @Module options from a class. */\nexport function getModuleOptions(target: Type<any>): ModuleOptions {\n\treturn Reflect.getMetadata(METADATA_KEY.MODULE, target) ?? {};\n}\n",
16
+ "/**\n * Convenience barrel for all decorators.\n */\nexport * from \"./module.js\";\nexport * from \"./controller.js\";\nexport * from \"./injectable.js\";\nexport * from \"./http-methods.js\";\nexport * from \"./params.js\";\nexport * from \"./validate.js\";\nexport * from \"./repository.js\";\nexport * from \"./metadata.js\";\n",
17
+ "/**\n * @Injectable decorator.\n *\n * Marks a class as available for DI. The container uses reflect-metadata's\n * `design:paramtypes` to read constructor parameter types and resolve them\n * automatically.\n *\n * @example\n * ```ts\n * @Injectable()\n * class UserService {\n * constructor(private repo: UserRepository) {}\n * }\n *\n * @Injectable({ scope: 'request' })\n * class RequestContext {\n * constructor(@Inject(REQUEST) private req: any) {}\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\n\nexport interface InjectableOptions {\n\tscope?: \"singleton\" | \"request\" | \"transient\";\n}\n\nexport function Injectable(options: InjectableOptions = {}): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);\n\t\tif (options.scope) {\n\t\t\tReflect.defineMetadata(\n\t\t\t\t\"nexus:di:scope\",\n\t\t\t\toptions.scope,\n\t\t\t\ttarget,\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isInjectable(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.INJECTABLE, target);\n}\n\n/**\n * Read the scope declared on a class via `@Injectable({ scope })`.\n * Returns undefined when no scope is declared (defaults to singleton).\n */\nexport function getScope(\n\ttarget: any,\n): \"singleton\" | \"request\" | \"transient\" | undefined {\n\treturn Reflect.getMetadata(\"nexus:di:scope\", target);\n}\n\n/**\n * Mark a parameter as resolved by a specific token instead of its declared\n * type. Useful for interfaces, abstract classes, or string tokens.\n *\n * @example\n * ```ts\n * constructor(@Inject('CONFIG') private config: AppConfig) {}\n * ```\n */\nexport function Inject<T = any>(token: any): ParameterDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol | undefined,\n\t\tparameterIndex: number,\n\t) => {\n\t\tconst existing: Map<number, any> =\n\t\t\tReflect.getMetadata(METADATA_KEY.INJECT, target) ?? new Map();\n\t\texisting.set(parameterIndex, token);\n\t\tReflect.defineMetadata(METADATA_KEY.INJECT, existing, target);\n\t};\n}",
18
+ "/**\n * @Repository decorator.\n *\n * Marks a class as a Spring-style repository. Repositories are normal\n * `@Injectable()` classes; the decorator is a marker so the framework\n * can register them with a database adapter (Drizzle/Prisma) and emit\n * a friendly error if you forget to wire one.\n *\n * @example\n * ```ts\n * @Repository()\n * class UserRepository {\n * findAll() { return db.select().from(users); }\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { InjectionToken } from \"../di/tokens.js\";\n\nexport function Repository(entityToken?: InjectionToken<any>): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(\n\t\t\tMETADATA_KEY.REPOSITORY,\n\t\t\t{ entity: entityToken },\n\t\t\ttarget,\n\t\t);\n\t\tReflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);\n\t};\n}\n\nexport function getRepositoryMetadata(\n\ttarget: any,\n): { entity?: InjectionToken<any> } | undefined {\n\treturn Reflect.getMetadata(METADATA_KEY.REPOSITORY, target);\n}\n\nexport function isRepository(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.REPOSITORY, target);\n}\n",
19
+ "/**\n * Reflect-metadata helper. Centralizes the keys the framework uses so\n * decorator files stay clean.\n */\nexport { METADATA_KEY, PARAM_TYPES, HTTP_METHODS } from \"../constants.js\";\nexport type { MetadataKey, ParamType, HttpMethod } from \"../constants.js\";\n",
20
+ "/**\n * `SessionService` — DI-friendly facade over a `SessionStorage`.\n *\n * Two layers:\n * - `SessionService` is the user-facing facade; controllers and\n * services inject this and call `create / read / update /\n * destroy / readMany`.\n * - The underlying `SessionStorage` is one of the registered\n * backends (`cookie` / `memory` / `redis`).\n *\n * Cookie-specific helpers (`buildSetCookie`, `buildClearCookie`) are\n * exposed when the cookie backend is configured.\n */\n\nimport { Inject, Injectable } from '../core/decorators/index.js';\nimport {\n\tRedisSessionStorage,\n\tCloudflareKVSessionStorage,\n} from './backends/redis.js';\nimport type {\n\tSessionStorage,\n\tSessionConfig,\n\tSessionRecord,\n\tSessionData,\n\tCreateSessionOptions,\n\tUpdateSessionOptions,\n\tSessionQuery,\n\tSessionEvent,\n\tSessionEventListener,\n} from './types.js';\nimport {\n\tMemorySessionStorage,\n\tCookieSessionStorage,\n\tencodeSessionCookie,\n\tdecodeSessionCookie,\n} from './backends/index.js';\n\n@Injectable()\nexport class SessionService {\n\t/** DI token — use with `@Inject(SessionService.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for('nexus:SessionService');\n\n\treadonly storage: SessionStorage;\n\t#listeners = new Set<SessionEventListener>();\n\t#memory: MemorySessionStorage | null = null;\n\t#cookie: CookieSessionStorage | null = null;\n\n\tconstructor(@Inject('SESSION_CONFIG') private readonly config: SessionConfig = {}) {\n\t\tthis.storage = this.#createBackend(config);\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\tasync start(): Promise<void> {\n\t\tif (this.#memory) this.#memory.start();\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (this.#memory) await this.#memory.stop();\n\t\tif (this.storage.stop) await this.storage.stop();\n\t}\n\n\t// ===========================================================================\n\t// CRUD\n\t// ===========================================================================\n\n\tasync create<T = SessionData>(opts: CreateSessionOptions<T> = {}): Promise<SessionRecord<T>> {\n\t\tconst merged = {\n\t\t\tttlSeconds: this.config.defaults?.ttlSeconds,\n\t\t\tabsoluteTtlSeconds: this.config.defaults?.absoluteTtlSeconds,\n\t\t\t...opts,\n\t\t};\n\t\tconst record = await this.storage.create(merged);\n\t\tthis.#emit({ kind: 'session:created', id: record.id, userId: record.userId });\n\t\treturn record;\n\t}\n\n\tasync read(id: string): Promise<SessionRecord | null> {\n\t\tconst record = await this.storage.read(id);\n\t\tthis.#emit({ kind: 'session:read', id });\n\t\treturn record;\n\t}\n\n\tasync readMany(query?: SessionQuery): Promise<SessionRecord[]> {\n\t\treturn this.storage.readMany(query);\n\t}\n\n\tasync update<T = SessionData>(\n\t\tid: string,\n\t\topts: UpdateSessionOptions<T>,\n\t): Promise<SessionRecord<T> | null> {\n\t\tconst updated = await this.storage.update(id, opts);\n\t\tif (updated) this.#emit({ kind: 'session:updated', id });\n\t\treturn updated;\n\t}\n\n\tasync destroy(id: string, reason: 'logout' | 'expired' | 'admin' | 'unknown' = 'logout'): Promise<boolean> {\n\t\tconst record = await this.storage.read(id);\n\t\tconst ok = await this.storage.destroy(id);\n\t\tif (ok) {\n\t\t\tthis.#emit({\n\t\t\t\tkind: 'session:destroyed',\n\t\t\t\tid,\n\t\t\t\tuserId: record?.userId ?? null,\n\t\t\t\treason,\n\t\t\t});\n\t\t}\n\t\treturn ok;\n\t}\n\n\tasync destroyMany(query: SessionQuery): Promise<number> {\n\t\treturn this.storage.destroyMany(query);\n\t}\n\n\tasync gc(): Promise<number> {\n\t\treturn this.storage.gc();\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait this.storage.clear();\n\t}\n\n\t// ===========================================================================\n\t// Cookie helpers (only when backend = 'cookie')\n\t// ===========================================================================\n\n\t/** Build a `Set-Cookie` header value for a session. Cookie backend only. */\n\tbuildSetCookie(record: SessionRecord): string | null {\n\t\tif (!this.#cookie) return null;\n\t\treturn this.#cookie.buildSetCookie(record);\n\t}\n\n\t/** Build a `Set-Cookie` header value that clears the cookie. */\n\tbuildClearCookie(): string | null {\n\t\tif (!this.#cookie) return null;\n\t\treturn this.#cookie.buildClearCookie();\n\t}\n\n\t/** Cookie name (e.g. \"nexus.sess\"). */\n\tget cookieName(): string | null {\n\t\treturn this.#cookie?.cookieName ?? null;\n\t}\n\n\t/** Decode a session cookie value. Returns null on tampering/expired. */\n\tdecodeCookie(cookieValue: string): SessionRecord | null {\n\t\tif (!this.#cookie) return null;\n\t\tconst record = this.#cookie.decode(cookieValue);\n\t\tif (!record) return null;\n\t\tif (record.expiresAt.getTime() <= Date.now()) {\n\t\t\tthis.#emit({\n\t\t\t\tkind: 'session:destroyed',\n\t\t\t\tid: record.id,\n\t\t\t\tuserId: record.userId,\n\t\t\t\treason: 'expired',\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t\treturn record;\n\t}\n\n\t// ===========================================================================\n\t// Static cookie helpers (work without a SessionService instance)\n\t// ===========================================================================\n\n\tstatic encodeCookie(record: SessionRecord, secret: string): string {\n\t\treturn encodeSessionCookie(record, secret);\n\t}\n\n\tstatic decodeCookie<T = SessionData>(\n\t\tcookieValue: string,\n\t\tsecret: string,\n\t): SessionRecord<T> | null {\n\t\treturn decodeSessionCookie(cookieValue, secret);\n\t}\n\n\t// ===========================================================================\n\t// Events\n\t// ===========================================================================\n\n\ton(listener: SessionEventListener): () => void {\n\t\tthis.#listeners.add(listener);\n\t\treturn () => this.#listeners.delete(listener);\n\t}\n\n\t// ===========================================================================\n\t// Session rotation (security)\n\t// ===========================================================================\n\n\t/**\n\t * Rotate a session's id (session-fixation defense). Creates a new\n\t * record with the same data / metadata, destroys the old one.\n\t */\n\tasync rotate(id: string): Promise<SessionRecord | null> {\n\t\tconst old = await this.storage.read(id);\n\t\tif (!old) return null;\n\t\tconst fresh = await this.storage.create({\n\t\t\tttlSeconds: Math.max(60, Math.floor((old.expiresAt.getTime() - Date.now()) / 1000)),\n\t\t\tabsoluteTtlSeconds: old.absoluteExpiresAt\n\t\t\t\t? Math.max(60, Math.floor((old.absoluteExpiresAt.getTime() - Date.now()) / 1000))\n\t\t\t\t: undefined,\n\t\t\tdata: old.data,\n\t\t\tmetadata: old.metadata,\n\t\t});\n\t\t// Carry over userId (rotate doesn't sign out).\n\t\t(fresh as { userId: string | null }).userId = old.userId;\n\t\tawait this.storage.destroy(id);\n\t\tthis.#emit({ kind: 'session:rotated', oldId: id, newId: fresh.id });\n\t\treturn fresh;\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\t#createBackend(config: SessionConfig): SessionStorage {\n\t\tswitch (config.backend ?? 'cookie') {\n\t\t\tcase 'memory': {\n\t\t\t\tconst backend = new MemorySessionStorage({\n\t\t\t\t\tgcIntervalMs: config.memory?.gcIntervalMs,\n\t\t\t\t\tmaxSessions: config.memory?.maxSessions,\n\t\t\t\t});\n\t\t\t\tthis.#memory = backend;\n\t\t\t\treturn backend;\n\t\t\t}\n\t\t\tcase 'cookie': {\n\t\t\t\tif (!config.cookie) {\n\t\t\t\t\tthrow new Error('[session] backend=cookie requires `cookie.secret` in config.');\n\t\t\t\t}\n\t\t\t\tconst backend = new CookieSessionStorage(config.cookie);\n\t\t\t\tthis.#cookie = backend;\n\t\t\t\treturn backend;\n\t\t\t}\n\t\t\tcase 'redis': {\n\t\t\t\tif (!config.redis) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'[session] backend=redis requires `redis` in config. ' +\n\t\t\t\t\t\t\t'Provide `{ client: RedisClient, keyPrefix?: string }`. ' +\n\t\t\t\t\t\t\t'Use `createRedisClient({ ... })` from `nexusjs/redis`.',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn new RedisSessionStorage(config.redis.client, {\n\t\t\t\t\tkeyPrefix: config.redis.keyPrefix,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'cloudflare-kv': {\n\t\t\t\tif (!config.cloudflareKv) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'[session] backend=cloudflare-kv requires `cloudflareKv` in config. ' +\n\t\t\t\t\t\t\t'Provide `{ client: RedisClient, keyPrefix?: string }` where ' +\n\t\t\t\t\t\t\t'`client` is a `CloudflareKVAdapter` from `nexusjs/redis`.',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn new CloudflareKVSessionStorage(config.cloudflareKv.client, {\n\t\t\t\t\tkeyPrefix: config.cloudflareKv.keyPrefix,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'database': {\n\t\t\t\tif (!config.database) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'[session] backend=database requires `database` in config. ' +\n\t\t\t\t\t\t\t'Provide `{ db: DrizzleService, tableName?: string }`.',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { DrizzleSessionStorage } = require('./backends/drizzle.js') as typeof import('./backends/drizzle.js');\n\t\t\t\tconst backend = new DrizzleSessionStorage({\n\t\t\t\t\tdb: config.database.db as any,\n\t\t\t\t\ttableName: config.database.tableName,\n\t\t\t\t});\n\t\t\t\treturn backend;\n\t\t\t}\n\t\t}\n\t}\n\n\t#emit(event: SessionEvent): void {\n\t\tfor (const l of this.#listeners) {\n\t\t\tvoid Promise.resolve(l(event));\n\t\t}\n\t}\n}",
21
+ "/**\n * `SessionModule` — drop-in module for adding sessions to a NexusJS\n * app.\n *\n * Usage:\n * // src/app/app.module.ts\n * @Module({\n * imports: [\n * SessionModule.forRoot({\n * backend: 'cookie',\n * cookie: { secret: process.env.SESSION_SECRET! },\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * // any controller\n * @Controller('/cart')\n * class CartController {\n * @Post('/')\n * add(@Session() session: SessionRecord) {\n * const cart = (session.data.cart ?? []) as Item[];\n * // ...\n * return this.sessionService.update(session.id, { dataPatch: { cart } });\n * }\n * }\n */\n\nimport \"reflect-metadata\";\nimport { Module } from \"../core/decorators/module.js\";\nimport { SessionService } from \"./session.service.js\";\nimport type { SessionConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tSessionService,\n\t\t{ provide: SessionService.TOKEN, useExisting: SessionService },\n\t],\n\texports: [SessionService, SessionService.TOKEN],\n})\nexport class SessionModule {\n\tstatic forRoot(config: SessionConfig = {}) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tSessionService,\n\t\t\t\t{ provide: SessionService.TOKEN, useExisting: SessionService },\n\t\t\t\t{ provide: \"SESSION_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [SessionService, SessionService.TOKEN],\n\t\t})\n\t\tclass ConfiguredSessionModule {}\n\n\t\tObject.defineProperty(ConfiguredSessionModule, \"name\", {\n\t\t\tvalue: \"ConfiguredSessionModule\",\n\t\t});\n\n\t\treturn ConfiguredSessionModule;\n\t}\n}\n",
22
+ "/**\n * `@Session()` — controller parameter decorator that injects the\n * current session record (or null when unauthenticated).\n *\n * Mirrors `@CurrentUser()` from `nexusjs/auth` (shorter name follows\n * the same convention as `@Req()` / `@Body()` / `@Ctx()` — the most\n * common request decorator).\n *\n * Usage:\n * @Get('/profile')\n * me(@Session() session: SessionRecord) {\n * return session;\n * }\n *\n * @Get('/admin')\n * admin(@Session({ required: true, role: 'admin' }) s: SessionRecord) {\n * return this.adminService.runFor(s.userId!);\n * }\n */\n\nimport \"reflect-metadata\";\nimport { createParamDecorator } from \"../../core/decorators/params.js\";\nimport { PARAM_TYPES } from \"../../core/constants.js\";\nimport type { SessionRecord, SessionData } from \"../types.js\";\n\nexport interface SessionOptions<T = SessionData> {\n\t/**\n\t * Throw a synthetic 401 when no session is present. Default: false.\n\t * When true, the framework returns 401 without invoking the handler.\n\t */\n\trequired?: boolean;\n\t/**\n\t * Throw 403 when `assert(session)` returns false.\n\t */\n\tassert?: (session: SessionRecord<T>) => boolean | Promise<boolean>;\n\t/**\n\t * Patch the session's data on each access (e.g. mark \"last seen at\").\n\t * Off by default to keep read paths side-effect-free.\n\t */\n\ttouch?: boolean;\n}\n\n/**\n * Inject the current session record (or null if unauthenticated).\n */\nexport function Session<T = SessionData>(\n\toptions: SessionOptions<T> = {},\n): ParameterDecorator {\n\treturn createParamDecorator(PARAM_TYPES.USER, options as never);\n}\n\n/**\n * Convenience: throw 401 when no session is present.\n */\nexport class UnauthenticatedError extends Error {\n\treadonly status = 401;\n\tconstructor(message = \"Authentication required.\") {\n\t\tsuper(message);\n\t\tthis.name = \"UnauthenticatedError\";\n\t}\n}\n\n/**\n * Convenience: throw 403 when a session-level check fails.\n */\nexport class SessionForbiddenError extends Error {\n\treadonly status = 403;\n\tconstructor(message = \"Insufficient permissions.\") {\n\t\tsuper(message);\n\t\tthis.name = \"SessionForbiddenError\";\n\t}\n}\n",
23
+ "/**\n * Built-in session middleware.\n *\n * Reads the session cookie (`sid` by default) and populates\n * `c.var.nexus.user` so the `@Session()` decorator works in\n * controllers without manual middleware wiring.\n *\n * The middleware is auto-installed by `SessionModule.forRoot()`.\n * If you need custom behavior (e.g. a different cookie name),\n * import this function and mount it manually in `main.ts`.\n *\n * Usage (manual, when SessionModule.forRoot is not used):\n *\n * import { sessionMiddleware } from 'nexusjs/session';\n * const sessions = app.container.resolve(SessionService.TOKEN);\n * app.server.app.use('*', sessionMiddleware(sessions, { cookieName: 'my_sid' }));\n */\n\nimport type { MiddlewareHandler } from \"hono\";\nimport type { SessionService } from \"./session.service.js\";\n\nexport interface SessionMiddlewareOptions {\n\t/** Cookie name to read the session ID from. Default: `sid`. */\n\tcookieName?: string;\n}\n\n/**\n * Build a Hono middleware that reads the session cookie and populates\n * `c.var.nexus.user` for the `@Session()` decorator.\n */\nexport function sessionMiddleware(\n\tsessions: SessionService,\n\toptions: SessionMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst cookieName = options.cookieName ?? \"sid\";\n\n\treturn async (c, next) => {\n\t\tconst cookie = c.req.header(\"cookie\") ?? \"\";\n\t\tconst escaped = cookieName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tconst re = new RegExp(`(?:^|;\\\\s*)${escaped}=([^;]+)`);\n\t\tconst match = cookie.match(re);\n\n\t\tif (match) {\n\t\t\ttry {\n\t\t\t\tconst record = sessions.decodeCookie(decodeURIComponent(match[1]));\n\t\t\t\tif (record) {\n\t\t\t\t\tc.set(\"nexus\", { user: record });\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Malformed cookie — ignore.\n\t\t\t}\n\t\t}\n\n\t\tawait next();\n\t};\n}\n"
24
+ ],
25
+ "mappings": "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",
26
+ "debugId": "78B3D5568F05BB1064756E2164756E21",
27
+ "names": []
28
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Built-in session middleware.
3
+ *
4
+ * Reads the session cookie (`sid` by default) and populates
5
+ * `c.var.nexus.user` so the `@Session()` decorator works in
6
+ * controllers without manual middleware wiring.
7
+ *
8
+ * The middleware is auto-installed by `SessionModule.forRoot()`.
9
+ * If you need custom behavior (e.g. a different cookie name),
10
+ * import this function and mount it manually in `main.ts`.
11
+ *
12
+ * Usage (manual, when SessionModule.forRoot is not used):
13
+ *
14
+ * import { sessionMiddleware } from 'nexusjs/session';
15
+ * const sessions = app.container.resolve(SessionService.TOKEN);
16
+ * app.server.app.use('*', sessionMiddleware(sessions, { cookieName: 'my_sid' }));
17
+ */
18
+ import type { MiddlewareHandler } from "hono";
19
+ import type { SessionService } from "./session.service.js";
20
+ export interface SessionMiddlewareOptions {
21
+ /** Cookie name to read the session ID from. Default: `sid`. */
22
+ cookieName?: string;
23
+ }
24
+ /**
25
+ * Build a Hono middleware that reads the session cookie and populates
26
+ * `c.var.nexus.user` for the `@Session()` decorator.
27
+ */
28
+ export declare function sessionMiddleware(sessions: SessionService, options?: SessionMiddlewareOptions): MiddlewareHandler;
29
+ //# sourceMappingURL=session-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-middleware.d.ts","sourceRoot":"","sources":["../../src/session/session-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,wBAAwB;IACxC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,wBAA6B,GACpC,iBAAiB,CAsBnB"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `SessionModule` — drop-in module for adding sessions to a NexusJS
3
+ * app.
4
+ *
5
+ * Usage:
6
+ * // src/app/app.module.ts
7
+ * @Module({
8
+ * imports: [
9
+ * SessionModule.forRoot({
10
+ * backend: 'cookie',
11
+ * cookie: { secret: process.env.SESSION_SECRET! },
12
+ * }),
13
+ * ],
14
+ * })
15
+ * export class AppModule {}
16
+ *
17
+ * // any controller
18
+ * @Controller('/cart')
19
+ * class CartController {
20
+ * @Post('/')
21
+ * add(@Session() session: SessionRecord) {
22
+ * const cart = (session.data.cart ?? []) as Item[];
23
+ * // ...
24
+ * return this.sessionService.update(session.id, { dataPatch: { cart } });
25
+ * }
26
+ * }
27
+ */
28
+ import "reflect-metadata";
29
+ import type { SessionConfig } from "./types.js";
30
+ export declare class SessionModule {
31
+ static forRoot(config?: SessionConfig): {
32
+ new (): {};
33
+ };
34
+ }
35
+ //# sourceMappingURL=session.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.module.d.ts","sourceRoot":"","sources":["../../src/session/session.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAOa,aAAa;IACzB,MAAM,CAAC,OAAO,CAAC,MAAM,GAAE,aAAkB;;;CAiBzC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `SessionService` — DI-friendly facade over a `SessionStorage`.
3
+ *
4
+ * Two layers:
5
+ * - `SessionService` is the user-facing facade; controllers and
6
+ * services inject this and call `create / read / update /
7
+ * destroy / readMany`.
8
+ * - The underlying `SessionStorage` is one of the registered
9
+ * backends (`cookie` / `memory` / `redis`).
10
+ *
11
+ * Cookie-specific helpers (`buildSetCookie`, `buildClearCookie`) are
12
+ * exposed when the cookie backend is configured.
13
+ */
14
+ import type { SessionStorage, SessionConfig, SessionRecord, SessionData, CreateSessionOptions, UpdateSessionOptions, SessionQuery, SessionEventListener } from './types.js';
15
+ export declare class SessionService {
16
+ #private;
17
+ private readonly config;
18
+ /** DI token — use with `@Inject(SessionService.TOKEN)`. */
19
+ static readonly TOKEN: unique symbol;
20
+ readonly storage: SessionStorage;
21
+ constructor(config?: SessionConfig);
22
+ start(): Promise<void>;
23
+ stop(): Promise<void>;
24
+ create<T = SessionData>(opts?: CreateSessionOptions<T>): Promise<SessionRecord<T>>;
25
+ read(id: string): Promise<SessionRecord | null>;
26
+ readMany(query?: SessionQuery): Promise<SessionRecord[]>;
27
+ update<T = SessionData>(id: string, opts: UpdateSessionOptions<T>): Promise<SessionRecord<T> | null>;
28
+ destroy(id: string, reason?: 'logout' | 'expired' | 'admin' | 'unknown'): Promise<boolean>;
29
+ destroyMany(query: SessionQuery): Promise<number>;
30
+ gc(): Promise<number>;
31
+ clear(): Promise<void>;
32
+ /** Build a `Set-Cookie` header value for a session. Cookie backend only. */
33
+ buildSetCookie(record: SessionRecord): string | null;
34
+ /** Build a `Set-Cookie` header value that clears the cookie. */
35
+ buildClearCookie(): string | null;
36
+ /** Cookie name (e.g. "nexus.sess"). */
37
+ get cookieName(): string | null;
38
+ /** Decode a session cookie value. Returns null on tampering/expired. */
39
+ decodeCookie(cookieValue: string): SessionRecord | null;
40
+ static encodeCookie(record: SessionRecord, secret: string): string;
41
+ static decodeCookie<T = SessionData>(cookieValue: string, secret: string): SessionRecord<T> | null;
42
+ on(listener: SessionEventListener): () => void;
43
+ /**
44
+ * Rotate a session's id (session-fixation defense). Creates a new
45
+ * record with the same data / metadata, destroys the old one.
46
+ */
47
+ rotate(id: string): Promise<SessionRecord | null>;
48
+ }
49
+ //# sourceMappingURL=session.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.service.d.ts","sourceRoot":"","sources":["../../src/session/session.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EAEZ,oBAAoB,EACpB,MAAM,YAAY,CAAC;AAQpB,qBACa,cAAc;;IASY,OAAO,CAAC,QAAQ,CAAC,MAAM;IAR7D,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAAC,KAAK,gBAAsC;IAE3D,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;gBAKsB,MAAM,GAAE,aAAkB;IAQ3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,MAAM,CAAC,CAAC,GAAG,WAAW,EAAE,IAAI,GAAE,oBAAoB,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAWtF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAM/C,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIxD,MAAM,CAAC,CAAC,GAAG,WAAW,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAM7B,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAcpG,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,4EAA4E;IAC5E,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI;IAKpD,gEAAgE;IAChE,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAKjC,uCAAuC;IACvC,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,wEAAwE;IACxE,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAoBvD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAIlE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,WAAW,EAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACZ,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ1B,EAAE,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAS9C;;;OAGG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAsFvD"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Session types — the public contract for `nexusjs/session`.
3
+ *
4
+ * Provides a uniform session-storage abstraction with multiple
5
+ * backends (cookie, memory, Redis, DB) and an optional integration
6
+ * with `nexusjs/auth` for richer auth flows.
7
+ *
8
+ * Mirrors common session-management libraries (express-session,
9
+ * iron-session, @auth/core's session model).
10
+ */
11
+ /**
12
+ * A session record. Stored by the backend, returned by read operations.
13
+ *
14
+ * `data` is a free-form blob for app-specific state (flash messages,
15
+ * guest cart, CSRF tokens, ...). `userId` is null for anonymous
16
+ * (unauthenticated) sessions.
17
+ */
18
+ export interface SessionRecord<T = Record<string, unknown>> {
19
+ /** Unique session id (random, opaque, 32+ bytes). */
20
+ id: string;
21
+ /** User id, or null for anonymous sessions. */
22
+ userId: string | null;
23
+ /** Free-form per-session data. */
24
+ data: T;
25
+ /** When the session was created. */
26
+ createdAt: Date;
27
+ /** Last access time (updated on every read by default). */
28
+ lastSeenAt: Date;
29
+ /** Hard expiry. After this point the session is invalid. */
30
+ expiresAt: Date;
31
+ /** Optional absolute timeout (sliding window disabled). */
32
+ absoluteExpiresAt?: Date;
33
+ /** Client metadata — IP, user agent, etc. — for security audits. */
34
+ metadata?: SessionMetadata;
35
+ }
36
+ export interface SessionMetadata {
37
+ ipAddress?: string;
38
+ userAgent?: string;
39
+ fingerprint?: string;
40
+ /** When the session was last rotated (re-generated id). */
41
+ lastRotatedAt?: Date;
42
+ }
43
+ export type SessionData = Record<string, unknown>;
44
+ export interface CreateSessionOptions<T = SessionData> {
45
+ /** User id associated with the session (set on sign-in). */
46
+ userId?: string | null;
47
+ /** TTL in seconds. Default: 7 days. */
48
+ ttlSeconds?: number;
49
+ /** Hard absolute TTL regardless of activity. */
50
+ absoluteTtlSeconds?: number;
51
+ /** Optional client metadata. */
52
+ metadata?: SessionMetadata;
53
+ /** Initial data. */
54
+ data?: T;
55
+ /** Pre-generated id (for session-fixation defense). */
56
+ id?: string;
57
+ /** Whether to issue a Set-Cookie header. Default: false (manual). */
58
+ issueCookie?: boolean;
59
+ }
60
+ export interface UpdateSessionOptions<T = SessionData> {
61
+ /** Set the userId (or null to log out). */
62
+ userId?: string | null;
63
+ /** Replace data with a partial patch. */
64
+ dataPatch?: Partial<T>;
65
+ /** Extend the sliding expiry by N seconds. */
66
+ extendSeconds?: number;
67
+ }
68
+ export interface SessionQuery {
69
+ userId?: string;
70
+ /** Filter by metadata (e.g. ipAddress). */
71
+ metadata?: Partial<SessionMetadata>;
72
+ /** Skip the first N records (for pagination). */
73
+ offset?: number;
74
+ /** Max records to return. */
75
+ limit?: number;
76
+ }
77
+ /**
78
+ * SessionStorage contract — every backend implements this.
79
+ *
80
+ * Reads default to "sliding" expiry: touching a record extends its
81
+ * `expiresAt`. Backends that don't support atomic sliding updates
82
+ * must emulate it in user code (or accept the simpler non-sliding
83
+ * model).
84
+ */
85
+ export interface SessionStorage {
86
+ /** Backend name for diagnostics. */
87
+ readonly name: "cookie" | "memory" | "redis" | "cloudflare-kv" | "database";
88
+ /** Create a new session record. Returns the stored record. */
89
+ create<T = SessionData>(opts: CreateSessionOptions<T>): Promise<SessionRecord<T>>;
90
+ /** Read by id. Returns null if missing or expired. */
91
+ read(id: string): Promise<SessionRecord | null>;
92
+ /** Read multiple sessions matching a query. */
93
+ readMany(query?: SessionQuery): Promise<SessionRecord[]>;
94
+ /** Update a session record. */
95
+ update<T = SessionData>(id: string, opts: UpdateSessionOptions<T>): Promise<SessionRecord<T> | null>;
96
+ /** Destroy a single session. */
97
+ destroy(id: string): Promise<boolean>;
98
+ /** Destroy every session matching a query. */
99
+ destroyMany(query: SessionQuery): Promise<number>;
100
+ /** Touch a session (refresh lastSeenAt / expiresAt). */
101
+ touch(id: string): Promise<SessionRecord | null>;
102
+ /** Garbage-collect expired sessions. Returns # removed. */
103
+ gc(): Promise<number>;
104
+ /** Clear every session (for tests / log-out-everywhere). */
105
+ clear(): Promise<void>;
106
+ /** Optional: cleanup timer / pool / connections. */
107
+ stop?(): Promise<void>;
108
+ }
109
+ /**
110
+ * The Cookie storage encodes the entire session record inside a signed
111
+ * cookie. No server-side state. Ideal for edge runtimes.
112
+ */
113
+ export interface CookieStorageOptions {
114
+ /** HMAC secret (32+ bytes). */
115
+ secret: string;
116
+ /** Cookie name. Default: "nexus.sess". */
117
+ cookieName?: string;
118
+ /** Default TTL. */
119
+ defaultTtlSeconds?: number;
120
+ /** Cookie attributes applied on issue. */
121
+ cookieOptions?: CookieOptions;
122
+ }
123
+ export interface RedisSessionStorageConfig {
124
+ /** A pre-built `RedisClient` (from `nexusjs/redis`). Required. */
125
+ client: import("../redis/types.js").RedisClient;
126
+ /** Key prefix. Default: "session:". */
127
+ keyPrefix?: string;
128
+ }
129
+ export interface CookieOptions {
130
+ domain?: string;
131
+ path?: string;
132
+ httpOnly?: boolean;
133
+ secure?: boolean;
134
+ sameSite?: "lax" | "strict" | "none";
135
+ maxAgeSeconds?: number;
136
+ partitioned?: boolean;
137
+ }
138
+ export type SessionBackendKind = "cookie" | "memory" | "redis" | "cloudflare-kv" | "database";
139
+ export interface SessionConfig {
140
+ /** Backend to use. Default: 'cookie'. */
141
+ backend?: SessionBackendKind;
142
+ /** Cookie backend config (ignored by other backends). */
143
+ cookie?: CookieStorageOptions;
144
+ /** Memory backend config. */
145
+ memory?: {
146
+ /** GC interval in ms. Default: 60_000. */
147
+ gcIntervalMs?: number;
148
+ /** Max sessions in memory before evicting LRU. Default: 100_000. */
149
+ maxSessions?: number;
150
+ };
151
+ /** Redis backend config (uses ). */
152
+ redis?: RedisSessionStorageConfig;
153
+ /** Cloudflare Workers KV backend config (uses `nexusjs/redis` cloudflare adapter). */
154
+ cloudflareKv?: RedisSessionStorageConfig;
155
+ /**
156
+ * Database backend config (uses `nexusjs/drizzle`).
157
+ *
158
+ * session: {
159
+ * backend: 'database',
160
+ * database: { db: drizzleService, tableName: 'nexus_sessions' },
161
+ * }
162
+ */
163
+ database?: {
164
+ /** A `DrizzleService` instance (or anything with `rawQuery`). */
165
+ db: {
166
+ rawQuery<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;
167
+ };
168
+ /** Table name. Default: 'nexus_sessions'. */
169
+ tableName?: string;
170
+ };
171
+ /** Default options applied to every session. */
172
+ defaults?: {
173
+ ttlSeconds?: number;
174
+ absoluteTtlSeconds?: number;
175
+ };
176
+ }
177
+ export type SessionEvent = {
178
+ kind: "session:created";
179
+ id: string;
180
+ userId: string | null;
181
+ } | {
182
+ kind: "session:read";
183
+ id: string;
184
+ } | {
185
+ kind: "session:updated";
186
+ id: string;
187
+ } | {
188
+ kind: "session:destroyed";
189
+ id: string;
190
+ userId: string | null;
191
+ reason: "logout" | "expired" | "admin" | "unknown";
192
+ } | {
193
+ kind: "session:expired";
194
+ id: string;
195
+ } | {
196
+ kind: "session:rotated";
197
+ oldId: string;
198
+ newId: string;
199
+ };
200
+ export type SessionEventListener = (event: SessionEvent) => void | Promise<void>;
201
+ //# sourceMappingURL=types.d.ts.map