@blokjs/runner 0.6.20 → 0.7.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/dist/Blok.d.ts +2 -0
- package/dist/Blok.js +42 -110
- package/dist/Blok.js.map +1 -1
- package/dist/DefaultLogger.d.ts +13 -0
- package/dist/DefaultLogger.js +25 -0
- package/dist/DefaultLogger.js.map +1 -1
- package/dist/RunnerSteps.d.ts +23 -0
- package/dist/RunnerSteps.js +128 -87
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/SubworkflowNode.js +19 -0
- package/dist/SubworkflowNode.js.map +1 -1
- package/dist/TriggerBase.d.ts +12 -0
- package/dist/TriggerBase.js +216 -181
- package/dist/TriggerBase.js.map +1 -1
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +9 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +76 -6
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
- package/dist/index.d.ts +4 -39
- package/dist/index.js +7 -32
- package/dist/index.js.map +1 -1
- package/dist/monitoring/JanitorMetrics.d.ts +3 -0
- package/dist/monitoring/JanitorMetrics.js +11 -0
- package/dist/monitoring/JanitorMetrics.js.map +1 -1
- package/dist/monitoring/ProcessErrorMetrics.d.ts +32 -0
- package/dist/monitoring/ProcessErrorMetrics.js +43 -0
- package/dist/monitoring/ProcessErrorMetrics.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +7 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +8 -2
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -1
- package/dist/monitoring/SubworkflowMetrics.d.ts +25 -0
- package/dist/monitoring/SubworkflowMetrics.js +38 -0
- package/dist/monitoring/SubworkflowMetrics.js.map +1 -0
- package/dist/observability/ErrorSink.d.ts +23 -0
- package/dist/observability/ErrorSink.js +32 -0
- package/dist/observability/ErrorSink.js.map +1 -0
- package/dist/observability/SentryIntegration.d.ts +9 -0
- package/dist/observability/SentryIntegration.js +31 -0
- package/dist/observability/SentryIntegration.js.map +1 -0
- package/dist/scheduling/DebounceCoordinator.d.ts +7 -53
- package/dist/scheduling/DebounceCoordinator.js +8 -207
- package/dist/scheduling/DebounceCoordinator.js.map +1 -1
- package/dist/tracing/InMemoryRunStore.d.ts +5 -1
- package/dist/tracing/InMemoryRunStore.js +14 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -1
- package/dist/tracing/Janitor.js +3 -0
- package/dist/tracing/Janitor.js.map +1 -1
- package/dist/tracing/PostgresRunStore.d.ts +4 -1
- package/dist/tracing/PostgresRunStore.js +73 -3
- package/dist/tracing/PostgresRunStore.js.map +1 -1
- package/dist/tracing/RunStore.d.ts +17 -1
- package/dist/tracing/RunTracker.d.ts +13 -34
- package/dist/tracing/RunTracker.js +62 -32
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.d.ts +4 -1
- package/dist/tracing/SqliteRunStore.js +60 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.d.ts +13 -0
- package/dist/tracing/TraceRouter.js +43 -11
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/TracingLogger.js +22 -0
- package/dist/tracing/TracingLogger.js.map +1 -1
- package/dist/tracing/createStore.js +51 -22
- package/dist/tracing/createStore.js.map +1 -1
- package/dist/tracing/types.d.ts +22 -0
- package/dist/types/GlobalOptions.d.ts +5 -7
- package/dist/workflow/WorkflowNormalizer.js +63 -0
- package/dist/workflow/WorkflowNormalizer.js.map +1 -1
- package/package.json +7 -4
- package/dist/cache/NodeResultCache.d.ts +0 -286
- package/dist/cache/NodeResultCache.js +0 -506
- package/dist/cache/NodeResultCache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -1
- package/dist/cache/index.js +0 -2
- package/dist/cache/index.js.map +0 -1
- package/dist/concurrency/ConcurrencyBackend.d.ts +0 -61
- package/dist/concurrency/ConcurrencyBackend.js +0 -20
- package/dist/concurrency/ConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/NatsKvConcurrencyBackend.js +0 -310
- package/dist/concurrency/NatsKvConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/RedisConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/RedisConcurrencyBackend.js +0 -374
- package/dist/concurrency/RedisConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/createConcurrencyBackend.d.ts +0 -24
- package/dist/concurrency/createConcurrencyBackend.js +0 -38
- package/dist/concurrency/createConcurrencyBackend.js.map +0 -1
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +0 -129
- package/dist/graphql/GraphQLSchemaGenerator.js +0 -425
- package/dist/graphql/GraphQLSchemaGenerator.js.map +0 -1
- package/dist/integrations/APMIntegration.d.ts +0 -141
- package/dist/integrations/APMIntegration.js +0 -212
- package/dist/integrations/APMIntegration.js.map +0 -1
- package/dist/integrations/AzureMonitorIntegration.d.ts +0 -118
- package/dist/integrations/AzureMonitorIntegration.js +0 -254
- package/dist/integrations/AzureMonitorIntegration.js.map +0 -1
- package/dist/integrations/CloudWatchIntegration.d.ts +0 -135
- package/dist/integrations/CloudWatchIntegration.js +0 -293
- package/dist/integrations/CloudWatchIntegration.js.map +0 -1
- package/dist/integrations/SentryIntegration.d.ts +0 -153
- package/dist/integrations/SentryIntegration.js +0 -200
- package/dist/integrations/SentryIntegration.js.map +0 -1
- package/dist/integrations/index.d.ts +0 -19
- package/dist/integrations/index.js +0 -16
- package/dist/integrations/index.js.map +0 -1
- package/dist/marketplace/RuntimeAutoScaler.d.ts +0 -148
- package/dist/marketplace/RuntimeAutoScaler.js +0 -366
- package/dist/marketplace/RuntimeAutoScaler.js.map +0 -1
- package/dist/marketplace/RuntimeCatalog.d.ts +0 -180
- package/dist/marketplace/RuntimeCatalog.js +0 -339
- package/dist/marketplace/RuntimeCatalog.js.map +0 -1
- package/dist/marketplace/RuntimeDiscovery.d.ts +0 -86
- package/dist/marketplace/RuntimeDiscovery.js +0 -231
- package/dist/marketplace/RuntimeDiscovery.js.map +0 -1
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +0 -100
- package/dist/marketplace/RuntimeHealthMonitor.js +0 -241
- package/dist/marketplace/RuntimeHealthMonitor.js.map +0 -1
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +0 -113
- package/dist/marketplace/RuntimeMetricsDashboard.js +0 -293
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +0 -1
- package/dist/openapi/OpenAPIGenerator.d.ts +0 -192
- package/dist/openapi/OpenAPIGenerator.js +0 -378
- package/dist/openapi/OpenAPIGenerator.js.map +0 -1
- package/dist/openapi/index.d.ts +0 -20
- package/dist/openapi/index.js +0 -20
- package/dist/openapi/index.js.map +0 -1
- package/dist/scheduling/DebounceBackend.d.ts +0 -108
- package/dist/scheduling/DebounceBackend.js +0 -23
- package/dist/scheduling/DebounceBackend.js.map +0 -1
- package/dist/scheduling/NatsKvDebounceBackend.d.ts +0 -53
- package/dist/scheduling/NatsKvDebounceBackend.js +0 -334
- package/dist/scheduling/NatsKvDebounceBackend.js.map +0 -1
- package/dist/scheduling/RedisDebounceBackend.d.ts +0 -49
- package/dist/scheduling/RedisDebounceBackend.js +0 -356
- package/dist/scheduling/RedisDebounceBackend.js.map +0 -1
- package/dist/scheduling/createDebounceBackend.d.ts +0 -25
- package/dist/scheduling/createDebounceBackend.js +0 -39
- package/dist/scheduling/createDebounceBackend.js.map +0 -1
- package/dist/security/ABAC.d.ts +0 -224
- package/dist/security/ABAC.js +0 -380
- package/dist/security/ABAC.js.map +0 -1
- package/dist/security/AuditLogger.d.ts +0 -242
- package/dist/security/AuditLogger.js +0 -317
- package/dist/security/AuditLogger.js.map +0 -1
- package/dist/security/AuthMiddleware.d.ts +0 -162
- package/dist/security/AuthMiddleware.js +0 -289
- package/dist/security/AuthMiddleware.js.map +0 -1
- package/dist/security/EncryptionAtRest.d.ts +0 -206
- package/dist/security/EncryptionAtRest.js +0 -236
- package/dist/security/EncryptionAtRest.js.map +0 -1
- package/dist/security/OAuthProvider.d.ts +0 -334
- package/dist/security/OAuthProvider.js +0 -719
- package/dist/security/OAuthProvider.js.map +0 -1
- package/dist/security/PIIDetector.d.ts +0 -233
- package/dist/security/PIIDetector.js +0 -354
- package/dist/security/PIIDetector.js.map +0 -1
- package/dist/security/RBAC.d.ts +0 -143
- package/dist/security/RBAC.js +0 -285
- package/dist/security/RBAC.js.map +0 -1
- package/dist/security/SecretManager.d.ts +0 -652
- package/dist/security/SecretManager.js +0 -1147
- package/dist/security/SecretManager.js.map +0 -1
- package/dist/security/TLSConfig.d.ts +0 -305
- package/dist/security/TLSConfig.js +0 -550
- package/dist/security/TLSConfig.js.map +0 -1
- package/dist/security/index.d.ts +0 -81
- package/dist/security/index.js +0 -82
- package/dist/security/index.js.map +0 -1
|
@@ -1,378 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAPI Schema Generator for Blok Workflows
|
|
3
|
-
*
|
|
4
|
-
* Automatically generates OpenAPI 3.1 specifications from workflow definitions.
|
|
5
|
-
* Introspects HTTP trigger configurations, node schemas, and context types
|
|
6
|
-
* to produce a complete API specification.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* const generator = new OpenAPIGenerator({
|
|
11
|
-
* title: "My Blok API",
|
|
12
|
-
* version: "1.0.0",
|
|
13
|
-
* description: "Auto-generated from Blok workflows",
|
|
14
|
-
* });
|
|
15
|
-
*
|
|
16
|
-
* // Add workflows
|
|
17
|
-
* generator.addWorkflow({
|
|
18
|
-
* name: "get-user",
|
|
19
|
-
* version: "1.0.0",
|
|
20
|
-
* trigger: { http: { method: "GET", path: "/users/:id" } },
|
|
21
|
-
* steps: [...],
|
|
22
|
-
* nodes: {...},
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* // Generate OpenAPI spec
|
|
26
|
-
* const spec = generator.generate();
|
|
27
|
-
* console.log(JSON.stringify(spec, null, 2));
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export class OpenAPIGenerator {
|
|
31
|
-
config;
|
|
32
|
-
workflows = [];
|
|
33
|
-
schemas = new Map();
|
|
34
|
-
constructor(config) {
|
|
35
|
-
this.config = {
|
|
36
|
-
servers: [{ url: "http://localhost:4000", description: "Development server" }],
|
|
37
|
-
...config,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Add a workflow definition to the generator
|
|
42
|
-
*/
|
|
43
|
-
addWorkflow(workflow) {
|
|
44
|
-
this.workflows.push(workflow);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Add multiple workflows
|
|
48
|
-
*/
|
|
49
|
-
addWorkflows(workflows) {
|
|
50
|
-
this.workflows.push(...workflows);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Add a custom schema component
|
|
54
|
-
*/
|
|
55
|
-
addSchema(name, schema) {
|
|
56
|
-
this.schemas.set(name, schema);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Generate OpenAPI 3.1 specification
|
|
60
|
-
*/
|
|
61
|
-
generate() {
|
|
62
|
-
const spec = {
|
|
63
|
-
openapi: "3.1.0",
|
|
64
|
-
info: {
|
|
65
|
-
title: this.config.title,
|
|
66
|
-
version: this.config.version,
|
|
67
|
-
description: this.config.description,
|
|
68
|
-
contact: this.config.contact,
|
|
69
|
-
license: this.config.license,
|
|
70
|
-
},
|
|
71
|
-
servers: this.config.servers,
|
|
72
|
-
paths: {},
|
|
73
|
-
components: {
|
|
74
|
-
schemas: {
|
|
75
|
-
ErrorResponse: {
|
|
76
|
-
type: "object",
|
|
77
|
-
properties: {
|
|
78
|
-
error: { type: "string", description: "Error message" },
|
|
79
|
-
origin: { type: "string", description: "Node that caused the error" },
|
|
80
|
-
validation_errors: {
|
|
81
|
-
type: "array",
|
|
82
|
-
items: {
|
|
83
|
-
type: "object",
|
|
84
|
-
properties: {
|
|
85
|
-
path: { type: "array", items: { type: "string" } },
|
|
86
|
-
message: { type: "string" },
|
|
87
|
-
code: { type: "string" },
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
description: "Validation error details (if applicable)",
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
WorkflowContext: {
|
|
95
|
-
type: "object",
|
|
96
|
-
properties: {
|
|
97
|
-
id: { type: "string", format: "uuid", description: "Request ID" },
|
|
98
|
-
workflow_name: { type: "string" },
|
|
99
|
-
workflow_path: { type: "string" },
|
|
100
|
-
},
|
|
101
|
-
},
|
|
102
|
-
...Object.fromEntries(this.schemas),
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
tags: this.config.tags || [],
|
|
106
|
-
};
|
|
107
|
-
// Add security schemes if configured
|
|
108
|
-
if (this.config.securitySchemes) {
|
|
109
|
-
spec.components.securitySchemes = this.config.securitySchemes;
|
|
110
|
-
// Apply security globally
|
|
111
|
-
spec.security = Object.keys(this.config.securitySchemes).map((name) => ({
|
|
112
|
-
[name]: [],
|
|
113
|
-
}));
|
|
114
|
-
}
|
|
115
|
-
// Generate paths from workflows
|
|
116
|
-
for (const workflow of this.workflows) {
|
|
117
|
-
if (!workflow.trigger.http)
|
|
118
|
-
continue;
|
|
119
|
-
const { method, path: routePath } = workflow.trigger.http;
|
|
120
|
-
const openApiPath = this.convertPath(routePath);
|
|
121
|
-
const httpMethod = (method || "get").toLowerCase();
|
|
122
|
-
if (!spec.paths[openApiPath]) {
|
|
123
|
-
spec.paths[openApiPath] = {};
|
|
124
|
-
}
|
|
125
|
-
spec.paths[openApiPath][httpMethod] = this.buildOperation(workflow);
|
|
126
|
-
}
|
|
127
|
-
// Add default health check and metrics paths
|
|
128
|
-
spec.paths["/health-check"] = {
|
|
129
|
-
get: {
|
|
130
|
-
summary: "Health Check",
|
|
131
|
-
operationId: "healthCheck",
|
|
132
|
-
tags: ["System"],
|
|
133
|
-
responses: {
|
|
134
|
-
"200": {
|
|
135
|
-
description: "Service is healthy",
|
|
136
|
-
content: { "text/plain": { schema: { type: "string" } } },
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
spec.paths["/metrics"] = {
|
|
142
|
-
get: {
|
|
143
|
-
summary: "Prometheus Metrics",
|
|
144
|
-
operationId: "getMetrics",
|
|
145
|
-
tags: ["System"],
|
|
146
|
-
responses: {
|
|
147
|
-
"200": {
|
|
148
|
-
description: "Prometheus metrics in text format",
|
|
149
|
-
content: { "text/plain": { schema: { type: "string" } } },
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
// Auto-generate tags from workflows
|
|
155
|
-
const workflowTags = new Set();
|
|
156
|
-
for (const workflow of this.workflows) {
|
|
157
|
-
const tag = this.inferTag(workflow);
|
|
158
|
-
workflowTags.add(tag);
|
|
159
|
-
}
|
|
160
|
-
if (!spec.tags || spec.tags.length === 0) {
|
|
161
|
-
spec.tags = [
|
|
162
|
-
...Array.from(workflowTags).map((t) => ({ name: t })),
|
|
163
|
-
{ name: "System", description: "System health and monitoring endpoints" },
|
|
164
|
-
];
|
|
165
|
-
}
|
|
166
|
-
return spec;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Generate OpenAPI spec as JSON string
|
|
170
|
-
*/
|
|
171
|
-
toJSON(pretty = true) {
|
|
172
|
-
const spec = this.generate();
|
|
173
|
-
return JSON.stringify(spec, null, pretty ? 2 : undefined);
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Generate OpenAPI spec as YAML string
|
|
177
|
-
*/
|
|
178
|
-
toYAML() {
|
|
179
|
-
const spec = this.generate();
|
|
180
|
-
return this.jsonToYaml(spec);
|
|
181
|
-
}
|
|
182
|
-
buildOperation(workflow) {
|
|
183
|
-
// Caller (`generate()`) only invokes `buildOperation` for workflows
|
|
184
|
-
// that have an http trigger; defensive check keeps the type exact.
|
|
185
|
-
const httpTrigger = workflow.trigger.http;
|
|
186
|
-
if (!httpTrigger) {
|
|
187
|
-
throw new Error(`[OpenAPIGenerator] workflow "${workflow.name}" has no http trigger — cannot build operation`);
|
|
188
|
-
}
|
|
189
|
-
const method = (httpTrigger.method || "GET").toUpperCase();
|
|
190
|
-
const tag = this.inferTag(workflow);
|
|
191
|
-
const operation = {
|
|
192
|
-
summary: workflow.name.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()),
|
|
193
|
-
description: workflow.description || `Execute the ${workflow.name} workflow (v${workflow.version})`,
|
|
194
|
-
operationId: this.toOperationId(workflow.name, method),
|
|
195
|
-
tags: [tag],
|
|
196
|
-
parameters: [],
|
|
197
|
-
responses: {
|
|
198
|
-
"200": {
|
|
199
|
-
description: "Successful workflow execution",
|
|
200
|
-
content: {
|
|
201
|
-
[httpTrigger.accept || "application/json"]: {
|
|
202
|
-
schema: this.buildResponseSchema(workflow),
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
},
|
|
206
|
-
"400": {
|
|
207
|
-
description: "Validation error",
|
|
208
|
-
content: {
|
|
209
|
-
"application/json": {
|
|
210
|
-
schema: { $ref: "#/components/schemas/ErrorResponse" },
|
|
211
|
-
},
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
"500": {
|
|
215
|
-
description: "Internal server error",
|
|
216
|
-
content: {
|
|
217
|
-
"application/json": {
|
|
218
|
-
schema: { $ref: "#/components/schemas/ErrorResponse" },
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
// Extract path parameters
|
|
225
|
-
const pathParams = this.extractPathParams(httpTrigger.path);
|
|
226
|
-
for (const param of pathParams) {
|
|
227
|
-
operation.parameters?.push({
|
|
228
|
-
name: param,
|
|
229
|
-
in: "path",
|
|
230
|
-
required: true,
|
|
231
|
-
schema: { type: "string" },
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
// Add request body for POST/PUT/PATCH
|
|
235
|
-
if (["POST", "PUT", "PATCH"].includes(method)) {
|
|
236
|
-
operation.requestBody = {
|
|
237
|
-
required: true,
|
|
238
|
-
content: {
|
|
239
|
-
"application/json": {
|
|
240
|
-
schema: this.buildRequestSchema(workflow),
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
// Add requestId query parameter
|
|
246
|
-
operation.parameters?.push({
|
|
247
|
-
name: "requestId",
|
|
248
|
-
in: "query",
|
|
249
|
-
required: false,
|
|
250
|
-
schema: { type: "string" },
|
|
251
|
-
description: "Custom request ID for tracing",
|
|
252
|
-
});
|
|
253
|
-
return operation;
|
|
254
|
-
}
|
|
255
|
-
buildRequestSchema(workflow) {
|
|
256
|
-
// Try to extract input schema from first step's node config
|
|
257
|
-
const firstStepConfig = this.getFirstNodeInputs(workflow);
|
|
258
|
-
if (firstStepConfig) {
|
|
259
|
-
return firstStepConfig;
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
type: "object",
|
|
263
|
-
description: `Input for ${workflow.name} workflow`,
|
|
264
|
-
additionalProperties: true,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
buildResponseSchema(workflow) {
|
|
268
|
-
return {
|
|
269
|
-
type: "object",
|
|
270
|
-
description: `Output from ${workflow.name} workflow`,
|
|
271
|
-
additionalProperties: true,
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
getFirstNodeInputs(workflow) {
|
|
275
|
-
if (!workflow.steps || workflow.steps.length === 0)
|
|
276
|
-
return null;
|
|
277
|
-
const firstStep = workflow.steps[0];
|
|
278
|
-
if (!firstStep?.name)
|
|
279
|
-
return null;
|
|
280
|
-
const nodeConfig = workflow.nodes[firstStep.name];
|
|
281
|
-
if (!nodeConfig?.inputs)
|
|
282
|
-
return null;
|
|
283
|
-
// Convert inputs config to JSON schema
|
|
284
|
-
const properties = {};
|
|
285
|
-
for (const [_key, value] of Object.entries(nodeConfig.inputs)) {
|
|
286
|
-
if (typeof value === "string" && value.startsWith("{{") && value.endsWith("}}")) {
|
|
287
|
-
// Template reference - this is a dynamic input from request body
|
|
288
|
-
const ref = value.slice(2, -2).trim();
|
|
289
|
-
if (ref.startsWith("ctx.request.body.")) {
|
|
290
|
-
const fieldName = ref.replace("ctx.request.body.", "");
|
|
291
|
-
properties[fieldName] = { type: "string" };
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
if (Object.keys(properties).length > 0) {
|
|
296
|
-
return { type: "object", properties };
|
|
297
|
-
}
|
|
298
|
-
return null;
|
|
299
|
-
}
|
|
300
|
-
convertPath(blokPath) {
|
|
301
|
-
// Convert Express-style :param to OpenAPI {param}
|
|
302
|
-
return blokPath.replace(/:(\w+)/g, "{$1}");
|
|
303
|
-
}
|
|
304
|
-
extractPathParams(path) {
|
|
305
|
-
const matches = path.match(/:(\w+)/g);
|
|
306
|
-
if (!matches)
|
|
307
|
-
return [];
|
|
308
|
-
return matches.map((m) => m.slice(1));
|
|
309
|
-
}
|
|
310
|
-
toOperationId(name, method) {
|
|
311
|
-
const cleanName = name
|
|
312
|
-
.replace(/[^a-zA-Z0-9]/g, " ")
|
|
313
|
-
.trim()
|
|
314
|
-
.split(/\s+/)
|
|
315
|
-
.map((word, i) => (i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()))
|
|
316
|
-
.join("");
|
|
317
|
-
return `${method.toLowerCase()}${cleanName.charAt(0).toUpperCase()}${cleanName.slice(1)}`;
|
|
318
|
-
}
|
|
319
|
-
inferTag(workflow) {
|
|
320
|
-
const name = workflow.name;
|
|
321
|
-
// Try to extract a category from workflow name (e.g., "user-create" → "User")
|
|
322
|
-
const parts = name.split(/[-_]/);
|
|
323
|
-
if (parts.length > 1) {
|
|
324
|
-
return parts[0].charAt(0).toUpperCase() + parts[0].slice(1);
|
|
325
|
-
}
|
|
326
|
-
return "Default";
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Simple JSON to YAML converter (basic, no external deps)
|
|
330
|
-
*/
|
|
331
|
-
jsonToYaml(obj, indent = 0) {
|
|
332
|
-
const spaces = " ".repeat(indent);
|
|
333
|
-
if (obj === null || obj === undefined)
|
|
334
|
-
return "null";
|
|
335
|
-
if (typeof obj === "boolean")
|
|
336
|
-
return String(obj);
|
|
337
|
-
if (typeof obj === "number")
|
|
338
|
-
return String(obj);
|
|
339
|
-
if (typeof obj === "string") {
|
|
340
|
-
if (obj.includes("\n") || obj.includes(":") || obj.includes("#") || obj.includes("'")) {
|
|
341
|
-
return `"${obj.replace(/"/g, '\\"')}"`;
|
|
342
|
-
}
|
|
343
|
-
return obj;
|
|
344
|
-
}
|
|
345
|
-
if (Array.isArray(obj)) {
|
|
346
|
-
if (obj.length === 0)
|
|
347
|
-
return "[]";
|
|
348
|
-
return obj
|
|
349
|
-
.map((item) => {
|
|
350
|
-
const value = this.jsonToYaml(item, indent + 1);
|
|
351
|
-
if (typeof item === "object" && item !== null) {
|
|
352
|
-
return `${spaces}- ${value.trimStart()}`;
|
|
353
|
-
}
|
|
354
|
-
return `${spaces}- ${value}`;
|
|
355
|
-
})
|
|
356
|
-
.join("\n");
|
|
357
|
-
}
|
|
358
|
-
if (typeof obj === "object") {
|
|
359
|
-
const entries = Object.entries(obj).filter(([, v]) => v !== undefined);
|
|
360
|
-
if (entries.length === 0)
|
|
361
|
-
return "{}";
|
|
362
|
-
return entries
|
|
363
|
-
.map(([key, value]) => {
|
|
364
|
-
const yamlValue = this.jsonToYaml(value, indent + 1);
|
|
365
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
366
|
-
return `${spaces}${key}:\n${yamlValue}`;
|
|
367
|
-
}
|
|
368
|
-
if (Array.isArray(value) && value.length > 0) {
|
|
369
|
-
return `${spaces}${key}:\n${yamlValue}`;
|
|
370
|
-
}
|
|
371
|
-
return `${spaces}${key}: ${yamlValue}`;
|
|
372
|
-
})
|
|
373
|
-
.join("\n");
|
|
374
|
-
}
|
|
375
|
-
return String(obj);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
//# sourceMappingURL=OpenAPIGenerator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/openapi/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
|
package/dist/openapi/index.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAPI Schema Generation for Blok
|
|
3
|
-
*
|
|
4
|
-
* Auto-generates OpenAPI 3.1 specifications from workflow definitions.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```typescript
|
|
8
|
-
* import { OpenAPIGenerator } from "@blokjs/runner";
|
|
9
|
-
*
|
|
10
|
-
* const generator = new OpenAPIGenerator({
|
|
11
|
-
* title: "My API",
|
|
12
|
-
* version: "1.0.0",
|
|
13
|
-
* });
|
|
14
|
-
*
|
|
15
|
-
* generator.addWorkflow(workflowDef);
|
|
16
|
-
* const spec = generator.generate();
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
export { OpenAPIGenerator } from "./OpenAPIGenerator";
|
|
20
|
-
export type { OpenAPIGeneratorConfig, OpenAPISecurityScheme, WorkflowDefinition, OpenAPISpec, } from "./OpenAPIGenerator";
|
package/dist/openapi/index.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAPI Schema Generation for Blok
|
|
3
|
-
*
|
|
4
|
-
* Auto-generates OpenAPI 3.1 specifications from workflow definitions.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```typescript
|
|
8
|
-
* import { OpenAPIGenerator } from "@blokjs/runner";
|
|
9
|
-
*
|
|
10
|
-
* const generator = new OpenAPIGenerator({
|
|
11
|
-
* title: "My API",
|
|
12
|
-
* version: "1.0.0",
|
|
13
|
-
* });
|
|
14
|
-
*
|
|
15
|
-
* generator.addWorkflow(workflowDef);
|
|
16
|
-
* const spec = generator.generate();
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
export { OpenAPIGenerator } from "./OpenAPIGenerator";
|
|
20
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier C #1 · Cross-process debounce backend interface.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors the relationship between `ConcurrencyBackend` and the
|
|
5
|
-
* `RunStore`-backed concurrency gate: an optional async capability that
|
|
6
|
-
* lets `DebounceCoordinator` coordinate windows across processes
|
|
7
|
-
* (NATS KV, Redis) instead of relying on the local in-memory Map.
|
|
8
|
-
*
|
|
9
|
-
* Default behavior is unchanged — when no backend is set, the
|
|
10
|
-
* coordinator uses its existing in-memory state. The backend is opt-in
|
|
11
|
-
* via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
|
|
12
|
-
* packages during `listen()`.
|
|
13
|
-
*
|
|
14
|
-
* **Semantic trade-off**: this v1 ships *owner-local payload*
|
|
15
|
-
* semantics. The owning process's captured closure (`onFire`) fires
|
|
16
|
-
* when its local timer elapses; payloads from coalesce pings on other
|
|
17
|
-
* processes are dropped (the doc only records `pingCount`,
|
|
18
|
-
* `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
|
|
19
|
-
* is a deferred follow-up — would require persisting each ping's
|
|
20
|
-
* payload to the shared doc.
|
|
21
|
-
*/
|
|
22
|
-
export type DebounceBackendMode = "leading" | "trailing";
|
|
23
|
-
export interface DebounceRegisterBackendOpts {
|
|
24
|
-
workflowName: string;
|
|
25
|
-
debounceKey: string;
|
|
26
|
-
mode: DebounceBackendMode;
|
|
27
|
-
delayMs: number;
|
|
28
|
-
maxDelayMs?: number;
|
|
29
|
-
/** Run id allocated by the caller for THIS ping. */
|
|
30
|
-
runId: string;
|
|
31
|
-
/** Process identity used for owner-lease attribution. */
|
|
32
|
-
processId: string;
|
|
33
|
-
/** Owner lease in ms — when expired, another process can take over. */
|
|
34
|
-
ownerLeaseMs: number;
|
|
35
|
-
/** Current wall-clock ms. */
|
|
36
|
-
now: number;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Result of a `registerPing`. Three outcomes, mirroring the
|
|
40
|
-
* single-process `DebounceRegisterResult` shape:
|
|
41
|
-
*
|
|
42
|
-
* - `"owner-new"` — caller is the new owner of a fresh window.
|
|
43
|
-
* For leading mode: fire synchronously. For trailing mode: start a
|
|
44
|
-
* local timer to fire at `scheduledAt`.
|
|
45
|
-
* - `"owner-extend"` — caller is the existing owner; window extended.
|
|
46
|
-
* Cancel + restart local timer to fire at the new `scheduledAt`.
|
|
47
|
-
* - `"coalesce"` — caller is NOT the owner. Mark the run `debounced`
|
|
48
|
-
* with `intoRunId = activeRunId`.
|
|
49
|
-
*/
|
|
50
|
-
export interface DebounceRegisterBackendResult {
|
|
51
|
-
outcome: "owner-new" | "owner-extend" | "coalesce";
|
|
52
|
-
activeRunId: string;
|
|
53
|
-
/** The runId of the OWNING process. Equal to opts.runId when outcome ∈ {owner-new, owner-extend}; differs on coalesce. */
|
|
54
|
-
scheduledAt: number;
|
|
55
|
-
pingCount: number;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Result of a `finalize` call from an owning process's local timer.
|
|
59
|
-
*
|
|
60
|
-
* - `"fire"` — caller still owns AND the silence period elapsed.
|
|
61
|
-
* Bucket has been atomically DELETEd; caller dispatches.
|
|
62
|
-
* - `"reschedule"` — caller still owns, but coalesce pings from other
|
|
63
|
-
* processes pushed `scheduledAt` forward. Caller restarts local
|
|
64
|
-
* timer for `scheduledAt - now`.
|
|
65
|
-
* - `"abandoned"` — caller's lease expired and another process took
|
|
66
|
-
* ownership. Caller silently drops the closure.
|
|
67
|
-
*/
|
|
68
|
-
export type DebounceFinalizeResult = {
|
|
69
|
-
finalize: "fire";
|
|
70
|
-
} | {
|
|
71
|
-
finalize: "reschedule";
|
|
72
|
-
scheduledAt: number;
|
|
73
|
-
} | {
|
|
74
|
-
finalize: "abandoned";
|
|
75
|
-
};
|
|
76
|
-
export interface DebounceBackend {
|
|
77
|
-
/** Identifying string for logs/metrics. e.g. `"nats-kv"`, `"redis"`. */
|
|
78
|
-
readonly name: string;
|
|
79
|
-
/** Lifecycle — open the underlying connection. Idempotent. */
|
|
80
|
-
connect(): Promise<void>;
|
|
81
|
-
/** Lifecycle — close the underlying connection. Idempotent. */
|
|
82
|
-
disconnect(): Promise<void>;
|
|
83
|
-
/**
|
|
84
|
-
* Atomically record a ping against the `(workflow, debounceKey)`
|
|
85
|
-
* bucket and decide ownership. Returns one of the three outcomes
|
|
86
|
-
* documented on {@link DebounceRegisterBackendResult}.
|
|
87
|
-
*/
|
|
88
|
-
registerPing(opts: DebounceRegisterBackendOpts): Promise<DebounceRegisterBackendResult>;
|
|
89
|
-
/**
|
|
90
|
-
* Owner calls this on local timer fire. Atomically:
|
|
91
|
-
* - If `runId` still owns AND `now >= scheduledAt` → DELETE the
|
|
92
|
-
* bucket and return `{finalize: "fire"}`.
|
|
93
|
-
* - If `runId` still owns but `now < scheduledAt` → return
|
|
94
|
-
* `{finalize: "reschedule", scheduledAt}`.
|
|
95
|
-
* - If `runId` no longer owns (lease expired + handoff) → return
|
|
96
|
-
* `{finalize: "abandoned"}`.
|
|
97
|
-
*/
|
|
98
|
-
finalize(workflowName: string, debounceKey: string, runId: string, now: number): Promise<DebounceFinalizeResult>;
|
|
99
|
-
/** Cancel an active window without firing. Returns true if cancelled. */
|
|
100
|
-
cancel(workflowName: string, debounceKey: string): Promise<boolean>;
|
|
101
|
-
/**
|
|
102
|
-
* Janitor sweep — purge every bucket whose owner lease expired
|
|
103
|
-
* AND whose `scheduledAt` is in the past. Returns the count of
|
|
104
|
-
* purged buckets. Cheap per-bucket lazy-purge happens inside the
|
|
105
|
-
* registerPing/finalize scripts.
|
|
106
|
-
*/
|
|
107
|
-
purgeExpired(now: number): Promise<number>;
|
|
108
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier C #1 · Cross-process debounce backend interface.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors the relationship between `ConcurrencyBackend` and the
|
|
5
|
-
* `RunStore`-backed concurrency gate: an optional async capability that
|
|
6
|
-
* lets `DebounceCoordinator` coordinate windows across processes
|
|
7
|
-
* (NATS KV, Redis) instead of relying on the local in-memory Map.
|
|
8
|
-
*
|
|
9
|
-
* Default behavior is unchanged — when no backend is set, the
|
|
10
|
-
* coordinator uses its existing in-memory state. The backend is opt-in
|
|
11
|
-
* via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
|
|
12
|
-
* packages during `listen()`.
|
|
13
|
-
*
|
|
14
|
-
* **Semantic trade-off**: this v1 ships *owner-local payload*
|
|
15
|
-
* semantics. The owning process's captured closure (`onFire`) fires
|
|
16
|
-
* when its local timer elapses; payloads from coalesce pings on other
|
|
17
|
-
* processes are dropped (the doc only records `pingCount`,
|
|
18
|
-
* `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
|
|
19
|
-
* is a deferred follow-up — would require persisting each ping's
|
|
20
|
-
* payload to the shared doc.
|
|
21
|
-
*/
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=DebounceBackend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DebounceBackend.js","sourceRoot":"","sources":["../../src/scheduling/DebounceBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier C #1 · NATS KV-backed debounce backend.
|
|
3
|
-
*
|
|
4
|
-
* Coordinates per-(workflow, debounceKey) window state across processes
|
|
5
|
-
* via a single NATS JetStream KV value per bucket with revision-based
|
|
6
|
-
* compare-and-swap (OCC). Mirrors the storage model of
|
|
7
|
-
* `NatsKvConcurrencyBackend` but with a different document shape (one
|
|
8
|
-
* window per bucket, not a leases array).
|
|
9
|
-
*
|
|
10
|
-
* Acquire / extend / coalesce: a bounded CAS loop (10 retries) that
|
|
11
|
-
* reads → decides ownership → atomically writes. On retry exhaustion,
|
|
12
|
-
* fall back to admitting the ping as a `coalesce` against the current
|
|
13
|
-
* owner — debounce is not a safety gate, so we'd rather over-coalesce
|
|
14
|
-
* than drop pings on a contention spike.
|
|
15
|
-
*
|
|
16
|
-
* Finalize: same OCC pattern. The owning process atomically reads the
|
|
17
|
-
* doc, confirms it still owns AND `now >= scheduledAt`, and atomically
|
|
18
|
-
* deletes. On lease handoff, the owner discovers it no longer owns and
|
|
19
|
-
* abandons silently.
|
|
20
|
-
*
|
|
21
|
-
* **Owner-local payload**: this backend tracks `pingCount`,
|
|
22
|
-
* `lastPingAt`, and `scheduledAt` only — not the payload. Cross-process
|
|
23
|
-
* latest-payload-wins is a deferred follow-up.
|
|
24
|
-
*/
|
|
25
|
-
import type { DebounceBackend, DebounceFinalizeResult, DebounceRegisterBackendOpts, DebounceRegisterBackendResult } from "./DebounceBackend";
|
|
26
|
-
export interface NatsKvDebounceConfig {
|
|
27
|
-
servers: string[];
|
|
28
|
-
token?: string;
|
|
29
|
-
user?: string;
|
|
30
|
-
pass?: string;
|
|
31
|
-
bucketName: string;
|
|
32
|
-
}
|
|
33
|
-
export declare function readNatsKvDebounceConfigFromEnv(): NatsKvDebounceConfig;
|
|
34
|
-
export declare class NatsKvDebounceBackend implements DebounceBackend {
|
|
35
|
-
readonly name = "nats-kv";
|
|
36
|
-
private nc;
|
|
37
|
-
private kv;
|
|
38
|
-
private readonly config;
|
|
39
|
-
private connected;
|
|
40
|
-
constructor(config?: Partial<NatsKvDebounceConfig>);
|
|
41
|
-
connect(): Promise<void>;
|
|
42
|
-
disconnect(): Promise<void>;
|
|
43
|
-
private bucketKey;
|
|
44
|
-
private encodeSegment;
|
|
45
|
-
private requireKv;
|
|
46
|
-
private computeScheduledAt;
|
|
47
|
-
registerPing(opts: DebounceRegisterBackendOpts): Promise<DebounceRegisterBackendResult>;
|
|
48
|
-
finalize(workflowName: string, debounceKey: string, runId: string, now: number): Promise<DebounceFinalizeResult>;
|
|
49
|
-
cancel(workflowName: string, debounceKey: string): Promise<boolean>;
|
|
50
|
-
purgeExpired(now: number): Promise<number>;
|
|
51
|
-
private safeGet;
|
|
52
|
-
private parseDoc;
|
|
53
|
-
}
|