@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,209 @@
1
+ /**
2
+ * `Scheduler` — thin TypeScript wrapper around `ream-scheduler-napi`.
3
+ *
4
+ * The actual cron parser, task registry, and tick loop live in Rust
5
+ * (Story 28.1). This class:
6
+ * - Lazily loads the NAPI `.node` binary on first instantiation.
7
+ * - Adapts the native surface to a typed TS API.
8
+ * - Translates `napi::Error` JSON payloads into `ReamError`.
9
+ * - Tracks registered cron expressions locally so `listTasks()` can
10
+ * return them (the Rust side does not expose task metadata today).
11
+ *
12
+ * @implements Story 28.2
13
+ */
14
+ import type { LockBackend } from './locks/LockBackend.js';
15
+ import type { ErrorReporter } from './observability/ErrorReporter.js';
16
+ import type { ScheduleEventSink } from './observability/ScheduleEventSink.js';
17
+ import type { TaskStats } from './observability/StatsTracker.js';
18
+ /** Payload delivered to every task invocation by the Rust ticker. */
19
+ export interface ScheduleInvocation {
20
+ taskName: string;
21
+ scheduledForMs: number;
22
+ }
23
+ /** Task listing entry returned by {@link Scheduler.listTasks}. */
24
+ export interface TaskInfo {
25
+ name: string;
26
+ cronExpr: string;
27
+ nextRun: number | null;
28
+ }
29
+ /**
30
+ * Outcome returned by {@link Scheduler.runTaskNow}.
31
+ *
32
+ * - `completed` — the task body resolved without throwing.
33
+ * - `failed` — the task body threw / rejected; `error` carries a
34
+ * plain-object projection of the throw. Also used when an optional
35
+ * `timeoutMs` elapses before the task resolves.
36
+ * - `unknown` — no task is registered under the given name;
37
+ * `durationMs` is `0` and no events are emitted. The `errorReporter`
38
+ * (if configured) receives a synthetic error so the operator typo
39
+ * is observable in audit pipelines.
40
+ * - `already-running` — an in-process invocation of the same task is
41
+ * already in flight; this call was dropped to avoid double-execution.
42
+ * A `schedule.task.skipped` event with reason `'already-running'`
43
+ * was emitted.
44
+ */
45
+ export interface RunTaskOutcome {
46
+ outcome: 'completed' | 'failed' | 'unknown' | 'already-running';
47
+ durationMs: number;
48
+ error?: {
49
+ name: string;
50
+ message: string;
51
+ stack?: string;
52
+ };
53
+ }
54
+ /** Options accepted by {@link Scheduler.runTaskNow}. */
55
+ export interface RunTaskOptions {
56
+ /**
57
+ * Cancel the on-demand run after `timeoutMs` milliseconds. On
58
+ * timeout, `runTaskNow` returns `{ outcome: 'failed', error: ... }`
59
+ * with a `SCHEDULE_TASK_TIMEOUT` error. The user callback continues
60
+ * running in the background — JavaScript does not support
61
+ * pre-emptive cancellation; the timeout is observational only.
62
+ */
63
+ timeoutMs?: number;
64
+ }
65
+ /** Shape of the native class exposed by `ream-scheduler-napi`. */
66
+ interface NativeScheduler {
67
+ register(name: string, cronExpr: string, callback: (payload: ScheduleInvocation) => void | Promise<void>): void;
68
+ unregister(name: string): void;
69
+ start(): void;
70
+ stop(): void;
71
+ nextRun(name: string): number | null;
72
+ }
73
+ interface NativeModule {
74
+ RustScheduler: new () => NativeScheduler;
75
+ }
76
+ /**
77
+ * Constructor options for {@link Scheduler}.
78
+ */
79
+ export interface SchedulerOptions {
80
+ /**
81
+ * Inject a pre-loaded NAPI module. Intended for tests that bypass
82
+ * the `.node` binary lookup — production callers should omit this
83
+ * and let `loadNapi` resolve the platform-suffixed binary.
84
+ */
85
+ nativeModule?: NativeModule;
86
+ /**
87
+ * Distributed-lock backend. When provided, every task invocation
88
+ * is guarded by `acquire(name, defaultLockTtlMs)` / `release(name)`
89
+ * so horizontally-scaled deployments do not double-execute.
90
+ * Defaults to `undefined` (no locking — single-instance semantics).
91
+ */
92
+ lockBackend?: LockBackend;
93
+ /**
94
+ * Lock TTL in milliseconds. Defaults to 60_000 (one minute). Only
95
+ * used when `lockBackend` is provided.
96
+ */
97
+ defaultLockTtlMs?: number;
98
+ /**
99
+ * Destination for task-invocation events
100
+ * (`schedule.task.{started,completed,failed,skipped}`). Leave
101
+ * undefined to disable event emission — stats tracking still
102
+ * happens regardless, and `getStats` remains useful.
103
+ */
104
+ eventSink?: ScheduleEventSink;
105
+ /**
106
+ * Callback invoked when a task throws. Typically bridges to
107
+ * `ErrorBoundary.serviceError`. Leave undefined to disable
108
+ * boundary reporting.
109
+ */
110
+ errorReporter?: ErrorReporter;
111
+ }
112
+ /**
113
+ * Cron-style scheduler backed by a Rust Tokio ticker.
114
+ *
115
+ * ```ts
116
+ * const scheduler = new Scheduler()
117
+ * scheduler.register('cleanup', '0 *\/5 * * *', () => { ... })
118
+ * scheduler.start()
119
+ * // later
120
+ * scheduler.stop()
121
+ * ```
122
+ *
123
+ * All schedules evaluate in UTC. Missed fires after a runtime stall are
124
+ * dropped, not replayed (see `ream-scheduler` crate docs).
125
+ */
126
+ export declare class Scheduler {
127
+ #private;
128
+ constructor(options?: SchedulerOptions);
129
+ /**
130
+ * Register a recurring task.
131
+ *
132
+ * The callback is invoked by the Rust ticker when the cron schedule
133
+ * fires. Exceptions thrown synchronously or rejected asynchronously
134
+ * are caught here so they never surface back to the Rust side; when
135
+ * an `eventSink` / `errorReporter` is configured, failures are
136
+ * emitted as `schedule.task.failed` events and forwarded to the
137
+ * reporter. Otherwise the error is dropped silently.
138
+ *
139
+ * Event ordering guarantees: within a single tick, events are emitted
140
+ * in the documented order (`started` → `completed` | `failed` |
141
+ * `skipped`). Ordering across ticks is NOT guaranteed when the sink
142
+ * returns a Promise — the scheduler does not chain sink promises, so
143
+ * a fast tick N+1 can deliver events before a slow tick N's events
144
+ * reach the sink. Sinks that need strict ordering should maintain
145
+ * their own sequencing.
146
+ */
147
+ register(name: string, cronExpr: string, callback: (payload: ScheduleInvocation) => void | Promise<void>): void;
148
+ /**
149
+ * Remove a registered task. Idempotent — unknown names are not an
150
+ * error. If the native side reports an unknown-task condition it is
151
+ * treated as already-removed rather than propagated.
152
+ */
153
+ unregister(name: string): void;
154
+ /**
155
+ * Start the Rust ticker. Safe to call when already running — the
156
+ * underlying `ream-scheduler` core is idempotent (Story 28.1: the
157
+ * ticker's internal cancel channel is only installed once per start).
158
+ */
159
+ start(): void;
160
+ /**
161
+ * Cancel the Rust ticker. Safe to call when not running — the
162
+ * underlying `ream-scheduler` core treats `stop()` as a no-op when no
163
+ * cancel channel is installed.
164
+ */
165
+ stop(): void;
166
+ /**
167
+ * Return the next fire time in ms since epoch, or `null` if the task
168
+ * is unknown.
169
+ */
170
+ nextRun(name: string): number | null;
171
+ /**
172
+ * Snapshot of every currently-registered task.
173
+ *
174
+ * NOTE: Makes one FFI call per task via `nextRun`. Acceptable for
175
+ * typical task counts (dozens); consumers iterating huge registries
176
+ * should cache the result.
177
+ */
178
+ listTasks(): TaskInfo[];
179
+ /**
180
+ * Invoke a registered task once immediately, bypassing the cron
181
+ * schedule AND the configured lock backend.
182
+ *
183
+ * **Admin override:** `runTaskNow` does NOT consult the
184
+ * `lockBackend`. Running a task manually is an explicit operator
185
+ * action that must not be blocked by a peer instance holding the
186
+ * distributed lock. Regular ticker-driven fires continue to honor
187
+ * the lock.
188
+ *
189
+ * Observability is preserved — the same `started` / `completed`
190
+ * / `failed` events fire and the `errorReporter` runs exactly as
191
+ * for a normal tick, updating `getStats(name)` identically.
192
+ *
193
+ * Unknown task names return `{ outcome: 'unknown', durationMs: 0 }`
194
+ * without emitting any event — mirrors the never-throws contract
195
+ * of {@link Scheduler.getStats}.
196
+ */
197
+ runTaskNow(name: string, options?: RunTaskOptions): Promise<RunTaskOutcome>;
198
+ /**
199
+ * Return a snapshot of observability counters for `taskName`.
200
+ *
201
+ * Unknown task names return a zeroed snapshot (all counters `0`,
202
+ * all timestamps `null`) — never throws. The `nextRunMs` field is
203
+ * read live from the Rust layer on each call; a native-side failure
204
+ * is swallowed here so that `getStats` always returns.
205
+ */
206
+ getStats(taskName: string): TaskStats;
207
+ }
208
+ export {};
209
+ //# sourceMappingURL=Scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,432 @@
1
+ /**
2
+ * `Scheduler` — thin TypeScript wrapper around `ream-scheduler-napi`.
3
+ *
4
+ * The actual cron parser, task registry, and tick loop live in Rust
5
+ * (Story 28.1). This class:
6
+ * - Lazily loads the NAPI `.node` binary on first instantiation.
7
+ * - Adapts the native surface to a typed TS API.
8
+ * - Translates `napi::Error` JSON payloads into `ReamError`.
9
+ * - Tracks registered cron expressions locally so `listTasks()` can
10
+ * return them (the Rust side does not expose task metadata today).
11
+ *
12
+ * @implements Story 28.2
13
+ */
14
+ import { performance } from 'node:perf_hooks';
15
+ import { ReamError } from '../errors/ReamError.js';
16
+ import { loadNapi } from '../helpers/napi-loader.js';
17
+ import { StatsTracker } from './observability/StatsTracker.js';
18
+ const DEFAULT_LOCK_TTL_MS = 60_000;
19
+ let native;
20
+ function loadNative() {
21
+ if (native)
22
+ return native;
23
+ native = loadNapi({
24
+ binaryName: 'scheduler',
25
+ callerMetaUrl: import.meta.url,
26
+ errorCodePrefix: 'SCHEDULER',
27
+ });
28
+ return native;
29
+ }
30
+ /**
31
+ * Convert a thrown native error into a `ReamError`. Prefers parsing the
32
+ * JSON payload shipped by Rust (`ream_napi_core::ReamError::into()`);
33
+ * falls back to wrapping opaque errors under `SCHEDULER_NATIVE_ERROR`
34
+ * so scheduler context is never lost.
35
+ */
36
+ function translateNativeError(e) {
37
+ const asError = e;
38
+ const parsed = ReamError.fromNapi(asError);
39
+ // `fromNapi` returns an `UNKNOWN`-coded error when the message is not
40
+ // a JSON payload. Preserve that context under a scheduler-specific
41
+ // code so callers can trace the failure back to this layer.
42
+ if (parsed.code === 'UNKNOWN') {
43
+ return new ReamError('SCHEDULER_NATIVE_ERROR', `ream-scheduler NAPI call failed: ${asError.message}`, {
44
+ hint: 'This is likely a bug in the scheduler. Please file an issue with the stack trace.',
45
+ });
46
+ }
47
+ return parsed;
48
+ }
49
+ /**
50
+ * Cron-style scheduler backed by a Rust Tokio ticker.
51
+ *
52
+ * ```ts
53
+ * const scheduler = new Scheduler()
54
+ * scheduler.register('cleanup', '0 *\/5 * * *', () => { ... })
55
+ * scheduler.start()
56
+ * // later
57
+ * scheduler.stop()
58
+ * ```
59
+ *
60
+ * All schedules evaluate in UTC. Missed fires after a runtime stall are
61
+ * dropped, not replayed (see `ream-scheduler` crate docs).
62
+ */
63
+ export class Scheduler {
64
+ #inner;
65
+ /** Mirror of registrations — Rust does not expose this today. */
66
+ #tasks = new Map();
67
+ #lockBackend;
68
+ #defaultLockTtlMs;
69
+ #eventSink;
70
+ #errorReporter;
71
+ #stats = new StatsTracker();
72
+ /** Set of task names currently in flight — prevents concurrent
73
+ * double-execution when the ticker and `runTaskNow` (or two
74
+ * simultaneous `runTaskNow` calls) collide on the same name. */
75
+ #running = new Set();
76
+ constructor(options = {}) {
77
+ if (options.lockBackend !== undefined) {
78
+ const be = options.lockBackend;
79
+ if (typeof be.acquire !== 'function' || typeof be.release !== 'function') {
80
+ throw new ReamError('SCHEDULE_INVALID_LOCK_BACKEND', 'Scheduler options.lockBackend must implement acquire(name, ttlMs) and release(name)');
81
+ }
82
+ }
83
+ if (options.defaultLockTtlMs !== undefined) {
84
+ if (!Number.isFinite(options.defaultLockTtlMs) || options.defaultLockTtlMs <= 0) {
85
+ throw new ReamError('SCHEDULE_INVALID_LOCK_TTL', `Scheduler options.defaultLockTtlMs must be a finite positive number, got ${options.defaultLockTtlMs}`, {
86
+ hint: 'Use a millisecond value greater than zero (typical range 1_000 – 600_000).',
87
+ });
88
+ }
89
+ }
90
+ if (options.eventSink !== undefined) {
91
+ const sink = options.eventSink;
92
+ if (typeof sink.emit !== 'function') {
93
+ throw new ReamError('SCHEDULE_INVALID_EVENT_SINK', 'Scheduler options.eventSink must implement emit(event)');
94
+ }
95
+ }
96
+ if (options.errorReporter !== undefined && typeof options.errorReporter !== 'function') {
97
+ throw new ReamError('SCHEDULE_INVALID_ERROR_REPORTER', 'Scheduler options.errorReporter must be a function');
98
+ }
99
+ const mod = options.nativeModule ?? loadNative();
100
+ this.#inner = new mod.RustScheduler();
101
+ this.#lockBackend = options.lockBackend ?? null;
102
+ this.#defaultLockTtlMs = options.defaultLockTtlMs ?? DEFAULT_LOCK_TTL_MS;
103
+ this.#eventSink = options.eventSink ?? null;
104
+ this.#errorReporter = options.errorReporter ?? null;
105
+ }
106
+ #emit(event) {
107
+ if (!this.#eventSink)
108
+ return;
109
+ try {
110
+ const result = this.#eventSink.emit(event);
111
+ // Detect a thenable and swallow any async rejection so the
112
+ // ticker cannot be crashed by a buggy async adapter. Use the
113
+ // `.then`-based detection + `Promise.resolve` wrap so non-native
114
+ // thenables (e.g. RxJS-style) are handled uniformly.
115
+ if (result !== null &&
116
+ result !== undefined &&
117
+ typeof result.then === 'function') {
118
+ Promise.resolve(result).catch(() => { });
119
+ }
120
+ }
121
+ catch {
122
+ // Swallow — a buggy sink adapter must not kill the ticker.
123
+ }
124
+ }
125
+ /**
126
+ * Shared observability core: emit started, invoke the callback,
127
+ * emit completed/failed, record stats, forward to the error
128
+ * reporter. Returns the terminal outcome so callers (the ticker
129
+ * wrapped closure and `runTaskNow`) can act on the result without
130
+ * re-reading the stats map.
131
+ *
132
+ * Does NOT touch the lock backend — lock handling is the caller's
133
+ * responsibility so the admin-override path can bypass it cleanly.
134
+ */
135
+ async #runOnce(name, callback, scheduledForMs) {
136
+ // Concurrent-execution guard. The distributed lock prevents
137
+ // double-fire across instances; this Set prevents double-fire
138
+ // WITHIN a single process (ticker racing with runTaskNow, or two
139
+ // operators hitting runTaskNow at once). A duplicate invocation
140
+ // is recorded as a skip with reason `'already-running'`.
141
+ if (this.#running.has(name)) {
142
+ this.#stats.recordSkipped(name);
143
+ this.#emit({ type: 'schedule.task.skipped', taskName: name, reason: 'already-running' });
144
+ return { outcome: 'already-running', durationMs: 0 };
145
+ }
146
+ this.#running.add(name);
147
+ const startedAt = Date.now();
148
+ const perfStart = performance.now();
149
+ this.#stats.recordStarted(name, startedAt);
150
+ this.#emit({
151
+ type: 'schedule.task.started',
152
+ taskName: name,
153
+ scheduledForMs,
154
+ startedAtMs: startedAt,
155
+ });
156
+ try {
157
+ await callback({ taskName: name, scheduledForMs });
158
+ const durationMs = performance.now() - perfStart;
159
+ this.#stats.recordCompleted(name, durationMs);
160
+ this.#emit({ type: 'schedule.task.completed', taskName: name, durationMs });
161
+ return { outcome: 'completed', durationMs };
162
+ }
163
+ catch (err) {
164
+ const durationMs = performance.now() - perfStart;
165
+ this.#stats.recordFailed(name, durationMs);
166
+ const errObj = err instanceof Error ? err : new Error(String(err));
167
+ this.#emit({
168
+ type: 'schedule.task.failed',
169
+ taskName: name,
170
+ error: { name: errObj.name, message: errObj.message, stack: errObj.stack },
171
+ durationMs,
172
+ });
173
+ this.#report(err, name);
174
+ return { outcome: 'failed', durationMs, error: errObj };
175
+ }
176
+ finally {
177
+ this.#running.delete(name);
178
+ }
179
+ }
180
+ #report(err, taskName) {
181
+ if (!this.#errorReporter)
182
+ return;
183
+ try {
184
+ // The `ErrorReporter` type declares `void` return, but a user
185
+ // adapter that declares an `async` function still satisfies the
186
+ // callable shape and will return a Promise at runtime. Swallow
187
+ // any async rejection in addition to sync throws so a bad
188
+ // reporter never crashes the ticker.
189
+ const result = this.#errorReporter(err, { taskName });
190
+ if (result !== null &&
191
+ result !== undefined &&
192
+ typeof result.then === 'function') {
193
+ Promise.resolve(result).catch(() => { });
194
+ }
195
+ }
196
+ catch {
197
+ // Swallow — a reporter that itself throws cannot propagate.
198
+ }
199
+ }
200
+ /**
201
+ * Register a recurring task.
202
+ *
203
+ * The callback is invoked by the Rust ticker when the cron schedule
204
+ * fires. Exceptions thrown synchronously or rejected asynchronously
205
+ * are caught here so they never surface back to the Rust side; when
206
+ * an `eventSink` / `errorReporter` is configured, failures are
207
+ * emitted as `schedule.task.failed` events and forwarded to the
208
+ * reporter. Otherwise the error is dropped silently.
209
+ *
210
+ * Event ordering guarantees: within a single tick, events are emitted
211
+ * in the documented order (`started` → `completed` | `failed` |
212
+ * `skipped`). Ordering across ticks is NOT guaranteed when the sink
213
+ * returns a Promise — the scheduler does not chain sink promises, so
214
+ * a fast tick N+1 can deliver events before a slow tick N's events
215
+ * reach the sink. Sinks that need strict ordering should maintain
216
+ * their own sequencing.
217
+ */
218
+ register(name, cronExpr, callback) {
219
+ if (typeof callback !== 'function') {
220
+ throw new ReamError('SCHEDULE_INVALID_CALLBACK', `Scheduler.register expected a function callback for task '${name}', got ${typeof callback}`);
221
+ }
222
+ if (name === '') {
223
+ throw new ReamError('SCHEDULE_INVALID_TASK_NAME', 'Scheduler.register requires a non-empty task name');
224
+ }
225
+ // Capture-at-register: the active lock backend is frozen per-task
226
+ // at registration time (observability sinks are read live via
227
+ // #runOnce so they can be replaced in the future non-breakingly).
228
+ const lockBackend = this.#lockBackend;
229
+ const lockTtlMs = this.#defaultLockTtlMs;
230
+ // Wrapped closure delegated to #runOnce for the observability
231
+ // core — lock handling layered around it when a backend is
232
+ // configured. `runTaskNow` reuses `#runOnce` directly, bypassing
233
+ // the lock.
234
+ const wrapped = async (payload) => {
235
+ if (lockBackend !== null) {
236
+ let acquired;
237
+ try {
238
+ acquired = await lockBackend.acquire(name, lockTtlMs);
239
+ }
240
+ catch (acquireErr) {
241
+ this.#stats.recordSkipped(name);
242
+ this.#emit({
243
+ type: 'schedule.task.skipped',
244
+ taskName: name,
245
+ reason: 'acquire-failed',
246
+ });
247
+ this.#report(acquireErr, name);
248
+ return;
249
+ }
250
+ if (!acquired) {
251
+ this.#stats.recordSkipped(name);
252
+ this.#emit({ type: 'schedule.task.skipped', taskName: name, reason: 'locked' });
253
+ return;
254
+ }
255
+ }
256
+ try {
257
+ await this.#runOnce(name, callback, payload.scheduledForMs);
258
+ }
259
+ finally {
260
+ if (lockBackend !== null) {
261
+ try {
262
+ await lockBackend.release(name);
263
+ }
264
+ catch {
265
+ // Swallow — lock auto-frees via TTL.
266
+ }
267
+ }
268
+ }
269
+ };
270
+ try {
271
+ this.#inner.register(name, cronExpr, wrapped);
272
+ }
273
+ catch (e) {
274
+ throw translateNativeError(e);
275
+ }
276
+ this.#tasks.set(name, { cronExpr, callback });
277
+ }
278
+ /**
279
+ * Remove a registered task. Idempotent — unknown names are not an
280
+ * error. If the native side reports an unknown-task condition it is
281
+ * treated as already-removed rather than propagated.
282
+ */
283
+ unregister(name) {
284
+ try {
285
+ this.#inner.unregister(name);
286
+ }
287
+ catch (e) {
288
+ const err = translateNativeError(e);
289
+ // Rust's `unregister` is itself idempotent (Story 28.1) so a
290
+ // thrown error here is unexpected. Drop the local entry anyway
291
+ // — the doc promises idempotence — but surface any unexpected
292
+ // native failure that is not a missing-task situation.
293
+ if (err.code !== 'UNKNOWN_TASK' && err.code !== 'SCHEDULER_NATIVE_ERROR') {
294
+ this.#tasks.delete(name);
295
+ throw err;
296
+ }
297
+ }
298
+ this.#tasks.delete(name);
299
+ }
300
+ /**
301
+ * Start the Rust ticker. Safe to call when already running — the
302
+ * underlying `ream-scheduler` core is idempotent (Story 28.1: the
303
+ * ticker's internal cancel channel is only installed once per start).
304
+ */
305
+ start() {
306
+ try {
307
+ this.#inner.start();
308
+ }
309
+ catch (e) {
310
+ throw translateNativeError(e);
311
+ }
312
+ }
313
+ /**
314
+ * Cancel the Rust ticker. Safe to call when not running — the
315
+ * underlying `ream-scheduler` core treats `stop()` as a no-op when no
316
+ * cancel channel is installed.
317
+ */
318
+ stop() {
319
+ try {
320
+ this.#inner.stop();
321
+ }
322
+ catch (e) {
323
+ throw translateNativeError(e);
324
+ }
325
+ }
326
+ /**
327
+ * Return the next fire time in ms since epoch, or `null` if the task
328
+ * is unknown.
329
+ */
330
+ nextRun(name) {
331
+ try {
332
+ return this.#inner.nextRun(name);
333
+ }
334
+ catch (e) {
335
+ throw translateNativeError(e);
336
+ }
337
+ }
338
+ /**
339
+ * Snapshot of every currently-registered task.
340
+ *
341
+ * NOTE: Makes one FFI call per task via `nextRun`. Acceptable for
342
+ * typical task counts (dozens); consumers iterating huge registries
343
+ * should cache the result.
344
+ */
345
+ listTasks() {
346
+ const out = [];
347
+ for (const [name, { cronExpr }] of this.#tasks) {
348
+ out.push({ name, cronExpr, nextRun: this.nextRun(name) });
349
+ }
350
+ return out;
351
+ }
352
+ /**
353
+ * Invoke a registered task once immediately, bypassing the cron
354
+ * schedule AND the configured lock backend.
355
+ *
356
+ * **Admin override:** `runTaskNow` does NOT consult the
357
+ * `lockBackend`. Running a task manually is an explicit operator
358
+ * action that must not be blocked by a peer instance holding the
359
+ * distributed lock. Regular ticker-driven fires continue to honor
360
+ * the lock.
361
+ *
362
+ * Observability is preserved — the same `started` / `completed`
363
+ * / `failed` events fire and the `errorReporter` runs exactly as
364
+ * for a normal tick, updating `getStats(name)` identically.
365
+ *
366
+ * Unknown task names return `{ outcome: 'unknown', durationMs: 0 }`
367
+ * without emitting any event — mirrors the never-throws contract
368
+ * of {@link Scheduler.getStats}.
369
+ */
370
+ async runTaskNow(name, options = {}) {
371
+ const entry = this.#tasks.get(name);
372
+ if (!entry) {
373
+ // Notify the observability boundary so operator typos leave a
374
+ // trace. No event is emitted — events are reserved for
375
+ // real task invocations.
376
+ this.#report(new ReamError('SCHEDULE_TASK_UNKNOWN', `runTaskNow called with unknown task name: '${name}'`), name);
377
+ return { outcome: 'unknown', durationMs: 0 };
378
+ }
379
+ const runPromise = this.#runOnce(name, entry.callback, Date.now());
380
+ // Optional timeout: whichever wins, runPromise stays running in
381
+ // the background — JS has no pre-emptive cancellation.
382
+ const result = options.timeoutMs !== undefined && Number.isFinite(options.timeoutMs) && options.timeoutMs > 0
383
+ ? await Promise.race([
384
+ runPromise,
385
+ new Promise((resolve) => {
386
+ setTimeout(() => {
387
+ resolve({
388
+ outcome: 'failed',
389
+ durationMs: options.timeoutMs ?? 0,
390
+ error: new ReamError('SCHEDULE_TASK_TIMEOUT', `Task '${name}' did not complete within ${options.timeoutMs} ms (background execution continues)`),
391
+ });
392
+ }, options.timeoutMs);
393
+ }),
394
+ ])
395
+ : await runPromise;
396
+ if (result.outcome === 'already-running') {
397
+ return { outcome: 'already-running', durationMs: 0 };
398
+ }
399
+ if (result.outcome === 'failed') {
400
+ return {
401
+ outcome: 'failed',
402
+ durationMs: result.durationMs,
403
+ error: {
404
+ name: result.error?.name ?? 'Error',
405
+ message: result.error?.message ?? 'unknown error',
406
+ stack: result.error?.stack,
407
+ },
408
+ };
409
+ }
410
+ return { outcome: 'completed', durationMs: result.durationMs };
411
+ }
412
+ /**
413
+ * Return a snapshot of observability counters for `taskName`.
414
+ *
415
+ * Unknown task names return a zeroed snapshot (all counters `0`,
416
+ * all timestamps `null`) — never throws. The `nextRunMs` field is
417
+ * read live from the Rust layer on each call; a native-side failure
418
+ * is swallowed here so that `getStats` always returns.
419
+ */
420
+ getStats(taskName) {
421
+ const snapshot = this.#stats.get(taskName);
422
+ let nextRunMs = null;
423
+ try {
424
+ nextRunMs = this.nextRun(taskName);
425
+ }
426
+ catch {
427
+ // Swallow — getStats guarantees no-throw.
428
+ }
429
+ return { ...snapshot, nextRunMs };
430
+ }
431
+ }
432
+ //# sourceMappingURL=Scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":"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"}