@c9up/ream 0.1.3

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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/Application.d.ts +71 -0
  4. package/dist/Application.d.ts.map +1 -0
  5. package/dist/Application.js +151 -0
  6. package/dist/Application.js.map +1 -0
  7. package/dist/Codemods.d.ts +16 -0
  8. package/dist/Codemods.d.ts.map +1 -0
  9. package/dist/Codemods.js +277 -0
  10. package/dist/Codemods.js.map +1 -0
  11. package/dist/ConfigLoader.d.ts +29 -0
  12. package/dist/ConfigLoader.d.ts.map +1 -0
  13. package/dist/ConfigLoader.js +43 -0
  14. package/dist/ConfigLoader.js.map +1 -0
  15. package/dist/ErrorBoundary.d.ts +51 -0
  16. package/dist/ErrorBoundary.d.ts.map +1 -0
  17. package/dist/ErrorBoundary.js +122 -0
  18. package/dist/ErrorBoundary.js.map +1 -0
  19. package/dist/GracefulShutdown.d.ts +28 -0
  20. package/dist/GracefulShutdown.d.ts.map +1 -0
  21. package/dist/GracefulShutdown.js +55 -0
  22. package/dist/GracefulShutdown.js.map +1 -0
  23. package/dist/HealthCheck.d.ts +42 -0
  24. package/dist/HealthCheck.d.ts.map +1 -0
  25. package/dist/HealthCheck.js +65 -0
  26. package/dist/HealthCheck.js.map +1 -0
  27. package/dist/HotReload.d.ts +28 -0
  28. package/dist/HotReload.d.ts.map +1 -0
  29. package/dist/HotReload.js +60 -0
  30. package/dist/HotReload.js.map +1 -0
  31. package/dist/HttpKernel.d.ts +62 -0
  32. package/dist/HttpKernel.d.ts.map +1 -0
  33. package/dist/HttpKernel.js +210 -0
  34. package/dist/HttpKernel.js.map +1 -0
  35. package/dist/Ignitor.d.ts +195 -0
  36. package/dist/Ignitor.d.ts.map +1 -0
  37. package/dist/Ignitor.js +505 -0
  38. package/dist/Ignitor.js.map +1 -0
  39. package/dist/Provider.d.ts +54 -0
  40. package/dist/Provider.d.ts.map +1 -0
  41. package/dist/Provider.js +37 -0
  42. package/dist/Provider.js.map +1 -0
  43. package/dist/bodyparser/BodyParserMiddleware.d.ts +38 -0
  44. package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -0
  45. package/dist/bodyparser/BodyParserMiddleware.js +143 -0
  46. package/dist/bodyparser/BodyParserMiddleware.js.map +1 -0
  47. package/dist/bodyparser/MultipartFile.d.ts +77 -0
  48. package/dist/bodyparser/MultipartFile.d.ts.map +1 -0
  49. package/dist/bodyparser/MultipartFile.js +138 -0
  50. package/dist/bodyparser/MultipartFile.js.map +1 -0
  51. package/dist/bodyparser/parseSize.d.ts +6 -0
  52. package/dist/bodyparser/parseSize.d.ts.map +1 -0
  53. package/dist/bodyparser/parseSize.js +21 -0
  54. package/dist/bodyparser/parseSize.js.map +1 -0
  55. package/dist/bootstrap/hyper-server.d.ts +27 -0
  56. package/dist/bootstrap/hyper-server.d.ts.map +1 -0
  57. package/dist/bootstrap/hyper-server.js +63 -0
  58. package/dist/bootstrap/hyper-server.js.map +1 -0
  59. package/dist/console/CommandRunner.d.ts +18 -0
  60. package/dist/console/CommandRunner.d.ts.map +1 -0
  61. package/dist/console/CommandRunner.js +65 -0
  62. package/dist/console/CommandRunner.js.map +1 -0
  63. package/dist/container/Container.d.ts +60 -0
  64. package/dist/container/Container.d.ts.map +1 -0
  65. package/dist/container/Container.js +329 -0
  66. package/dist/container/Container.js.map +1 -0
  67. package/dist/container/types.d.ts +25 -0
  68. package/dist/container/types.d.ts.map +1 -0
  69. package/dist/container/types.js +6 -0
  70. package/dist/container/types.js.map +1 -0
  71. package/dist/decorators/Lazy.d.ts +19 -0
  72. package/dist/decorators/Lazy.d.ts.map +1 -0
  73. package/dist/decorators/Lazy.js +53 -0
  74. package/dist/decorators/Lazy.js.map +1 -0
  75. package/dist/decorators/Service.d.ts +48 -0
  76. package/dist/decorators/Service.d.ts.map +1 -0
  77. package/dist/decorators/Service.js +70 -0
  78. package/dist/decorators/Service.js.map +1 -0
  79. package/dist/errors/FuzzyMatcher.d.ts +41 -0
  80. package/dist/errors/FuzzyMatcher.d.ts.map +1 -0
  81. package/dist/errors/FuzzyMatcher.js +81 -0
  82. package/dist/errors/FuzzyMatcher.js.map +1 -0
  83. package/dist/errors/ModuleErrors.d.ts +41 -0
  84. package/dist/errors/ModuleErrors.d.ts.map +1 -0
  85. package/dist/errors/ModuleErrors.js +65 -0
  86. package/dist/errors/ModuleErrors.js.map +1 -0
  87. package/dist/errors/PipelineStageError.d.ts +31 -0
  88. package/dist/errors/PipelineStageError.d.ts.map +1 -0
  89. package/dist/errors/PipelineStageError.js +77 -0
  90. package/dist/errors/PipelineStageError.js.map +1 -0
  91. package/dist/errors/ReamError.d.ts +50 -0
  92. package/dist/errors/ReamError.d.ts.map +1 -0
  93. package/dist/errors/ReamError.js +108 -0
  94. package/dist/errors/ReamError.js.map +1 -0
  95. package/dist/events/Emitter.d.ts +124 -0
  96. package/dist/events/Emitter.d.ts.map +1 -0
  97. package/dist/events/Emitter.js +271 -0
  98. package/dist/events/Emitter.js.map +1 -0
  99. package/dist/events/EventsProvider.d.ts +28 -0
  100. package/dist/events/EventsProvider.d.ts.map +1 -0
  101. package/dist/events/EventsProvider.js +36 -0
  102. package/dist/events/EventsProvider.js.map +1 -0
  103. package/dist/events/config.d.ts +8 -0
  104. package/dist/events/config.d.ts.map +1 -0
  105. package/dist/events/config.js +4 -0
  106. package/dist/events/config.js.map +1 -0
  107. package/dist/events/configure.d.ts +10 -0
  108. package/dist/events/configure.d.ts.map +1 -0
  109. package/dist/events/configure.js +11 -0
  110. package/dist/events/configure.js.map +1 -0
  111. package/dist/events/helix/helpers.d.ts +62 -0
  112. package/dist/events/helix/helpers.d.ts.map +1 -0
  113. package/dist/events/helix/helpers.js +187 -0
  114. package/dist/events/helix/helpers.js.map +1 -0
  115. package/dist/events/index.d.ts +17 -0
  116. package/dist/events/index.d.ts.map +1 -0
  117. package/dist/events/index.js +15 -0
  118. package/dist/events/index.js.map +1 -0
  119. package/dist/events/native.d.ts +21 -0
  120. package/dist/events/native.d.ts.map +1 -0
  121. package/dist/events/native.js +17 -0
  122. package/dist/events/native.js.map +1 -0
  123. package/dist/events/services/main.d.ts +18 -0
  124. package/dist/events/services/main.d.ts.map +1 -0
  125. package/dist/events/services/main.js +31 -0
  126. package/dist/events/services/main.js.map +1 -0
  127. package/dist/events/testing/FakeBus.d.ts +66 -0
  128. package/dist/events/testing/FakeBus.d.ts.map +1 -0
  129. package/dist/events/testing/FakeBus.js +356 -0
  130. package/dist/events/testing/FakeBus.js.map +1 -0
  131. package/dist/graphql/GraphQLEngine.d.ts +69 -0
  132. package/dist/graphql/GraphQLEngine.d.ts.map +1 -0
  133. package/dist/graphql/GraphQLEngine.js +309 -0
  134. package/dist/graphql/GraphQLEngine.js.map +1 -0
  135. package/dist/graphql/GraphQLProvider.d.ts +32 -0
  136. package/dist/graphql/GraphQLProvider.d.ts.map +1 -0
  137. package/dist/graphql/GraphQLProvider.js +49 -0
  138. package/dist/graphql/GraphQLProvider.js.map +1 -0
  139. package/dist/helpers/base64.d.ts +40 -0
  140. package/dist/helpers/base64.d.ts.map +1 -0
  141. package/dist/helpers/base64.js +70 -0
  142. package/dist/helpers/base64.js.map +1 -0
  143. package/dist/helpers/index.d.ts +7 -0
  144. package/dist/helpers/index.d.ts.map +1 -0
  145. package/dist/helpers/index.js +5 -0
  146. package/dist/helpers/index.js.map +1 -0
  147. package/dist/helpers/is.d.ts +101 -0
  148. package/dist/helpers/is.d.ts.map +1 -0
  149. package/dist/helpers/is.js +151 -0
  150. package/dist/helpers/is.js.map +1 -0
  151. package/dist/helpers/napi-loader.d.ts +46 -0
  152. package/dist/helpers/napi-loader.d.ts.map +1 -0
  153. package/dist/helpers/napi-loader.js +69 -0
  154. package/dist/helpers/napi-loader.js.map +1 -0
  155. package/dist/helpers/safeEqual.d.ts +9 -0
  156. package/dist/helpers/safeEqual.d.ts.map +1 -0
  157. package/dist/helpers/safeEqual.js +16 -0
  158. package/dist/helpers/safeEqual.js.map +1 -0
  159. package/dist/helpers/string.d.ts +161 -0
  160. package/dist/helpers/string.d.ts.map +1 -0
  161. package/dist/helpers/string.js +429 -0
  162. package/dist/helpers/string.js.map +1 -0
  163. package/dist/helpers/types.d.ts +83 -0
  164. package/dist/helpers/types.d.ts.map +1 -0
  165. package/dist/helpers/types.js +6 -0
  166. package/dist/helpers/types.js.map +1 -0
  167. package/dist/http/Exception.d.ts +103 -0
  168. package/dist/http/Exception.d.ts.map +1 -0
  169. package/dist/http/Exception.js +228 -0
  170. package/dist/http/Exception.js.map +1 -0
  171. package/dist/http/HttpContext.d.ts +69 -0
  172. package/dist/http/HttpContext.d.ts.map +1 -0
  173. package/dist/http/HttpContext.js +55 -0
  174. package/dist/http/HttpContext.js.map +1 -0
  175. package/dist/http/RedirectBuilder.d.ts +31 -0
  176. package/dist/http/RedirectBuilder.d.ts.map +1 -0
  177. package/dist/http/RedirectBuilder.js +75 -0
  178. package/dist/http/RedirectBuilder.js.map +1 -0
  179. package/dist/http/Request.d.ts +160 -0
  180. package/dist/http/Request.d.ts.map +1 -0
  181. package/dist/http/Request.js +484 -0
  182. package/dist/http/Request.js.map +1 -0
  183. package/dist/http/Response.d.ts +114 -0
  184. package/dist/http/Response.d.ts.map +1 -0
  185. package/dist/http/Response.js +303 -0
  186. package/dist/http/Response.js.map +1 -0
  187. package/dist/http/SseStream.d.ts +89 -0
  188. package/dist/http/SseStream.d.ts.map +1 -0
  189. package/dist/http/SseStream.js +228 -0
  190. package/dist/http/SseStream.js.map +1 -0
  191. package/dist/http/urlDecode.d.ts +8 -0
  192. package/dist/http/urlDecode.d.ts.map +1 -0
  193. package/dist/http/urlDecode.js +18 -0
  194. package/dist/http/urlDecode.js.map +1 -0
  195. package/dist/index.d.ts +92 -0
  196. package/dist/index.d.ts.map +1 -0
  197. package/dist/index.js +67 -0
  198. package/dist/index.js.map +1 -0
  199. package/dist/middleware/Pipeline.d.ts +36 -0
  200. package/dist/middleware/Pipeline.d.ts.map +1 -0
  201. package/dist/middleware/Pipeline.js +104 -0
  202. package/dist/middleware/Pipeline.js.map +1 -0
  203. package/dist/openapi/OpenApiGenerator.d.ts +58 -0
  204. package/dist/openapi/OpenApiGenerator.d.ts.map +1 -0
  205. package/dist/openapi/OpenApiGenerator.js +192 -0
  206. package/dist/openapi/OpenApiGenerator.js.map +1 -0
  207. package/dist/openapi/OpenApiMiddleware.d.ts +24 -0
  208. package/dist/openapi/OpenApiMiddleware.d.ts.map +1 -0
  209. package/dist/openapi/OpenApiMiddleware.js +78 -0
  210. package/dist/openapi/OpenApiMiddleware.js.map +1 -0
  211. package/dist/openapi/OpenApiProvider.d.ts +36 -0
  212. package/dist/openapi/OpenApiProvider.d.ts.map +1 -0
  213. package/dist/openapi/OpenApiProvider.js +42 -0
  214. package/dist/openapi/OpenApiProvider.js.map +1 -0
  215. package/dist/resources/ApiResource.d.ts +45 -0
  216. package/dist/resources/ApiResource.d.ts.map +1 -0
  217. package/dist/resources/ApiResource.js +58 -0
  218. package/dist/resources/ApiResource.js.map +1 -0
  219. package/dist/router/Router.d.ts +205 -0
  220. package/dist/router/Router.d.ts.map +1 -0
  221. package/dist/router/Router.js +552 -0
  222. package/dist/router/Router.js.map +1 -0
  223. package/dist/rpc/RpcProvider.d.ts +34 -0
  224. package/dist/rpc/RpcProvider.d.ts.map +1 -0
  225. package/dist/rpc/RpcProvider.js +37 -0
  226. package/dist/rpc/RpcProvider.js.map +1 -0
  227. package/dist/rpc/RpcRouter.d.ts +61 -0
  228. package/dist/rpc/RpcRouter.d.ts.map +1 -0
  229. package/dist/rpc/RpcRouter.js +187 -0
  230. package/dist/rpc/RpcRouter.js.map +1 -0
  231. package/dist/scheduler/Schedule.d.ts +53 -0
  232. package/dist/scheduler/Schedule.d.ts.map +1 -0
  233. package/dist/scheduler/Schedule.js +76 -0
  234. package/dist/scheduler/Schedule.js.map +1 -0
  235. package/dist/scheduler/ScheduleProvider.d.ts +56 -0
  236. package/dist/scheduler/ScheduleProvider.d.ts.map +1 -0
  237. package/dist/scheduler/ScheduleProvider.js +145 -0
  238. package/dist/scheduler/ScheduleProvider.js.map +1 -0
  239. package/dist/scheduler/Scheduler.d.ts +209 -0
  240. package/dist/scheduler/Scheduler.d.ts.map +1 -0
  241. package/dist/scheduler/Scheduler.js +432 -0
  242. package/dist/scheduler/Scheduler.js.map +1 -0
  243. package/dist/scheduler/index.d.ts +14 -0
  244. package/dist/scheduler/index.d.ts.map +1 -0
  245. package/dist/scheduler/index.js +6 -0
  246. package/dist/scheduler/index.js.map +1 -0
  247. package/dist/scheduler/locks/LockBackend.d.ts +37 -0
  248. package/dist/scheduler/locks/LockBackend.d.ts.map +1 -0
  249. package/dist/scheduler/locks/LockBackend.js +13 -0
  250. package/dist/scheduler/locks/LockBackend.js.map +1 -0
  251. package/dist/scheduler/locks/MemoryLockBackend.d.ts +39 -0
  252. package/dist/scheduler/locks/MemoryLockBackend.d.ts.map +1 -0
  253. package/dist/scheduler/locks/MemoryLockBackend.js +71 -0
  254. package/dist/scheduler/locks/MemoryLockBackend.js.map +1 -0
  255. package/dist/scheduler/observability/ErrorReporter.d.ts +15 -0
  256. package/dist/scheduler/observability/ErrorReporter.d.ts.map +1 -0
  257. package/dist/scheduler/observability/ErrorReporter.js +13 -0
  258. package/dist/scheduler/observability/ErrorReporter.js.map +1 -0
  259. package/dist/scheduler/observability/ScheduleEvent.d.ts +57 -0
  260. package/dist/scheduler/observability/ScheduleEvent.d.ts.map +1 -0
  261. package/dist/scheduler/observability/ScheduleEvent.js +12 -0
  262. package/dist/scheduler/observability/ScheduleEvent.js.map +1 -0
  263. package/dist/scheduler/observability/ScheduleEventSink.d.ts +20 -0
  264. package/dist/scheduler/observability/ScheduleEventSink.d.ts.map +1 -0
  265. package/dist/scheduler/observability/ScheduleEventSink.js +17 -0
  266. package/dist/scheduler/observability/ScheduleEventSink.js.map +1 -0
  267. package/dist/scheduler/observability/StatsTracker.d.ts +50 -0
  268. package/dist/scheduler/observability/StatsTracker.d.ts.map +1 -0
  269. package/dist/scheduler/observability/StatsTracker.js +96 -0
  270. package/dist/scheduler/observability/StatsTracker.js.map +1 -0
  271. package/dist/security/CookieSigner.d.ts +13 -0
  272. package/dist/security/CookieSigner.d.ts.map +1 -0
  273. package/dist/security/CookieSigner.js +51 -0
  274. package/dist/security/CookieSigner.js.map +1 -0
  275. package/dist/security/SignedUrl.d.ts +17 -0
  276. package/dist/security/SignedUrl.d.ts.map +1 -0
  277. package/dist/security/SignedUrl.js +63 -0
  278. package/dist/security/SignedUrl.js.map +1 -0
  279. package/dist/security/crypto.d.ts +25 -0
  280. package/dist/security/crypto.d.ts.map +1 -0
  281. package/dist/security/crypto.js +82 -0
  282. package/dist/security/crypto.js.map +1 -0
  283. package/dist/server/HyperServer.d.ts +64 -0
  284. package/dist/server/HyperServer.d.ts.map +1 -0
  285. package/dist/server/HyperServer.js +54 -0
  286. package/dist/server/HyperServer.js.map +1 -0
  287. package/dist/server/Server.d.ts +68 -0
  288. package/dist/server/Server.d.ts.map +1 -0
  289. package/dist/server/Server.js +113 -0
  290. package/dist/server/Server.js.map +1 -0
  291. package/dist/services/app.d.ts +14 -0
  292. package/dist/services/app.d.ts.map +1 -0
  293. package/dist/services/app.js +27 -0
  294. package/dist/services/app.js.map +1 -0
  295. package/dist/services/router.d.ts +21 -0
  296. package/dist/services/router.d.ts.map +1 -0
  297. package/dist/services/router.js +36 -0
  298. package/dist/services/router.js.map +1 -0
  299. package/dist/services/server.d.ts +16 -0
  300. package/dist/services/server.d.ts.map +1 -0
  301. package/dist/services/server.js +32 -0
  302. package/dist/services/server.js.map +1 -0
  303. package/dist/session/Session.d.ts +88 -0
  304. package/dist/session/Session.d.ts.map +1 -0
  305. package/dist/session/Session.js +186 -0
  306. package/dist/session/Session.js.map +1 -0
  307. package/dist/session/SessionMiddleware.d.ts +16 -0
  308. package/dist/session/SessionMiddleware.d.ts.map +1 -0
  309. package/dist/session/SessionMiddleware.js +132 -0
  310. package/dist/session/SessionMiddleware.js.map +1 -0
  311. package/dist/session/drivers/CookieDriver.d.ts +17 -0
  312. package/dist/session/drivers/CookieDriver.d.ts.map +1 -0
  313. package/dist/session/drivers/CookieDriver.js +42 -0
  314. package/dist/session/drivers/CookieDriver.js.map +1 -0
  315. package/dist/session/drivers/MemoryDriver.d.ts +9 -0
  316. package/dist/session/drivers/MemoryDriver.d.ts.map +1 -0
  317. package/dist/session/drivers/MemoryDriver.js +24 -0
  318. package/dist/session/drivers/MemoryDriver.js.map +1 -0
  319. package/dist/storage/S3Driver.d.ts +27 -0
  320. package/dist/storage/S3Driver.d.ts.map +1 -0
  321. package/dist/storage/S3Driver.js +135 -0
  322. package/dist/storage/S3Driver.js.map +1 -0
  323. package/dist/storage/StaticMiddleware.d.ts +27 -0
  324. package/dist/storage/StaticMiddleware.d.ts.map +1 -0
  325. package/dist/storage/StaticMiddleware.js +153 -0
  326. package/dist/storage/StaticMiddleware.js.map +1 -0
  327. package/dist/storage/StaticProvider.d.ts +26 -0
  328. package/dist/storage/StaticProvider.d.ts.map +1 -0
  329. package/dist/storage/StaticProvider.js +31 -0
  330. package/dist/storage/StaticProvider.js.map +1 -0
  331. package/dist/storage/StorageManager.d.ts +31 -0
  332. package/dist/storage/StorageManager.d.ts.map +1 -0
  333. package/dist/storage/StorageManager.js +120 -0
  334. package/dist/storage/StorageManager.js.map +1 -0
  335. package/dist/testing/RequestBuilder.d.ts +67 -0
  336. package/dist/testing/RequestBuilder.d.ts.map +1 -0
  337. package/dist/testing/RequestBuilder.js +202 -0
  338. package/dist/testing/RequestBuilder.js.map +1 -0
  339. package/dist/testing/TestClient.d.ts +96 -0
  340. package/dist/testing/TestClient.d.ts.map +1 -0
  341. package/dist/testing/TestClient.js +263 -0
  342. package/dist/testing/TestClient.js.map +1 -0
  343. package/dist/types/helpers.d.ts +47 -0
  344. package/dist/types/helpers.d.ts.map +1 -0
  345. package/dist/types/helpers.js +5 -0
  346. package/dist/types/helpers.js.map +1 -0
  347. package/events.darwin-arm64.node +0 -0
  348. package/events.darwin-x64.node +0 -0
  349. package/events.linux-arm64-gnu.node +0 -0
  350. package/events.linux-x64-gnu.node +0 -0
  351. package/events.win32-x64-msvc.node +0 -0
  352. package/index.darwin-arm64.node +0 -0
  353. package/index.darwin-x64.node +0 -0
  354. package/index.linux-arm64-gnu.node +0 -0
  355. package/index.linux-x64-gnu.node +0 -0
  356. package/index.win32-x64-msvc.node +0 -0
  357. package/package.json +106 -0
  358. package/scheduler.darwin-arm64.node +0 -0
  359. package/scheduler.darwin-x64.node +0 -0
  360. package/scheduler.linux-arm64-gnu.node +0 -0
  361. package/scheduler.linux-x64-gnu.node +0 -0
  362. package/scheduler.win32-x64-msvc.node +0 -0
  363. package/scripts/copy-napi.mjs +113 -0
  364. package/src/Application.ts +177 -0
  365. package/src/Codemods.ts +343 -0
  366. package/src/ConfigLoader.ts +49 -0
  367. package/src/ErrorBoundary.ts +157 -0
  368. package/src/GracefulShutdown.ts +80 -0
  369. package/src/HealthCheck.ts +96 -0
  370. package/src/HotReload.ts +78 -0
  371. package/src/HttpKernel.ts +305 -0
  372. package/src/Ignitor.ts +656 -0
  373. package/src/Provider.ts +74 -0
  374. package/src/bodyparser/BodyParserMiddleware.ts +183 -0
  375. package/src/bodyparser/MultipartFile.ts +181 -0
  376. package/src/bodyparser/parseSize.ts +19 -0
  377. package/src/bootstrap/hyper-server.ts +78 -0
  378. package/src/console/CommandRunner.ts +82 -0
  379. package/src/container/Container.ts +383 -0
  380. package/src/container/types.ts +30 -0
  381. package/src/decorators/Lazy.ts +57 -0
  382. package/src/decorators/Service.ts +85 -0
  383. package/src/errors/FuzzyMatcher.ts +93 -0
  384. package/src/errors/ModuleErrors.ts +73 -0
  385. package/src/errors/PipelineStageError.ts +97 -0
  386. package/src/errors/ReamError.ts +138 -0
  387. package/src/events/Emitter.ts +333 -0
  388. package/src/events/EventsProvider.ts +58 -0
  389. package/src/events/config.ts +10 -0
  390. package/src/events/configure.ts +19 -0
  391. package/src/events/helix/helpers.ts +260 -0
  392. package/src/events/index.ts +22 -0
  393. package/src/events/native.ts +37 -0
  394. package/src/events/services/main.ts +39 -0
  395. package/src/events/testing/FakeBus.ts +420 -0
  396. package/src/graphql/GraphQLEngine.ts +421 -0
  397. package/src/graphql/GraphQLProvider.ts +59 -0
  398. package/src/helpers/base64.ts +72 -0
  399. package/src/helpers/index.ts +6 -0
  400. package/src/helpers/is.ts +162 -0
  401. package/src/helpers/napi-loader.ts +106 -0
  402. package/src/helpers/safeEqual.ts +15 -0
  403. package/src/helpers/string.ts +469 -0
  404. package/src/helpers/types.ts +100 -0
  405. package/src/http/Exception.ts +272 -0
  406. package/src/http/HttpContext.ts +108 -0
  407. package/src/http/RedirectBuilder.ts +89 -0
  408. package/src/http/Request.ts +540 -0
  409. package/src/http/Response.ts +351 -0
  410. package/src/http/SseStream.ts +250 -0
  411. package/src/http/urlDecode.ts +18 -0
  412. package/src/index.ts +263 -0
  413. package/src/middleware/Pipeline.ts +136 -0
  414. package/src/openapi/OpenApiGenerator.ts +254 -0
  415. package/src/openapi/OpenApiMiddleware.ts +101 -0
  416. package/src/openapi/OpenApiProvider.ts +67 -0
  417. package/src/resources/ApiResource.ts +79 -0
  418. package/src/router/Router.ts +733 -0
  419. package/src/rpc/RpcProvider.ts +54 -0
  420. package/src/rpc/RpcRouter.ts +243 -0
  421. package/src/scheduler/Schedule.ts +96 -0
  422. package/src/scheduler/ScheduleProvider.ts +177 -0
  423. package/src/scheduler/Scheduler.ts +601 -0
  424. package/src/scheduler/index.ts +24 -0
  425. package/src/scheduler/locks/LockBackend.ts +38 -0
  426. package/src/scheduler/locks/MemoryLockBackend.ts +85 -0
  427. package/src/scheduler/observability/ErrorReporter.ts +13 -0
  428. package/src/scheduler/observability/ScheduleEvent.ts +61 -0
  429. package/src/scheduler/observability/ScheduleEventSink.ts +21 -0
  430. package/src/scheduler/observability/StatsTracker.ts +134 -0
  431. package/src/security/CookieSigner.ts +54 -0
  432. package/src/security/SignedUrl.ts +71 -0
  433. package/src/security/crypto.ts +98 -0
  434. package/src/server/HyperServer.ts +121 -0
  435. package/src/server/Server.ts +147 -0
  436. package/src/services/app.ts +34 -0
  437. package/src/services/router.ts +44 -0
  438. package/src/services/server.ts +40 -0
  439. package/src/session/Session.ts +231 -0
  440. package/src/session/SessionMiddleware.ts +153 -0
  441. package/src/session/drivers/CookieDriver.ts +48 -0
  442. package/src/session/drivers/MemoryDriver.ts +29 -0
  443. package/src/storage/S3Driver.ts +171 -0
  444. package/src/storage/StaticMiddleware.ts +182 -0
  445. package/src/storage/StaticProvider.ts +40 -0
  446. package/src/storage/StorageManager.ts +142 -0
  447. package/src/testing/RequestBuilder.ts +275 -0
  448. package/src/testing/TestClient.ts +344 -0
  449. package/src/types/helpers.ts +52 -0
  450. package/swcrc.app.json +17 -0
  451. package/tsconfig.app.json +21 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Server singleton service — proxy to the Ignitor's Server instance.
3
+ *
4
+ * Usage in start/kernel.ts:
5
+ * import server from '@c9up/ream/services/server'
6
+ * server.errorHandler(() => import('#exceptions/handler'))
7
+ * server.use([() => import('#middleware/logging')])
8
+ */
9
+ let instance;
10
+ /** @internal Set the server instance (called by Ignitor). */
11
+ export function setServer(server) {
12
+ instance = server;
13
+ }
14
+ /** @internal Get the server instance directly. */
15
+ export function getServer() {
16
+ return instance;
17
+ }
18
+ const server = new Proxy({}, {
19
+ get(_target, prop) {
20
+ if (!instance) {
21
+ throw new Error('Server accessed before initialization. ' +
22
+ 'Ensure your kernel files are loaded as preloads in reamrc.ts.');
23
+ }
24
+ // Bind methods to the real instance so private-field access inside
25
+ // them resolves against the underlying class brand — passing the
26
+ // Proxy as `this` breaks `#field` writes (Proxy isn't branded).
27
+ const value = Reflect.get(instance, prop, instance);
28
+ return typeof value === 'function' ? value.bind(instance) : value;
29
+ },
30
+ });
31
+ export default server;
32
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/services/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,IAAI,QAA4B,CAAA;AAEhC,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,QAAQ,GAAG,MAAM,CAAA;AACnB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,MAAM,GAAW,IAAI,KAAK,CAAC,EAAY,EAAE;IAC7C,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACvC,+DAA+D,CAClE,CAAA;QACH,CAAC;QACD,mEAAmE;QACnE,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Session — server-side session management.
3
+ *
4
+ * Like AdonisJS Session:
5
+ * session.get('key')
6
+ * session.put('key', value)
7
+ * session.flash('success', 'Saved!')
8
+ * session.forget('key')
9
+ *
10
+ * Backed by pluggable drivers (cookie, memory, redis).
11
+ */
12
+ export interface SessionDriver {
13
+ read(sessionId: string): Promise<Record<string, unknown>>;
14
+ write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void>;
15
+ destroy(sessionId: string): Promise<void>;
16
+ touch(sessionId: string, ttl: number): Promise<void>;
17
+ }
18
+ export interface SessionConfig {
19
+ driver: string;
20
+ cookieName?: string;
21
+ maxAge?: number;
22
+ clearWithBrowser?: boolean;
23
+ /**
24
+ * When true, re-emit Set-Cookie on every response so the cookie's `maxAge`
25
+ * window slides forward on each request. Active users won't be logged out
26
+ * mid-session; the trade-off is a `Vary: Cookie` side-channel on every
27
+ * response (defeats shared HTTP caches). Default `false` to preserve cache
28
+ * behaviour. Express-session and AdonisJS expose the same toggle.
29
+ */
30
+ rolling?: boolean;
31
+ }
32
+ export declare class Session {
33
+ #private;
34
+ constructor(sessionId: string, data?: Record<string, unknown>);
35
+ /** Current session id. Mutated by `regenerate()`. */
36
+ get sessionId(): string;
37
+ /**
38
+ * Rotate the session id while preserving the data. The standard mitigation
39
+ * for session-fixation (CWE-384): call this whenever a privilege boundary
40
+ * is crossed — login, role change, sensitive-action confirmation. Warden's
41
+ * `SessionStrategy.login()` calls it automatically before writing the
42
+ * authenticated user id.
43
+ *
44
+ * The new id takes effect inside this Session instance immediately so
45
+ * subsequent `session.get()` / `session.put()` see the same data under
46
+ * the new id. The SessionMiddleware sees `wasRegenerated() === true` on
47
+ * the way out and migrates the driver storage + emits a new Set-Cookie.
48
+ */
49
+ regenerate(): void;
50
+ /** @internal — read by SessionMiddleware to detect a mid-request rotation. */
51
+ wasRegenerated(): boolean;
52
+ /** @internal — the id captured at request arrival; used to destroy the old driver entry post-regenerate. */
53
+ originalSessionId(): string;
54
+ /** Get a session value. */
55
+ get<T = unknown>(key: string, defaultValue?: T): T;
56
+ /** Set a session value. */
57
+ put(key: string, value: unknown): void;
58
+ /** Check if a key exists. */
59
+ has(key: string): boolean;
60
+ /** Get all session data. */
61
+ all(): Record<string, unknown>;
62
+ /** Remove a key. */
63
+ forget(key: string): void;
64
+ /** Get and remove a key. */
65
+ pull<T = unknown>(key: string, defaultValue?: T): T;
66
+ /** Clear all session data. */
67
+ clear(): void;
68
+ /** Increment a numeric value. */
69
+ increment(key: string, amount?: number): void;
70
+ /** Decrement a numeric value. */
71
+ decrement(key: string, amount?: number): void;
72
+ /** Set flash data (available only on the next request). */
73
+ flash(key: string, value: unknown): void;
74
+ /** Flash all current input. */
75
+ flashAll(input: Record<string, unknown>): void;
76
+ /** Flash only specific keys. */
77
+ flashOnly(input: Record<string, unknown>, keys: string[]): void;
78
+ /** Flash all except specific keys. */
79
+ flashExcept(input: Record<string, unknown>, keys: string[]): void;
80
+ /** Get a flashed value from the previous request. */
81
+ flashMessages(): Record<string, unknown>;
82
+ /** Get a specific flash message from the previous request. */
83
+ old<T = unknown>(key: string, defaultValue?: T): T;
84
+ /** Serialize for storage. Includes flash data for next request. */
85
+ toJSON(): Record<string, unknown>;
86
+ isDirty(): boolean;
87
+ }
88
+ //# sourceMappingURL=Session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Session — server-side session management.
3
+ *
4
+ * Like AdonisJS Session:
5
+ * session.get('key')
6
+ * session.put('key', value)
7
+ * session.flash('success', 'Saved!')
8
+ * session.forget('key')
9
+ *
10
+ * Backed by pluggable drivers (cookie, memory, redis).
11
+ */
12
+ /**
13
+ * Generate a fresh session ID. Format mirrors AdonisJS / express-session —
14
+ * 32 bytes of base64url entropy (~256 bits). Defined here so `regenerate()`
15
+ * can pick a new id without bringing in a driver dependency.
16
+ */
17
+ function generateSessionId() {
18
+ const bytes = new Uint8Array(32);
19
+ // `crypto.getRandomValues` is a Node ≥ 19 builtin AND the standard browser
20
+ // API; same call site works on both runtimes without a polyfill.
21
+ crypto.getRandomValues(bytes);
22
+ let str = '';
23
+ for (let i = 0; i < bytes.length; i++) {
24
+ str += String.fromCharCode(bytes[i] ?? 0);
25
+ }
26
+ return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
27
+ }
28
+ export class Session {
29
+ #data = {};
30
+ #flashData = {};
31
+ #previousFlash = {};
32
+ #dirty = false;
33
+ #sessionId;
34
+ /**
35
+ * The session id active when the request arrived, captured at construction.
36
+ * The middleware uses this on the way out to migrate driver storage
37
+ * (`driver.write(newId)` + `driver.destroy(oldId)`) when the application
38
+ * called `regenerate()` mid-request.
39
+ */
40
+ #originalSessionId;
41
+ #regenerated = false;
42
+ constructor(sessionId, data = {}) {
43
+ this.#sessionId = sessionId;
44
+ this.#originalSessionId = sessionId;
45
+ this.#data = { ...data };
46
+ const flash = data.__flash;
47
+ this.#previousFlash =
48
+ typeof flash === 'object' && flash !== null && !Array.isArray(flash)
49
+ ? // biome-ignore lint/suspicious/noExplicitAny: flash narrowed to non-null non-array object; branded as Record for key access
50
+ flash
51
+ : {};
52
+ delete this.#data.__flash;
53
+ }
54
+ /** Current session id. Mutated by `regenerate()`. */
55
+ get sessionId() {
56
+ return this.#sessionId;
57
+ }
58
+ /**
59
+ * Rotate the session id while preserving the data. The standard mitigation
60
+ * for session-fixation (CWE-384): call this whenever a privilege boundary
61
+ * is crossed — login, role change, sensitive-action confirmation. Warden's
62
+ * `SessionStrategy.login()` calls it automatically before writing the
63
+ * authenticated user id.
64
+ *
65
+ * The new id takes effect inside this Session instance immediately so
66
+ * subsequent `session.get()` / `session.put()` see the same data under
67
+ * the new id. The SessionMiddleware sees `wasRegenerated() === true` on
68
+ * the way out and migrates the driver storage + emits a new Set-Cookie.
69
+ */
70
+ regenerate() {
71
+ this.#sessionId = generateSessionId();
72
+ this.#regenerated = true;
73
+ this.#dirty = true;
74
+ }
75
+ /** @internal — read by SessionMiddleware to detect a mid-request rotation. */
76
+ wasRegenerated() {
77
+ return this.#regenerated;
78
+ }
79
+ /** @internal — the id captured at request arrival; used to destroy the old driver entry post-regenerate. */
80
+ originalSessionId() {
81
+ return this.#originalSessionId;
82
+ }
83
+ /** Get a session value. */
84
+ get(key, defaultValue) {
85
+ if (key in this.#data) {
86
+ // biome-ignore lint/suspicious/noExplicitAny: session data stored as unknown; caller brands the value type via T
87
+ return this.#data[key];
88
+ }
89
+ // biome-ignore lint/suspicious/noExplicitAny: generic default — caller brands the value type via T
90
+ return defaultValue;
91
+ }
92
+ /** Set a session value. */
93
+ put(key, value) {
94
+ this.#data[key] = value;
95
+ this.#dirty = true;
96
+ }
97
+ /** Check if a key exists. */
98
+ has(key) {
99
+ return key in this.#data;
100
+ }
101
+ /** Get all session data. */
102
+ all() {
103
+ return { ...this.#data };
104
+ }
105
+ /** Remove a key. */
106
+ forget(key) {
107
+ delete this.#data[key];
108
+ this.#dirty = true;
109
+ }
110
+ /** Get and remove a key. */
111
+ pull(key, defaultValue) {
112
+ const value = this.get(key, defaultValue);
113
+ this.forget(key);
114
+ return value;
115
+ }
116
+ /** Clear all session data. */
117
+ clear() {
118
+ this.#data = {};
119
+ this.#dirty = true;
120
+ }
121
+ /** Increment a numeric value. */
122
+ increment(key, amount = 1) {
123
+ const current = this.get(key) ?? 0;
124
+ this.put(key, current + amount);
125
+ }
126
+ /** Decrement a numeric value. */
127
+ decrement(key, amount = 1) {
128
+ this.increment(key, -amount);
129
+ }
130
+ // ─── Flash data ───────────────────────────────────────────
131
+ /** Set flash data (available only on the next request). */
132
+ flash(key, value) {
133
+ this.#flashData[key] = value;
134
+ this.#dirty = true;
135
+ }
136
+ /** Flash all current input. */
137
+ flashAll(input) {
138
+ for (const [k, v] of Object.entries(input)) {
139
+ this.#flashData[k] = v;
140
+ }
141
+ this.#dirty = true;
142
+ }
143
+ /** Flash only specific keys. */
144
+ flashOnly(input, keys) {
145
+ for (const k of keys) {
146
+ if (k in input)
147
+ this.#flashData[k] = input[k];
148
+ }
149
+ this.#dirty = true;
150
+ }
151
+ /** Flash all except specific keys. */
152
+ flashExcept(input, keys) {
153
+ const keySet = new Set(keys);
154
+ for (const [k, v] of Object.entries(input)) {
155
+ if (!keySet.has(k))
156
+ this.#flashData[k] = v;
157
+ }
158
+ this.#dirty = true;
159
+ }
160
+ /** Get a flashed value from the previous request. */
161
+ flashMessages() {
162
+ return { ...this.#previousFlash };
163
+ }
164
+ /** Get a specific flash message from the previous request. */
165
+ old(key, defaultValue) {
166
+ if (key in this.#previousFlash) {
167
+ // biome-ignore lint/suspicious/noExplicitAny: flash data stored as unknown; caller brands the value type via T
168
+ return this.#previousFlash[key];
169
+ }
170
+ // biome-ignore lint/suspicious/noExplicitAny: generic default — caller brands the value type via T
171
+ return defaultValue;
172
+ }
173
+ // ─── Serialization ────────────────────────────────────────
174
+ /** Serialize for storage. Includes flash data for next request. */
175
+ toJSON() {
176
+ const result = { ...this.#data };
177
+ if (Object.keys(this.#flashData).length > 0) {
178
+ result.__flash = this.#flashData;
179
+ }
180
+ return result;
181
+ }
182
+ isDirty() {
183
+ return this.#dirty;
184
+ }
185
+ }
186
+ //# sourceMappingURL=Session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH;;;;GAIG;AACH,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,OAAO,OAAO;IAClB,KAAK,GAA4B,EAAE,CAAA;IACnC,UAAU,GAA4B,EAAE,CAAA;IACxC,cAAc,GAA4B,EAAE,CAAA;IAC5C,MAAM,GAAG,KAAK,CAAA;IACd,UAAU,CAAQ;IAClB;;;;;OAKG;IACM,kBAAkB,CAAQ;IACnC,YAAY,GAAG,KAAK,CAAA;IAEpB,YAAY,SAAiB,EAAE,OAAgC,EAAE;QAC/D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAA;QAC1B,IAAI,CAAC,cAAc;YACjB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAClE,CAAC,CAAC,4HAA4H;oBAC3H,KAAwC;gBAC3C,CAAC,CAAC,EAAE,CAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,qDAAqD;IACrD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU;QACR,IAAI,CAAC,UAAU,GAAG,iBAAiB,EAAE,CAAA;QACrC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,8EAA8E;IAC9E,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,4GAA4G;IAC5G,iBAAiB;QACf,OAAO,IAAI,CAAC,kBAAkB,CAAA;IAChC,CAAC;IAED,2BAA2B;IAC3B,GAAG,CAAc,GAAW,EAAE,YAAgB;QAC5C,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,iHAAiH;YACjH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAA;QACpC,CAAC;QACD,mGAAmG;QACnG,OAAO,YAAwB,CAAA;IACjC,CAAC;IAED,2BAA2B;IAC3B,GAAG,CAAC,GAAW,EAAE,KAAc;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,6BAA6B;IAC7B,GAAG,CAAC,GAAW;QACb,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAA;IAC1B,CAAC;IAED,4BAA4B;IAC5B,GAAG;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,oBAAoB;IACpB,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAc,GAAW,EAAE,YAAgB;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,YAAY,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAS,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,CAAA;IACjC,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAED,6DAA6D;IAE7D,2DAA2D;IAC3D,KAAK,CAAC,GAAW,EAAE,KAAc;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,+BAA+B;IAC/B,QAAQ,CAAC,KAA8B;QACrC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,gCAAgC;IAChC,SAAS,CAAC,KAA8B,EAAE,IAAc;QACtD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,sCAAsC;IACtC,WAAW,CAAC,KAA8B,EAAE,IAAc;QACxD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,qDAAqD;IACrD,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;IACnC,CAAC;IAED,8DAA8D;IAC9D,GAAG,CAAc,GAAW,EAAE,YAAgB;QAC5C,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,+GAA+G;YAC/G,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAa,CAAA;QAC7C,CAAC;QACD,mGAAmG;QACnG,OAAO,YAAwB,CAAA;IACjC,CAAC;IAED,6DAA6D;IAE7D,mEAAmE;IACnE,MAAM;QACJ,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAChC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Session middleware — initializes session on each request.
3
+ *
4
+ * Reads session ID from cookie, loads data via driver, attaches to ctx,
5
+ * and writes back after the handler runs.
6
+ */
7
+ import type { HttpContext } from '../http/HttpContext.js';
8
+ import type { SessionConfig } from './Session.js';
9
+ export default class SessionMiddleware {
10
+ #private;
11
+ constructor(config?: SessionConfig & {
12
+ secret?: string;
13
+ });
14
+ handle(ctx: HttpContext, next: () => Promise<void>): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=SessionMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMiddleware.d.ts","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAWhE,MAAM,CAAC,OAAO,OAAO,iBAAiB;;gBAKxB,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAwBlD,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;CAiGzD"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Session middleware — initializes session on each request.
3
+ *
4
+ * Reads session ID from cookie, loads data via driver, attaches to ctx,
5
+ * and writes back after the handler runs.
6
+ */
7
+ import { randomBytes } from 'node:crypto';
8
+ import { CookieDriver } from './drivers/CookieDriver.js';
9
+ import { MemoryDriver } from './drivers/MemoryDriver.js';
10
+ import { Session } from './Session.js';
11
+ export default class SessionMiddleware {
12
+ #driver;
13
+ #cookieDriver = null;
14
+ #config;
15
+ constructor(config) {
16
+ this.#config = {
17
+ driver: config?.driver ?? 'memory',
18
+ cookieName: config?.cookieName ?? 'ream_session',
19
+ maxAge: config?.maxAge ?? 7200,
20
+ clearWithBrowser: config?.clearWithBrowser ?? false,
21
+ rolling: config?.rolling ?? false,
22
+ };
23
+ if (this.#config.driver === 'cookie') {
24
+ if (!config?.secret) {
25
+ throw new Error('Cookie session driver requires a secret. Set session.secret in your config.');
26
+ }
27
+ this.#cookieDriver = new CookieDriver(config.secret);
28
+ this.#driver = this.#cookieDriver;
29
+ }
30
+ else if (this.#config.driver === 'memory') {
31
+ this.#driver = new MemoryDriver();
32
+ }
33
+ else {
34
+ throw new Error(`Unknown session driver: ${this.#config.driver}`);
35
+ }
36
+ }
37
+ async handle(ctx, next) {
38
+ const cookieName = this.#config.cookieName;
39
+ const maxAge = this.#config.maxAge;
40
+ const rolling = this.#config.rolling;
41
+ const isProduction = process.env.NODE_ENV === 'production';
42
+ // Read session ID from cookie — pre-parsed by the Rust HyperServer.
43
+ let sessionId = ctx.request.cookie(cookieName);
44
+ const hadIncomingCookie = sessionId !== null;
45
+ // Cookie driver: the cookie value IS the session data (encrypted)
46
+ if (this.#cookieDriver) {
47
+ const data = await this.#driver.read(sessionId ?? '');
48
+ sessionId = sessionId ?? generateSessionId();
49
+ const session = new Session(sessionId, data);
50
+ ctx.store.set('session', session);
51
+ await next();
52
+ // Default: only emit Set-Cookie if the session was actually modified —
53
+ // sending a cookie on every response defeats HTTP caching, leaks state
54
+ // to CDNs, and creates a privacy side-channel (response varies even for
55
+ // read-only GETs).
56
+ // Rolling mode: re-emit on every response with an existing session so
57
+ // the cookie maxAge window slides forward (active users don't time out
58
+ // mid-session). Caller opts in via SessionConfig.rolling.
59
+ const shouldEmit = session.isDirty() || (rolling && hadIncomingCookie);
60
+ if (shouldEmit) {
61
+ const encoded = this.#cookieDriver.encode(session.toJSON());
62
+ ctx.response.cookie(cookieName, encoded, {
63
+ maxAge: this.#config.clearWithBrowser ? undefined : maxAge,
64
+ path: '/',
65
+ httpOnly: true,
66
+ sameSite: 'lax',
67
+ secure: isProduction,
68
+ });
69
+ }
70
+ return;
71
+ }
72
+ // Server-side drivers (memory, redis)
73
+ if (!sessionId) {
74
+ sessionId = generateSessionId();
75
+ }
76
+ const data = await this.#driver.read(sessionId);
77
+ const session = new Session(sessionId, data);
78
+ ctx.store.set('session', session);
79
+ await next();
80
+ // Session-fixation mitigation: if the handler called `session.regenerate()`
81
+ // (typically via Warden's SessionStrategy.login), the session id has been
82
+ // rotated. Migrate the driver storage atomically — write under the new
83
+ // id first, then destroy the old entry so a crash between calls leaves
84
+ // the user with a valid session under one of the two ids rather than
85
+ // none. The cookie below picks up `session.sessionId` which already
86
+ // returns the new value.
87
+ const regenerated = session.wasRegenerated();
88
+ const isNew = !hadIncomingCookie;
89
+ if (regenerated) {
90
+ const originalId = session.originalSessionId();
91
+ const currentId = session.sessionId;
92
+ await this.#driver.write(currentId, session.toJSON(), maxAge);
93
+ // Best-effort: a destroy failure leaves a stale entry that TTL will
94
+ // sweep, but should not crash the request. The new session is already
95
+ // live under `currentId`.
96
+ try {
97
+ await this.#driver.destroy(originalId);
98
+ }
99
+ catch {
100
+ // benign — TTL will reclaim it.
101
+ }
102
+ }
103
+ else if (session.isDirty()) {
104
+ await this.#driver.write(sessionId, session.toJSON(), maxAge);
105
+ }
106
+ else if (!isNew) {
107
+ await this.#driver.touch(sessionId, maxAge);
108
+ }
109
+ // Emit Set-Cookie only when there is server-side state worth
110
+ // pinning to the browser: the session was modified (isDirty → we
111
+ // just wrote it), regenerated (rotated id post-login), or rolling
112
+ // mode is sliding an existing session's window. A brand-new but
113
+ // CLEAN anonymous request gets NO cookie — otherwise every first
114
+ // read-only GET hands out a persistent tracking id that points at
115
+ // no server-side row (touch() is a no-op without a backing entry),
116
+ // defeats HTTP caching, and leaks a Set-Cookie to CDNs. This mirrors
117
+ // the cookie-driver path above (which already omits `isNew`).
118
+ if (session.isDirty() || regenerated || (rolling && hadIncomingCookie)) {
119
+ ctx.response.cookie(cookieName, session.sessionId, {
120
+ maxAge: this.#config.clearWithBrowser ? undefined : maxAge,
121
+ path: '/',
122
+ httpOnly: true,
123
+ sameSite: 'lax',
124
+ secure: isProduction,
125
+ });
126
+ }
127
+ }
128
+ }
129
+ function generateSessionId() {
130
+ return randomBytes(24).toString('base64url');
131
+ }
132
+ //# sourceMappingURL=SessionMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMiddleware.js","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAUtC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAe;IACtB,aAAa,GAAwB,IAAI,CAAA;IACzC,OAAO,CAAuB;IAE9B,YAAY,MAA4C;QACtD,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,QAAQ;YAClC,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,cAAc;YAChD,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI;YAC9B,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,KAAK;YACnD,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;SAClC,CAAA;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAA;YACH,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAA;QACnC,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,IAAyB;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAA;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;QAE1D,oEAAoE;QACpE,IAAI,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,iBAAiB,GAAG,SAAS,KAAK,IAAI,CAAA;QAE5C,kEAAkE;QAClE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAA;YACrD,SAAS,GAAG,SAAS,IAAI,iBAAiB,EAAE,CAAA;YAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC5C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAEjC,MAAM,IAAI,EAAE,CAAA;YAEZ,uEAAuE;YACvE,uEAAuE;YACvE,wEAAwE;YACxE,mBAAmB;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,0DAA0D;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,CAAA;YACtE,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC3D,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE;oBACvC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oBAC1D,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,YAAY;iBACrB,CAAC,CAAA;YACJ,CAAC;YACD,OAAM;QACR,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,iBAAiB,EAAE,CAAA;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAC5C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAEjC,MAAM,IAAI,EAAE,CAAA;QAEZ,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,qEAAqE;QACrE,oEAAoE;QACpE,yBAAyB;QACzB,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAA;QAC5C,MAAM,KAAK,GAAG,CAAC,iBAAiB,CAAA;QAChC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAA;YAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;YACnC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;YAC7D,oEAAoE;YACpE,sEAAsE;YACtE,0BAA0B;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QAC/D,CAAC;aAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC7C,CAAC;QAED,6DAA6D;QAC7D,iEAAiE;QACjE,kEAAkE;QAClE,gEAAgE;QAChE,iEAAiE;QACjE,kEAAkE;QAClE,mEAAmE;QACnE,qEAAqE;QACrE,8DAA8D;QAC9D,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,WAAW,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE;gBACjD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC1D,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,YAAY;aACrB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF;AAED,SAAS,iBAAiB;IACxB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { SessionDriver } from '../Session.js';
2
+ /**
3
+ * Cookie session driver — stores session data in an encrypted cookie (AES-256-GCM).
4
+ * Stateless on the server. Limited by cookie size (~4KB).
5
+ * Requires a secret for encryption.
6
+ */
7
+ export declare class CookieDriver implements SessionDriver {
8
+ private signer;
9
+ constructor(secret: string);
10
+ read(sessionId: string): Promise<Record<string, unknown>>;
11
+ write(_sessionId: string, _data: Record<string, unknown>, _ttl: number): Promise<void>;
12
+ destroy(_sessionId: string): Promise<void>;
13
+ touch(_sessionId: string, _ttl: number): Promise<void>;
14
+ /** Encode session data for cookie storage (encrypted). */
15
+ encode(data: Record<string, unknown>): string;
16
+ }
17
+ //# sourceMappingURL=CookieDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieDriver.d.ts","sourceRoot":"","sources":["../../../src/session/drivers/CookieDriver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD;;;;GAIG;AACH,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,MAAM;IASpB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAWzD,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItF,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,0DAA0D;IAC1D,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAG9C"}
@@ -0,0 +1,42 @@
1
+ import { CookieSigner } from '../../security/CookieSigner.js';
2
+ /**
3
+ * Cookie session driver — stores session data in an encrypted cookie (AES-256-GCM).
4
+ * Stateless on the server. Limited by cookie size (~4KB).
5
+ * Requires a secret for encryption.
6
+ */
7
+ export class CookieDriver {
8
+ signer;
9
+ constructor(secret) {
10
+ if (!secret) {
11
+ throw new Error('CookieDriver requires a secret for session encryption. Set session.secret in your config.');
12
+ }
13
+ this.signer = new CookieSigner(secret);
14
+ }
15
+ async read(sessionId) {
16
+ if (!sessionId)
17
+ return {};
18
+ const decrypted = this.signer.decrypt(sessionId);
19
+ if (!decrypted)
20
+ return {};
21
+ try {
22
+ return JSON.parse(decrypted);
23
+ }
24
+ catch {
25
+ return {};
26
+ }
27
+ }
28
+ async write(_sessionId, _data, _ttl) {
29
+ // Cookie driver writes via the response cookie — handled by middleware
30
+ }
31
+ async destroy(_sessionId) {
32
+ // Cookie deletion handled by middleware setting maxAge=0
33
+ }
34
+ async touch(_sessionId, _ttl) {
35
+ // Cookie renewal handled by middleware
36
+ }
37
+ /** Encode session data for cookie storage (encrypted). */
38
+ encode(data) {
39
+ return this.signer.encrypt(JSON.stringify(data));
40
+ }
41
+ }
42
+ //# sourceMappingURL=CookieDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieDriver.js","sourceRoot":"","sources":["../../../src/session/drivers/CookieDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAG7D;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAc;IAE5B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAA;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,KAA8B,EAAE,IAAY;QAC1E,uEAAuE;IACzE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC9B,yDAAyD;IAC3D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,IAAY;QAC1C,uCAAuC;IACzC,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,IAA6B;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { SessionDriver } from '../Session.js';
2
+ export declare class MemoryDriver implements SessionDriver {
3
+ private store;
4
+ read(sessionId: string): Promise<Record<string, unknown>>;
5
+ write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void>;
6
+ destroy(sessionId: string): Promise<void>;
7
+ touch(sessionId: string, ttl: number): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=MemoryDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryDriver.d.ts","sourceRoot":"","sources":["../../../src/session/drivers/MemoryDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,KAAK,CAA+E;IAEtF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IASzD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3D"}
@@ -0,0 +1,24 @@
1
+ export class MemoryDriver {
2
+ store = new Map();
3
+ async read(sessionId) {
4
+ const entry = this.store.get(sessionId);
5
+ if (!entry || entry.expiresAt < Date.now()) {
6
+ this.store.delete(sessionId);
7
+ return {};
8
+ }
9
+ return { ...entry.data };
10
+ }
11
+ async write(sessionId, data, ttl) {
12
+ this.store.set(sessionId, { data, expiresAt: Date.now() + ttl * 1000 });
13
+ }
14
+ async destroy(sessionId) {
15
+ this.store.delete(sessionId);
16
+ }
17
+ async touch(sessionId, ttl) {
18
+ const entry = this.store.get(sessionId);
19
+ if (entry) {
20
+ entry.expiresAt = Date.now() + ttl * 1000;
21
+ }
22
+ }
23
+ }
24
+ //# sourceMappingURL=MemoryDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryDriver.js","sourceRoot":"","sources":["../../../src/session/drivers/MemoryDriver.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACf,KAAK,GAAsE,IAAI,GAAG,EAAE,CAAA;IAE5F,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5B,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,IAA6B,EAAE,GAAW;QACvE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,GAAW;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAA;QAC3C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * S3Driver — S3-compatible cloud storage (AWS S3, Cloudflare R2, MinIO).
3
+ *
4
+ * Uses fetch API — no external SDK dependency.
5
+ * Implements the StorageDriver interface.
6
+ *
7
+ * @implements MISS-24
8
+ */
9
+ import type { StorageDriver } from './StorageManager.js';
10
+ export interface S3Config {
11
+ bucket: string;
12
+ region?: string;
13
+ endpoint?: string;
14
+ accessKeyId: string;
15
+ secretAccessKey: string;
16
+ publicUrl?: string;
17
+ }
18
+ export declare class S3Driver implements StorageDriver {
19
+ #private;
20
+ constructor(config: S3Config);
21
+ put(filePath: string, content: Buffer | string): Promise<void>;
22
+ get(filePath: string): Promise<Buffer | null>;
23
+ delete(filePath: string): Promise<boolean>;
24
+ exists(filePath: string): Promise<boolean>;
25
+ url(filePath: string): string;
26
+ }
27
+ //# sourceMappingURL=S3Driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S3Driver.d.ts","sourceRoot":"","sources":["../../src/storage/S3Driver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AA4BxD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,QAAS,YAAW,aAAa;;gBAIhC,MAAM,EAAE,QAAQ;IAKtB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9D,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa7C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAuE9B"}