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
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Logger - Enhanced logging with context and spans
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging capabilities with:
|
|
5
|
+
* - Hierarchical context (child loggers)
|
|
6
|
+
* - Timing spans for operations
|
|
7
|
+
* - Multiple output formats
|
|
8
|
+
* - Integration with event emitter
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Span Implementation
|
|
12
|
+
// ============================================================================
|
|
13
|
+
class SpanImpl {
|
|
14
|
+
id;
|
|
15
|
+
name;
|
|
16
|
+
startTime;
|
|
17
|
+
context = {};
|
|
18
|
+
parentSpanId;
|
|
19
|
+
logger;
|
|
20
|
+
ended = false;
|
|
21
|
+
constructor(name, logger, parentSpanId) {
|
|
22
|
+
this.id = generateSpanId();
|
|
23
|
+
this.name = name;
|
|
24
|
+
this.startTime = Date.now();
|
|
25
|
+
this.parentSpanId = parentSpanId;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
}
|
|
28
|
+
end() {
|
|
29
|
+
if (this.ended)
|
|
30
|
+
return 0;
|
|
31
|
+
this.ended = true;
|
|
32
|
+
const duration = Date.now() - this.startTime;
|
|
33
|
+
this.logger.writeSpanEnd(this.name, this.id, this.parentSpanId, duration, this.context);
|
|
34
|
+
return duration;
|
|
35
|
+
}
|
|
36
|
+
addContext(context) {
|
|
37
|
+
Object.assign(this.context, context);
|
|
38
|
+
}
|
|
39
|
+
child(name) {
|
|
40
|
+
return new SpanImpl(name, this.logger, this.id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function generateSpanId() {
|
|
44
|
+
return Math.random().toString(36).substring(2, 10);
|
|
45
|
+
}
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Logger Implementation
|
|
48
|
+
// ============================================================================
|
|
49
|
+
const LOG_LEVELS = {
|
|
50
|
+
debug: 0,
|
|
51
|
+
info: 1,
|
|
52
|
+
warn: 2,
|
|
53
|
+
error: 3,
|
|
54
|
+
};
|
|
55
|
+
class StructuredLoggerImpl {
|
|
56
|
+
context;
|
|
57
|
+
outputs = [];
|
|
58
|
+
minLevel = 'info';
|
|
59
|
+
eventEmitter;
|
|
60
|
+
constructor(context = {}, outputs = [], minLevel = 'info', eventEmitter) {
|
|
61
|
+
this.context = context;
|
|
62
|
+
this.outputs = outputs;
|
|
63
|
+
this.minLevel = minLevel;
|
|
64
|
+
this.eventEmitter = eventEmitter;
|
|
65
|
+
}
|
|
66
|
+
shouldLog(level) {
|
|
67
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[this.minLevel];
|
|
68
|
+
}
|
|
69
|
+
log(level, message, context) {
|
|
70
|
+
if (!this.shouldLog(level))
|
|
71
|
+
return;
|
|
72
|
+
const entry = {
|
|
73
|
+
level,
|
|
74
|
+
message,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
context: { ...this.context, ...context },
|
|
77
|
+
};
|
|
78
|
+
for (const output of this.outputs) {
|
|
79
|
+
try {
|
|
80
|
+
output.write(entry);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Swallow output errors
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
debug(message, context) {
|
|
88
|
+
this.log('debug', message, context);
|
|
89
|
+
}
|
|
90
|
+
info(message, context) {
|
|
91
|
+
this.log('info', message, context);
|
|
92
|
+
}
|
|
93
|
+
warn(message, context) {
|
|
94
|
+
this.log('warn', message, context);
|
|
95
|
+
}
|
|
96
|
+
error(message, context) {
|
|
97
|
+
this.log('error', message, context);
|
|
98
|
+
}
|
|
99
|
+
child(context) {
|
|
100
|
+
return new StructuredLoggerImpl({ ...this.context, ...context }, this.outputs, this.minLevel, this.eventEmitter);
|
|
101
|
+
}
|
|
102
|
+
span(name) {
|
|
103
|
+
const span = new SpanImpl(name, this);
|
|
104
|
+
this.debug(`span:start`, { spanName: name, spanId: span.id });
|
|
105
|
+
return span;
|
|
106
|
+
}
|
|
107
|
+
setLevel(level) {
|
|
108
|
+
this.minLevel = level;
|
|
109
|
+
}
|
|
110
|
+
addOutput(output) {
|
|
111
|
+
this.outputs.push(output);
|
|
112
|
+
}
|
|
113
|
+
/** Internal: write span end entry */
|
|
114
|
+
writeSpanEnd(name, spanId, parentSpanId, duration, spanContext) {
|
|
115
|
+
const entry = {
|
|
116
|
+
level: 'debug',
|
|
117
|
+
message: `span:end`,
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
context: { ...this.context, spanName: name, ...spanContext },
|
|
120
|
+
spanId,
|
|
121
|
+
parentSpanId,
|
|
122
|
+
duration,
|
|
123
|
+
};
|
|
124
|
+
for (const output of this.outputs) {
|
|
125
|
+
try {
|
|
126
|
+
output.write(entry);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Swallow output errors
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Get the event emitter if configured */
|
|
134
|
+
getEventEmitter() {
|
|
135
|
+
return this.eventEmitter;
|
|
136
|
+
}
|
|
137
|
+
/** Emit an event (convenience method) */
|
|
138
|
+
emit(type, payload) {
|
|
139
|
+
this.eventEmitter?.emit(type, payload);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Output Handlers
|
|
144
|
+
// ============================================================================
|
|
145
|
+
/** Console output with human-readable formatting */
|
|
146
|
+
export class ConsoleOutput {
|
|
147
|
+
prefix;
|
|
148
|
+
colors;
|
|
149
|
+
constructor(options = {}) {
|
|
150
|
+
this.prefix = options.prefix ?? 'Reqon';
|
|
151
|
+
this.colors = options.colors ?? true;
|
|
152
|
+
}
|
|
153
|
+
write(entry) {
|
|
154
|
+
const prefix = `[${this.prefix}]`;
|
|
155
|
+
const levelStr = entry.level.toUpperCase().padEnd(5);
|
|
156
|
+
// Format context as key=value pairs
|
|
157
|
+
const contextStr = Object.keys(entry.context).length > 0
|
|
158
|
+
? ` ${formatContext(entry.context)}`
|
|
159
|
+
: '';
|
|
160
|
+
// Format duration if present
|
|
161
|
+
const durationStr = entry.duration !== undefined
|
|
162
|
+
? ` (${entry.duration}ms)`
|
|
163
|
+
: '';
|
|
164
|
+
const message = `${prefix} ${levelStr} ${entry.message}${contextStr}${durationStr}`;
|
|
165
|
+
switch (entry.level) {
|
|
166
|
+
case 'debug':
|
|
167
|
+
console.debug(message);
|
|
168
|
+
break;
|
|
169
|
+
case 'info':
|
|
170
|
+
console.log(message);
|
|
171
|
+
break;
|
|
172
|
+
case 'warn':
|
|
173
|
+
console.warn(message);
|
|
174
|
+
break;
|
|
175
|
+
case 'error':
|
|
176
|
+
console.error(message);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** JSON Lines output for log aggregation */
|
|
182
|
+
export class JsonLinesOutput {
|
|
183
|
+
stream;
|
|
184
|
+
constructor(stream) {
|
|
185
|
+
this.stream = stream ?? { write: (line) => console.log(line) };
|
|
186
|
+
}
|
|
187
|
+
write(entry) {
|
|
188
|
+
const json = JSON.stringify({
|
|
189
|
+
...entry,
|
|
190
|
+
'@timestamp': entry.timestamp,
|
|
191
|
+
});
|
|
192
|
+
this.stream.write(json);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Buffer output for testing */
|
|
196
|
+
export class BufferOutput {
|
|
197
|
+
entries = [];
|
|
198
|
+
write(entry) {
|
|
199
|
+
this.entries.push(entry);
|
|
200
|
+
}
|
|
201
|
+
clear() {
|
|
202
|
+
this.entries.length = 0;
|
|
203
|
+
}
|
|
204
|
+
find(predicate) {
|
|
205
|
+
return this.entries.find(predicate);
|
|
206
|
+
}
|
|
207
|
+
filter(predicate) {
|
|
208
|
+
return this.entries.filter(predicate);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/** Event emitter output - bridges logs to events */
|
|
212
|
+
export class EventOutput {
|
|
213
|
+
emitter;
|
|
214
|
+
constructor(emitter) {
|
|
215
|
+
this.emitter = emitter;
|
|
216
|
+
}
|
|
217
|
+
write(entry) {
|
|
218
|
+
// Map log entries to appropriate event types based on context
|
|
219
|
+
// This allows logs to flow into the event system
|
|
220
|
+
if (entry.context.eventType) {
|
|
221
|
+
this.emitter.emit(entry.context.eventType, { ...entry.context, message: entry.message });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Create a structured logger with configured outputs
|
|
227
|
+
*/
|
|
228
|
+
export function createStructuredLogger(options = {}) {
|
|
229
|
+
const outputs = [];
|
|
230
|
+
if (!options.silent) {
|
|
231
|
+
if (options.console !== false) {
|
|
232
|
+
outputs.push(new ConsoleOutput({ prefix: options.prefix }));
|
|
233
|
+
}
|
|
234
|
+
if (options.jsonLines) {
|
|
235
|
+
outputs.push(new JsonLinesOutput(options.jsonStream));
|
|
236
|
+
}
|
|
237
|
+
if (options.eventEmitter) {
|
|
238
|
+
outputs.push(new EventOutput(options.eventEmitter));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return new StructuredLoggerImpl(options.context ?? {}, outputs, options.level ?? 'info', options.eventEmitter);
|
|
242
|
+
}
|
|
243
|
+
// ============================================================================
|
|
244
|
+
// Helpers
|
|
245
|
+
// ============================================================================
|
|
246
|
+
function formatContext(context) {
|
|
247
|
+
return Object.entries(context)
|
|
248
|
+
.filter(([key]) => !key.startsWith('_')) // Skip internal keys
|
|
249
|
+
.map(([key, value]) => {
|
|
250
|
+
if (typeof value === 'string') {
|
|
251
|
+
return `${key}="${value}"`;
|
|
252
|
+
}
|
|
253
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
254
|
+
return `${key}=${value}`;
|
|
255
|
+
}
|
|
256
|
+
return `${key}=${JSON.stringify(value)}`;
|
|
257
|
+
})
|
|
258
|
+
.join(' ');
|
|
259
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry Integration - Trace and metrics export
|
|
3
|
+
*
|
|
4
|
+
* Provides adapters for exporting observability data to OpenTelemetry-compatible
|
|
5
|
+
* backends (Jaeger, Zipkin, OTLP, etc.)
|
|
6
|
+
*
|
|
7
|
+
* This is a lightweight implementation that doesn't require the full OTel SDK.
|
|
8
|
+
* For production use, consider using the official @opentelemetry packages.
|
|
9
|
+
*/
|
|
10
|
+
import type { ObservabilityEvent } from './events.js';
|
|
11
|
+
import type { LogEntry, LogOutput } from './logger.js';
|
|
12
|
+
/** OTLP-compatible span structure */
|
|
13
|
+
export interface OTelSpan {
|
|
14
|
+
traceId: string;
|
|
15
|
+
spanId: string;
|
|
16
|
+
parentSpanId?: string;
|
|
17
|
+
name: string;
|
|
18
|
+
kind: 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER';
|
|
19
|
+
startTimeUnixNano: string;
|
|
20
|
+
endTimeUnixNano: string;
|
|
21
|
+
attributes: OTelAttribute[];
|
|
22
|
+
status: {
|
|
23
|
+
code: 'UNSET' | 'OK' | 'ERROR';
|
|
24
|
+
message?: string;
|
|
25
|
+
};
|
|
26
|
+
events: OTelSpanEvent[];
|
|
27
|
+
}
|
|
28
|
+
export interface OTelAttribute {
|
|
29
|
+
key: string;
|
|
30
|
+
value: {
|
|
31
|
+
stringValue?: string;
|
|
32
|
+
intValue?: number;
|
|
33
|
+
boolValue?: boolean;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface OTelSpanEvent {
|
|
37
|
+
name: string;
|
|
38
|
+
timeUnixNano: string;
|
|
39
|
+
attributes: OTelAttribute[];
|
|
40
|
+
}
|
|
41
|
+
/** Trace context for span correlation */
|
|
42
|
+
export interface TraceContext {
|
|
43
|
+
traceId: string;
|
|
44
|
+
spanId: string;
|
|
45
|
+
parentSpanId?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate a 32-character hex trace ID
|
|
49
|
+
*/
|
|
50
|
+
export declare function generateTraceId(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Generate a 16-character hex span ID
|
|
53
|
+
*/
|
|
54
|
+
export declare function generateSpanId(): string;
|
|
55
|
+
export declare class SpanBuilder {
|
|
56
|
+
private traceId;
|
|
57
|
+
private spans;
|
|
58
|
+
private activeSpans;
|
|
59
|
+
constructor(traceId?: string);
|
|
60
|
+
getTraceId(): string;
|
|
61
|
+
startSpan(name: string, options?: {
|
|
62
|
+
kind?: OTelSpan['kind'];
|
|
63
|
+
parentSpanId?: string;
|
|
64
|
+
attributes?: Record<string, string | number | boolean>;
|
|
65
|
+
}): string;
|
|
66
|
+
endSpan(spanId: string, options?: {
|
|
67
|
+
status?: 'OK' | 'ERROR';
|
|
68
|
+
error?: string;
|
|
69
|
+
attributes?: Record<string, string | number | boolean>;
|
|
70
|
+
}): OTelSpan | undefined;
|
|
71
|
+
addEvent(spanId: string, name: string, attributes?: Record<string, string | number | boolean>): void;
|
|
72
|
+
getSpans(): OTelSpan[];
|
|
73
|
+
private toAttributes;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Adapts observability events to OpenTelemetry spans
|
|
77
|
+
*/
|
|
78
|
+
export declare class OTelEventAdapter {
|
|
79
|
+
private spanBuilder;
|
|
80
|
+
private spanStack;
|
|
81
|
+
private eventToSpan;
|
|
82
|
+
constructor(traceId?: string);
|
|
83
|
+
/**
|
|
84
|
+
* Process an observability event and update spans
|
|
85
|
+
*/
|
|
86
|
+
processEvent(event: ObservabilityEvent): void;
|
|
87
|
+
private startMissionSpan;
|
|
88
|
+
private endMissionSpan;
|
|
89
|
+
private startStageSpan;
|
|
90
|
+
private endStageSpan;
|
|
91
|
+
private startStepSpan;
|
|
92
|
+
private endStepSpan;
|
|
93
|
+
private startFetchSpan;
|
|
94
|
+
private endFetchSpan;
|
|
95
|
+
private addEventToCurrentSpan;
|
|
96
|
+
getSpans(): OTelSpan[];
|
|
97
|
+
getTraceId(): string;
|
|
98
|
+
}
|
|
99
|
+
export interface OTLPExporterConfig {
|
|
100
|
+
endpoint: string;
|
|
101
|
+
headers?: Record<string, string>;
|
|
102
|
+
serviceName?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Export spans to an OTLP-compatible endpoint
|
|
106
|
+
*/
|
|
107
|
+
export declare class OTLPExporter {
|
|
108
|
+
private config;
|
|
109
|
+
private pendingSpans;
|
|
110
|
+
private flushTimer?;
|
|
111
|
+
constructor(config: OTLPExporterConfig);
|
|
112
|
+
addSpans(spans: OTelSpan[]): void;
|
|
113
|
+
flush(): Promise<void>;
|
|
114
|
+
startAutoFlush(intervalMs?: number): void;
|
|
115
|
+
stopAutoFlush(): void;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Log output that converts entries to OTel spans
|
|
119
|
+
*/
|
|
120
|
+
export declare class OTelLogOutput implements LogOutput {
|
|
121
|
+
private adapter;
|
|
122
|
+
private exporter?;
|
|
123
|
+
constructor(adapter: OTelEventAdapter, exporter?: OTLPExporter);
|
|
124
|
+
write(entry: LogEntry): void;
|
|
125
|
+
getSpans(): OTelSpan[];
|
|
126
|
+
flush(): Promise<void>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create an event listener that builds OTel spans
|
|
130
|
+
*/
|
|
131
|
+
export declare function createOTelListener(config?: OTLPExporterConfig): {
|
|
132
|
+
adapter: OTelEventAdapter;
|
|
133
|
+
handler: (event: ObservabilityEvent) => void;
|
|
134
|
+
flush: () => Promise<void>;
|
|
135
|
+
};
|