@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,14 @@
1
+ export type { LockBackend } from './locks/LockBackend.js';
2
+ export { MemoryLockBackend } from './locks/MemoryLockBackend.js';
3
+ export type { ErrorReporter } from './observability/ErrorReporter.js';
4
+ export type { ScheduleEvent, ScheduleTaskCompletedEvent, ScheduleTaskFailedEvent, ScheduleTaskSkippedEvent, ScheduleTaskStartedEvent, } from './observability/ScheduleEvent.js';
5
+ export type { ScheduleEventSink } from './observability/ScheduleEventSink.js';
6
+ export type { TaskStats } from './observability/StatsTracker.js';
7
+ export { StatsTracker } from './observability/StatsTracker.js';
8
+ export type { ScheduleMetadata } from './Schedule.js';
9
+ export { getScheduleMetadata, SCHEDULE_METADATA_KEY, Schedule } from './Schedule.js';
10
+ export type { ScheduleProviderOptions } from './ScheduleProvider.js';
11
+ export { ScheduleProvider } from './ScheduleProvider.js';
12
+ export type { RunTaskOutcome, ScheduleInvocation, SchedulerOptions, TaskInfo, } from './Scheduler.js';
13
+ export { Scheduler } from './Scheduler.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AACrE,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,YAAY,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACpF,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { MemoryLockBackend } from './locks/MemoryLockBackend.js';
2
+ export { StatsTracker } from './observability/StatsTracker.js';
3
+ export { getScheduleMetadata, SCHEDULE_METADATA_KEY, Schedule } from './Schedule.js';
4
+ export { ScheduleProvider } from './ScheduleProvider.js';
5
+ export { Scheduler } from './Scheduler.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAWhE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAOxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Pluggable distributed-lock interface for the scheduler.
3
+ *
4
+ * The scheduler consults a `LockBackend` immediately before firing a
5
+ * registered task so that in multi-instance deployments only one
6
+ * instance runs a given task on each tick. Redis, database
7
+ * advisory-lock, and other backends live in user-land — this module
8
+ * ships only the interface and a single-process `MemoryLockBackend`.
9
+ *
10
+ * @implements Story 28.3
11
+ */
12
+ export interface LockBackend {
13
+ /**
14
+ * Attempt to acquire an exclusive lock on `name` for up to `ttlMs`
15
+ * wall-clock milliseconds.
16
+ *
17
+ * Returns `true` when the caller now owns the lock, `false` when it
18
+ * is held by someone else. Implementations must treat an entry
19
+ * whose TTL has elapsed as free — expired locks auto-recover
20
+ * without manual cleanup, which is essential for crash tolerance.
21
+ *
22
+ * Implementations should be safe to call concurrently; the memory
23
+ * backend serializes access through a synchronous `Map` under the
24
+ * hood, remote backends typically rely on their server's atomic
25
+ * compare-and-set primitive.
26
+ */
27
+ acquire(name: string, ttlMs: number): Promise<boolean>;
28
+ /**
29
+ * Release the lock on `name`. Idempotent — releasing an unknown or
30
+ * already-released lock must not throw. The scheduler calls this
31
+ * in a `finally` block immediately after the task completes so the
32
+ * next tick on any instance can re-acquire without waiting for the
33
+ * TTL.
34
+ */
35
+ release(name: string): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=LockBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockBackend.d.ts","sourceRoot":"","sources":["../../../src/scheduler/locks/LockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtD;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Pluggable distributed-lock interface for the scheduler.
3
+ *
4
+ * The scheduler consults a `LockBackend` immediately before firing a
5
+ * registered task so that in multi-instance deployments only one
6
+ * instance runs a given task on each tick. Redis, database
7
+ * advisory-lock, and other backends live in user-land — this module
8
+ * ships only the interface and a single-process `MemoryLockBackend`.
9
+ *
10
+ * @implements Story 28.3
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=LockBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockBackend.js","sourceRoot":"","sources":["../../../src/scheduler/locks/LockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Default single-process lock backend backed by a `Map`.
3
+ *
4
+ * Correct for apps that run in a single Node.js process. For
5
+ * horizontally-scaled deployments, implement `LockBackend` against a
6
+ * shared store (Redis `SET NX PX`, Postgres advisory locks, etc.) —
7
+ * those drivers live in user-land per the project's "agnostic per
8
+ * package" rule.
9
+ *
10
+ * Expiry is evaluated **lazily** at `acquire` time — no background
11
+ * timer, no `setInterval`. This preserves Story 28.1's
12
+ * Rust-ticker-only philosophy: the only timers in the scheduler live
13
+ * in the Rust Tokio runtime.
14
+ *
15
+ * An opportunistic sweep runs at most once per `acquire` call to
16
+ * cap unbounded growth: when the map exceeds `SWEEP_THRESHOLD`
17
+ * entries, expired entries are pruned in O(N) without blocking
18
+ * the normal path.
19
+ *
20
+ * @implements Story 28.3
21
+ */
22
+ import type { LockBackend } from './LockBackend.js';
23
+ export declare class MemoryLockBackend implements LockBackend {
24
+ #private;
25
+ acquire(name: string, ttlMs: number): Promise<boolean>;
26
+ release(name: string): Promise<void>;
27
+ /**
28
+ * @internal Test-only helper: force an entry into the map with an
29
+ * arbitrary expiry. Used to simulate a crashed holder whose lock
30
+ * has already expired without advancing `Date.now()`. Not part of
31
+ * the public {@link LockBackend} contract — never call from
32
+ * production code.
33
+ */
34
+ __setExpiryForTesting(name: string, expiryMs: number): void;
35
+ /** @internal Test-only helper — return the current map size. */
36
+ __sizeForTesting(): number;
37
+ }
38
+ export default MemoryLockBackend;
39
+ //# sourceMappingURL=MemoryLockBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryLockBackend.d.ts","sourceRoot":"","sources":["../../../src/scheduler/locks/MemoryLockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAgBnD,qBAAa,iBAAkB,YAAW,WAAW;;IAG7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBtD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C;;;;;;OAMG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3D,gEAAgE;IAChE,gBAAgB,IAAI,MAAM;CAG3B;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Default single-process lock backend backed by a `Map`.
3
+ *
4
+ * Correct for apps that run in a single Node.js process. For
5
+ * horizontally-scaled deployments, implement `LockBackend` against a
6
+ * shared store (Redis `SET NX PX`, Postgres advisory locks, etc.) —
7
+ * those drivers live in user-land per the project's "agnostic per
8
+ * package" rule.
9
+ *
10
+ * Expiry is evaluated **lazily** at `acquire` time — no background
11
+ * timer, no `setInterval`. This preserves Story 28.1's
12
+ * Rust-ticker-only philosophy: the only timers in the scheduler live
13
+ * in the Rust Tokio runtime.
14
+ *
15
+ * An opportunistic sweep runs at most once per `acquire` call to
16
+ * cap unbounded growth: when the map exceeds `SWEEP_THRESHOLD`
17
+ * entries, expired entries are pruned in O(N) without blocking
18
+ * the normal path.
19
+ *
20
+ * @implements Story 28.3
21
+ */
22
+ import { ReamError } from '../../errors/ReamError.js';
23
+ const SWEEP_THRESHOLD = 256;
24
+ function assertValidTtl(ttlMs) {
25
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
26
+ throw new ReamError('SCHEDULE_INVALID_LOCK_TTL', `Lock TTL must be a finite positive number, got ${ttlMs}`, {
27
+ hint: 'Use a millisecond value greater than zero (typical range 1_000 – 600_000).',
28
+ });
29
+ }
30
+ }
31
+ export class MemoryLockBackend {
32
+ #locks = new Map();
33
+ async acquire(name, ttlMs) {
34
+ assertValidTtl(ttlMs);
35
+ const now = Date.now();
36
+ // Opportunistic sweep: when the map grows past the threshold,
37
+ // drop expired entries. Bounded by the current map size, runs at
38
+ // most once per acquire, never schedules async work.
39
+ if (this.#locks.size >= SWEEP_THRESHOLD) {
40
+ for (const [key, expiry] of this.#locks) {
41
+ if (expiry <= now)
42
+ this.#locks.delete(key);
43
+ }
44
+ }
45
+ const existing = this.#locks.get(name);
46
+ if (existing !== undefined && existing > now) {
47
+ return false;
48
+ }
49
+ this.#locks.set(name, now + ttlMs);
50
+ return true;
51
+ }
52
+ async release(name) {
53
+ this.#locks.delete(name);
54
+ }
55
+ /**
56
+ * @internal Test-only helper: force an entry into the map with an
57
+ * arbitrary expiry. Used to simulate a crashed holder whose lock
58
+ * has already expired without advancing `Date.now()`. Not part of
59
+ * the public {@link LockBackend} contract — never call from
60
+ * production code.
61
+ */
62
+ __setExpiryForTesting(name, expiryMs) {
63
+ this.#locks.set(name, expiryMs);
64
+ }
65
+ /** @internal Test-only helper — return the current map size. */
66
+ __sizeForTesting() {
67
+ return this.#locks.size;
68
+ }
69
+ }
70
+ export default MemoryLockBackend;
71
+ //# sourceMappingURL=MemoryLockBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryLockBackend.js","sourceRoot":"","sources":["../../../src/scheduler/locks/MemoryLockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAGrD,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CACjB,2BAA2B,EAC3B,kDAAkD,KAAK,EAAE,EACzD;YACE,IAAI,EAAE,4EAA4E;SACnF,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IAElC,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAAa;QACvC,cAAc,CAAC,KAAK,CAAC,CAAA;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,8DAA8D;QAC9D,iEAAiE;QACjE,qDAAqD;QACrD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxC,IAAI,MAAM,IAAI,GAAG;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,CAAA;QAClC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,IAAY,EAAE,QAAgB;QAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,gEAAgE;IAChE,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;IACzB,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Callback invoked when a scheduled task throws. Typically bridges
3
+ * to `ErrorBoundary.serviceError` — but the scheduler does not
4
+ * import `ErrorBoundary` directly; the user wires the adapter
5
+ * per the "agnostic per package" rule.
6
+ *
7
+ * The scheduler wraps the call in its own `try/catch`, so an
8
+ * `ErrorReporter` that itself throws cannot crash the Rust ticker.
9
+ *
10
+ * @implements Story 28.4
11
+ */
12
+ export type ErrorReporter = (err: unknown, context: {
13
+ taskName: string;
14
+ }) => void;
15
+ //# sourceMappingURL=ErrorReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorReporter.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ErrorReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Callback invoked when a scheduled task throws. Typically bridges
3
+ * to `ErrorBoundary.serviceError` — but the scheduler does not
4
+ * import `ErrorBoundary` directly; the user wires the adapter
5
+ * per the "agnostic per package" rule.
6
+ *
7
+ * The scheduler wraps the call in its own `try/catch`, so an
8
+ * `ErrorReporter` that itself throws cannot crash the Rust ticker.
9
+ *
10
+ * @implements Story 28.4
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=ErrorReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorReporter.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ErrorReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Discriminated union of events emitted by the scheduler's task
3
+ * invocation wrapper.
4
+ *
5
+ * All payloads are JSON-serializable so downstream sinks (the event bus,
6
+ * structured logs, metrics backends) can forward them without
7
+ * touching live `Error` instances.
8
+ *
9
+ * @implements Story 28.4
10
+ */
11
+ export interface ScheduleTaskStartedEvent {
12
+ type: 'schedule.task.started';
13
+ taskName: string;
14
+ /** ms-epoch instant the Rust ticker chose for this fire. */
15
+ scheduledForMs: number;
16
+ /** ms-epoch at which the JS wrapper began running the user callback. */
17
+ startedAtMs: number;
18
+ }
19
+ export interface ScheduleTaskCompletedEvent {
20
+ type: 'schedule.task.completed';
21
+ taskName: string;
22
+ /** Wall-clock milliseconds spent running the callback. */
23
+ durationMs: number;
24
+ }
25
+ export interface ScheduleTaskFailedEvent {
26
+ type: 'schedule.task.failed';
27
+ taskName: string;
28
+ /** Plain-object projection of the thrown error (no live `Error`). */
29
+ error: {
30
+ name: string;
31
+ message: string;
32
+ stack?: string;
33
+ };
34
+ /** Wall-clock milliseconds until the throw. */
35
+ durationMs: number;
36
+ }
37
+ export interface ScheduleTaskSkippedEvent {
38
+ type: 'schedule.task.skipped';
39
+ taskName: string;
40
+ /** Reason this tick did not execute the task body.
41
+ * - `'locked'` — distributed-lock backend reported the slot as
42
+ * already held by another instance.
43
+ * - `'acquire-failed'` — the lock backend itself threw/rejected
44
+ * (e.g. Redis connection drop); the scheduler treats the tick
45
+ * as skipped for observability rather than silently dropping.
46
+ * - `'already-running'` — an in-process invocation of the same
47
+ * task is already in flight (ticker + concurrent `runTaskNow`,
48
+ * or two simultaneous `runTaskNow` calls). The duplicate is
49
+ * dropped to prevent double-execution of non-idempotent tasks.
50
+ *
51
+ * Left open for future reasons (e.g. `'paused'`). Consumers that
52
+ * branch on `reason` should handle unknown values defensively
53
+ * (log + treat as skip) so adding a new variant is non-breaking. */
54
+ reason: 'locked' | 'acquire-failed' | 'already-running';
55
+ }
56
+ export type ScheduleEvent = ScheduleTaskStartedEvent | ScheduleTaskCompletedEvent | ScheduleTaskFailedEvent | ScheduleTaskSkippedEvent;
57
+ //# sourceMappingURL=ScheduleEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleEvent.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEvent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,uBAAuB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,yBAAyB,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,qEAAqE;IACrE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxD,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,uBAAuB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;;;;;;;;yEAaqE;IACrE,MAAM,EAAE,QAAQ,GAAG,gBAAgB,GAAG,iBAAiB,CAAA;CACxD;AAED,MAAM,MAAM,aAAa,GACrB,wBAAwB,GACxB,0BAA0B,GAC1B,uBAAuB,GACvB,wBAAwB,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Discriminated union of events emitted by the scheduler's task
3
+ * invocation wrapper.
4
+ *
5
+ * All payloads are JSON-serializable so downstream sinks (the event bus,
6
+ * structured logs, metrics backends) can forward them without
7
+ * touching live `Error` instances.
8
+ *
9
+ * @implements Story 28.4
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=ScheduleEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleEvent.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEvent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Destination for scheduler task-invocation events.
3
+ *
4
+ * This interface is intentionally minimal so users can adapt to any
5
+ * event bus (the bus, a raw `EventEmitter`, a structured logger). The
6
+ * scheduler does NOT import the event bus directly — writing the
7
+ * bridge is the user's responsibility per the project's "agnostic
8
+ * per package" rule.
9
+ *
10
+ * The scheduler treats `emit` as fire-and-forget: it does not await
11
+ * the return value, and any sync throw is caught at the call site so
12
+ * a buggy adapter cannot crash the Rust ticker.
13
+ *
14
+ * @implements Story 28.4
15
+ */
16
+ import type { ScheduleEvent } from './ScheduleEvent.js';
17
+ export interface ScheduleEventSink {
18
+ emit(event: ScheduleEvent): void | Promise<void>;
19
+ }
20
+ //# sourceMappingURL=ScheduleEventSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleEventSink.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEventSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Destination for scheduler task-invocation events.
3
+ *
4
+ * This interface is intentionally minimal so users can adapt to any
5
+ * event bus (the bus, a raw `EventEmitter`, a structured logger). The
6
+ * scheduler does NOT import the event bus directly — writing the
7
+ * bridge is the user's responsibility per the project's "agnostic
8
+ * per package" rule.
9
+ *
10
+ * The scheduler treats `emit` as fire-and-forget: it does not await
11
+ * the return value, and any sync throw is caught at the call site so
12
+ * a buggy adapter cannot crash the Rust ticker.
13
+ *
14
+ * @implements Story 28.4
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=ScheduleEventSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleEventSink.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEventSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Per-task run statistics. Populated by the scheduler's invocation
3
+ * wrapper and surfaced via `Scheduler.getStats(taskName)`.
4
+ *
5
+ * `nextRunMs` is NOT tracked here — it is read live from the Rust
6
+ * NAPI layer every time `Scheduler.getStats` is called. This tracker
7
+ * only owns counters that accumulate over time.
8
+ *
9
+ * @implements Story 28.4
10
+ */
11
+ export interface TaskStats {
12
+ /** ms-epoch of the most recent fire that the wrapper STARTED (lock-skipped fires do not update this). `null` if never started. */
13
+ lastRunMs: number | null;
14
+ /** ms-epoch of the next scheduled fire as reported by the Rust core. `null` when the task is unknown or the core returns null. */
15
+ nextRunMs: number | null;
16
+ /** Total terminal invocations: completed + failed + skipped. */
17
+ runCount: number;
18
+ /** Completed (callback resolved without throwing). */
19
+ successCount: number;
20
+ /** Failed (callback threw / rejected). */
21
+ errorCount: number;
22
+ /** Skipped (lock backend reported the task already held by another instance). */
23
+ skippedCount: number;
24
+ /**
25
+ * Rolling average wall-clock duration over completed + failed
26
+ * runs (skipped runs have no duration and are excluded). `0`
27
+ * until at least one duration has been recorded.
28
+ */
29
+ avgDurationMs: number;
30
+ }
31
+ /**
32
+ * O(1) in-memory counter map — one entry per task name seen. Never
33
+ * grows beyond the number of distinct task names the scheduler has
34
+ * seen; no per-run history retained.
35
+ */
36
+ export declare class StatsTracker {
37
+ #private;
38
+ recordStarted(name: string, startedAtMs: number): void;
39
+ recordCompleted(name: string, durationMs: number): void;
40
+ recordFailed(name: string, durationMs: number): void;
41
+ recordSkipped(name: string): void;
42
+ /**
43
+ * Return a defensive snapshot. Unknown tasks yield a zeroed
44
+ * snapshot with `null` timestamps. `nextRunMs` is always `null`
45
+ * here — the caller (`Scheduler.getStats`) overlays the live
46
+ * value from the NAPI layer.
47
+ */
48
+ get(name: string): TaskStats;
49
+ }
50
+ //# sourceMappingURL=StatsTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatsTracker.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/StatsTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,SAAS;IACxB,kIAAkI;IAClI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kIAAkI;IAClI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAA;IACpB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAA;CACtB;AAwBD;;;;GAIG;AACH,qBAAa,YAAY;;IAYvB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAItD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAavD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUpD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMjC;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;CAuB7B"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Per-task run statistics. Populated by the scheduler's invocation
3
+ * wrapper and surfaced via `Scheduler.getStats(taskName)`.
4
+ *
5
+ * `nextRunMs` is NOT tracked here — it is read live from the Rust
6
+ * NAPI layer every time `Scheduler.getStats` is called. This tracker
7
+ * only owns counters that accumulate over time.
8
+ *
9
+ * @implements Story 28.4
10
+ */
11
+ function zeroInternal() {
12
+ return {
13
+ lastRunMs: null,
14
+ runCount: 0,
15
+ successCount: 0,
16
+ errorCount: 0,
17
+ skippedCount: 0,
18
+ totalDurationMs: 0,
19
+ durationRunCount: 0,
20
+ };
21
+ }
22
+ /**
23
+ * O(1) in-memory counter map — one entry per task name seen. Never
24
+ * grows beyond the number of distinct task names the scheduler has
25
+ * seen; no per-run history retained.
26
+ */
27
+ export class StatsTracker {
28
+ #stats = new Map();
29
+ #ensure(name) {
30
+ let s = this.#stats.get(name);
31
+ if (!s) {
32
+ s = zeroInternal();
33
+ this.#stats.set(name, s);
34
+ }
35
+ return s;
36
+ }
37
+ recordStarted(name, startedAtMs) {
38
+ this.#ensure(name).lastRunMs = startedAtMs;
39
+ }
40
+ recordCompleted(name, durationMs) {
41
+ const s = this.#ensure(name);
42
+ s.runCount++;
43
+ s.successCount++;
44
+ // Guard against non-finite durations — a caller bug passing NaN or
45
+ // Infinity would permanently poison the rolling average. Still
46
+ // count the run; only skip the duration accumulation.
47
+ if (Number.isFinite(durationMs)) {
48
+ s.totalDurationMs += durationMs;
49
+ s.durationRunCount++;
50
+ }
51
+ }
52
+ recordFailed(name, durationMs) {
53
+ const s = this.#ensure(name);
54
+ s.runCount++;
55
+ s.errorCount++;
56
+ if (Number.isFinite(durationMs)) {
57
+ s.totalDurationMs += durationMs;
58
+ s.durationRunCount++;
59
+ }
60
+ }
61
+ recordSkipped(name) {
62
+ const s = this.#ensure(name);
63
+ s.runCount++;
64
+ s.skippedCount++;
65
+ }
66
+ /**
67
+ * Return a defensive snapshot. Unknown tasks yield a zeroed
68
+ * snapshot with `null` timestamps. `nextRunMs` is always `null`
69
+ * here — the caller (`Scheduler.getStats`) overlays the live
70
+ * value from the NAPI layer.
71
+ */
72
+ get(name) {
73
+ const s = this.#stats.get(name);
74
+ if (!s) {
75
+ return {
76
+ lastRunMs: null,
77
+ nextRunMs: null,
78
+ runCount: 0,
79
+ successCount: 0,
80
+ errorCount: 0,
81
+ skippedCount: 0,
82
+ avgDurationMs: 0,
83
+ };
84
+ }
85
+ return {
86
+ lastRunMs: s.lastRunMs,
87
+ nextRunMs: null,
88
+ runCount: s.runCount,
89
+ successCount: s.successCount,
90
+ errorCount: s.errorCount,
91
+ skippedCount: s.skippedCount,
92
+ avgDurationMs: s.durationRunCount > 0 ? s.totalDurationMs / s.durationRunCount : 0,
93
+ };
94
+ }
95
+ }
96
+ //# sourceMappingURL=StatsTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatsTracker.js","sourceRoot":"","sources":["../../../src/scheduler/observability/StatsTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Cookie signing and encryption.
3
+ * Uses Rust NAPI via crypto facade when available.
4
+ */
5
+ export declare class CookieSigner {
6
+ #private;
7
+ constructor(secret: string);
8
+ sign(value: string): string;
9
+ unsign(signed: string): string | null;
10
+ encrypt(value: string): string;
11
+ decrypt(encrypted: string): string | null;
12
+ }
13
+ //# sourceMappingURL=CookieSigner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieSigner.d.ts","sourceRoot":"","sources":["../../src/security/CookieSigner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,YAAY;;gBAIX,MAAM,EAAE,MAAM;IAM1B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQrC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ9B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAc1C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Cookie signing and encryption.
3
+ * Uses Rust NAPI via crypto facade when available.
4
+ */
5
+ import { createCipheriv, createDecipheriv, createHmac, randomBytes } from 'node:crypto';
6
+ import { hmacSign, hmacVerify } from './crypto.js';
7
+ export class CookieSigner {
8
+ #secret;
9
+ #keyBuffer;
10
+ constructor(secret) {
11
+ this.#secret = secret;
12
+ // Derive a 32-byte key for AES-256-GCM via HKDF-like derivation
13
+ this.#keyBuffer = Buffer.from(createHmac('sha256', secret).update('cookie-key').digest());
14
+ }
15
+ sign(value) {
16
+ const sig = hmacSign(value, this.#secret);
17
+ return `${value}.${sig}`;
18
+ }
19
+ unsign(signed) {
20
+ const lastDot = signed.lastIndexOf('.');
21
+ if (lastDot === -1)
22
+ return null;
23
+ const value = signed.slice(0, lastDot);
24
+ const sig = signed.slice(lastDot + 1);
25
+ return hmacVerify(value, sig, this.#secret) ? value : null;
26
+ }
27
+ encrypt(value) {
28
+ const iv = randomBytes(12);
29
+ const cipher = createCipheriv('aes-256-gcm', this.#keyBuffer, iv);
30
+ const encrypted = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()]);
31
+ const tag = cipher.getAuthTag();
32
+ return `${iv.toString('base64url')}.${encrypted.toString('base64url')}.${tag.toString('base64url')}`;
33
+ }
34
+ decrypt(encrypted) {
35
+ const parts = encrypted.split('.');
36
+ if (parts.length !== 3)
37
+ return null;
38
+ try {
39
+ const iv = Buffer.from(parts[0], 'base64url');
40
+ const data = Buffer.from(parts[1], 'base64url');
41
+ const tag = Buffer.from(parts[2], 'base64url');
42
+ const decipher = createDecipheriv('aes-256-gcm', this.#keyBuffer, iv);
43
+ decipher.setAuthTag(tag);
44
+ return Buffer.concat([decipher.update(data), decipher.final()]).toString('utf8');
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=CookieSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieSigner.js","sourceRoot":"","sources":["../../src/security/CookieSigner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Signed URLs — HMAC-SHA256 with expiration.
3
+ * Uses Rust NAPI via crypto facade when available.
4
+ */
5
+ export interface SignedUrlConfig {
6
+ secret: string;
7
+ }
8
+ export declare class SignedUrl {
9
+ #private;
10
+ constructor(config: SignedUrlConfig);
11
+ make(path: string, options?: {
12
+ expiresIn?: string | number;
13
+ purpose?: string;
14
+ }): string;
15
+ verify(urlString: string, purpose?: string): boolean;
16
+ }
17
+ //# sourceMappingURL=SignedUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignedUrl.d.ts","sourceRoot":"","sources":["../../src/security/SignedUrl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,SAAS;;gBAGR,MAAM,EAAE,eAAe;IAInC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAqBvF,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;CAYrD"}