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.
- package/.claude/settings.local.json +31 -0
- package/.claude/skills/api-integration.md +125 -0
- package/.claude/skills/database-schema.md +51 -0
- package/.claude/skills/dsl-design.md +80 -0
- package/.claude/skills/property-testing.md +143 -0
- package/.claude/skills/reqon/SKILL.md +44 -0
- package/.claude/skills/reqon/references/examples.md +206 -0
- package/.claude/skills/reqon/references/syntax.md +263 -0
- package/.claude/skills/vscode-extension.md +113 -0
- package/.github/dependabot.yml +32 -0
- package/.github/pull_request_template.md +21 -0
- package/.github/workflows/ci.yml +174 -0
- package/.github/workflows/release.yml +73 -0
- package/CLAUDE.md +72 -0
- package/CONTRIBUTING.md +161 -0
- package/README.md +235 -0
- package/TODO.md +51 -0
- package/dist/ast/index.d.ts +1 -0
- package/dist/ast/index.js +1 -0
- package/dist/ast/nodes.d.ts +237 -0
- package/dist/ast/nodes.js +12 -0
- package/dist/auth/auth.test.d.ts +1 -0
- package/dist/auth/auth.test.js +255 -0
- package/dist/auth/circuit-breaker.d.ts +115 -0
- package/dist/auth/circuit-breaker.js +267 -0
- package/dist/auth/credentials.d.ts +91 -0
- package/dist/auth/credentials.js +169 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/oauth2-provider.d.ts +41 -0
- package/dist/auth/oauth2-provider.js +131 -0
- package/dist/auth/rate-limiter.d.ts +61 -0
- package/dist/auth/rate-limiter.js +380 -0
- package/dist/auth/token-store.d.ts +30 -0
- package/dist/auth/token-store.js +148 -0
- package/dist/auth/types.d.ts +142 -0
- package/dist/auth/types.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +270 -0
- package/dist/errors/errors.test.d.ts +1 -0
- package/dist/errors/errors.test.js +165 -0
- package/dist/errors/index.d.ts +83 -0
- package/dist/errors/index.js +159 -0
- package/dist/execution/execution.test.d.ts +1 -0
- package/dist/execution/execution.test.js +246 -0
- package/dist/execution/index.d.ts +4 -0
- package/dist/execution/index.js +2 -0
- package/dist/execution/state.d.ts +136 -0
- package/dist/execution/state.js +82 -0
- package/dist/execution/store.d.ts +52 -0
- package/dist/execution/store.js +120 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +57 -0
- package/dist/integration.test.d.ts +1 -0
- package/dist/integration.test.js +168 -0
- package/dist/interpreter/context.d.ts +15 -0
- package/dist/interpreter/context.js +29 -0
- package/dist/interpreter/evaluator.d.ts +5 -0
- package/dist/interpreter/evaluator.js +223 -0
- package/dist/interpreter/evaluator.test.d.ts +1 -0
- package/dist/interpreter/evaluator.test.js +512 -0
- package/dist/interpreter/executor.d.ts +131 -0
- package/dist/interpreter/executor.js +663 -0
- package/dist/interpreter/fetch-handler.d.ts +43 -0
- package/dist/interpreter/fetch-handler.js +203 -0
- package/dist/interpreter/http.d.ts +57 -0
- package/dist/interpreter/http.js +210 -0
- package/dist/interpreter/http.test.d.ts +1 -0
- package/dist/interpreter/http.test.js +299 -0
- package/dist/interpreter/index.d.ts +7 -0
- package/dist/interpreter/index.js +7 -0
- package/dist/interpreter/pagination.d.ts +63 -0
- package/dist/interpreter/pagination.js +155 -0
- package/dist/interpreter/progress.test.d.ts +1 -0
- package/dist/interpreter/progress.test.js +216 -0
- package/dist/interpreter/schema-matcher.d.ts +16 -0
- package/dist/interpreter/schema-matcher.js +136 -0
- package/dist/interpreter/schema-matcher.test.d.ts +1 -0
- package/dist/interpreter/schema-matcher.test.js +122 -0
- package/dist/interpreter/signals.d.ts +57 -0
- package/dist/interpreter/signals.js +73 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +17 -0
- package/dist/interpreter/step-handlers/for-handler.js +51 -0
- package/dist/interpreter/step-handlers/index.d.ts +8 -0
- package/dist/interpreter/step-handlers/index.js +8 -0
- package/dist/interpreter/step-handlers/map-handler.d.ts +10 -0
- package/dist/interpreter/step-handlers/map-handler.js +20 -0
- package/dist/interpreter/step-handlers/match-handler.d.ts +27 -0
- package/dist/interpreter/step-handlers/match-handler.js +61 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/store-handler.js +66 -0
- package/dist/interpreter/step-handlers/types.d.ts +15 -0
- package/dist/interpreter/step-handlers/types.js +1 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +10 -0
- package/dist/interpreter/step-handlers/validate-handler.js +26 -0
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +36 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +104 -0
- package/dist/lexer/index.d.ts +10 -0
- package/dist/lexer/index.js +12 -0
- package/dist/lexer/lexer.d.ts +24 -0
- package/dist/lexer/lexer.js +264 -0
- package/dist/lexer/lexer.test.d.ts +1 -0
- package/dist/lexer/lexer.test.js +259 -0
- package/dist/lexer/tokens.d.ts +69 -0
- package/dist/lexer/tokens.js +146 -0
- package/dist/loader/index.d.ts +36 -0
- package/dist/loader/index.js +220 -0
- package/dist/loader/loader.test.d.ts +1 -0
- package/dist/loader/loader.test.js +287 -0
- package/dist/oas/index.d.ts +4 -0
- package/dist/oas/index.js +2 -0
- package/dist/oas/loader.d.ts +21 -0
- package/dist/oas/loader.js +82 -0
- package/dist/oas/oas.test.d.ts +1 -0
- package/dist/oas/oas.test.js +218 -0
- package/dist/oas/validator.d.ts +12 -0
- package/dist/oas/validator.js +227 -0
- package/dist/parser/base.d.ts +33 -0
- package/dist/parser/base.js +97 -0
- package/dist/parser/expressions.d.ts +27 -0
- package/dist/parser/expressions.js +248 -0
- package/dist/parser/expressions.test.d.ts +1 -0
- package/dist/parser/expressions.test.js +378 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/match.test.d.ts +1 -0
- package/dist/parser/match.test.js +254 -0
- package/dist/parser/parser.d.ts +68 -0
- package/dist/parser/parser.js +1229 -0
- package/dist/parser/parser.test.d.ts +1 -0
- package/dist/parser/parser.test.js +333 -0
- package/dist/parser/schedule.test.d.ts +1 -0
- package/dist/parser/schedule.test.js +241 -0
- package/dist/plugin.d.ts +35 -0
- package/dist/plugin.js +68 -0
- package/dist/scheduler/cron-parser.d.ts +32 -0
- package/dist/scheduler/cron-parser.js +198 -0
- package/dist/scheduler/cron-parser.test.d.ts +1 -0
- package/dist/scheduler/cron-parser.test.js +188 -0
- package/dist/scheduler/index.d.ts +3 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/scheduler.d.ts +81 -0
- package/dist/scheduler/scheduler.js +376 -0
- package/dist/scheduler/types.d.ts +65 -0
- package/dist/scheduler/types.js +1 -0
- package/dist/stores/factory.d.ts +36 -0
- package/dist/stores/factory.js +73 -0
- package/dist/stores/file.d.ts +60 -0
- package/dist/stores/file.js +173 -0
- package/dist/stores/file.test.d.ts +1 -0
- package/dist/stores/file.test.js +165 -0
- package/dist/stores/index.d.ts +6 -0
- package/dist/stores/index.js +5 -0
- package/dist/stores/memory.d.ts +19 -0
- package/dist/stores/memory.js +51 -0
- package/dist/stores/memory.test.d.ts +1 -0
- package/dist/stores/memory.test.js +157 -0
- package/dist/stores/postgrest.d.ts +55 -0
- package/dist/stores/postgrest.js +217 -0
- package/dist/stores/stores.test.d.ts +1 -0
- package/dist/stores/stores.test.js +158 -0
- package/dist/stores/types.d.ts +31 -0
- package/dist/stores/types.js +26 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +2 -0
- package/dist/sync/state.d.ts +69 -0
- package/dist/sync/state.js +66 -0
- package/dist/sync/store.d.ts +49 -0
- package/dist/sync/store.js +93 -0
- package/dist/sync/sync.test.d.ts +1 -0
- package/dist/sync/sync.test.js +221 -0
- package/dist/utils/async.d.ts +7 -0
- package/dist/utils/async.js +9 -0
- package/dist/utils/file.d.ts +38 -0
- package/dist/utils/file.js +92 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/path.d.ts +12 -0
- package/dist/utils/path.js +41 -0
- package/dist/webhook/index.d.ts +8 -0
- package/dist/webhook/index.js +7 -0
- package/dist/webhook/server.d.ts +84 -0
- package/dist/webhook/server.js +319 -0
- package/dist/webhook/store.d.ts +67 -0
- package/dist/webhook/store.js +193 -0
- package/dist/webhook/types.d.ts +88 -0
- package/dist/webhook/types.js +6 -0
- package/docusaurus/README.md +41 -0
- package/docusaurus/docs/advanced/execution-state.md +283 -0
- package/docusaurus/docs/advanced/extending-reqon.md +388 -0
- package/docusaurus/docs/advanced/multi-file-missions.md +250 -0
- package/docusaurus/docs/advanced/parallel-execution.md +353 -0
- package/docusaurus/docs/api-reference.md +443 -0
- package/docusaurus/docs/authentication/api-key.md +339 -0
- package/docusaurus/docs/authentication/basic.md +276 -0
- package/docusaurus/docs/authentication/bearer.md +282 -0
- package/docusaurus/docs/authentication/oauth2.md +317 -0
- package/docusaurus/docs/authentication/overview.md +251 -0
- package/docusaurus/docs/cli.md +229 -0
- package/docusaurus/docs/core-concepts/actions.md +286 -0
- package/docusaurus/docs/core-concepts/missions.md +264 -0
- package/docusaurus/docs/core-concepts/schemas.md +353 -0
- package/docusaurus/docs/core-concepts/sources.md +339 -0
- package/docusaurus/docs/core-concepts/stores.md +332 -0
- package/docusaurus/docs/dsl-syntax/expressions.md +361 -0
- package/docusaurus/docs/dsl-syntax/fetch.md +293 -0
- package/docusaurus/docs/dsl-syntax/for-loops.md +324 -0
- package/docusaurus/docs/dsl-syntax/map.md +345 -0
- package/docusaurus/docs/dsl-syntax/match.md +387 -0
- package/docusaurus/docs/dsl-syntax/pipelines.md +397 -0
- package/docusaurus/docs/dsl-syntax/validate.md +401 -0
- package/docusaurus/docs/error-handling/dead-letter-queues.md +399 -0
- package/docusaurus/docs/error-handling/flow-control.md +337 -0
- package/docusaurus/docs/error-handling/retry-strategies.md +368 -0
- package/docusaurus/docs/examples.md +488 -0
- package/docusaurus/docs/getting-started.md +256 -0
- package/docusaurus/docs/http/circuit-breaker.md +401 -0
- package/docusaurus/docs/http/incremental-sync.md +394 -0
- package/docusaurus/docs/http/pagination.md +361 -0
- package/docusaurus/docs/http/rate-limiting.md +383 -0
- package/docusaurus/docs/http/requests.md +328 -0
- package/docusaurus/docs/http/retry.md +402 -0
- package/docusaurus/docs/intro.md +90 -0
- package/docusaurus/docs/openapi/loading-specs.md +305 -0
- package/docusaurus/docs/openapi/operation-calls.md +314 -0
- package/docusaurus/docs/openapi/overview.md +212 -0
- package/docusaurus/docs/openapi/response-validation.md +344 -0
- package/docusaurus/docs/scheduling/cron.md +305 -0
- package/docusaurus/docs/scheduling/daemon-mode.md +317 -0
- package/docusaurus/docs/scheduling/intervals.md +289 -0
- package/docusaurus/docs/scheduling/overview.md +231 -0
- package/docusaurus/docs/stores/custom-adapters.md +376 -0
- package/docusaurus/docs/stores/file.md +236 -0
- package/docusaurus/docs/stores/memory.md +193 -0
- package/docusaurus/docs/stores/overview.md +274 -0
- package/docusaurus/docs/stores/postgrest.md +316 -0
- package/docusaurus/docusaurus.config.ts +148 -0
- package/docusaurus/package-lock.json +18029 -0
- package/docusaurus/package.json +47 -0
- package/docusaurus/sidebars.ts +155 -0
- package/docusaurus/src/components/HomepageFeatures/index.tsx +105 -0
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +12 -0
- package/docusaurus/src/css/custom.css +169 -0
- package/docusaurus/src/pages/index.module.css +48 -0
- package/docusaurus/src/pages/index.tsx +110 -0
- package/docusaurus/src/pages/markdown-page.md +7 -0
- 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 +10 -0
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docusaurus/tsconfig.json +8 -0
- package/examples/README.md +112 -0
- package/examples/error-handling/README.md +150 -0
- package/examples/error-handling/payment-processor.vague +287 -0
- package/examples/github-sync/README.md +74 -0
- package/examples/github-sync/fetch-issues.vague +47 -0
- package/examples/github-sync/fetch-prs.vague +40 -0
- package/examples/github-sync/mission.vague +101 -0
- package/examples/github-sync/normalize.vague +70 -0
- package/examples/jsonplaceholder/README.md +28 -0
- package/examples/jsonplaceholder/posts.vague +48 -0
- package/examples/petstore/README.md +35 -0
- package/examples/petstore/openapi.yaml +97 -0
- package/examples/petstore/sync.vague +52 -0
- package/examples/temporal-comparison/README.md +297 -0
- package/examples/temporal-comparison/reconciliation.vague +355 -0
- package/examples/temporal-comparison/temporal/activities/index.ts +8 -0
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +225 -0
- package/examples/temporal-comparison/temporal/activities/shopify.ts +257 -0
- package/examples/temporal-comparison/temporal/activities/storage.ts +198 -0
- package/examples/temporal-comparison/temporal/activities/stripe.ts +169 -0
- package/examples/temporal-comparison/temporal/activities/validation.ts +205 -0
- package/examples/temporal-comparison/temporal/client/schedule.ts +218 -0
- package/examples/temporal-comparison/temporal/config/retry.ts +63 -0
- package/examples/temporal-comparison/temporal/types/index.ts +129 -0
- package/examples/temporal-comparison/temporal/workers/main.ts +130 -0
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +262 -0
- package/examples/xero/README.md +88 -0
- package/examples/xero/invoices.vague +189 -0
- package/package.json +40 -0
- package/src/api-integration.test.ts +954 -0
- package/src/ast/index.ts +1 -0
- package/src/ast/nodes.ts +310 -0
- package/src/auth/auth.test.ts +326 -0
- package/src/auth/circuit-breaker.test.ts +390 -0
- package/src/auth/circuit-breaker.ts +379 -0
- package/src/auth/credentials.test.ts +273 -0
- package/src/auth/credentials.ts +246 -0
- package/src/auth/index.ts +40 -0
- package/src/auth/oauth2-provider.ts +177 -0
- package/src/auth/rate-limiter.ts +459 -0
- package/src/auth/token-store.ts +177 -0
- package/src/auth/types.ts +159 -0
- package/src/benchmark/e2e.bench.ts +288 -0
- package/src/benchmark/evaluator.bench.ts +331 -0
- package/src/benchmark/fixtures.ts +295 -0
- package/src/benchmark/index.ts +108 -0
- package/src/benchmark/lexer.bench.ts +69 -0
- package/src/benchmark/parser.bench.ts +103 -0
- package/src/benchmark/resilience.bench.ts +193 -0
- package/src/benchmark/store.bench.ts +147 -0
- package/src/benchmark/utils.ts +230 -0
- package/src/cli.ts +313 -0
- package/src/errors/errors.test.ts +234 -0
- package/src/errors/index.ts +223 -0
- package/src/execution/execution.test.ts +307 -0
- package/src/execution/index.ts +21 -0
- package/src/execution/state.ts +207 -0
- package/src/execution/store.ts +188 -0
- package/src/index.ts +169 -0
- package/src/integration.test.ts +192 -0
- package/src/interpreter/context.ts +57 -0
- package/src/interpreter/evaluator.test.ts +796 -0
- package/src/interpreter/evaluator.ts +245 -0
- package/src/interpreter/executor.ts +946 -0
- package/src/interpreter/fetch-handler.ts +302 -0
- package/src/interpreter/http.test.ts +423 -0
- package/src/interpreter/http.ts +308 -0
- package/src/interpreter/index.ts +32 -0
- package/src/interpreter/pagination.ts +207 -0
- package/src/interpreter/progress.test.ts +276 -0
- package/src/interpreter/schema-matcher.test.ts +160 -0
- package/src/interpreter/schema-matcher.ts +168 -0
- package/src/interpreter/signals.ts +73 -0
- package/src/interpreter/step-handlers/for-handler.ts +65 -0
- package/src/interpreter/step-handlers/index.ts +17 -0
- package/src/interpreter/step-handlers/map-handler.ts +24 -0
- package/src/interpreter/step-handlers/match-handler.ts +101 -0
- package/src/interpreter/step-handlers/store-handler.ts +78 -0
- package/src/interpreter/step-handlers/types.ts +17 -0
- package/src/interpreter/step-handlers/validate-handler.ts +30 -0
- package/src/interpreter/step-handlers/webhook-handler.ts +142 -0
- package/src/lexer/index.ts +18 -0
- package/src/lexer/lexer.test.ts +316 -0
- package/src/lexer/tokens.ts +179 -0
- package/src/loader/index.ts +288 -0
- package/src/loader/loader.test.ts +360 -0
- package/src/oas/index.ts +4 -0
- package/src/oas/loader.ts +126 -0
- package/src/oas/oas.test.ts +254 -0
- package/src/oas/validator.ts +299 -0
- package/src/parser/base.ts +124 -0
- package/src/parser/expressions.test.ts +525 -0
- package/src/parser/expressions.ts +314 -0
- package/src/parser/index.ts +3 -0
- package/src/parser/match.test.ts +296 -0
- package/src/parser/parser.test.ts +739 -0
- package/src/parser/parser.ts +1469 -0
- package/src/parser/schedule.test.ts +287 -0
- package/src/parser/webhook.test.ts +248 -0
- package/src/plugin.ts +83 -0
- package/src/scheduler/cron-parser.test.ts +236 -0
- package/src/scheduler/cron-parser.ts +236 -0
- package/src/scheduler/index.ts +10 -0
- package/src/scheduler/scheduler.ts +443 -0
- package/src/scheduler/types.ts +71 -0
- package/src/stores/factory.ts +104 -0
- package/src/stores/file.test.ts +276 -0
- package/src/stores/file.ts +211 -0
- package/src/stores/index.ts +6 -0
- package/src/stores/memory.test.ts +238 -0
- package/src/stores/memory.ts +63 -0
- package/src/stores/postgrest.test.ts +488 -0
- package/src/stores/postgrest.ts +263 -0
- package/src/stores/stores.test.ts +197 -0
- package/src/stores/types.ts +58 -0
- package/src/sync/index.ts +16 -0
- package/src/sync/state.ts +126 -0
- package/src/sync/store.ts +139 -0
- package/src/sync/sync.test.ts +271 -0
- package/src/utils/async.ts +10 -0
- package/src/utils/file.ts +106 -0
- package/src/utils/index.ts +14 -0
- package/src/utils/logger.ts +53 -0
- package/src/utils/path.ts +47 -0
- package/src/webhook/index.ts +15 -0
- package/src/webhook/server.test.ts +253 -0
- package/src/webhook/server.ts +389 -0
- package/src/webhook/store.ts +239 -0
- package/src/webhook/types.ts +93 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +39 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_position: 2
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Cron Expressions
|
|
6
|
+
|
|
7
|
+
Reqon supports full cron expression syntax for precise scheduling.
|
|
8
|
+
|
|
9
|
+
## Syntax
|
|
10
|
+
|
|
11
|
+
```vague
|
|
12
|
+
schedule: cron "minute hour day month weekday"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Field Reference
|
|
16
|
+
|
|
17
|
+
| Field | Values | Special Characters |
|
|
18
|
+
|-------|--------|-------------------|
|
|
19
|
+
| Minute | 0-59 | * , - / |
|
|
20
|
+
| Hour | 0-23 | * , - / |
|
|
21
|
+
| Day of Month | 1-31 | * , - / |
|
|
22
|
+
| Month | 1-12 | * , - / |
|
|
23
|
+
| Day of Week | 0-6 (0=Sunday) | * , - / |
|
|
24
|
+
|
|
25
|
+
## Special Characters
|
|
26
|
+
|
|
27
|
+
| Character | Meaning | Example |
|
|
28
|
+
|-----------|---------|---------|
|
|
29
|
+
| `*` | Any value | `* * * * *` = every minute |
|
|
30
|
+
| `,` | Value list | `0,30 * * * *` = minute 0 and 30 |
|
|
31
|
+
| `-` | Range | `0 9-17 * * *` = 9am to 5pm |
|
|
32
|
+
| `/` | Step | `*/15 * * * *` = every 15 minutes |
|
|
33
|
+
|
|
34
|
+
## Common Patterns
|
|
35
|
+
|
|
36
|
+
### Every Minute
|
|
37
|
+
|
|
38
|
+
```vague
|
|
39
|
+
schedule: cron "* * * * *"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Every Hour
|
|
43
|
+
|
|
44
|
+
```vague
|
|
45
|
+
// At minute 0
|
|
46
|
+
schedule: cron "0 * * * *"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Every N Minutes
|
|
50
|
+
|
|
51
|
+
```vague
|
|
52
|
+
// Every 5 minutes
|
|
53
|
+
schedule: cron "*/5 * * * *"
|
|
54
|
+
|
|
55
|
+
// Every 15 minutes
|
|
56
|
+
schedule: cron "*/15 * * * *"
|
|
57
|
+
|
|
58
|
+
// Every 30 minutes
|
|
59
|
+
schedule: cron "*/30 * * * *"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Every N Hours
|
|
63
|
+
|
|
64
|
+
```vague
|
|
65
|
+
// Every 2 hours
|
|
66
|
+
schedule: cron "0 */2 * * *"
|
|
67
|
+
|
|
68
|
+
// Every 6 hours
|
|
69
|
+
schedule: cron "0 */6 * * *"
|
|
70
|
+
|
|
71
|
+
// Every 12 hours
|
|
72
|
+
schedule: cron "0 */12 * * *"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Daily
|
|
76
|
+
|
|
77
|
+
```vague
|
|
78
|
+
// At midnight
|
|
79
|
+
schedule: cron "0 0 * * *"
|
|
80
|
+
|
|
81
|
+
// At 6am
|
|
82
|
+
schedule: cron "0 6 * * *"
|
|
83
|
+
|
|
84
|
+
// At 9am
|
|
85
|
+
schedule: cron "0 9 * * *"
|
|
86
|
+
|
|
87
|
+
// At 11pm
|
|
88
|
+
schedule: cron "0 23 * * *"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Multiple Times Per Day
|
|
92
|
+
|
|
93
|
+
```vague
|
|
94
|
+
// At 9am and 5pm
|
|
95
|
+
schedule: cron "0 9,17 * * *"
|
|
96
|
+
|
|
97
|
+
// At midnight, 8am, 4pm
|
|
98
|
+
schedule: cron "0 0,8,16 * * *"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Weekly
|
|
102
|
+
|
|
103
|
+
```vague
|
|
104
|
+
// Every Sunday at midnight
|
|
105
|
+
schedule: cron "0 0 * * 0"
|
|
106
|
+
|
|
107
|
+
// Every Monday at 9am
|
|
108
|
+
schedule: cron "0 9 * * 1"
|
|
109
|
+
|
|
110
|
+
// Every Friday at 5pm
|
|
111
|
+
schedule: cron "0 17 * * 5"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Weekdays Only
|
|
115
|
+
|
|
116
|
+
```vague
|
|
117
|
+
// Weekdays at 9am
|
|
118
|
+
schedule: cron "0 9 * * 1-5"
|
|
119
|
+
|
|
120
|
+
// Weekdays every hour during business hours
|
|
121
|
+
schedule: cron "0 9-17 * * 1-5"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Weekends Only
|
|
125
|
+
|
|
126
|
+
```vague
|
|
127
|
+
// Weekends at noon
|
|
128
|
+
schedule: cron "0 12 * * 0,6"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Monthly
|
|
132
|
+
|
|
133
|
+
```vague
|
|
134
|
+
// First of month at midnight
|
|
135
|
+
schedule: cron "0 0 1 * *"
|
|
136
|
+
|
|
137
|
+
// First of month at 6am
|
|
138
|
+
schedule: cron "0 6 1 * *"
|
|
139
|
+
|
|
140
|
+
// 15th of month at noon
|
|
141
|
+
schedule: cron "0 12 15 * *"
|
|
142
|
+
|
|
143
|
+
// Last day approach: run on 28th
|
|
144
|
+
schedule: cron "0 0 28 * *"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Quarterly
|
|
148
|
+
|
|
149
|
+
```vague
|
|
150
|
+
// First day of quarter at 6am
|
|
151
|
+
schedule: cron "0 6 1 1,4,7,10 *"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Yearly
|
|
155
|
+
|
|
156
|
+
```vague
|
|
157
|
+
// January 1st at midnight
|
|
158
|
+
schedule: cron "0 0 1 1 *"
|
|
159
|
+
|
|
160
|
+
// First Monday of year (approximate)
|
|
161
|
+
schedule: cron "0 9 1-7 1 1"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Complex Examples
|
|
165
|
+
|
|
166
|
+
### Business Hours Only
|
|
167
|
+
|
|
168
|
+
```vague
|
|
169
|
+
// Every 30 minutes, 9am-5pm, weekdays
|
|
170
|
+
schedule: cron "*/30 9-17 * * 1-5"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Night Batch Jobs
|
|
174
|
+
|
|
175
|
+
```vague
|
|
176
|
+
// At 2am every day
|
|
177
|
+
schedule: cron "0 2 * * *"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Multiple Specific Times
|
|
181
|
+
|
|
182
|
+
```vague
|
|
183
|
+
// 8am, 12pm, 6pm every day
|
|
184
|
+
schedule: cron "0 8,12,18 * * *"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### End of Month (Approximation)
|
|
188
|
+
|
|
189
|
+
```vague
|
|
190
|
+
// 28th of every month
|
|
191
|
+
schedule: cron "0 0 28 * *"
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Timezone Handling
|
|
195
|
+
|
|
196
|
+
Cron expressions use the system timezone by default.
|
|
197
|
+
|
|
198
|
+
### Specify Timezone
|
|
199
|
+
|
|
200
|
+
```vague
|
|
201
|
+
mission TimezoneSync {
|
|
202
|
+
schedule: cron "0 9 * * *"
|
|
203
|
+
timezone: "America/New_York"
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### UTC
|
|
208
|
+
|
|
209
|
+
```vague
|
|
210
|
+
mission UTCSync {
|
|
211
|
+
schedule: cron "0 9 * * *"
|
|
212
|
+
timezone: "UTC"
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Testing Cron Expressions
|
|
217
|
+
|
|
218
|
+
### Dry Run
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
reqon ./mission.vague --dry-run
|
|
222
|
+
# Shows: Next run at: 2024-01-20 09:00:00
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Validate Expression
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
reqon --validate-cron "0 9 * * *"
|
|
229
|
+
# Valid cron expression
|
|
230
|
+
# Next 5 runs:
|
|
231
|
+
# 2024-01-20 09:00:00
|
|
232
|
+
# 2024-01-21 09:00:00
|
|
233
|
+
# 2024-01-22 09:00:00
|
|
234
|
+
# 2024-01-23 09:00:00
|
|
235
|
+
# 2024-01-24 09:00:00
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Best Practices
|
|
239
|
+
|
|
240
|
+
### Avoid Midnight
|
|
241
|
+
|
|
242
|
+
Many systems run jobs at midnight, causing load spikes:
|
|
243
|
+
|
|
244
|
+
```vague
|
|
245
|
+
// Instead of 0 0 * * *
|
|
246
|
+
schedule: cron "0 3 * * *" // 3am
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Spread Load
|
|
250
|
+
|
|
251
|
+
Stagger related jobs:
|
|
252
|
+
|
|
253
|
+
```vague
|
|
254
|
+
mission SyncCustomers {
|
|
255
|
+
schedule: cron "0 * * * *" // On the hour
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
mission SyncOrders {
|
|
259
|
+
schedule: cron "15 * * * *" // 15 past
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
mission SyncProducts {
|
|
263
|
+
schedule: cron "30 * * * *" // 30 past
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Consider Execution Time
|
|
268
|
+
|
|
269
|
+
Account for job duration:
|
|
270
|
+
|
|
271
|
+
```vague
|
|
272
|
+
// If job takes 10 minutes, don't schedule every 5
|
|
273
|
+
schedule: cron "*/15 * * * *" // Every 15 minutes
|
|
274
|
+
|
|
275
|
+
// Or use skipIfRunning
|
|
276
|
+
skipIfRunning: true
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Troubleshooting
|
|
280
|
+
|
|
281
|
+
### Wrong Times
|
|
282
|
+
|
|
283
|
+
Check timezone settings:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
date # System time
|
|
287
|
+
TZ=UTC date # UTC time
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Missed Runs
|
|
291
|
+
|
|
292
|
+
If daemon was down, jobs don't backfill. Consider:
|
|
293
|
+
|
|
294
|
+
```vague
|
|
295
|
+
retryOnFailure: { maxAttempts: 3 }
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Expression Errors
|
|
299
|
+
|
|
300
|
+
Validate syntax:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
reqon --validate-cron "invalid"
|
|
304
|
+
# Error: Invalid cron expression
|
|
305
|
+
```
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_position: 4
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Daemon Mode
|
|
6
|
+
|
|
7
|
+
Daemon mode runs Reqon as a long-running service, executing scheduled missions automatically.
|
|
8
|
+
|
|
9
|
+
## Starting the Daemon
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
reqon ./missions/ --daemon
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## How It Works
|
|
16
|
+
|
|
17
|
+
1. Daemon loads all missions from the specified path
|
|
18
|
+
2. Parses schedule configurations
|
|
19
|
+
3. Runs missions according to their schedules
|
|
20
|
+
4. Continues until stopped
|
|
21
|
+
|
|
22
|
+
## Command Options
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
reqon ./missions/ --daemon [options]
|
|
26
|
+
|
|
27
|
+
Options:
|
|
28
|
+
--auth <file> Credentials file
|
|
29
|
+
--verbose Enable detailed logging
|
|
30
|
+
--check-interval How often to check schedules (default: 1000ms)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Example Setup
|
|
34
|
+
|
|
35
|
+
### Mission Files
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
missions/
|
|
39
|
+
├── sync-customers.vague
|
|
40
|
+
├── sync-orders.vague
|
|
41
|
+
└── daily-report.vague
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### sync-customers.vague
|
|
45
|
+
|
|
46
|
+
```vague
|
|
47
|
+
mission SyncCustomers {
|
|
48
|
+
schedule: every 15 minutes
|
|
49
|
+
|
|
50
|
+
source API { auth: bearer, base: "https://api.example.com" }
|
|
51
|
+
store customers: file("customers")
|
|
52
|
+
|
|
53
|
+
action Sync {
|
|
54
|
+
get "/customers" { since: lastSync }
|
|
55
|
+
store response -> customers { key: .id, upsert: true }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
run Sync
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Running
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
reqon ./missions/ --daemon --auth ./credentials.json --verbose
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Process Management
|
|
69
|
+
|
|
70
|
+
### Foreground
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
reqon ./missions/ --daemon
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Press Ctrl+C to stop.
|
|
77
|
+
|
|
78
|
+
### Background (Linux)
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
nohup reqon ./missions/ --daemon > reqon.log 2>&1 &
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Systemd Service
|
|
85
|
+
|
|
86
|
+
Create `/etc/systemd/system/reqon.service`:
|
|
87
|
+
|
|
88
|
+
```ini
|
|
89
|
+
[Unit]
|
|
90
|
+
Description=Reqon Data Sync Daemon
|
|
91
|
+
After=network.target
|
|
92
|
+
|
|
93
|
+
[Service]
|
|
94
|
+
Type=simple
|
|
95
|
+
User=reqon
|
|
96
|
+
WorkingDirectory=/opt/reqon
|
|
97
|
+
ExecStart=/usr/bin/npx reqon ./missions/ --daemon --auth ./credentials.json
|
|
98
|
+
Restart=on-failure
|
|
99
|
+
RestartSec=10
|
|
100
|
+
|
|
101
|
+
[Install]
|
|
102
|
+
WantedBy=multi-user.target
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Enable and start:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
sudo systemctl enable reqon
|
|
109
|
+
sudo systemctl start reqon
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Docker
|
|
113
|
+
|
|
114
|
+
Dockerfile:
|
|
115
|
+
|
|
116
|
+
```dockerfile
|
|
117
|
+
FROM node:20-alpine
|
|
118
|
+
|
|
119
|
+
WORKDIR /app
|
|
120
|
+
COPY package*.json ./
|
|
121
|
+
RUN npm install
|
|
122
|
+
|
|
123
|
+
COPY . .
|
|
124
|
+
|
|
125
|
+
CMD ["npx", "reqon", "./missions/", "--daemon"]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
docker-compose.yml:
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
version: '3'
|
|
132
|
+
services:
|
|
133
|
+
reqon:
|
|
134
|
+
build: .
|
|
135
|
+
volumes:
|
|
136
|
+
- ./missions:/app/missions
|
|
137
|
+
- ./credentials.json:/app/credentials.json
|
|
138
|
+
- reqon-data:/app/.vague-data
|
|
139
|
+
environment:
|
|
140
|
+
- NODE_ENV=production
|
|
141
|
+
restart: unless-stopped
|
|
142
|
+
|
|
143
|
+
volumes:
|
|
144
|
+
reqon-data:
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Graceful Shutdown
|
|
148
|
+
|
|
149
|
+
Reqon handles SIGINT and SIGTERM:
|
|
150
|
+
|
|
151
|
+
1. Stops accepting new runs
|
|
152
|
+
2. Waits for in-progress missions to complete
|
|
153
|
+
3. Saves state
|
|
154
|
+
4. Exits cleanly
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Graceful stop
|
|
158
|
+
kill -TERM $(pgrep -f "reqon.*daemon")
|
|
159
|
+
|
|
160
|
+
# Or with systemd
|
|
161
|
+
systemctl stop reqon
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Health Checks
|
|
165
|
+
|
|
166
|
+
### Status Endpoint
|
|
167
|
+
|
|
168
|
+
Enable HTTP health endpoint:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
reqon ./missions/ --daemon --health-port 8080
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Check health:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
curl http://localhost:8080/health
|
|
178
|
+
# {"status":"ok","uptime":3600,"missionsLoaded":3}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### File-Based Health
|
|
182
|
+
|
|
183
|
+
```vague
|
|
184
|
+
mission HealthCheck {
|
|
185
|
+
schedule: every 1 minute
|
|
186
|
+
|
|
187
|
+
action Check {
|
|
188
|
+
store { status: "ok", timestamp: now() } -> health
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Monitor the health store file.
|
|
194
|
+
|
|
195
|
+
## Logging
|
|
196
|
+
|
|
197
|
+
### Log Levels
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Default logging
|
|
201
|
+
reqon ./missions/ --daemon
|
|
202
|
+
|
|
203
|
+
# Verbose logging
|
|
204
|
+
reqon ./missions/ --daemon --verbose
|
|
205
|
+
|
|
206
|
+
# Environment variable
|
|
207
|
+
REQON_LOG_LEVEL=debug reqon ./missions/ --daemon
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Log Output
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
[2024-01-20 09:00:00] [INFO] Starting Reqon daemon
|
|
214
|
+
[2024-01-20 09:00:00] [INFO] Loaded 3 missions
|
|
215
|
+
[2024-01-20 09:00:00] [INFO] SyncCustomers: Next run at 09:15:00
|
|
216
|
+
[2024-01-20 09:00:00] [INFO] SyncOrders: Next run at 09:05:00
|
|
217
|
+
[2024-01-20 09:00:00] [INFO] DailyReport: Next run at 2024-01-21 00:00:00
|
|
218
|
+
[2024-01-20 09:05:00] [INFO] SyncOrders: Starting run
|
|
219
|
+
[2024-01-20 09:05:02] [INFO] SyncOrders: Completed (2.1s)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Structured Logging
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
REQON_LOG_FORMAT=json reqon ./missions/ --daemon
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
```json
|
|
229
|
+
{"timestamp":"2024-01-20T09:00:00Z","level":"info","message":"Starting run","mission":"SyncCustomers"}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Monitoring
|
|
233
|
+
|
|
234
|
+
### Metrics
|
|
235
|
+
|
|
236
|
+
Export metrics with `--metrics-port`:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
reqon ./missions/ --daemon --metrics-port 9090
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Prometheus format:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
# HELP reqon_mission_runs_total Total mission runs
|
|
246
|
+
reqon_mission_runs_total{mission="SyncCustomers",status="success"} 142
|
|
247
|
+
reqon_mission_runs_total{mission="SyncCustomers",status="failure"} 3
|
|
248
|
+
|
|
249
|
+
# HELP reqon_mission_duration_seconds Mission run duration
|
|
250
|
+
reqon_mission_duration_seconds{mission="SyncCustomers",quantile="0.5"} 2.1
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Alerting
|
|
254
|
+
|
|
255
|
+
Create alerting rules:
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
groups:
|
|
259
|
+
- name: reqon
|
|
260
|
+
rules:
|
|
261
|
+
- alert: ReqonMissionFailing
|
|
262
|
+
expr: rate(reqon_mission_runs_total{status="failure"}[5m]) > 0.1
|
|
263
|
+
for: 10m
|
|
264
|
+
labels:
|
|
265
|
+
severity: warning
|
|
266
|
+
annotations:
|
|
267
|
+
summary: "Mission {{ $labels.mission }} is failing"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Best Practices
|
|
271
|
+
|
|
272
|
+
### Use Separate Credentials
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
# Production credentials
|
|
276
|
+
reqon ./missions/ --daemon --auth ./prod-credentials.json
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Run as Non-Root
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Create dedicated user
|
|
283
|
+
useradd -r -s /bin/false reqon
|
|
284
|
+
|
|
285
|
+
# Run as that user
|
|
286
|
+
sudo -u reqon reqon ./missions/ --daemon
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Persistent Storage
|
|
290
|
+
|
|
291
|
+
Ensure `.vague-data` is on persistent storage:
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
volumes:
|
|
295
|
+
- /var/lib/reqon:/app/.vague-data
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Health Monitoring
|
|
299
|
+
|
|
300
|
+
Always enable health checks:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
reqon ./missions/ --daemon --health-port 8080
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Log Rotation
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# Use logrotate
|
|
310
|
+
/var/log/reqon/*.log {
|
|
311
|
+
daily
|
|
312
|
+
rotate 7
|
|
313
|
+
compress
|
|
314
|
+
missingok
|
|
315
|
+
notifempty
|
|
316
|
+
}
|
|
317
|
+
```
|