reqon-dsl 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/.claude/settings.local.json +31 -0
  2. package/.claude/skills/api-integration.md +125 -0
  3. package/.claude/skills/database-schema.md +51 -0
  4. package/.claude/skills/dsl-design.md +80 -0
  5. package/.claude/skills/property-testing.md +143 -0
  6. package/.claude/skills/reqon/SKILL.md +44 -0
  7. package/.claude/skills/reqon/references/examples.md +206 -0
  8. package/.claude/skills/reqon/references/syntax.md +263 -0
  9. package/.claude/skills/vscode-extension.md +113 -0
  10. package/.github/dependabot.yml +32 -0
  11. package/.github/pull_request_template.md +21 -0
  12. package/.github/workflows/ci.yml +174 -0
  13. package/.github/workflows/release.yml +73 -0
  14. package/CLAUDE.md +72 -0
  15. package/CONTRIBUTING.md +161 -0
  16. package/README.md +235 -0
  17. package/TODO.md +51 -0
  18. package/dist/ast/index.d.ts +1 -0
  19. package/dist/ast/index.js +1 -0
  20. package/dist/ast/nodes.d.ts +237 -0
  21. package/dist/ast/nodes.js +12 -0
  22. package/dist/auth/auth.test.d.ts +1 -0
  23. package/dist/auth/auth.test.js +255 -0
  24. package/dist/auth/circuit-breaker.d.ts +115 -0
  25. package/dist/auth/circuit-breaker.js +267 -0
  26. package/dist/auth/credentials.d.ts +91 -0
  27. package/dist/auth/credentials.js +169 -0
  28. package/dist/auth/index.d.ts +5 -0
  29. package/dist/auth/index.js +8 -0
  30. package/dist/auth/oauth2-provider.d.ts +41 -0
  31. package/dist/auth/oauth2-provider.js +131 -0
  32. package/dist/auth/rate-limiter.d.ts +61 -0
  33. package/dist/auth/rate-limiter.js +380 -0
  34. package/dist/auth/token-store.d.ts +30 -0
  35. package/dist/auth/token-store.js +148 -0
  36. package/dist/auth/types.d.ts +142 -0
  37. package/dist/auth/types.js +1 -0
  38. package/dist/cli.d.ts +2 -0
  39. package/dist/cli.js +270 -0
  40. package/dist/errors/errors.test.d.ts +1 -0
  41. package/dist/errors/errors.test.js +165 -0
  42. package/dist/errors/index.d.ts +83 -0
  43. package/dist/errors/index.js +159 -0
  44. package/dist/execution/execution.test.d.ts +1 -0
  45. package/dist/execution/execution.test.js +246 -0
  46. package/dist/execution/index.d.ts +4 -0
  47. package/dist/execution/index.js +2 -0
  48. package/dist/execution/state.d.ts +136 -0
  49. package/dist/execution/state.js +82 -0
  50. package/dist/execution/store.d.ts +52 -0
  51. package/dist/execution/store.js +120 -0
  52. package/dist/index.d.ts +27 -0
  53. package/dist/index.js +57 -0
  54. package/dist/integration.test.d.ts +1 -0
  55. package/dist/integration.test.js +168 -0
  56. package/dist/interpreter/context.d.ts +15 -0
  57. package/dist/interpreter/context.js +29 -0
  58. package/dist/interpreter/evaluator.d.ts +5 -0
  59. package/dist/interpreter/evaluator.js +223 -0
  60. package/dist/interpreter/evaluator.test.d.ts +1 -0
  61. package/dist/interpreter/evaluator.test.js +512 -0
  62. package/dist/interpreter/executor.d.ts +131 -0
  63. package/dist/interpreter/executor.js +663 -0
  64. package/dist/interpreter/fetch-handler.d.ts +43 -0
  65. package/dist/interpreter/fetch-handler.js +203 -0
  66. package/dist/interpreter/http.d.ts +57 -0
  67. package/dist/interpreter/http.js +210 -0
  68. package/dist/interpreter/http.test.d.ts +1 -0
  69. package/dist/interpreter/http.test.js +299 -0
  70. package/dist/interpreter/index.d.ts +7 -0
  71. package/dist/interpreter/index.js +7 -0
  72. package/dist/interpreter/pagination.d.ts +63 -0
  73. package/dist/interpreter/pagination.js +155 -0
  74. package/dist/interpreter/progress.test.d.ts +1 -0
  75. package/dist/interpreter/progress.test.js +216 -0
  76. package/dist/interpreter/schema-matcher.d.ts +16 -0
  77. package/dist/interpreter/schema-matcher.js +136 -0
  78. package/dist/interpreter/schema-matcher.test.d.ts +1 -0
  79. package/dist/interpreter/schema-matcher.test.js +122 -0
  80. package/dist/interpreter/signals.d.ts +57 -0
  81. package/dist/interpreter/signals.js +73 -0
  82. package/dist/interpreter/step-handlers/for-handler.d.ts +17 -0
  83. package/dist/interpreter/step-handlers/for-handler.js +51 -0
  84. package/dist/interpreter/step-handlers/index.d.ts +8 -0
  85. package/dist/interpreter/step-handlers/index.js +8 -0
  86. package/dist/interpreter/step-handlers/map-handler.d.ts +10 -0
  87. package/dist/interpreter/step-handlers/map-handler.js +20 -0
  88. package/dist/interpreter/step-handlers/match-handler.d.ts +27 -0
  89. package/dist/interpreter/step-handlers/match-handler.js +61 -0
  90. package/dist/interpreter/step-handlers/store-handler.d.ts +13 -0
  91. package/dist/interpreter/step-handlers/store-handler.js +66 -0
  92. package/dist/interpreter/step-handlers/types.d.ts +15 -0
  93. package/dist/interpreter/step-handlers/types.js +1 -0
  94. package/dist/interpreter/step-handlers/validate-handler.d.ts +10 -0
  95. package/dist/interpreter/step-handlers/validate-handler.js +26 -0
  96. package/dist/interpreter/step-handlers/webhook-handler.d.ts +36 -0
  97. package/dist/interpreter/step-handlers/webhook-handler.js +104 -0
  98. package/dist/lexer/index.d.ts +10 -0
  99. package/dist/lexer/index.js +12 -0
  100. package/dist/lexer/lexer.d.ts +24 -0
  101. package/dist/lexer/lexer.js +264 -0
  102. package/dist/lexer/lexer.test.d.ts +1 -0
  103. package/dist/lexer/lexer.test.js +259 -0
  104. package/dist/lexer/tokens.d.ts +69 -0
  105. package/dist/lexer/tokens.js +146 -0
  106. package/dist/loader/index.d.ts +36 -0
  107. package/dist/loader/index.js +220 -0
  108. package/dist/loader/loader.test.d.ts +1 -0
  109. package/dist/loader/loader.test.js +287 -0
  110. package/dist/oas/index.d.ts +4 -0
  111. package/dist/oas/index.js +2 -0
  112. package/dist/oas/loader.d.ts +21 -0
  113. package/dist/oas/loader.js +82 -0
  114. package/dist/oas/oas.test.d.ts +1 -0
  115. package/dist/oas/oas.test.js +218 -0
  116. package/dist/oas/validator.d.ts +12 -0
  117. package/dist/oas/validator.js +227 -0
  118. package/dist/parser/base.d.ts +33 -0
  119. package/dist/parser/base.js +97 -0
  120. package/dist/parser/expressions.d.ts +27 -0
  121. package/dist/parser/expressions.js +248 -0
  122. package/dist/parser/expressions.test.d.ts +1 -0
  123. package/dist/parser/expressions.test.js +378 -0
  124. package/dist/parser/index.d.ts +3 -0
  125. package/dist/parser/index.js +3 -0
  126. package/dist/parser/match.test.d.ts +1 -0
  127. package/dist/parser/match.test.js +254 -0
  128. package/dist/parser/parser.d.ts +68 -0
  129. package/dist/parser/parser.js +1229 -0
  130. package/dist/parser/parser.test.d.ts +1 -0
  131. package/dist/parser/parser.test.js +333 -0
  132. package/dist/parser/schedule.test.d.ts +1 -0
  133. package/dist/parser/schedule.test.js +241 -0
  134. package/dist/plugin.d.ts +35 -0
  135. package/dist/plugin.js +68 -0
  136. package/dist/scheduler/cron-parser.d.ts +32 -0
  137. package/dist/scheduler/cron-parser.js +198 -0
  138. package/dist/scheduler/cron-parser.test.d.ts +1 -0
  139. package/dist/scheduler/cron-parser.test.js +188 -0
  140. package/dist/scheduler/index.d.ts +3 -0
  141. package/dist/scheduler/index.js +2 -0
  142. package/dist/scheduler/scheduler.d.ts +81 -0
  143. package/dist/scheduler/scheduler.js +376 -0
  144. package/dist/scheduler/types.d.ts +65 -0
  145. package/dist/scheduler/types.js +1 -0
  146. package/dist/stores/factory.d.ts +36 -0
  147. package/dist/stores/factory.js +73 -0
  148. package/dist/stores/file.d.ts +60 -0
  149. package/dist/stores/file.js +173 -0
  150. package/dist/stores/file.test.d.ts +1 -0
  151. package/dist/stores/file.test.js +165 -0
  152. package/dist/stores/index.d.ts +6 -0
  153. package/dist/stores/index.js +5 -0
  154. package/dist/stores/memory.d.ts +19 -0
  155. package/dist/stores/memory.js +51 -0
  156. package/dist/stores/memory.test.d.ts +1 -0
  157. package/dist/stores/memory.test.js +157 -0
  158. package/dist/stores/postgrest.d.ts +55 -0
  159. package/dist/stores/postgrest.js +217 -0
  160. package/dist/stores/stores.test.d.ts +1 -0
  161. package/dist/stores/stores.test.js +158 -0
  162. package/dist/stores/types.d.ts +31 -0
  163. package/dist/stores/types.js +26 -0
  164. package/dist/sync/index.d.ts +4 -0
  165. package/dist/sync/index.js +2 -0
  166. package/dist/sync/state.d.ts +69 -0
  167. package/dist/sync/state.js +66 -0
  168. package/dist/sync/store.d.ts +49 -0
  169. package/dist/sync/store.js +93 -0
  170. package/dist/sync/sync.test.d.ts +1 -0
  171. package/dist/sync/sync.test.js +221 -0
  172. package/dist/utils/async.d.ts +7 -0
  173. package/dist/utils/async.js +9 -0
  174. package/dist/utils/file.d.ts +38 -0
  175. package/dist/utils/file.js +92 -0
  176. package/dist/utils/index.d.ts +4 -0
  177. package/dist/utils/index.js +4 -0
  178. package/dist/utils/logger.d.ts +34 -0
  179. package/dist/utils/logger.js +39 -0
  180. package/dist/utils/path.d.ts +12 -0
  181. package/dist/utils/path.js +41 -0
  182. package/dist/webhook/index.d.ts +8 -0
  183. package/dist/webhook/index.js +7 -0
  184. package/dist/webhook/server.d.ts +84 -0
  185. package/dist/webhook/server.js +319 -0
  186. package/dist/webhook/store.d.ts +67 -0
  187. package/dist/webhook/store.js +193 -0
  188. package/dist/webhook/types.d.ts +88 -0
  189. package/dist/webhook/types.js +6 -0
  190. package/docusaurus/README.md +41 -0
  191. package/docusaurus/docs/advanced/execution-state.md +283 -0
  192. package/docusaurus/docs/advanced/extending-reqon.md +388 -0
  193. package/docusaurus/docs/advanced/multi-file-missions.md +250 -0
  194. package/docusaurus/docs/advanced/parallel-execution.md +353 -0
  195. package/docusaurus/docs/api-reference.md +443 -0
  196. package/docusaurus/docs/authentication/api-key.md +339 -0
  197. package/docusaurus/docs/authentication/basic.md +276 -0
  198. package/docusaurus/docs/authentication/bearer.md +282 -0
  199. package/docusaurus/docs/authentication/oauth2.md +317 -0
  200. package/docusaurus/docs/authentication/overview.md +251 -0
  201. package/docusaurus/docs/cli.md +229 -0
  202. package/docusaurus/docs/core-concepts/actions.md +286 -0
  203. package/docusaurus/docs/core-concepts/missions.md +264 -0
  204. package/docusaurus/docs/core-concepts/schemas.md +353 -0
  205. package/docusaurus/docs/core-concepts/sources.md +339 -0
  206. package/docusaurus/docs/core-concepts/stores.md +332 -0
  207. package/docusaurus/docs/dsl-syntax/expressions.md +361 -0
  208. package/docusaurus/docs/dsl-syntax/fetch.md +293 -0
  209. package/docusaurus/docs/dsl-syntax/for-loops.md +324 -0
  210. package/docusaurus/docs/dsl-syntax/map.md +345 -0
  211. package/docusaurus/docs/dsl-syntax/match.md +387 -0
  212. package/docusaurus/docs/dsl-syntax/pipelines.md +397 -0
  213. package/docusaurus/docs/dsl-syntax/validate.md +401 -0
  214. package/docusaurus/docs/error-handling/dead-letter-queues.md +399 -0
  215. package/docusaurus/docs/error-handling/flow-control.md +337 -0
  216. package/docusaurus/docs/error-handling/retry-strategies.md +368 -0
  217. package/docusaurus/docs/examples.md +488 -0
  218. package/docusaurus/docs/getting-started.md +256 -0
  219. package/docusaurus/docs/http/circuit-breaker.md +401 -0
  220. package/docusaurus/docs/http/incremental-sync.md +394 -0
  221. package/docusaurus/docs/http/pagination.md +361 -0
  222. package/docusaurus/docs/http/rate-limiting.md +383 -0
  223. package/docusaurus/docs/http/requests.md +328 -0
  224. package/docusaurus/docs/http/retry.md +402 -0
  225. package/docusaurus/docs/intro.md +90 -0
  226. package/docusaurus/docs/openapi/loading-specs.md +305 -0
  227. package/docusaurus/docs/openapi/operation-calls.md +314 -0
  228. package/docusaurus/docs/openapi/overview.md +212 -0
  229. package/docusaurus/docs/openapi/response-validation.md +344 -0
  230. package/docusaurus/docs/scheduling/cron.md +305 -0
  231. package/docusaurus/docs/scheduling/daemon-mode.md +317 -0
  232. package/docusaurus/docs/scheduling/intervals.md +289 -0
  233. package/docusaurus/docs/scheduling/overview.md +231 -0
  234. package/docusaurus/docs/stores/custom-adapters.md +376 -0
  235. package/docusaurus/docs/stores/file.md +236 -0
  236. package/docusaurus/docs/stores/memory.md +193 -0
  237. package/docusaurus/docs/stores/overview.md +274 -0
  238. package/docusaurus/docs/stores/postgrest.md +316 -0
  239. package/docusaurus/docusaurus.config.ts +148 -0
  240. package/docusaurus/package-lock.json +18029 -0
  241. package/docusaurus/package.json +47 -0
  242. package/docusaurus/sidebars.ts +155 -0
  243. package/docusaurus/src/components/HomepageFeatures/index.tsx +105 -0
  244. package/docusaurus/src/components/HomepageFeatures/styles.module.css +12 -0
  245. package/docusaurus/src/css/custom.css +169 -0
  246. package/docusaurus/src/pages/index.module.css +48 -0
  247. package/docusaurus/src/pages/index.tsx +110 -0
  248. package/docusaurus/src/pages/markdown-page.md +7 -0
  249. package/docusaurus/static/.nojekyll +0 -0
  250. package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  251. package/docusaurus/static/img/docusaurus.png +0 -0
  252. package/docusaurus/static/img/favicon.ico +0 -0
  253. package/docusaurus/static/img/logo.svg +10 -0
  254. package/docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
  255. package/docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
  256. package/docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
  257. package/docusaurus/tsconfig.json +8 -0
  258. package/examples/README.md +112 -0
  259. package/examples/error-handling/README.md +150 -0
  260. package/examples/error-handling/payment-processor.vague +287 -0
  261. package/examples/github-sync/README.md +74 -0
  262. package/examples/github-sync/fetch-issues.vague +47 -0
  263. package/examples/github-sync/fetch-prs.vague +40 -0
  264. package/examples/github-sync/mission.vague +101 -0
  265. package/examples/github-sync/normalize.vague +70 -0
  266. package/examples/jsonplaceholder/README.md +28 -0
  267. package/examples/jsonplaceholder/posts.vague +48 -0
  268. package/examples/petstore/README.md +35 -0
  269. package/examples/petstore/openapi.yaml +97 -0
  270. package/examples/petstore/sync.vague +52 -0
  271. package/examples/temporal-comparison/README.md +297 -0
  272. package/examples/temporal-comparison/reconciliation.vague +355 -0
  273. package/examples/temporal-comparison/temporal/activities/index.ts +8 -0
  274. package/examples/temporal-comparison/temporal/activities/shipstation.ts +225 -0
  275. package/examples/temporal-comparison/temporal/activities/shopify.ts +257 -0
  276. package/examples/temporal-comparison/temporal/activities/storage.ts +198 -0
  277. package/examples/temporal-comparison/temporal/activities/stripe.ts +169 -0
  278. package/examples/temporal-comparison/temporal/activities/validation.ts +205 -0
  279. package/examples/temporal-comparison/temporal/client/schedule.ts +218 -0
  280. package/examples/temporal-comparison/temporal/config/retry.ts +63 -0
  281. package/examples/temporal-comparison/temporal/types/index.ts +129 -0
  282. package/examples/temporal-comparison/temporal/workers/main.ts +130 -0
  283. package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +262 -0
  284. package/examples/xero/README.md +88 -0
  285. package/examples/xero/invoices.vague +189 -0
  286. package/package.json +40 -0
  287. package/src/api-integration.test.ts +954 -0
  288. package/src/ast/index.ts +1 -0
  289. package/src/ast/nodes.ts +310 -0
  290. package/src/auth/auth.test.ts +326 -0
  291. package/src/auth/circuit-breaker.test.ts +390 -0
  292. package/src/auth/circuit-breaker.ts +379 -0
  293. package/src/auth/credentials.test.ts +273 -0
  294. package/src/auth/credentials.ts +246 -0
  295. package/src/auth/index.ts +40 -0
  296. package/src/auth/oauth2-provider.ts +177 -0
  297. package/src/auth/rate-limiter.ts +459 -0
  298. package/src/auth/token-store.ts +177 -0
  299. package/src/auth/types.ts +159 -0
  300. package/src/benchmark/e2e.bench.ts +288 -0
  301. package/src/benchmark/evaluator.bench.ts +331 -0
  302. package/src/benchmark/fixtures.ts +295 -0
  303. package/src/benchmark/index.ts +108 -0
  304. package/src/benchmark/lexer.bench.ts +69 -0
  305. package/src/benchmark/parser.bench.ts +103 -0
  306. package/src/benchmark/resilience.bench.ts +193 -0
  307. package/src/benchmark/store.bench.ts +147 -0
  308. package/src/benchmark/utils.ts +230 -0
  309. package/src/cli.ts +313 -0
  310. package/src/errors/errors.test.ts +234 -0
  311. package/src/errors/index.ts +223 -0
  312. package/src/execution/execution.test.ts +307 -0
  313. package/src/execution/index.ts +21 -0
  314. package/src/execution/state.ts +207 -0
  315. package/src/execution/store.ts +188 -0
  316. package/src/index.ts +169 -0
  317. package/src/integration.test.ts +192 -0
  318. package/src/interpreter/context.ts +57 -0
  319. package/src/interpreter/evaluator.test.ts +796 -0
  320. package/src/interpreter/evaluator.ts +245 -0
  321. package/src/interpreter/executor.ts +946 -0
  322. package/src/interpreter/fetch-handler.ts +302 -0
  323. package/src/interpreter/http.test.ts +423 -0
  324. package/src/interpreter/http.ts +308 -0
  325. package/src/interpreter/index.ts +32 -0
  326. package/src/interpreter/pagination.ts +207 -0
  327. package/src/interpreter/progress.test.ts +276 -0
  328. package/src/interpreter/schema-matcher.test.ts +160 -0
  329. package/src/interpreter/schema-matcher.ts +168 -0
  330. package/src/interpreter/signals.ts +73 -0
  331. package/src/interpreter/step-handlers/for-handler.ts +65 -0
  332. package/src/interpreter/step-handlers/index.ts +17 -0
  333. package/src/interpreter/step-handlers/map-handler.ts +24 -0
  334. package/src/interpreter/step-handlers/match-handler.ts +101 -0
  335. package/src/interpreter/step-handlers/store-handler.ts +78 -0
  336. package/src/interpreter/step-handlers/types.ts +17 -0
  337. package/src/interpreter/step-handlers/validate-handler.ts +30 -0
  338. package/src/interpreter/step-handlers/webhook-handler.ts +142 -0
  339. package/src/lexer/index.ts +18 -0
  340. package/src/lexer/lexer.test.ts +316 -0
  341. package/src/lexer/tokens.ts +179 -0
  342. package/src/loader/index.ts +288 -0
  343. package/src/loader/loader.test.ts +360 -0
  344. package/src/oas/index.ts +4 -0
  345. package/src/oas/loader.ts +126 -0
  346. package/src/oas/oas.test.ts +254 -0
  347. package/src/oas/validator.ts +299 -0
  348. package/src/parser/base.ts +124 -0
  349. package/src/parser/expressions.test.ts +525 -0
  350. package/src/parser/expressions.ts +314 -0
  351. package/src/parser/index.ts +3 -0
  352. package/src/parser/match.test.ts +296 -0
  353. package/src/parser/parser.test.ts +739 -0
  354. package/src/parser/parser.ts +1469 -0
  355. package/src/parser/schedule.test.ts +287 -0
  356. package/src/parser/webhook.test.ts +248 -0
  357. package/src/plugin.ts +83 -0
  358. package/src/scheduler/cron-parser.test.ts +236 -0
  359. package/src/scheduler/cron-parser.ts +236 -0
  360. package/src/scheduler/index.ts +10 -0
  361. package/src/scheduler/scheduler.ts +443 -0
  362. package/src/scheduler/types.ts +71 -0
  363. package/src/stores/factory.ts +104 -0
  364. package/src/stores/file.test.ts +276 -0
  365. package/src/stores/file.ts +211 -0
  366. package/src/stores/index.ts +6 -0
  367. package/src/stores/memory.test.ts +238 -0
  368. package/src/stores/memory.ts +63 -0
  369. package/src/stores/postgrest.test.ts +488 -0
  370. package/src/stores/postgrest.ts +263 -0
  371. package/src/stores/stores.test.ts +197 -0
  372. package/src/stores/types.ts +58 -0
  373. package/src/sync/index.ts +16 -0
  374. package/src/sync/state.ts +126 -0
  375. package/src/sync/store.ts +139 -0
  376. package/src/sync/sync.test.ts +271 -0
  377. package/src/utils/async.ts +10 -0
  378. package/src/utils/file.ts +106 -0
  379. package/src/utils/index.ts +14 -0
  380. package/src/utils/logger.ts +53 -0
  381. package/src/utils/path.ts +47 -0
  382. package/src/webhook/index.ts +15 -0
  383. package/src/webhook/server.test.ts +253 -0
  384. package/src/webhook/server.ts +389 -0
  385. package/src/webhook/store.ts +239 -0
  386. package/src/webhook/types.ts +93 -0
  387. package/tsconfig.json +17 -0
  388. package/vitest.config.ts +39 -0
@@ -0,0 +1,237 @@
1
+ import type { Expression, SchemaDefinition, Statement as VagueStatement } from 'vague-lang';
2
+ export type Statement = VagueStatement | MissionDefinition | SourceDefinition | StoreDefinition | ActionDefinition;
3
+ export interface ReqonProgram {
4
+ type: 'ReqonProgram';
5
+ statements: Statement[];
6
+ }
7
+ export interface SourceDefinition {
8
+ type: 'SourceDefinition';
9
+ name: string;
10
+ specPath?: string;
11
+ config: SourceConfig;
12
+ }
13
+ export interface SourceConfig {
14
+ auth: AuthConfig;
15
+ base?: string;
16
+ headers?: Record<string, Expression>;
17
+ validateResponses?: boolean;
18
+ rateLimit?: RateLimitSourceConfig;
19
+ circuitBreaker?: CircuitBreakerSourceConfig;
20
+ }
21
+ export interface CircuitBreakerSourceConfig {
22
+ /** Number of failures before opening circuit (default: 5) */
23
+ failureThreshold?: number;
24
+ /** Time in seconds before attempting recovery (default: 30) */
25
+ resetTimeout?: number;
26
+ /** Number of successful requests in half-open to close circuit (default: 2) */
27
+ successThreshold?: number;
28
+ /** Time window in seconds for counting failures (default: 60) */
29
+ failureWindow?: number;
30
+ }
31
+ export interface RateLimitSourceConfig {
32
+ strategy?: 'pause' | 'throttle' | 'fail';
33
+ maxWait?: number;
34
+ fallbackRpm?: number;
35
+ }
36
+ export interface AuthConfig {
37
+ type: 'oauth2' | 'bearer' | 'basic' | 'api_key' | 'none';
38
+ }
39
+ export interface StoreDefinition {
40
+ type: 'StoreDefinition';
41
+ name: string;
42
+ storeType: 'nosql' | 'sql' | 'memory';
43
+ target: string;
44
+ }
45
+ export interface ScheduleDefinition {
46
+ type: 'ScheduleDefinition';
47
+ scheduleType: 'interval' | 'cron' | 'once';
48
+ interval?: IntervalSchedule;
49
+ cronExpression?: string;
50
+ runAt?: string;
51
+ timezone?: string;
52
+ maxConcurrency?: number;
53
+ skipIfRunning?: boolean;
54
+ retryOnFailure?: ScheduleRetryConfig;
55
+ }
56
+ export interface IntervalSchedule {
57
+ value: number;
58
+ unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks';
59
+ }
60
+ export interface ScheduleRetryConfig {
61
+ maxRetries: number;
62
+ delaySeconds: number;
63
+ }
64
+ export interface MissionDefinition {
65
+ type: 'MissionDefinition';
66
+ name: string;
67
+ schedule?: ScheduleDefinition;
68
+ sources: SourceDefinition[];
69
+ stores: StoreDefinition[];
70
+ schemas: SchemaDefinition[];
71
+ actions: ActionDefinition[];
72
+ pipeline: PipelineDefinition;
73
+ }
74
+ export interface ActionDefinition {
75
+ type: 'ActionDefinition';
76
+ name: string;
77
+ steps: ActionStep[];
78
+ }
79
+ export type ActionStep = FetchStep | ForStep | MapStep | ValidateStep | StoreStep | MatchStep | LetStep | WebhookStep;
80
+ export interface LetStep {
81
+ type: 'LetStep';
82
+ name: string;
83
+ value: Expression;
84
+ }
85
+ export interface WebhookStep {
86
+ type: 'WebhookStep';
87
+ /** Timeout in milliseconds to wait for webhook (default: 300000 = 5 minutes) */
88
+ timeout?: number;
89
+ /** Path for the webhook endpoint (e.g., "/webhooks/callback") */
90
+ path?: string;
91
+ /** Number of webhook events to collect before continuing (default: 1) */
92
+ expectedEvents?: number;
93
+ /** Filter expression for matching webhook events */
94
+ eventFilter?: Expression;
95
+ /** Retry configuration if timeout occurs */
96
+ retryOnTimeout?: RetryConfig;
97
+ /** Store configuration for saving webhook payloads */
98
+ storage?: WebhookStorageConfig;
99
+ }
100
+ export interface WebhookStorageConfig {
101
+ /** Store name to save webhook payloads */
102
+ target: string;
103
+ /** Expression for extracting key from webhook payload */
104
+ key?: Expression;
105
+ }
106
+ export type FlowDirective = {
107
+ type: 'continue';
108
+ } | {
109
+ type: 'skip';
110
+ } | {
111
+ type: 'abort';
112
+ message?: string;
113
+ } | {
114
+ type: 'retry';
115
+ backoff?: RetryConfig;
116
+ } | {
117
+ type: 'queue';
118
+ target?: string;
119
+ } | {
120
+ type: 'jump';
121
+ action: string;
122
+ then?: 'retry' | 'continue';
123
+ };
124
+ export interface MatchStep {
125
+ type: 'MatchStep';
126
+ target: Expression;
127
+ arms: MatchArm[];
128
+ }
129
+ export interface MatchArm {
130
+ /** Schema name to match against, or '_' for wildcard */
131
+ schema: string;
132
+ /** Steps to execute if matched */
133
+ steps?: ActionStep[];
134
+ /** Flow control directive (if no steps) */
135
+ flow?: FlowDirective;
136
+ }
137
+ export interface FetchStep {
138
+ type: 'FetchStep';
139
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
140
+ path?: Expression;
141
+ operationRef?: OperationRef;
142
+ source?: string;
143
+ body?: Expression;
144
+ headers?: Record<string, Expression>;
145
+ paginate?: PaginationConfig;
146
+ until?: Expression;
147
+ retry?: RetryConfig;
148
+ since?: SinceConfig;
149
+ }
150
+ export interface SinceConfig {
151
+ /** How to resolve the "since" timestamp */
152
+ type: 'lastSync' | 'expression';
153
+ /** Custom checkpoint key (defaults to source:endpoint) */
154
+ key?: string;
155
+ /** Query parameter name for the since value (default: varies by API) */
156
+ param?: string;
157
+ /** Date format for the since value */
158
+ format?: 'iso' | 'unix' | 'unix-ms' | 'date-only';
159
+ /** Expression to evaluate for 'expression' type */
160
+ expression?: Expression;
161
+ /** Field in response to use as the new "since" value for next sync */
162
+ updateFrom?: string;
163
+ }
164
+ export interface OperationRef {
165
+ source: string;
166
+ operationId: string;
167
+ }
168
+ export interface PaginationConfig {
169
+ type: 'offset' | 'cursor' | 'page';
170
+ param: string;
171
+ pageSize: number;
172
+ cursorPath?: string;
173
+ }
174
+ export interface RetryConfig {
175
+ maxAttempts: number;
176
+ backoff: 'exponential' | 'linear' | 'constant';
177
+ initialDelay: number;
178
+ maxDelay?: number;
179
+ }
180
+ export interface ForStep {
181
+ type: 'ForStep';
182
+ variable: string;
183
+ collection: Expression;
184
+ condition?: Expression;
185
+ steps: ActionStep[];
186
+ }
187
+ export interface MapStep {
188
+ type: 'MapStep';
189
+ source: Expression;
190
+ targetSchema: string;
191
+ mappings: FieldMapping[];
192
+ }
193
+ export interface FieldMapping {
194
+ field: string;
195
+ expression: Expression;
196
+ }
197
+ export interface ValidateStep {
198
+ type: 'ValidateStep';
199
+ target: Expression;
200
+ constraints: ValidationConstraint[];
201
+ }
202
+ export interface ValidationConstraint {
203
+ type: 'ValidationConstraint';
204
+ condition: Expression;
205
+ message?: string;
206
+ severity: 'error' | 'warning';
207
+ }
208
+ export interface StoreStep {
209
+ type: 'StoreStep';
210
+ source: Expression;
211
+ target: string;
212
+ options: StoreOptions;
213
+ }
214
+ export interface StoreOptions {
215
+ key?: Expression;
216
+ partial?: boolean;
217
+ upsert?: boolean;
218
+ }
219
+ export interface PipelineDefinition {
220
+ type: 'PipelineDefinition';
221
+ stages: PipelineStage[];
222
+ }
223
+ export interface PipelineStage {
224
+ /** Single action name (for sequential stages) */
225
+ action?: string;
226
+ /** Multiple action names (for parallel stages with bracket syntax) */
227
+ actions?: string[];
228
+ /** Optional: only run if condition true */
229
+ condition?: Expression;
230
+ }
231
+ /** Helper to check if a stage is parallel */
232
+ export declare function isParallelStage(stage: PipelineStage): stage is PipelineStage & {
233
+ actions: string[];
234
+ };
235
+ /** Helper to get action names from a stage (works for both single and parallel) */
236
+ export declare function getStageActions(stage: PipelineStage): string[];
237
+ export type { Expression, FieldDefinition, SchemaDefinition } from 'vague-lang';
@@ -0,0 +1,12 @@
1
+ /** Helper to check if a stage is parallel */
2
+ export function isParallelStage(stage) {
3
+ return Array.isArray(stage.actions) && stage.actions.length > 0;
4
+ }
5
+ /** Helper to get action names from a stage (works for both single and parallel) */
6
+ export function getStageActions(stage) {
7
+ if (stage.actions)
8
+ return stage.actions;
9
+ if (stage.action)
10
+ return [stage.action];
11
+ return [];
12
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,255 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { AdaptiveRateLimiter, parseRateLimitHeaders, RateLimitError, RateLimitTimeoutError, } from './rate-limiter.js';
3
+ import { InMemoryTokenStore } from './token-store.js';
4
+ describe('parseRateLimitHeaders', () => {
5
+ it('parses X-RateLimit headers', () => {
6
+ const headers = {
7
+ 'X-RateLimit-Limit': '100',
8
+ 'X-RateLimit-Remaining': '42',
9
+ 'X-RateLimit-Reset': '1700000000',
10
+ };
11
+ const info = parseRateLimitHeaders(headers);
12
+ expect(info.limit).toBe(100);
13
+ expect(info.remaining).toBe(42);
14
+ expect(info.resetAt).toBeInstanceOf(Date);
15
+ expect(info.resetAt?.getTime()).toBe(1700000000 * 1000);
16
+ });
17
+ it('parses lowercase ratelimit headers', () => {
18
+ const headers = {
19
+ 'ratelimit-limit': '60',
20
+ 'ratelimit-remaining': '5',
21
+ };
22
+ const info = parseRateLimitHeaders(headers);
23
+ expect(info.limit).toBe(60);
24
+ expect(info.remaining).toBe(5);
25
+ });
26
+ it('parses Retry-After header (seconds)', () => {
27
+ const headers = {
28
+ 'Retry-After': '30',
29
+ };
30
+ const info = parseRateLimitHeaders(headers);
31
+ expect(info.retryAfter).toBe(30);
32
+ });
33
+ it('handles missing headers gracefully', () => {
34
+ const info = parseRateLimitHeaders({});
35
+ expect(info.limit).toBeUndefined();
36
+ expect(info.remaining).toBeUndefined();
37
+ expect(info.resetAt).toBeUndefined();
38
+ expect(info.retryAfter).toBeUndefined();
39
+ });
40
+ });
41
+ describe('AdaptiveRateLimiter', () => {
42
+ let limiter;
43
+ beforeEach(() => {
44
+ limiter = new AdaptiveRateLimiter();
45
+ });
46
+ it('allows requests when no limits recorded', async () => {
47
+ const canProceed = await limiter.canProceed('TestAPI');
48
+ expect(canProceed).toBe(true);
49
+ });
50
+ it('blocks requests when remaining is 0', async () => {
51
+ const futureReset = new Date(Date.now() + 60000);
52
+ limiter.recordResponse('TestAPI', {
53
+ remaining: 0,
54
+ limit: 100,
55
+ resetAt: futureReset,
56
+ });
57
+ const canProceed = await limiter.canProceed('TestAPI');
58
+ expect(canProceed).toBe(false);
59
+ });
60
+ it('allows requests after reset time passes', async () => {
61
+ const pastReset = new Date(Date.now() - 1000);
62
+ limiter.recordResponse('TestAPI', {
63
+ remaining: 0,
64
+ limit: 100,
65
+ resetAt: pastReset,
66
+ });
67
+ const canProceed = await limiter.canProceed('TestAPI');
68
+ expect(canProceed).toBe(true);
69
+ });
70
+ it('blocks during retry-after period', async () => {
71
+ limiter.recordResponse('TestAPI', {
72
+ retryAfter: 60, // 60 seconds
73
+ });
74
+ const canProceed = await limiter.canProceed('TestAPI');
75
+ expect(canProceed).toBe(false);
76
+ });
77
+ it('tracks limits per source', async () => {
78
+ limiter.recordResponse('API1', { remaining: 0, resetAt: new Date(Date.now() + 60000) });
79
+ limiter.recordResponse('API2', { remaining: 50, limit: 100 });
80
+ expect(await limiter.canProceed('API1')).toBe(false);
81
+ expect(await limiter.canProceed('API2')).toBe(true);
82
+ });
83
+ it('tracks limits per endpoint within source', async () => {
84
+ limiter.recordResponse('API', { remaining: 0, resetAt: new Date(Date.now() + 60000) }, '/invoices');
85
+ limiter.recordResponse('API', { remaining: 50, limit: 100 }, '/contacts');
86
+ expect(await limiter.canProceed('API', '/invoices')).toBe(false);
87
+ expect(await limiter.canProceed('API', '/contacts')).toBe(true);
88
+ });
89
+ it('provides accurate status', () => {
90
+ limiter.recordResponse('TestAPI', {
91
+ remaining: 42,
92
+ limit: 100,
93
+ resetAt: new Date(Date.now() + 60000),
94
+ });
95
+ const status = limiter.getStatus('TestAPI');
96
+ expect(status.remaining).toBe(42);
97
+ expect(status.limit).toBe(100);
98
+ expect(status.isLimited).toBe(false);
99
+ });
100
+ describe('fail strategy', () => {
101
+ it('throws RateLimitError immediately when rate limited', async () => {
102
+ limiter.configure('FailAPI', { strategy: 'fail' });
103
+ limiter.recordResponse('FailAPI', {
104
+ remaining: 0,
105
+ resetAt: new Date(Date.now() + 60000),
106
+ });
107
+ await expect(limiter.waitForCapacity('FailAPI')).rejects.toThrow(RateLimitError);
108
+ });
109
+ it('includes reset time in error', async () => {
110
+ limiter.configure('FailAPI', { strategy: 'fail' });
111
+ const resetAt = new Date(Date.now() + 60000);
112
+ limiter.recordResponse('FailAPI', { remaining: 0, resetAt });
113
+ try {
114
+ await limiter.waitForCapacity('FailAPI');
115
+ expect.fail('Should have thrown');
116
+ }
117
+ catch (error) {
118
+ expect(error).toBeInstanceOf(RateLimitError);
119
+ expect(error.resetAt).toEqual(resetAt);
120
+ }
121
+ });
122
+ });
123
+ describe('pause strategy', () => {
124
+ it('throws RateLimitTimeoutError when maxWait exceeded', async () => {
125
+ limiter.configure('PauseAPI', { strategy: 'pause', maxWait: 1 });
126
+ limiter.recordResponse('PauseAPI', {
127
+ remaining: 0,
128
+ resetAt: new Date(Date.now() + 60000), // 60s in future
129
+ });
130
+ await expect(limiter.waitForCapacity('PauseAPI')).rejects.toThrow(RateLimitTimeoutError);
131
+ });
132
+ it('proceeds after reset time passes', async () => {
133
+ limiter.configure('PauseAPI', { strategy: 'pause', maxWait: 5 });
134
+ // Reset in 50ms
135
+ limiter.recordResponse('PauseAPI', {
136
+ remaining: 0,
137
+ resetAt: new Date(Date.now() + 50),
138
+ });
139
+ // Should complete without throwing
140
+ await limiter.waitForCapacity('PauseAPI');
141
+ });
142
+ });
143
+ describe('throttle strategy', () => {
144
+ it('calculates delay based on remaining requests and reset time', () => {
145
+ limiter.configure('ThrottleAPI', { strategy: 'throttle' });
146
+ limiter.recordResponse('ThrottleAPI', {
147
+ remaining: 10,
148
+ limit: 100,
149
+ resetAt: new Date(Date.now() + 10000), // 10s left
150
+ });
151
+ const delay = limiter.getThrottleDelay('ThrottleAPI');
152
+ // 10s / 10 remaining = 1s per request = 1000ms
153
+ expect(delay).toBeGreaterThanOrEqual(900);
154
+ expect(delay).toBeLessThanOrEqual(1100);
155
+ });
156
+ it('returns 0 delay when not in throttle mode', () => {
157
+ limiter.configure('PauseAPI', { strategy: 'pause' });
158
+ limiter.recordResponse('PauseAPI', { remaining: 10, limit: 100 });
159
+ const delay = limiter.getThrottleDelay('PauseAPI');
160
+ expect(delay).toBe(0);
161
+ });
162
+ it('uses fallback RPM when no rate limit headers', () => {
163
+ limiter.configure('FallbackAPI', { strategy: 'throttle', fallbackRpm: 60 });
164
+ limiter.recordResponse('FallbackAPI', {}); // No rate limit info
165
+ const delay = limiter.getThrottleDelay('FallbackAPI');
166
+ // 60 RPM = 1 per second = 1000ms intervals
167
+ expect(delay).toBeLessThanOrEqual(1000);
168
+ });
169
+ });
170
+ describe('callbacks', () => {
171
+ it('calls onRateLimited when rate limited', async () => {
172
+ const onRateLimited = vi.fn();
173
+ limiter.setCallbacks({ onRateLimited });
174
+ // Use maxWait of 10s so it doesn't timeout immediately (wait is only 50ms)
175
+ limiter.configure('CallbackAPI', { strategy: 'pause', maxWait: 10 });
176
+ limiter.recordResponse('CallbackAPI', {
177
+ remaining: 0,
178
+ resetAt: new Date(Date.now() + 50), // Resets in 50ms
179
+ });
180
+ await limiter.waitForCapacity('CallbackAPI');
181
+ expect(onRateLimited).toHaveBeenCalledTimes(1);
182
+ expect(onRateLimited).toHaveBeenCalledWith(expect.objectContaining({
183
+ source: 'CallbackAPI',
184
+ strategy: 'pause',
185
+ }));
186
+ });
187
+ it('calls onResumed after waiting completes', async () => {
188
+ const onResumed = vi.fn();
189
+ limiter.setCallbacks({ onResumed });
190
+ limiter.configure('ResumeAPI', { strategy: 'pause', maxWait: 5 });
191
+ // Reset in 50ms
192
+ limiter.recordResponse('ResumeAPI', {
193
+ remaining: 0,
194
+ resetAt: new Date(Date.now() + 50),
195
+ });
196
+ await limiter.waitForCapacity('ResumeAPI');
197
+ expect(onResumed).toHaveBeenCalledTimes(1);
198
+ expect(onResumed).toHaveBeenCalledWith(expect.objectContaining({
199
+ source: 'ResumeAPI',
200
+ }));
201
+ });
202
+ });
203
+ });
204
+ describe('InMemoryTokenStore', () => {
205
+ let store;
206
+ beforeEach(() => {
207
+ store = new InMemoryTokenStore();
208
+ });
209
+ it('stores and retrieves tokens', async () => {
210
+ const tokens = {
211
+ accessToken: 'access123',
212
+ refreshToken: 'refresh456',
213
+ expiresAt: new Date(Date.now() + 3600000),
214
+ };
215
+ await store.set('connection-1', tokens);
216
+ const retrieved = await store.get('connection-1');
217
+ expect(retrieved?.accessToken).toBe('access123');
218
+ expect(retrieved?.refreshToken).toBe('refresh456');
219
+ });
220
+ it('returns null for unknown connections', async () => {
221
+ const result = await store.get('unknown');
222
+ expect(result).toBeNull();
223
+ });
224
+ it('deletes tokens', async () => {
225
+ await store.set('connection-1', { accessToken: 'test' });
226
+ await store.delete('connection-1');
227
+ const result = await store.get('connection-1');
228
+ expect(result).toBeNull();
229
+ });
230
+ it('lists all connections', async () => {
231
+ await store.set('conn-1', { accessToken: 'a' });
232
+ await store.set('conn-2', { accessToken: 'b' });
233
+ await store.set('conn-3', { accessToken: 'c' });
234
+ const connections = await store.list();
235
+ expect(connections).toHaveLength(3);
236
+ expect(connections).toContain('conn-1');
237
+ expect(connections).toContain('conn-2');
238
+ expect(connections).toContain('conn-3');
239
+ });
240
+ it('identifies tokens needing refresh', async () => {
241
+ // Token expiring in 10 seconds (within 5 min buffer)
242
+ await store.set('expiring-soon', {
243
+ accessToken: 'test',
244
+ expiresAt: new Date(Date.now() + 10000),
245
+ });
246
+ // Token not expiring soon
247
+ await store.set('valid', {
248
+ accessToken: 'test',
249
+ expiresAt: new Date(Date.now() + 3600000),
250
+ });
251
+ const needsRefresh = await store.getTokensNeedingRefresh(300);
252
+ expect(needsRefresh).toContain('expiring-soon');
253
+ expect(needsRefresh).not.toContain('valid');
254
+ });
255
+ });
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Circuit Breaker implementation for HTTP requests.
3
+ *
4
+ * Prevents repeated failures from cascading by automatically detecting
5
+ * failure patterns and "opening" the circuit to fail fast.
6
+ *
7
+ * States:
8
+ * - CLOSED: Normal operation, requests pass through
9
+ * - OPEN: Circuit tripped, requests fail immediately
10
+ * - HALF_OPEN: Testing if service recovered, limited requests allowed
11
+ */
12
+ export type CircuitState = 'closed' | 'open' | 'half_open';
13
+ export interface CircuitBreakerConfig {
14
+ /** Number of failures before opening circuit (default: 5) */
15
+ failureThreshold?: number;
16
+ /** Time in ms before attempting recovery (default: 30000 = 30s) */
17
+ resetTimeout?: number;
18
+ /** Number of successful requests in half-open to close circuit (default: 2) */
19
+ successThreshold?: number;
20
+ /** Time window in ms for counting failures (default: 60000 = 60s) */
21
+ failureWindow?: number;
22
+ /** HTTP status codes to count as failures (default: 500-599) */
23
+ failureStatusCodes?: number[];
24
+ /** Whether to count network errors as failures (default: true) */
25
+ countNetworkErrors?: boolean;
26
+ }
27
+ export interface CircuitBreakerStatus {
28
+ state: CircuitState;
29
+ failures: number;
30
+ successes: number;
31
+ lastFailureTime?: Date;
32
+ nextAttemptTime?: Date;
33
+ isOpen: boolean;
34
+ }
35
+ export interface CircuitBreakerEvent {
36
+ source: string;
37
+ endpoint?: string;
38
+ state: CircuitState;
39
+ previousState: CircuitState;
40
+ failures: number;
41
+ reason?: string;
42
+ }
43
+ export interface CircuitBreakerCallbacks {
44
+ /** Called when circuit opens (too many failures) */
45
+ onOpen?: (event: CircuitBreakerEvent) => void;
46
+ /** Called when circuit closes (recovery successful) */
47
+ onClose?: (event: CircuitBreakerEvent) => void;
48
+ /** Called when circuit enters half-open state */
49
+ onHalfOpen?: (event: CircuitBreakerEvent) => void;
50
+ /** Called when a request is rejected due to open circuit */
51
+ onRejected?: (event: {
52
+ source: string;
53
+ endpoint?: string;
54
+ nextAttemptIn: number;
55
+ }) => void;
56
+ }
57
+ /**
58
+ * Error thrown when circuit breaker is open
59
+ */
60
+ export declare class CircuitBreakerError extends Error {
61
+ readonly source: string;
62
+ readonly endpoint: string | undefined;
63
+ readonly nextAttemptIn: number;
64
+ constructor(source: string, endpoint: string | undefined, nextAttemptIn: number);
65
+ }
66
+ /**
67
+ * Circuit breaker for managing failure detection and recovery
68
+ */
69
+ export declare class CircuitBreaker {
70
+ private circuits;
71
+ private callbacks;
72
+ private defaultConfig;
73
+ constructor(defaultConfig?: CircuitBreakerConfig);
74
+ /**
75
+ * Configure circuit breaker for a specific source
76
+ */
77
+ configure(source: string, config: CircuitBreakerConfig): void;
78
+ /**
79
+ * Set event callbacks
80
+ */
81
+ setCallbacks(callbacks: CircuitBreakerCallbacks): void;
82
+ /**
83
+ * Check if a request can proceed (throws if circuit is open)
84
+ */
85
+ canProceed(source: string, endpoint?: string): boolean;
86
+ /**
87
+ * Ensure request can proceed, throwing CircuitBreakerError if not
88
+ */
89
+ ensureCanProceed(source: string, endpoint?: string): void;
90
+ /**
91
+ * Record a successful request
92
+ */
93
+ recordSuccess(source: string, endpoint?: string): void;
94
+ /**
95
+ * Record a failed request
96
+ */
97
+ recordFailure(source: string, endpoint?: string, statusCode?: number, isNetworkError?: boolean): void;
98
+ /**
99
+ * Get current status for a source/endpoint
100
+ */
101
+ getStatus(source: string, endpoint?: string): CircuitBreakerStatus;
102
+ /**
103
+ * Force reset a circuit to closed state
104
+ */
105
+ reset(source: string, endpoint?: string): void;
106
+ /**
107
+ * Get all circuit statuses
108
+ */
109
+ getAllStatuses(): Map<string, CircuitBreakerStatus>;
110
+ private getKey;
111
+ private createEntry;
112
+ private getOrCreateEntry;
113
+ private pruneOldFailures;
114
+ private transitionTo;
115
+ }