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,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth provider interface - abstracts token retrieval and refresh
|
|
3
|
+
*/
|
|
4
|
+
export interface AuthProvider {
|
|
5
|
+
/** Get a valid access token (refreshing if needed) */
|
|
6
|
+
getToken(): Promise<string>;
|
|
7
|
+
|
|
8
|
+
/** Force a token refresh */
|
|
9
|
+
refreshToken?(): Promise<string>;
|
|
10
|
+
|
|
11
|
+
/** Get token metadata (for monitoring) */
|
|
12
|
+
getTokenInfo?(): TokenInfo;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TokenInfo {
|
|
16
|
+
/** When the access token expires */
|
|
17
|
+
expiresAt?: Date;
|
|
18
|
+
/** When the refresh token expires (for non-use expiry tracking) */
|
|
19
|
+
refreshExpiresAt?: Date;
|
|
20
|
+
/** Last time the token was successfully used */
|
|
21
|
+
lastUsedAt?: Date;
|
|
22
|
+
/** Connection/tenant identifier */
|
|
23
|
+
connectionId?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* OAuth2 token set - what gets stored
|
|
28
|
+
*/
|
|
29
|
+
export interface OAuth2Tokens {
|
|
30
|
+
accessToken: string;
|
|
31
|
+
refreshToken?: string;
|
|
32
|
+
expiresAt?: Date;
|
|
33
|
+
refreshExpiresAt?: Date;
|
|
34
|
+
tokenType?: string;
|
|
35
|
+
scope?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Token store interface - pluggable storage backend
|
|
40
|
+
*/
|
|
41
|
+
export interface TokenStore {
|
|
42
|
+
/** Get tokens for a connection */
|
|
43
|
+
get(connectionId: string): Promise<OAuth2Tokens | null>;
|
|
44
|
+
|
|
45
|
+
/** Store tokens for a connection */
|
|
46
|
+
set(connectionId: string, tokens: OAuth2Tokens): Promise<void>;
|
|
47
|
+
|
|
48
|
+
/** Delete tokens for a connection */
|
|
49
|
+
delete(connectionId: string): Promise<void>;
|
|
50
|
+
|
|
51
|
+
/** Update last used timestamp */
|
|
52
|
+
touch(connectionId: string): Promise<void>;
|
|
53
|
+
|
|
54
|
+
/** List all connections (for proactive refresh) */
|
|
55
|
+
list(): Promise<string[]>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* OAuth2 configuration for token refresh
|
|
60
|
+
*/
|
|
61
|
+
export interface OAuth2Config {
|
|
62
|
+
tokenEndpoint: string;
|
|
63
|
+
clientId: string;
|
|
64
|
+
clientSecret?: string;
|
|
65
|
+
/** Seconds before expiry to trigger refresh (default: 300 = 5 min) */
|
|
66
|
+
refreshBuffer?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Rate limit information extracted from response headers
|
|
71
|
+
*/
|
|
72
|
+
export interface RateLimitInfo {
|
|
73
|
+
/** Requests remaining in current window */
|
|
74
|
+
remaining?: number;
|
|
75
|
+
/** Total requests allowed in window */
|
|
76
|
+
limit?: number;
|
|
77
|
+
/** When the rate limit resets (Unix timestamp or Date) */
|
|
78
|
+
resetAt?: Date;
|
|
79
|
+
/** Retry after N seconds (from 429 response) */
|
|
80
|
+
retryAfter?: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Rate limit strategy
|
|
85
|
+
*/
|
|
86
|
+
export type RateLimitStrategy = 'pause' | 'throttle' | 'fail';
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Rate limit configuration
|
|
90
|
+
*/
|
|
91
|
+
export interface RateLimitConfig {
|
|
92
|
+
/** Strategy when rate limited (default: 'pause') */
|
|
93
|
+
strategy?: RateLimitStrategy;
|
|
94
|
+
/** Max seconds to wait before failing (default: 300) */
|
|
95
|
+
maxWait?: number;
|
|
96
|
+
/** Log warning after waiting this many seconds (default: 10) */
|
|
97
|
+
notifyAt?: number;
|
|
98
|
+
/** Fallback rate limit if no headers (requests per minute) */
|
|
99
|
+
fallbackRpm?: number;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Rate limit event - emitted when rate limiting occurs
|
|
104
|
+
*/
|
|
105
|
+
export interface RateLimitEvent {
|
|
106
|
+
source: string;
|
|
107
|
+
endpoint?: string;
|
|
108
|
+
waitSeconds: number;
|
|
109
|
+
remaining?: number;
|
|
110
|
+
resetAt?: Date;
|
|
111
|
+
strategy: RateLimitStrategy;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Rate limit event handlers
|
|
116
|
+
*/
|
|
117
|
+
export interface RateLimitCallbacks {
|
|
118
|
+
/** Called when rate limited and waiting */
|
|
119
|
+
onRateLimited?: (event: RateLimitEvent) => void;
|
|
120
|
+
/** Called when rate limit wait is complete */
|
|
121
|
+
onResumed?: (event: { source: string; endpoint?: string; waitedSeconds: number }) => void;
|
|
122
|
+
/** Called periodically during long waits */
|
|
123
|
+
onWaiting?: (event: RateLimitEvent & { elapsedSeconds: number }) => void;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Rate limiter interface - tracks and enforces rate limits
|
|
128
|
+
*/
|
|
129
|
+
export interface RateLimiter {
|
|
130
|
+
/** Check if we should proceed with a request */
|
|
131
|
+
canProceed(source: string, endpoint?: string): Promise<boolean>;
|
|
132
|
+
|
|
133
|
+
/** Wait until we can proceed (blocks if rate limited) */
|
|
134
|
+
waitForCapacity(source: string, endpoint?: string): Promise<void>;
|
|
135
|
+
|
|
136
|
+
/** Record rate limit info from a response */
|
|
137
|
+
recordResponse(source: string, info: RateLimitInfo, endpoint?: string): void;
|
|
138
|
+
|
|
139
|
+
/** Get current rate limit status */
|
|
140
|
+
getStatus(source: string, endpoint?: string): RateLimitStatus;
|
|
141
|
+
|
|
142
|
+
/** Configure rate limiting for a source */
|
|
143
|
+
configure(source: string, config: RateLimitConfig): void;
|
|
144
|
+
|
|
145
|
+
/** Set event callbacks */
|
|
146
|
+
setCallbacks(callbacks: RateLimitCallbacks): void;
|
|
147
|
+
|
|
148
|
+
/** Get delay for throttle mode (returns 0 if no throttling needed) */
|
|
149
|
+
getThrottleDelay(source: string, endpoint?: string): number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface RateLimitStatus {
|
|
153
|
+
remaining?: number;
|
|
154
|
+
limit?: number;
|
|
155
|
+
resetAt?: Date;
|
|
156
|
+
isLimited: boolean;
|
|
157
|
+
/** Seconds until reset (if limited) */
|
|
158
|
+
resetInSeconds?: number;
|
|
159
|
+
}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end execution benchmarks
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { parse, execute } from '../index.js';
|
|
6
|
+
import { MissionExecutor } from '../interpreter/index.js';
|
|
7
|
+
import { MemoryStore } from '../stores/memory.js';
|
|
8
|
+
import { BenchmarkSuite } from './utils.js';
|
|
9
|
+
import {
|
|
10
|
+
SIMPLE_DSL,
|
|
11
|
+
MEDIUM_DSL,
|
|
12
|
+
COMPLEX_DSL,
|
|
13
|
+
EXPRESSION_HEAVY_DSL,
|
|
14
|
+
MATCH_HEAVY_DSL,
|
|
15
|
+
generateLargeDSL,
|
|
16
|
+
} from './fixtures.js';
|
|
17
|
+
|
|
18
|
+
// DSL for benchmarking with pre-populated stores (no network)
|
|
19
|
+
const STORE_ONLY_DSL = `
|
|
20
|
+
mission "store-processing"
|
|
21
|
+
store input in memory
|
|
22
|
+
store output in memory
|
|
23
|
+
|
|
24
|
+
action process
|
|
25
|
+
for item in input where item.active == true
|
|
26
|
+
map item -> {
|
|
27
|
+
id: item.id,
|
|
28
|
+
fullName: item.firstName + " " + item.lastName,
|
|
29
|
+
score: item.value * 2,
|
|
30
|
+
category: match item.tier
|
|
31
|
+
when "A" then "premium"
|
|
32
|
+
when "B" then "standard"
|
|
33
|
+
else "basic"
|
|
34
|
+
end
|
|
35
|
+
}
|
|
36
|
+
validate
|
|
37
|
+
assume id is string
|
|
38
|
+
assume score is number
|
|
39
|
+
store mapped in output with key: mapped.id
|
|
40
|
+
end
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const COMPLEX_STORE_DSL = `
|
|
44
|
+
mission "complex-store-processing"
|
|
45
|
+
store users in memory
|
|
46
|
+
store orders in memory
|
|
47
|
+
store reports in memory
|
|
48
|
+
|
|
49
|
+
action processUsers
|
|
50
|
+
for user in users where user.active == true
|
|
51
|
+
map user -> {
|
|
52
|
+
userId: user.id,
|
|
53
|
+
displayName: user.firstName + " " + user.lastName,
|
|
54
|
+
tier: match user.score
|
|
55
|
+
when score >= 90 then "platinum"
|
|
56
|
+
when score >= 70 then "gold"
|
|
57
|
+
when score >= 50 then "silver"
|
|
58
|
+
else "bronze"
|
|
59
|
+
end,
|
|
60
|
+
eligible: user.verified == true and user.age >= 18
|
|
61
|
+
}
|
|
62
|
+
validate
|
|
63
|
+
assume userId is string
|
|
64
|
+
assume displayName is string
|
|
65
|
+
store mapped in reports with key: mapped.userId
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
action processOrders
|
|
69
|
+
for order in orders
|
|
70
|
+
for report in reports where report.userId == order.userId
|
|
71
|
+
map { order: order, report: report } -> {
|
|
72
|
+
orderId: order.id,
|
|
73
|
+
userId: order.userId,
|
|
74
|
+
total: order.amount * 100,
|
|
75
|
+
discount: match report.tier
|
|
76
|
+
when "platinum" then order.amount * 0.2
|
|
77
|
+
when "gold" then order.amount * 0.15
|
|
78
|
+
when "silver" then order.amount * 0.1
|
|
79
|
+
else order.amount * 0.05
|
|
80
|
+
end,
|
|
81
|
+
status: order.status
|
|
82
|
+
}
|
|
83
|
+
store mapped in reports with key: mapped.orderId, partial: true
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
run processUsers then processOrders
|
|
88
|
+
`;
|
|
89
|
+
|
|
90
|
+
// Generate test data for stores
|
|
91
|
+
function generateUsers(count: number): Record<string, unknown>[] {
|
|
92
|
+
const users: Record<string, unknown>[] = [];
|
|
93
|
+
const firstNames = ['John', 'Jane', 'Bob', 'Alice', 'Charlie', 'Diana'];
|
|
94
|
+
const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Davis'];
|
|
95
|
+
const tiers = ['A', 'B', 'C'];
|
|
96
|
+
|
|
97
|
+
for (let i = 0; i < count; i++) {
|
|
98
|
+
users.push({
|
|
99
|
+
id: `user-${i}`,
|
|
100
|
+
firstName: firstNames[i % firstNames.length],
|
|
101
|
+
lastName: lastNames[i % lastNames.length],
|
|
102
|
+
email: `user${i}@example.com`,
|
|
103
|
+
age: 20 + (i % 50),
|
|
104
|
+
value: Math.floor(Math.random() * 100),
|
|
105
|
+
score: Math.floor(Math.random() * 100),
|
|
106
|
+
tier: tiers[i % tiers.length],
|
|
107
|
+
active: Math.random() > 0.2,
|
|
108
|
+
verified: Math.random() > 0.3,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return users;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function generateOrders(
|
|
115
|
+
count: number,
|
|
116
|
+
userCount: number
|
|
117
|
+
): Record<string, unknown>[] {
|
|
118
|
+
const orders: Record<string, unknown>[] = [];
|
|
119
|
+
const statuses = ['pending', 'completed', 'cancelled'];
|
|
120
|
+
|
|
121
|
+
for (let i = 0; i < count; i++) {
|
|
122
|
+
orders.push({
|
|
123
|
+
id: `order-${i}`,
|
|
124
|
+
userId: `user-${i % userCount}`,
|
|
125
|
+
amount: Math.floor(Math.random() * 500) + 10,
|
|
126
|
+
status: statuses[i % statuses.length],
|
|
127
|
+
items: Math.floor(Math.random() * 10) + 1,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return orders;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export async function runE2EBenchmarks(): Promise<void> {
|
|
134
|
+
// Parse-only benchmarks
|
|
135
|
+
const parseSuite = new BenchmarkSuite('Parse (Lexer + Parser)');
|
|
136
|
+
|
|
137
|
+
parseSuite.addSync('simple', () => {
|
|
138
|
+
return parse(SIMPLE_DSL);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
parseSuite.addSync('medium', () => {
|
|
142
|
+
return parse(MEDIUM_DSL);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
parseSuite.addSync('complex', () => {
|
|
146
|
+
return parse(COMPLEX_DSL);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
parseSuite.addSync('expression-heavy', () => {
|
|
150
|
+
return parse(EXPRESSION_HEAVY_DSL);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
parseSuite.addSync('match-heavy', () => {
|
|
154
|
+
return parse(MATCH_HEAVY_DSL);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const largeDsl20 = generateLargeDSL(20);
|
|
158
|
+
parseSuite.addSync('large-20-actions', () => {
|
|
159
|
+
return parse(largeDsl20);
|
|
160
|
+
}, { iterations: 500 });
|
|
161
|
+
|
|
162
|
+
parseSuite.print();
|
|
163
|
+
|
|
164
|
+
// Execution benchmarks with pre-populated stores
|
|
165
|
+
const execSuite = new BenchmarkSuite('Execute (with pre-populated stores)');
|
|
166
|
+
|
|
167
|
+
// Small dataset (100 items)
|
|
168
|
+
const smallUsers = generateUsers(100);
|
|
169
|
+
const smallOrders = generateOrders(200, 100);
|
|
170
|
+
|
|
171
|
+
await execSuite.addAsync('store-processing-100-items', async () => {
|
|
172
|
+
const inputStore = new MemoryStore('input');
|
|
173
|
+
for (const user of smallUsers) {
|
|
174
|
+
await inputStore.set(user.id as string, user);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const outputStore = new MemoryStore('output');
|
|
178
|
+
|
|
179
|
+
await execute(STORE_ONLY_DSL, {
|
|
180
|
+
dryRun: true,
|
|
181
|
+
stores: {
|
|
182
|
+
input: inputStore,
|
|
183
|
+
output: outputStore,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}, { iterations: 100, warmupIterations: 10 });
|
|
187
|
+
|
|
188
|
+
// Medium dataset (500 items)
|
|
189
|
+
const mediumUsers = generateUsers(500);
|
|
190
|
+
const mediumOrders = generateOrders(1000, 500);
|
|
191
|
+
|
|
192
|
+
await execSuite.addAsync('store-processing-500-items', async () => {
|
|
193
|
+
const inputStore = new MemoryStore('input');
|
|
194
|
+
for (const user of mediumUsers) {
|
|
195
|
+
await inputStore.set(user.id as string, user);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const outputStore = new MemoryStore('output');
|
|
199
|
+
|
|
200
|
+
await execute(STORE_ONLY_DSL, {
|
|
201
|
+
dryRun: true,
|
|
202
|
+
stores: {
|
|
203
|
+
input: inputStore,
|
|
204
|
+
output: outputStore,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}, { iterations: 50, warmupIterations: 5 });
|
|
208
|
+
|
|
209
|
+
// Complex processing with multiple stores
|
|
210
|
+
await execSuite.addAsync('complex-processing-100-users-200-orders', async () => {
|
|
211
|
+
const usersStore = new MemoryStore('users');
|
|
212
|
+
const ordersStore = new MemoryStore('orders');
|
|
213
|
+
const reportsStore = new MemoryStore('reports');
|
|
214
|
+
|
|
215
|
+
for (const user of smallUsers) {
|
|
216
|
+
await usersStore.set(user.id as string, user);
|
|
217
|
+
}
|
|
218
|
+
for (const order of smallOrders) {
|
|
219
|
+
await ordersStore.set(order.id as string, order);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
await execute(COMPLEX_STORE_DSL, {
|
|
223
|
+
dryRun: true,
|
|
224
|
+
stores: {
|
|
225
|
+
users: usersStore,
|
|
226
|
+
orders: ordersStore,
|
|
227
|
+
reports: reportsStore,
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
}, { iterations: 50, warmupIterations: 5 });
|
|
231
|
+
|
|
232
|
+
await execSuite.addAsync('complex-processing-500-users-1000-orders', async () => {
|
|
233
|
+
const usersStore = new MemoryStore('users');
|
|
234
|
+
const ordersStore = new MemoryStore('orders');
|
|
235
|
+
const reportsStore = new MemoryStore('reports');
|
|
236
|
+
|
|
237
|
+
for (const user of mediumUsers) {
|
|
238
|
+
await usersStore.set(user.id as string, user);
|
|
239
|
+
}
|
|
240
|
+
for (const order of mediumOrders) {
|
|
241
|
+
await ordersStore.set(order.id as string, order);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
await execute(COMPLEX_STORE_DSL, {
|
|
245
|
+
dryRun: true,
|
|
246
|
+
stores: {
|
|
247
|
+
users: usersStore,
|
|
248
|
+
orders: ordersStore,
|
|
249
|
+
reports: reportsStore,
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
}, { iterations: 20, warmupIterations: 3 });
|
|
253
|
+
|
|
254
|
+
execSuite.print();
|
|
255
|
+
|
|
256
|
+
// Executor instantiation benchmarks
|
|
257
|
+
const executorSuite = new BenchmarkSuite('MissionExecutor Instantiation');
|
|
258
|
+
|
|
259
|
+
executorSuite.addSync('basic-config', () => {
|
|
260
|
+
return new MissionExecutor({});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
executorSuite.addSync('full-config', () => {
|
|
264
|
+
return new MissionExecutor({
|
|
265
|
+
dryRun: true,
|
|
266
|
+
verbose: false,
|
|
267
|
+
stores: {},
|
|
268
|
+
auth: { api: { type: 'bearer', token: 'test' } },
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
executorSuite.addSync('with-stores', () => {
|
|
273
|
+
return new MissionExecutor({
|
|
274
|
+
stores: {
|
|
275
|
+
store1: new MemoryStore('store1'),
|
|
276
|
+
store2: new MemoryStore('store2'),
|
|
277
|
+
store3: new MemoryStore('store3'),
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
executorSuite.print();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Run if executed directly
|
|
286
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
287
|
+
runE2EBenchmarks().catch(console.error);
|
|
288
|
+
}
|