reqon-dsl 0.2.0 → 0.3.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.
- package/CHANGELOG.md +7 -0
- package/README.md +22 -0
- package/dist/ast/nodes.d.ts +83 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.js +7 -6
- package/dist/auth/rate-limiter.d.ts +4 -0
- package/dist/auth/rate-limiter.js +9 -16
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +84 -4
- package/dist/config/constants.d.ts +141 -0
- package/dist/config/constants.js +128 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +4 -0
- package/dist/control/index.d.ts +2 -0
- package/dist/control/index.js +1 -0
- package/dist/control/server.d.ts +88 -0
- package/dist/control/server.js +238 -0
- package/dist/control/types.d.ts +55 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +180 -0
- package/dist/debug/controller.d.ts +94 -0
- package/dist/debug/controller.js +45 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.js +5 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.js +89 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/state.d.ts +24 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +33 -2
- package/dist/interpreter/context.d.ts +14 -0
- package/dist/interpreter/context.js +15 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +186 -39
- package/dist/interpreter/executor.d.ts +70 -14
- package/dist/interpreter/executor.js +503 -174
- package/dist/interpreter/fetch-handler.d.ts +9 -0
- package/dist/interpreter/fetch-handler.js +133 -24
- package/dist/interpreter/http.d.ts +5 -0
- package/dist/interpreter/http.js +26 -12
- package/dist/interpreter/index.d.ts +3 -1
- package/dist/interpreter/index.js +2 -0
- package/dist/interpreter/pagination.d.ts +11 -2
- package/dist/interpreter/pagination.js +95 -31
- package/dist/interpreter/signals.d.ts +8 -0
- package/dist/interpreter/signals.js +12 -0
- package/dist/interpreter/source-manager.d.ts +75 -0
- package/dist/interpreter/source-manager.js +157 -0
- package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
- package/dist/interpreter/step-handlers/apply-handler.js +79 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/for-handler.js +71 -4
- package/dist/interpreter/step-handlers/index.d.ts +4 -2
- package/dist/interpreter/step-handlers/index.js +4 -2
- package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
- package/dist/interpreter/step-handlers/match-handler.js +43 -16
- package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
- package/dist/interpreter/step-handlers/pause-handler.js +87 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +11 -1
- package/dist/interpreter/step-handlers/store-handler.js +45 -13
- package/dist/interpreter/step-handlers/types.d.ts +3 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
- package/dist/interpreter/step-handlers/validate-handler.js +4 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +66 -0
- package/dist/lexer/index.d.ts +11 -4
- package/dist/lexer/index.js +11 -4
- package/dist/lexer/tokens.d.ts +17 -1
- package/dist/lexer/tokens.js +36 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +451 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +187 -0
- package/dist/observability/events.d.ts +244 -0
- package/dist/observability/events.js +90 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/logger.d.ts +106 -0
- package/dist/observability/logger.js +259 -0
- package/dist/observability/otel.d.ts +135 -0
- package/dist/observability/otel.js +386 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/expressions.d.ts +13 -0
- package/dist/parser/expressions.js +72 -2
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +269 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.js +17 -0
- package/dist/parser/parser.d.ts +44 -46
- package/dist/parser/parser.js +122 -1070
- package/dist/parser/pipeline-parser.d.ts +12 -0
- package/dist/parser/pipeline-parser.js +52 -0
- package/dist/parser/schedule-parser.d.ts +7 -0
- package/dist/parser/schedule-parser.js +137 -0
- package/dist/parser/source-parser.d.ts +9 -0
- package/dist/parser/source-parser.js +151 -0
- package/dist/pause/index.d.ts +14 -0
- package/dist/pause/index.js +11 -0
- package/dist/pause/manager.d.ts +118 -0
- package/dist/pause/manager.js +245 -0
- package/dist/pause/state.d.ts +93 -0
- package/dist/pause/state.js +103 -0
- package/dist/pause/store.d.ts +61 -0
- package/dist/pause/store.js +156 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/stores/factory.d.ts +1 -1
- package/dist/stores/factory.js +3 -2
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +64 -10
- package/dist/stores/index.d.ts +16 -1
- package/dist/stores/index.js +16 -1
- package/dist/stores/memory.d.ts +4 -0
- package/dist/stores/memory.js +11 -0
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/trace/index.d.ts +16 -0
- package/dist/trace/index.js +12 -0
- package/dist/trace/recorder.d.ts +71 -0
- package/dist/trace/recorder.js +144 -0
- package/dist/trace/replay.d.ts +132 -0
- package/dist/trace/replay.js +264 -0
- package/dist/trace/state.d.ts +102 -0
- package/dist/trace/state.js +86 -0
- package/dist/trace/store.d.ts +69 -0
- package/dist/trace/store.js +225 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.js +7 -6
- package/package.json +55 -6
- package/.claude/settings.local.json +0 -31
- package/.claude/skills/api-integration.md +0 -125
- package/.claude/skills/database-schema.md +0 -51
- package/.claude/skills/dsl-design.md +0 -80
- package/.claude/skills/property-testing.md +0 -143
- package/.claude/skills/reqon/SKILL.md +0 -44
- package/.claude/skills/reqon/references/examples.md +0 -206
- package/.claude/skills/reqon/references/syntax.md +0 -263
- package/.claude/skills/vscode-extension.md +0 -113
- package/.github/dependabot.yml +0 -32
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/ci.yml +0 -174
- package/.github/workflows/release.yml +0 -73
- package/CLAUDE.md +0 -72
- package/CONTRIBUTING.md +0 -161
- package/TODO.md +0 -51
- package/dist/auth/auth.test.d.ts +0 -1
- package/dist/auth/auth.test.js +0 -255
- package/dist/errors/errors.test.d.ts +0 -1
- package/dist/errors/errors.test.js +0 -165
- package/dist/execution/execution.test.d.ts +0 -1
- package/dist/execution/execution.test.js +0 -246
- package/dist/integration.test.d.ts +0 -1
- package/dist/integration.test.js +0 -168
- package/dist/interpreter/evaluator.test.d.ts +0 -1
- package/dist/interpreter/evaluator.test.js +0 -512
- package/dist/interpreter/http.test.d.ts +0 -1
- package/dist/interpreter/http.test.js +0 -299
- package/dist/interpreter/progress.test.d.ts +0 -1
- package/dist/interpreter/progress.test.js +0 -216
- package/dist/interpreter/schema-matcher.test.d.ts +0 -1
- package/dist/interpreter/schema-matcher.test.js +0 -122
- package/dist/lexer/lexer.d.ts +0 -24
- package/dist/lexer/lexer.js +0 -264
- package/dist/lexer/lexer.test.d.ts +0 -1
- package/dist/lexer/lexer.test.js +0 -259
- package/dist/loader/loader.test.d.ts +0 -1
- package/dist/loader/loader.test.js +0 -287
- package/dist/oas/oas.test.d.ts +0 -1
- package/dist/oas/oas.test.js +0 -218
- package/dist/parser/expressions.test.d.ts +0 -1
- package/dist/parser/expressions.test.js +0 -378
- package/dist/parser/match.test.d.ts +0 -1
- package/dist/parser/match.test.js +0 -254
- package/dist/parser/parser.test.d.ts +0 -1
- package/dist/parser/parser.test.js +0 -333
- package/dist/parser/schedule.test.d.ts +0 -1
- package/dist/parser/schedule.test.js +0 -241
- package/dist/scheduler/cron-parser.test.d.ts +0 -1
- package/dist/scheduler/cron-parser.test.js +0 -188
- package/dist/stores/file.test.d.ts +0 -1
- package/dist/stores/file.test.js +0 -165
- package/dist/stores/memory.test.d.ts +0 -1
- package/dist/stores/memory.test.js +0 -157
- package/dist/stores/stores.test.d.ts +0 -1
- package/dist/stores/stores.test.js +0 -158
- package/dist/sync/sync.test.d.ts +0 -1
- package/dist/sync/sync.test.js +0 -221
- package/docusaurus/README.md +0 -41
- package/docusaurus/docs/advanced/execution-state.md +0 -283
- package/docusaurus/docs/advanced/extending-reqon.md +0 -388
- package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
- package/docusaurus/docs/advanced/parallel-execution.md +0 -353
- package/docusaurus/docs/api-reference.md +0 -443
- package/docusaurus/docs/authentication/api-key.md +0 -339
- package/docusaurus/docs/authentication/basic.md +0 -276
- package/docusaurus/docs/authentication/bearer.md +0 -282
- package/docusaurus/docs/authentication/oauth2.md +0 -317
- package/docusaurus/docs/authentication/overview.md +0 -251
- package/docusaurus/docs/cli.md +0 -229
- package/docusaurus/docs/core-concepts/actions.md +0 -286
- package/docusaurus/docs/core-concepts/missions.md +0 -264
- package/docusaurus/docs/core-concepts/schemas.md +0 -353
- package/docusaurus/docs/core-concepts/sources.md +0 -339
- package/docusaurus/docs/core-concepts/stores.md +0 -332
- package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
- package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
- package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
- package/docusaurus/docs/dsl-syntax/map.md +0 -345
- package/docusaurus/docs/dsl-syntax/match.md +0 -387
- package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
- package/docusaurus/docs/dsl-syntax/validate.md +0 -401
- package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
- package/docusaurus/docs/error-handling/flow-control.md +0 -337
- package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
- package/docusaurus/docs/examples.md +0 -488
- package/docusaurus/docs/getting-started.md +0 -256
- package/docusaurus/docs/http/circuit-breaker.md +0 -401
- package/docusaurus/docs/http/incremental-sync.md +0 -394
- package/docusaurus/docs/http/pagination.md +0 -361
- package/docusaurus/docs/http/rate-limiting.md +0 -383
- package/docusaurus/docs/http/requests.md +0 -328
- package/docusaurus/docs/http/retry.md +0 -402
- package/docusaurus/docs/intro.md +0 -90
- package/docusaurus/docs/openapi/loading-specs.md +0 -305
- package/docusaurus/docs/openapi/operation-calls.md +0 -314
- package/docusaurus/docs/openapi/overview.md +0 -212
- package/docusaurus/docs/openapi/response-validation.md +0 -344
- package/docusaurus/docs/scheduling/cron.md +0 -305
- package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
- package/docusaurus/docs/scheduling/intervals.md +0 -289
- package/docusaurus/docs/scheduling/overview.md +0 -231
- package/docusaurus/docs/stores/custom-adapters.md +0 -376
- package/docusaurus/docs/stores/file.md +0 -236
- package/docusaurus/docs/stores/memory.md +0 -193
- package/docusaurus/docs/stores/overview.md +0 -274
- package/docusaurus/docs/stores/postgrest.md +0 -316
- package/docusaurus/docusaurus.config.ts +0 -148
- package/docusaurus/package-lock.json +0 -18029
- package/docusaurus/package.json +0 -47
- package/docusaurus/sidebars.ts +0 -155
- package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
- package/docusaurus/src/css/custom.css +0 -169
- package/docusaurus/src/pages/index.module.css +0 -48
- package/docusaurus/src/pages/index.tsx +0 -110
- package/docusaurus/src/pages/markdown-page.md +0 -7
- package/docusaurus/static/.nojekyll +0 -0
- package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docusaurus/static/img/docusaurus.png +0 -0
- package/docusaurus/static/img/favicon.ico +0 -0
- package/docusaurus/static/img/logo.svg +0 -10
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
- package/docusaurus/tsconfig.json +0 -8
- package/examples/README.md +0 -112
- package/examples/error-handling/README.md +0 -150
- package/examples/error-handling/payment-processor.vague +0 -287
- package/examples/github-sync/README.md +0 -74
- package/examples/github-sync/fetch-issues.vague +0 -47
- package/examples/github-sync/fetch-prs.vague +0 -40
- package/examples/github-sync/mission.vague +0 -101
- package/examples/github-sync/normalize.vague +0 -70
- package/examples/jsonplaceholder/README.md +0 -28
- package/examples/jsonplaceholder/posts.vague +0 -48
- package/examples/petstore/README.md +0 -35
- package/examples/petstore/openapi.yaml +0 -97
- package/examples/petstore/sync.vague +0 -52
- package/examples/temporal-comparison/README.md +0 -297
- package/examples/temporal-comparison/reconciliation.vague +0 -355
- package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
- package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
- package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
- package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
- package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
- package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
- package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
- package/examples/temporal-comparison/temporal/types/index.ts +0 -129
- package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
- package/examples/xero/README.md +0 -88
- package/examples/xero/invoices.vague +0 -189
- package/src/api-integration.test.ts +0 -954
- package/src/ast/index.ts +0 -1
- package/src/ast/nodes.ts +0 -310
- package/src/auth/auth.test.ts +0 -326
- package/src/auth/circuit-breaker.test.ts +0 -390
- package/src/auth/circuit-breaker.ts +0 -379
- package/src/auth/credentials.test.ts +0 -273
- package/src/auth/credentials.ts +0 -246
- package/src/auth/index.ts +0 -40
- package/src/auth/oauth2-provider.ts +0 -177
- package/src/auth/rate-limiter.ts +0 -459
- package/src/auth/token-store.ts +0 -177
- package/src/auth/types.ts +0 -159
- package/src/benchmark/e2e.bench.ts +0 -288
- package/src/benchmark/evaluator.bench.ts +0 -331
- package/src/benchmark/fixtures.ts +0 -295
- package/src/benchmark/index.ts +0 -108
- package/src/benchmark/lexer.bench.ts +0 -69
- package/src/benchmark/parser.bench.ts +0 -103
- package/src/benchmark/resilience.bench.ts +0 -193
- package/src/benchmark/store.bench.ts +0 -147
- package/src/benchmark/utils.ts +0 -230
- package/src/cli.ts +0 -313
- package/src/errors/errors.test.ts +0 -234
- package/src/errors/index.ts +0 -223
- package/src/execution/execution.test.ts +0 -307
- package/src/execution/index.ts +0 -21
- package/src/execution/state.ts +0 -207
- package/src/execution/store.ts +0 -188
- package/src/index.ts +0 -169
- package/src/integration.test.ts +0 -192
- package/src/interpreter/context.ts +0 -57
- package/src/interpreter/evaluator.test.ts +0 -796
- package/src/interpreter/evaluator.ts +0 -245
- package/src/interpreter/executor.ts +0 -946
- package/src/interpreter/fetch-handler.ts +0 -302
- package/src/interpreter/http.test.ts +0 -423
- package/src/interpreter/http.ts +0 -308
- package/src/interpreter/index.ts +0 -32
- package/src/interpreter/pagination.ts +0 -207
- package/src/interpreter/progress.test.ts +0 -276
- package/src/interpreter/schema-matcher.test.ts +0 -160
- package/src/interpreter/schema-matcher.ts +0 -168
- package/src/interpreter/signals.ts +0 -73
- package/src/interpreter/step-handlers/for-handler.ts +0 -65
- package/src/interpreter/step-handlers/index.ts +0 -17
- package/src/interpreter/step-handlers/map-handler.ts +0 -24
- package/src/interpreter/step-handlers/match-handler.ts +0 -101
- package/src/interpreter/step-handlers/store-handler.ts +0 -78
- package/src/interpreter/step-handlers/types.ts +0 -17
- package/src/interpreter/step-handlers/validate-handler.ts +0 -30
- package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
- package/src/lexer/index.ts +0 -18
- package/src/lexer/lexer.test.ts +0 -316
- package/src/lexer/tokens.ts +0 -179
- package/src/loader/index.ts +0 -288
- package/src/loader/loader.test.ts +0 -360
- package/src/oas/index.ts +0 -4
- package/src/oas/loader.ts +0 -126
- package/src/oas/oas.test.ts +0 -254
- package/src/oas/validator.ts +0 -299
- package/src/parser/base.ts +0 -124
- package/src/parser/expressions.test.ts +0 -525
- package/src/parser/expressions.ts +0 -314
- package/src/parser/index.ts +0 -3
- package/src/parser/match.test.ts +0 -296
- package/src/parser/parser.test.ts +0 -739
- package/src/parser/parser.ts +0 -1469
- package/src/parser/schedule.test.ts +0 -287
- package/src/parser/webhook.test.ts +0 -248
- package/src/plugin.ts +0 -83
- package/src/scheduler/cron-parser.test.ts +0 -236
- package/src/scheduler/cron-parser.ts +0 -236
- package/src/scheduler/index.ts +0 -10
- package/src/scheduler/scheduler.ts +0 -443
- package/src/scheduler/types.ts +0 -71
- package/src/stores/factory.ts +0 -104
- package/src/stores/file.test.ts +0 -276
- package/src/stores/file.ts +0 -211
- package/src/stores/index.ts +0 -6
- package/src/stores/memory.test.ts +0 -238
- package/src/stores/memory.ts +0 -63
- package/src/stores/postgrest.test.ts +0 -488
- package/src/stores/postgrest.ts +0 -263
- package/src/stores/stores.test.ts +0 -197
- package/src/stores/types.ts +0 -58
- package/src/sync/index.ts +0 -16
- package/src/sync/state.ts +0 -126
- package/src/sync/store.ts +0 -139
- package/src/sync/sync.test.ts +0 -271
- package/src/utils/async.ts +0 -10
- package/src/utils/file.ts +0 -106
- package/src/utils/index.ts +0 -14
- package/src/utils/logger.ts +0 -53
- package/src/utils/path.ts +0 -47
- package/src/webhook/index.ts +0 -15
- package/src/webhook/server.test.ts +0 -253
- package/src/webhook/server.ts +0 -389
- package/src/webhook/store.ts +0 -239
- package/src/webhook/types.ts +0 -93
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -39
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 1
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# HTTP Requests
|
|
6
|
-
|
|
7
|
-
Reqon provides powerful HTTP request handling with built-in support for pagination, retries, rate limiting, and more.
|
|
8
|
-
|
|
9
|
-
## Request Methods
|
|
10
|
-
|
|
11
|
-
```vague
|
|
12
|
-
// GET - Retrieve data
|
|
13
|
-
get "/users"
|
|
14
|
-
|
|
15
|
-
// POST - Create data
|
|
16
|
-
post "/users" { body: { name: "John" } }
|
|
17
|
-
|
|
18
|
-
// PUT - Replace data
|
|
19
|
-
put "/users/123" { body: { name: "Jane" } }
|
|
20
|
-
|
|
21
|
-
// PATCH - Partial update
|
|
22
|
-
patch "/users/123" { body: { email: "jane@example.com" } }
|
|
23
|
-
|
|
24
|
-
// DELETE - Remove data
|
|
25
|
-
delete "/users/123"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Request Options
|
|
29
|
-
|
|
30
|
-
### Query Parameters
|
|
31
|
-
|
|
32
|
-
Add query parameters to requests:
|
|
33
|
-
|
|
34
|
-
```vague
|
|
35
|
-
get "/users" {
|
|
36
|
-
params: {
|
|
37
|
-
limit: 100,
|
|
38
|
-
offset: 0,
|
|
39
|
-
status: "active",
|
|
40
|
-
sort: "created_at",
|
|
41
|
-
order: "desc"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Generates: `GET /users?limit=100&offset=0&status=active&sort=created_at&order=desc`
|
|
47
|
-
|
|
48
|
-
### Dynamic Parameters
|
|
49
|
-
|
|
50
|
-
Use expressions in parameters:
|
|
51
|
-
|
|
52
|
-
```vague
|
|
53
|
-
get "/users" {
|
|
54
|
-
params: {
|
|
55
|
-
since: formatDate(lastSync, "YYYY-MM-DD"),
|
|
56
|
-
limit: env("PAGE_SIZE") or 100
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Request Body
|
|
62
|
-
|
|
63
|
-
Send JSON body with POST/PUT/PATCH:
|
|
64
|
-
|
|
65
|
-
```vague
|
|
66
|
-
post "/users" {
|
|
67
|
-
body: {
|
|
68
|
-
name: "John Doe",
|
|
69
|
-
email: "john@example.com",
|
|
70
|
-
metadata: {
|
|
71
|
-
source: "api",
|
|
72
|
-
importedAt: now()
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Dynamic Body
|
|
79
|
-
|
|
80
|
-
Build body from variables:
|
|
81
|
-
|
|
82
|
-
```vague
|
|
83
|
-
for user in usersToCreate {
|
|
84
|
-
post "/users" {
|
|
85
|
-
body: {
|
|
86
|
-
name: user.name,
|
|
87
|
-
email: user.email,
|
|
88
|
-
role: user.role or "user"
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Custom Headers
|
|
95
|
-
|
|
96
|
-
Override or add headers:
|
|
97
|
-
|
|
98
|
-
```vague
|
|
99
|
-
get "/data" {
|
|
100
|
-
headers: {
|
|
101
|
-
"Accept": "application/json",
|
|
102
|
-
"X-API-Version": "2.0",
|
|
103
|
-
"X-Request-ID": uuid()
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Response Handling
|
|
109
|
-
|
|
110
|
-
### Accessing Response Data
|
|
111
|
-
|
|
112
|
-
The `response` variable contains the parsed JSON:
|
|
113
|
-
|
|
114
|
-
```vague
|
|
115
|
-
action FetchUsers {
|
|
116
|
-
get "/users"
|
|
117
|
-
|
|
118
|
-
// Access response data
|
|
119
|
-
for user in response.data {
|
|
120
|
-
store user -> users { key: .id }
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Access metadata
|
|
124
|
-
validate {
|
|
125
|
-
assume response.total > 0
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Response Structure
|
|
131
|
-
|
|
132
|
-
```vague
|
|
133
|
-
// Common API response pattern
|
|
134
|
-
{
|
|
135
|
-
"data": [...],
|
|
136
|
-
"meta": {
|
|
137
|
-
"total": 100,
|
|
138
|
-
"page": 1,
|
|
139
|
-
"perPage": 20
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Access in Reqon
|
|
144
|
-
for item in response.data { }
|
|
145
|
-
validate { assume response.meta.total > 0 }
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
## Working with Multiple Sources
|
|
149
|
-
|
|
150
|
-
### Default Source
|
|
151
|
-
|
|
152
|
-
The first defined source is the default:
|
|
153
|
-
|
|
154
|
-
```vague
|
|
155
|
-
mission Example {
|
|
156
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
157
|
-
|
|
158
|
-
action Fetch {
|
|
159
|
-
get "/users" // Uses API source
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Named Source
|
|
165
|
-
|
|
166
|
-
Specify source explicitly:
|
|
167
|
-
|
|
168
|
-
```vague
|
|
169
|
-
mission MultiSource {
|
|
170
|
-
source Primary { auth: bearer, base: "https://primary.api.com" }
|
|
171
|
-
source Backup { auth: bearer, base: "https://backup.api.com" }
|
|
172
|
-
|
|
173
|
-
action FetchFromBoth {
|
|
174
|
-
get Primary "/users"
|
|
175
|
-
store response -> primaryUsers { key: .id }
|
|
176
|
-
|
|
177
|
-
get Backup "/users"
|
|
178
|
-
store response -> backupUsers { key: .id }
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Dynamic URLs
|
|
184
|
-
|
|
185
|
-
Build URLs dynamically:
|
|
186
|
-
|
|
187
|
-
```vague
|
|
188
|
-
action FetchDetails {
|
|
189
|
-
for user in users {
|
|
190
|
-
// String concatenation
|
|
191
|
-
get concat("/users/", user.id)
|
|
192
|
-
|
|
193
|
-
// Nested resources
|
|
194
|
-
get concat("/users/", user.id, "/orders")
|
|
195
|
-
|
|
196
|
-
// Complex paths
|
|
197
|
-
get concat("/api/v", env("API_VERSION"), "/users/", user.id)
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## Request Timeouts
|
|
203
|
-
|
|
204
|
-
Configure at source level:
|
|
205
|
-
|
|
206
|
-
```vague
|
|
207
|
-
source SlowAPI {
|
|
208
|
-
auth: bearer,
|
|
209
|
-
base: "https://slow.api.com",
|
|
210
|
-
timeout: 60000 // 60 seconds
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
Or per-request (future feature):
|
|
215
|
-
|
|
216
|
-
```vague
|
|
217
|
-
get "/slow-endpoint" {
|
|
218
|
-
timeout: 120000 // 2 minutes
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
## Error Handling
|
|
223
|
-
|
|
224
|
-
Handle HTTP errors with match:
|
|
225
|
-
|
|
226
|
-
```vague
|
|
227
|
-
action SafeFetch {
|
|
228
|
-
get "/users"
|
|
229
|
-
|
|
230
|
-
match response {
|
|
231
|
-
{ error: _, code: 401 } -> jump RefreshAuth then retry,
|
|
232
|
-
{ error: _, code: 404 } -> skip,
|
|
233
|
-
{ error: _, code: 429 } -> retry { delay: 60000 },
|
|
234
|
-
{ error: e } -> abort e,
|
|
235
|
-
_ -> store response -> users { key: .id }
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
## Request Chaining
|
|
241
|
-
|
|
242
|
-
Chain requests with data from previous responses:
|
|
243
|
-
|
|
244
|
-
```vague
|
|
245
|
-
action FetchWithDetails {
|
|
246
|
-
// First request
|
|
247
|
-
get "/orders"
|
|
248
|
-
|
|
249
|
-
for order in response.orders {
|
|
250
|
-
// Use data from first request
|
|
251
|
-
get concat("/customers/", order.customerId)
|
|
252
|
-
|
|
253
|
-
map order -> EnrichedOrder {
|
|
254
|
-
...order,
|
|
255
|
-
customer: response
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
store order -> enrichedOrders { key: .id }
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## Batching Requests
|
|
264
|
-
|
|
265
|
-
For APIs that support batch operations:
|
|
266
|
-
|
|
267
|
-
```vague
|
|
268
|
-
action BatchFetch {
|
|
269
|
-
// Collect IDs
|
|
270
|
-
get "/items" { params: { status: "pending" } }
|
|
271
|
-
|
|
272
|
-
// Batch request
|
|
273
|
-
post "/items/batch" {
|
|
274
|
-
body: {
|
|
275
|
-
ids: response.items.map(.id)
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
store response -> batchResults
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## Best Practices
|
|
284
|
-
|
|
285
|
-
### Use Descriptive Error Handling
|
|
286
|
-
|
|
287
|
-
```vague
|
|
288
|
-
match response {
|
|
289
|
-
{ error: _, code: 400 } -> abort "Invalid request data",
|
|
290
|
-
{ error: _, code: 401 } -> abort "Authentication failed",
|
|
291
|
-
{ error: _, code: 403 } -> abort "Permission denied",
|
|
292
|
-
{ error: _, code: 404 } -> abort "Resource not found",
|
|
293
|
-
{ error: _, code: 429 } -> retry { delay: 60000 },
|
|
294
|
-
{ error: _, code: 500 } -> retry { maxAttempts: 3 },
|
|
295
|
-
{ error: e } -> abort e,
|
|
296
|
-
_ -> continue
|
|
297
|
-
}
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### Validate Before Processing
|
|
301
|
-
|
|
302
|
-
```vague
|
|
303
|
-
get "/data"
|
|
304
|
-
|
|
305
|
-
validate response {
|
|
306
|
-
assume .data is array,
|
|
307
|
-
assume length(.data) > 0
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
for item in response.data { }
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
### Log Important Requests
|
|
314
|
-
|
|
315
|
-
```vague
|
|
316
|
-
get "/important-operation"
|
|
317
|
-
|
|
318
|
-
match response {
|
|
319
|
-
{ success: true } -> {
|
|
320
|
-
store { operation: "fetch", status: "success", timestamp: now() } -> logs
|
|
321
|
-
continue
|
|
322
|
-
},
|
|
323
|
-
_ -> {
|
|
324
|
-
store { operation: "fetch", status: "failed", response: response } -> logs
|
|
325
|
-
abort "Operation failed"
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
```
|
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 3
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Retry Strategies
|
|
6
|
-
|
|
7
|
-
Reqon provides built-in retry handling for transient failures with configurable backoff strategies.
|
|
8
|
-
|
|
9
|
-
## Basic Retry Configuration
|
|
10
|
-
|
|
11
|
-
```vague
|
|
12
|
-
get "/data" {
|
|
13
|
-
retry: {
|
|
14
|
-
maxAttempts: 3,
|
|
15
|
-
backoff: exponential,
|
|
16
|
-
initialDelay: 1000,
|
|
17
|
-
maxDelay: 30000
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Retry Options
|
|
23
|
-
|
|
24
|
-
| Option | Description | Default |
|
|
25
|
-
|--------|-------------|---------|
|
|
26
|
-
| `maxAttempts` | Maximum number of retry attempts | 3 |
|
|
27
|
-
| `backoff` | Backoff strategy | `exponential` |
|
|
28
|
-
| `initialDelay` | First retry delay (ms) | 1000 |
|
|
29
|
-
| `maxDelay` | Maximum delay between retries (ms) | 30000 |
|
|
30
|
-
|
|
31
|
-
## Backoff Strategies
|
|
32
|
-
|
|
33
|
-
### Exponential Backoff
|
|
34
|
-
|
|
35
|
-
Doubles the delay after each attempt:
|
|
36
|
-
|
|
37
|
-
```vague
|
|
38
|
-
get "/data" {
|
|
39
|
-
retry: {
|
|
40
|
-
maxAttempts: 5,
|
|
41
|
-
backoff: exponential,
|
|
42
|
-
initialDelay: 1000
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Timing:
|
|
48
|
-
- Attempt 1: immediate
|
|
49
|
-
- Attempt 2: wait 1000ms
|
|
50
|
-
- Attempt 3: wait 2000ms
|
|
51
|
-
- Attempt 4: wait 4000ms
|
|
52
|
-
- Attempt 5: wait 8000ms
|
|
53
|
-
|
|
54
|
-
### Linear Backoff
|
|
55
|
-
|
|
56
|
-
Adds a fixed delay each time:
|
|
57
|
-
|
|
58
|
-
```vague
|
|
59
|
-
get "/data" {
|
|
60
|
-
retry: {
|
|
61
|
-
maxAttempts: 5,
|
|
62
|
-
backoff: linear,
|
|
63
|
-
initialDelay: 2000
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Timing:
|
|
69
|
-
- Attempt 1: immediate
|
|
70
|
-
- Attempt 2: wait 2000ms
|
|
71
|
-
- Attempt 3: wait 4000ms
|
|
72
|
-
- Attempt 4: wait 6000ms
|
|
73
|
-
- Attempt 5: wait 8000ms
|
|
74
|
-
|
|
75
|
-
### Constant Backoff
|
|
76
|
-
|
|
77
|
-
Same delay every time:
|
|
78
|
-
|
|
79
|
-
```vague
|
|
80
|
-
get "/data" {
|
|
81
|
-
retry: {
|
|
82
|
-
maxAttempts: 5,
|
|
83
|
-
backoff: constant,
|
|
84
|
-
initialDelay: 5000
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Timing:
|
|
90
|
-
- Attempt 1: immediate
|
|
91
|
-
- Attempt 2: wait 5000ms
|
|
92
|
-
- Attempt 3: wait 5000ms
|
|
93
|
-
- Attempt 4: wait 5000ms
|
|
94
|
-
- Attempt 5: wait 5000ms
|
|
95
|
-
|
|
96
|
-
## Maximum Delay
|
|
97
|
-
|
|
98
|
-
Cap the maximum delay:
|
|
99
|
-
|
|
100
|
-
```vague
|
|
101
|
-
get "/data" {
|
|
102
|
-
retry: {
|
|
103
|
-
maxAttempts: 10,
|
|
104
|
-
backoff: exponential,
|
|
105
|
-
initialDelay: 1000,
|
|
106
|
-
maxDelay: 30000 // Cap at 30 seconds
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Without maxDelay, exponential backoff would reach:
|
|
112
|
-
- Attempt 8: 128 seconds
|
|
113
|
-
- Attempt 9: 256 seconds
|
|
114
|
-
- Attempt 10: 512 seconds
|
|
115
|
-
|
|
116
|
-
With `maxDelay: 30000`, all delays are capped at 30 seconds.
|
|
117
|
-
|
|
118
|
-
## Conditional Retry
|
|
119
|
-
|
|
120
|
-
Use `match` for conditional retry logic:
|
|
121
|
-
|
|
122
|
-
```vague
|
|
123
|
-
action FetchWithConditionalRetry {
|
|
124
|
-
get "/data"
|
|
125
|
-
|
|
126
|
-
match response {
|
|
127
|
-
// Retry on rate limit
|
|
128
|
-
{ error: _, code: 429 } -> retry {
|
|
129
|
-
maxAttempts: 5,
|
|
130
|
-
backoff: exponential,
|
|
131
|
-
initialDelay: 60000 // Start with 1 minute
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
// Retry on server errors
|
|
135
|
-
{ error: _, code: 500 } -> retry {
|
|
136
|
-
maxAttempts: 3,
|
|
137
|
-
backoff: exponential,
|
|
138
|
-
initialDelay: 5000
|
|
139
|
-
},
|
|
140
|
-
|
|
141
|
-
// Retry on timeout
|
|
142
|
-
{ error: "timeout" } -> retry {
|
|
143
|
-
maxAttempts: 3,
|
|
144
|
-
backoff: constant,
|
|
145
|
-
initialDelay: 10000
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
// Don't retry client errors
|
|
149
|
-
{ error: _, code: 400 } -> abort "Bad request",
|
|
150
|
-
{ error: _, code: 401 } -> abort "Unauthorized",
|
|
151
|
-
{ error: _, code: 404 } -> skip,
|
|
152
|
-
|
|
153
|
-
// Success
|
|
154
|
-
_ -> continue
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## Retry After Header
|
|
160
|
-
|
|
161
|
-
Reqon respects the `Retry-After` header when present:
|
|
162
|
-
|
|
163
|
-
```vague
|
|
164
|
-
get "/rate-limited-api" {
|
|
165
|
-
retry: {
|
|
166
|
-
maxAttempts: 5,
|
|
167
|
-
backoff: exponential,
|
|
168
|
-
initialDelay: 1000
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
If the API returns:
|
|
174
|
-
```http
|
|
175
|
-
HTTP/1.1 429 Too Many Requests
|
|
176
|
-
Retry-After: 60
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
Reqon will wait 60 seconds before retrying, regardless of backoff settings.
|
|
180
|
-
|
|
181
|
-
## Combining with Other Features
|
|
182
|
-
|
|
183
|
-
### With Pagination
|
|
184
|
-
|
|
185
|
-
```vague
|
|
186
|
-
get "/items" {
|
|
187
|
-
paginate: offset(offset, 100),
|
|
188
|
-
until: length(response) == 0,
|
|
189
|
-
retry: {
|
|
190
|
-
maxAttempts: 3,
|
|
191
|
-
backoff: exponential
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Each page request uses retry logic independently.
|
|
197
|
-
|
|
198
|
-
### With Rate Limiting
|
|
199
|
-
|
|
200
|
-
```vague
|
|
201
|
-
source API {
|
|
202
|
-
auth: bearer,
|
|
203
|
-
base: "https://api.example.com",
|
|
204
|
-
rateLimit: {
|
|
205
|
-
requestsPerMinute: 60,
|
|
206
|
-
strategy: "pause"
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
action Fetch {
|
|
211
|
-
get "/items" {
|
|
212
|
-
retry: {
|
|
213
|
-
maxAttempts: 3,
|
|
214
|
-
backoff: exponential
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
Rate limiting runs before retry; retry handles unexpected failures.
|
|
221
|
-
|
|
222
|
-
## Jump and Retry
|
|
223
|
-
|
|
224
|
-
For complex retry scenarios like token refresh:
|
|
225
|
-
|
|
226
|
-
```vague
|
|
227
|
-
action FetchData {
|
|
228
|
-
get "/protected-data"
|
|
229
|
-
|
|
230
|
-
match response {
|
|
231
|
-
{ error: _, code: 401 } -> jump RefreshToken then retry,
|
|
232
|
-
_ -> store response -> data { key: .id }
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
action RefreshToken {
|
|
237
|
-
post "/auth/refresh" {
|
|
238
|
-
body: { refreshToken: env("REFRESH_TOKEN") }
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Token is automatically used in subsequent requests
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
The `jump RefreshToken then retry` directive:
|
|
246
|
-
1. Executes the `RefreshToken` action
|
|
247
|
-
2. Retries the original request with the new token
|
|
248
|
-
|
|
249
|
-
## Per-Source Retry Configuration
|
|
250
|
-
|
|
251
|
-
Configure default retry at the source level:
|
|
252
|
-
|
|
253
|
-
```vague
|
|
254
|
-
source UnreliableAPI {
|
|
255
|
-
auth: bearer,
|
|
256
|
-
base: "https://flaky.api.com",
|
|
257
|
-
retry: {
|
|
258
|
-
maxAttempts: 5,
|
|
259
|
-
backoff: exponential,
|
|
260
|
-
initialDelay: 2000,
|
|
261
|
-
maxDelay: 60000
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
action Fetch {
|
|
266
|
-
// Uses source-level retry config
|
|
267
|
-
get "/data"
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
Request-level config overrides source-level:
|
|
272
|
-
|
|
273
|
-
```vague
|
|
274
|
-
action FetchWithOverride {
|
|
275
|
-
get "/data" {
|
|
276
|
-
retry: {
|
|
277
|
-
maxAttempts: 10 // Override just maxAttempts
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## Best Practices
|
|
284
|
-
|
|
285
|
-
### Use Exponential Backoff for APIs
|
|
286
|
-
|
|
287
|
-
```vague
|
|
288
|
-
get "/api/data" {
|
|
289
|
-
retry: {
|
|
290
|
-
maxAttempts: 5,
|
|
291
|
-
backoff: exponential,
|
|
292
|
-
initialDelay: 1000,
|
|
293
|
-
maxDelay: 30000
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
### Handle Specific Error Codes
|
|
299
|
-
|
|
300
|
-
```vague
|
|
301
|
-
match response {
|
|
302
|
-
// Transient errors - retry
|
|
303
|
-
{ code: 429 } -> retry { maxAttempts: 5 },
|
|
304
|
-
{ code: 503 } -> retry { maxAttempts: 3 },
|
|
305
|
-
{ code: 504 } -> retry { maxAttempts: 3 },
|
|
306
|
-
|
|
307
|
-
// Permanent errors - don't retry
|
|
308
|
-
{ code: 400 } -> abort "Bad request",
|
|
309
|
-
{ code: 401 } -> abort "Unauthorized",
|
|
310
|
-
{ code: 403 } -> abort "Forbidden",
|
|
311
|
-
{ code: 404 } -> skip,
|
|
312
|
-
|
|
313
|
-
_ -> continue
|
|
314
|
-
}
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Set Reasonable Limits
|
|
318
|
-
|
|
319
|
-
```vague
|
|
320
|
-
// Good: reasonable limits
|
|
321
|
-
retry: {
|
|
322
|
-
maxAttempts: 5,
|
|
323
|
-
maxDelay: 60000
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Risky: too aggressive
|
|
327
|
-
retry: {
|
|
328
|
-
maxAttempts: 100,
|
|
329
|
-
maxDelay: 1000 // 1 second
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Risky: too long
|
|
333
|
-
retry: {
|
|
334
|
-
maxAttempts: 20,
|
|
335
|
-
initialDelay: 60000 // 1 minute start
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### Log Retry Attempts
|
|
340
|
-
|
|
341
|
-
Combine with match for observability:
|
|
342
|
-
|
|
343
|
-
```vague
|
|
344
|
-
action FetchWithLogging {
|
|
345
|
-
get "/data" {
|
|
346
|
-
retry: {
|
|
347
|
-
maxAttempts: 3,
|
|
348
|
-
backoff: exponential
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
match response {
|
|
353
|
-
{ error: e } -> {
|
|
354
|
-
store {
|
|
355
|
-
endpoint: "/data",
|
|
356
|
-
error: e,
|
|
357
|
-
timestamp: now()
|
|
358
|
-
} -> retryLogs
|
|
359
|
-
abort e
|
|
360
|
-
},
|
|
361
|
-
_ -> continue
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
## Troubleshooting
|
|
367
|
-
|
|
368
|
-
### Retry Not Working
|
|
369
|
-
|
|
370
|
-
Ensure the response matches retry conditions:
|
|
371
|
-
|
|
372
|
-
```vague
|
|
373
|
-
// Retry only triggers on match directive
|
|
374
|
-
match response {
|
|
375
|
-
{ error: _ } -> retry { maxAttempts: 3 }, // This triggers retry
|
|
376
|
-
_ -> continue
|
|
377
|
-
}
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
### Too Many Retries
|
|
381
|
-
|
|
382
|
-
Add a maximum delay:
|
|
383
|
-
|
|
384
|
-
```vague
|
|
385
|
-
retry: {
|
|
386
|
-
maxAttempts: 10,
|
|
387
|
-
backoff: exponential,
|
|
388
|
-
initialDelay: 1000,
|
|
389
|
-
maxDelay: 30000 // Cap delays
|
|
390
|
-
}
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
### Retry After Token Refresh
|
|
394
|
-
|
|
395
|
-
Use `jump then retry`:
|
|
396
|
-
|
|
397
|
-
```vague
|
|
398
|
-
match response {
|
|
399
|
-
{ code: 401 } -> jump RefreshToken then retry,
|
|
400
|
-
_ -> continue
|
|
401
|
-
}
|
|
402
|
-
```
|