@workflow/world-local 4.0.1-beta.7 → 4.1.0-beta.29
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/config.d.ts +15 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -9
- package/dist/config.js.map +1 -1
- package/dist/fs.d.ts +13 -0
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +108 -13
- package/dist/fs.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -9
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +91 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +263 -0
- package/dist/init.js.map +1 -0
- package/dist/instrumentObject.d.ts +8 -0
- package/dist/instrumentObject.d.ts.map +1 -0
- package/dist/instrumentObject.js +66 -0
- package/dist/instrumentObject.js.map +1 -0
- package/dist/queue.d.ts +2 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +84 -40
- package/dist/queue.js.map +1 -1
- package/dist/storage/events-storage.d.ts +7 -0
- package/dist/storage/events-storage.d.ts.map +1 -0
- package/dist/storage/events-storage.js +540 -0
- package/dist/storage/events-storage.js.map +1 -0
- package/dist/storage/filters.d.ts +26 -0
- package/dist/storage/filters.d.ts.map +1 -0
- package/dist/storage/filters.js +43 -0
- package/dist/storage/filters.js.map +1 -0
- package/dist/storage/helpers.d.ts +14 -0
- package/dist/storage/helpers.d.ts.map +1 -0
- package/dist/storage/helpers.js +34 -0
- package/dist/storage/helpers.js.map +1 -0
- package/dist/storage/hooks-storage.d.ts +12 -0
- package/dist/storage/hooks-storage.d.ts.map +1 -0
- package/dist/storage/hooks-storage.js +89 -0
- package/dist/storage/hooks-storage.js.map +1 -0
- package/dist/storage/index.d.ts +12 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +32 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/legacy.d.ts +13 -0
- package/dist/storage/legacy.d.ts.map +1 -0
- package/dist/storage/legacy.js +73 -0
- package/dist/storage/legacy.js.map +1 -0
- package/dist/storage/runs-storage.d.ts +7 -0
- package/dist/storage/runs-storage.d.ts.map +1 -0
- package/dist/storage/runs-storage.js +59 -0
- package/dist/storage/runs-storage.js.map +1 -0
- package/dist/storage/steps-storage.d.ts +7 -0
- package/dist/storage/steps-storage.d.ts.map +1 -0
- package/dist/storage/steps-storage.js +58 -0
- package/dist/storage/steps-storage.js.map +1 -0
- package/dist/storage.d.ts +9 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +8 -437
- package/dist/storage.js.map +1 -1
- package/dist/streamer.d.ts +1 -1
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +146 -22
- package/dist/streamer.js.map +1 -1
- package/dist/telemetry.d.ts +28 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +71 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/test-helpers.d.ts +43 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +89 -0
- package/dist/test-helpers.js.map +1 -0
- package/package.json +10 -9
package/dist/streamer.js
CHANGED
|
@@ -1,51 +1,138 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { monotonicFactory } from 'ulid';
|
|
4
|
-
import {
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { listJSONFiles, readBuffer, readJSON, write, writeJSON } from './fs.js';
|
|
5
6
|
// Create a monotonic ULID factory that ensures ULIDs are always increasing
|
|
6
7
|
// even when generated within the same millisecond
|
|
7
8
|
const monotonicUlid = monotonicFactory(() => Math.random());
|
|
9
|
+
// Schema for the run-to-streams mapping file
|
|
10
|
+
const RunStreamsSchema = z.object({
|
|
11
|
+
streams: z.array(z.string()),
|
|
12
|
+
});
|
|
8
13
|
export function serializeChunk(chunk) {
|
|
9
14
|
const eofByte = Buffer.from([chunk.eof ? 1 : 0]);
|
|
10
15
|
return Buffer.concat([eofByte, chunk.chunk]);
|
|
11
16
|
}
|
|
12
17
|
export function deserializeChunk(serialized) {
|
|
13
18
|
const eof = serialized[0] === 1;
|
|
14
|
-
|
|
19
|
+
// Create a copy instead of a view to prevent ArrayBuffer detachment
|
|
20
|
+
const chunk = Buffer.from(serialized.subarray(1));
|
|
15
21
|
return { eof, chunk };
|
|
16
22
|
}
|
|
17
23
|
export function createStreamer(basedir) {
|
|
18
24
|
const streamEmitter = new EventEmitter();
|
|
25
|
+
// Track which streams have already been registered for a run (in-memory cache)
|
|
26
|
+
const registeredStreams = new Set();
|
|
27
|
+
// Helper to record the runId <> streamId association
|
|
28
|
+
async function registerStreamForRun(runId, streamName) {
|
|
29
|
+
const cacheKey = `${runId}:${streamName}`;
|
|
30
|
+
if (registeredStreams.has(cacheKey)) {
|
|
31
|
+
return; // Already registered in this session
|
|
32
|
+
}
|
|
33
|
+
const runStreamsPath = path.join(basedir, 'streams', 'runs', `${runId}.json`);
|
|
34
|
+
// Read existing streams for this run
|
|
35
|
+
const existing = await readJSON(runStreamsPath, RunStreamsSchema);
|
|
36
|
+
const streams = existing?.streams ?? [];
|
|
37
|
+
// Add stream if not already present
|
|
38
|
+
if (!streams.includes(streamName)) {
|
|
39
|
+
streams.push(streamName);
|
|
40
|
+
await writeJSON(runStreamsPath, { streams }, { overwrite: true });
|
|
41
|
+
}
|
|
42
|
+
registeredStreams.add(cacheKey);
|
|
43
|
+
}
|
|
44
|
+
// Helper to convert a chunk to a Buffer
|
|
45
|
+
function toBuffer(chunk) {
|
|
46
|
+
if (typeof chunk === 'string') {
|
|
47
|
+
return Buffer.from(new TextEncoder().encode(chunk));
|
|
48
|
+
}
|
|
49
|
+
else if (chunk instanceof Buffer) {
|
|
50
|
+
return chunk;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return Buffer.from(chunk);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
19
56
|
return {
|
|
20
|
-
async writeToStream(name, chunk) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
57
|
+
async writeToStream(name, _runId, chunk) {
|
|
58
|
+
// Generate ULID synchronously BEFORE any await to preserve call order.
|
|
59
|
+
// This ensures that chunks written in sequence maintain their order even
|
|
60
|
+
// when runId is a promise that multiple writes are waiting on.
|
|
61
|
+
const chunkId = `chnk_${monotonicUlid()}`;
|
|
62
|
+
// Await runId if it's a promise to ensure proper flushing
|
|
63
|
+
const runId = await _runId;
|
|
64
|
+
// Register this stream for the run
|
|
65
|
+
await registerStreamForRun(runId, name);
|
|
66
|
+
// Convert chunk to buffer for serialization
|
|
67
|
+
const chunkBuffer = toBuffer(chunk);
|
|
25
68
|
const serialized = serializeChunk({
|
|
26
|
-
chunk:
|
|
69
|
+
chunk: chunkBuffer,
|
|
27
70
|
eof: false,
|
|
28
71
|
});
|
|
29
72
|
const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
|
|
30
73
|
await write(chunkPath, serialized);
|
|
31
|
-
// Emit real-time event
|
|
32
|
-
const chunkData =
|
|
33
|
-
? new TextEncoder().encode(chunk)
|
|
34
|
-
: chunk instanceof Buffer
|
|
35
|
-
? new Uint8Array(chunk)
|
|
36
|
-
: chunk;
|
|
74
|
+
// Emit real-time event with Uint8Array (create copy to prevent ArrayBuffer detachment)
|
|
75
|
+
const chunkData = Uint8Array.from(chunkBuffer);
|
|
37
76
|
streamEmitter.emit(`chunk:${name}`, {
|
|
38
77
|
streamName: name,
|
|
39
78
|
chunkData,
|
|
40
79
|
chunkId,
|
|
41
80
|
});
|
|
42
81
|
},
|
|
43
|
-
async
|
|
44
|
-
|
|
82
|
+
async writeToStreamMulti(name, _runId, chunks) {
|
|
83
|
+
if (chunks.length === 0)
|
|
84
|
+
return;
|
|
85
|
+
// Generate all ULIDs synchronously BEFORE any await to preserve call order.
|
|
86
|
+
// This ensures that chunks maintain their order even when runId is a promise.
|
|
87
|
+
const chunkIds = chunks.map(() => `chnk_${monotonicUlid()}`);
|
|
88
|
+
// Await runId if it's a promise
|
|
89
|
+
const runId = await _runId;
|
|
90
|
+
// Register this stream for the run
|
|
91
|
+
await registerStreamForRun(runId, name);
|
|
92
|
+
// Prepare chunk data for parallel writes
|
|
93
|
+
const chunkBuffers = chunks.map((chunk) => toBuffer(chunk));
|
|
94
|
+
// Write all chunks in parallel for efficiency, but track individual completion
|
|
95
|
+
const writePromises = chunkBuffers.map(async (chunkBuffer, i) => {
|
|
96
|
+
const chunkId = chunkIds[i];
|
|
97
|
+
const serialized = serializeChunk({
|
|
98
|
+
chunk: chunkBuffer,
|
|
99
|
+
eof: false,
|
|
100
|
+
});
|
|
101
|
+
const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
|
|
102
|
+
await write(chunkPath, serialized);
|
|
103
|
+
// Return data needed for event emission
|
|
104
|
+
return {
|
|
105
|
+
chunkId,
|
|
106
|
+
chunkData: Uint8Array.from(chunkBuffer),
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
// Emit events in order, waiting for each chunk's write to complete
|
|
110
|
+
// This ensures events are emitted in order while writes happen in parallel
|
|
111
|
+
for (const writePromise of writePromises) {
|
|
112
|
+
const { chunkId, chunkData } = await writePromise;
|
|
113
|
+
streamEmitter.emit(`chunk:${name}`, {
|
|
114
|
+
streamName: name,
|
|
115
|
+
chunkData,
|
|
116
|
+
chunkId,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
async closeStream(name, _runId) {
|
|
121
|
+
// Generate ULID synchronously BEFORE any await to preserve call order.
|
|
122
|
+
const chunkId = `chnk_${monotonicUlid()}`;
|
|
123
|
+
// Await runId if it's a promise to ensure proper flushing
|
|
124
|
+
const runId = await _runId;
|
|
125
|
+
// Register this stream for the run (in case writeToStream wasn't called)
|
|
126
|
+
await registerStreamForRun(runId, name);
|
|
45
127
|
const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
|
|
46
128
|
await write(chunkPath, serializeChunk({ chunk: Buffer.from([]), eof: true }));
|
|
47
129
|
streamEmitter.emit(`close:${name}`, { streamName: name });
|
|
48
130
|
},
|
|
131
|
+
async listStreamsByRunId(runId) {
|
|
132
|
+
const runStreamsPath = path.join(basedir, 'streams', 'runs', `${runId}.json`);
|
|
133
|
+
const data = await readJSON(runStreamsPath, RunStreamsSchema);
|
|
134
|
+
return data?.streams ?? [];
|
|
135
|
+
},
|
|
49
136
|
async readFromStream(name, startIndex = 0) {
|
|
50
137
|
const chunksDir = path.join(basedir, 'streams', 'chunks');
|
|
51
138
|
let removeListeners = () => { };
|
|
@@ -56,25 +143,44 @@ export function createStreamer(basedir) {
|
|
|
56
143
|
// Buffer for chunks that arrive via events during disk reading
|
|
57
144
|
const bufferedEventChunks = [];
|
|
58
145
|
let isReadingFromDisk = true;
|
|
146
|
+
// Buffer close event if it arrives during disk reading
|
|
147
|
+
let pendingClose = false;
|
|
59
148
|
const chunkListener = (event) => {
|
|
60
149
|
deliveredChunkIds.add(event.chunkId);
|
|
150
|
+
// Skip empty chunks to maintain consistency with disk reading behavior
|
|
151
|
+
// Empty chunks are not enqueued when read from disk (see line 184-186)
|
|
152
|
+
if (event.chunkData.byteLength === 0) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
61
155
|
if (isReadingFromDisk) {
|
|
62
156
|
// Buffer chunks that arrive during disk reading to maintain order
|
|
157
|
+
// Create a copy to prevent ArrayBuffer detachment when enqueued later
|
|
63
158
|
bufferedEventChunks.push({
|
|
64
159
|
chunkId: event.chunkId,
|
|
65
|
-
chunkData: event.chunkData,
|
|
160
|
+
chunkData: Uint8Array.from(event.chunkData),
|
|
66
161
|
});
|
|
67
162
|
}
|
|
68
163
|
else {
|
|
69
164
|
// After disk reading is complete, deliver chunks immediately
|
|
70
|
-
|
|
165
|
+
// Create a copy to prevent ArrayBuffer detachment
|
|
166
|
+
controller.enqueue(Uint8Array.from(event.chunkData));
|
|
71
167
|
}
|
|
72
168
|
};
|
|
73
169
|
const closeListener = () => {
|
|
170
|
+
// Buffer close event if disk reading is still in progress
|
|
171
|
+
if (isReadingFromDisk) {
|
|
172
|
+
pendingClose = true;
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
74
175
|
// Remove listeners before closing
|
|
75
176
|
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
76
177
|
streamEmitter.off(`close:${name}`, closeListener);
|
|
77
|
-
|
|
178
|
+
try {
|
|
179
|
+
controller.close();
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Ignore if controller is already closed (e.g., from cancel() or EOF)
|
|
183
|
+
}
|
|
78
184
|
};
|
|
79
185
|
removeListeners = closeListener;
|
|
80
186
|
// Set up listeners FIRST to avoid missing events
|
|
@@ -101,7 +207,8 @@ export function createStreamer(basedir) {
|
|
|
101
207
|
break;
|
|
102
208
|
}
|
|
103
209
|
if (chunk.chunk.byteLength) {
|
|
104
|
-
|
|
210
|
+
// Create a copy to prevent ArrayBuffer detachment
|
|
211
|
+
controller.enqueue(Uint8Array.from(chunk.chunk));
|
|
105
212
|
}
|
|
106
213
|
}
|
|
107
214
|
// Finished reading from disk - now deliver buffered event chunks in chronological order
|
|
@@ -109,13 +216,30 @@ export function createStreamer(basedir) {
|
|
|
109
216
|
// Sort buffered chunks by ULID (chronological order)
|
|
110
217
|
bufferedEventChunks.sort((a, b) => a.chunkId.localeCompare(b.chunkId));
|
|
111
218
|
for (const buffered of bufferedEventChunks) {
|
|
112
|
-
|
|
219
|
+
// Create a copy for defense in depth (already copied at storage, but be extra safe)
|
|
220
|
+
controller.enqueue(Uint8Array.from(buffered.chunkData));
|
|
113
221
|
}
|
|
114
222
|
if (isComplete) {
|
|
115
223
|
removeListeners();
|
|
116
|
-
|
|
224
|
+
try {
|
|
225
|
+
controller.close();
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Ignore if controller is already closed (e.g., from closeListener event)
|
|
229
|
+
}
|
|
117
230
|
return;
|
|
118
231
|
}
|
|
232
|
+
// Process any pending close event that arrived during disk reading
|
|
233
|
+
if (pendingClose) {
|
|
234
|
+
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
235
|
+
streamEmitter.off(`close:${name}`, closeListener);
|
|
236
|
+
try {
|
|
237
|
+
controller.close();
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Ignore if controller is already closed
|
|
241
|
+
}
|
|
242
|
+
}
|
|
119
243
|
},
|
|
120
244
|
cancel() {
|
|
121
245
|
removeListeners();
|
package/dist/streamer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Span, SpanKind, SpanOptions } from '@opentelemetry/api';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap an async function with a trace span.
|
|
4
|
+
* No-op if OpenTelemetry is not available.
|
|
5
|
+
*/
|
|
6
|
+
export declare function trace<T>(spanName: string, ...args: [fn: (span?: Span) => Promise<T>] | [opts: SpanOptions, fn: (span?: Span) => Promise<T>]): Promise<T>;
|
|
7
|
+
/**
|
|
8
|
+
* Get SpanKind enum value by name.
|
|
9
|
+
* Returns undefined if OpenTelemetry is not available.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSpanKind(field: keyof typeof SpanKind): Promise<SpanKind | undefined>;
|
|
12
|
+
/** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
|
|
13
|
+
export declare const PeerService: (value: string) => {
|
|
14
|
+
[k: string]: string;
|
|
15
|
+
};
|
|
16
|
+
/** RPC system identifier (standard OTEL: rpc.system) */
|
|
17
|
+
export declare const RpcSystem: (value: string) => {
|
|
18
|
+
[k: string]: string;
|
|
19
|
+
};
|
|
20
|
+
/** RPC service name (standard OTEL: rpc.service) */
|
|
21
|
+
export declare const RpcService: (value: string) => {
|
|
22
|
+
[k: string]: string;
|
|
23
|
+
};
|
|
24
|
+
/** RPC method name (standard OTEL: rpc.method) */
|
|
25
|
+
export declare const RpcMethod: (value: string) => {
|
|
26
|
+
[k: string]: string;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuBtE;;;GAGG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,IAAI,EACH,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACjC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,OAAO,QAAQ,GAC3B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAI/B;AASD,wFAAwF;AACxF,eAAO,MAAM,WAAW;;CAA6C,CAAC;AAEtE,wDAAwD;AACxD,eAAO,MAAM,SAAS;;CAA2C,CAAC;AAElE,oDAAoD;AACpD,eAAO,MAAM,UAAU;;CAA4C,CAAC;AAEpE,kDAAkD;AAClD,eAAO,MAAM,SAAS;;CAA2C,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Lazy load OpenTelemetry API to make it optional
|
|
2
|
+
let otelApiPromise = null;
|
|
3
|
+
async function getOtelApi() {
|
|
4
|
+
if (!otelApiPromise) {
|
|
5
|
+
otelApiPromise = import('@opentelemetry/api').catch(() => null);
|
|
6
|
+
}
|
|
7
|
+
return otelApiPromise;
|
|
8
|
+
}
|
|
9
|
+
let tracerPromise = null;
|
|
10
|
+
async function getTracer() {
|
|
11
|
+
if (!tracerPromise) {
|
|
12
|
+
tracerPromise = getOtelApi().then((otel) => otel ? otel.trace.getTracer('workflow') : null);
|
|
13
|
+
}
|
|
14
|
+
return tracerPromise;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Wrap an async function with a trace span.
|
|
18
|
+
* No-op if OpenTelemetry is not available.
|
|
19
|
+
*/
|
|
20
|
+
export async function trace(spanName, ...args) {
|
|
21
|
+
const [tracer, otel] = await Promise.all([getTracer(), getOtelApi()]);
|
|
22
|
+
const { fn, opts } = typeof args[0] === 'function'
|
|
23
|
+
? { fn: args[0], opts: {} }
|
|
24
|
+
: { fn: args[1], opts: args[0] };
|
|
25
|
+
if (!fn)
|
|
26
|
+
throw new Error('Function to trace must be provided');
|
|
27
|
+
if (!tracer || !otel) {
|
|
28
|
+
return await fn();
|
|
29
|
+
}
|
|
30
|
+
return tracer.startActiveSpan(spanName, opts, async (span) => {
|
|
31
|
+
try {
|
|
32
|
+
const result = await fn(span);
|
|
33
|
+
span.setStatus({ code: otel.SpanStatusCode.OK });
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
span.setStatus({
|
|
38
|
+
code: otel.SpanStatusCode.ERROR,
|
|
39
|
+
message: e.message,
|
|
40
|
+
});
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
span.end();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get SpanKind enum value by name.
|
|
50
|
+
* Returns undefined if OpenTelemetry is not available.
|
|
51
|
+
*/
|
|
52
|
+
export async function getSpanKind(field) {
|
|
53
|
+
const otel = await getOtelApi();
|
|
54
|
+
if (!otel)
|
|
55
|
+
return undefined;
|
|
56
|
+
return otel.SpanKind[field];
|
|
57
|
+
}
|
|
58
|
+
// Semantic conventions for World/Storage tracing
|
|
59
|
+
// Standard OTEL conventions for peer service mapping
|
|
60
|
+
function SemanticConvention(...names) {
|
|
61
|
+
return (value) => Object.fromEntries(names.map((name) => [name, value]));
|
|
62
|
+
}
|
|
63
|
+
/** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
|
|
64
|
+
export const PeerService = SemanticConvention('peer.service');
|
|
65
|
+
/** RPC system identifier (standard OTEL: rpc.system) */
|
|
66
|
+
export const RpcSystem = SemanticConvention('rpc.system');
|
|
67
|
+
/** RPC service name (standard OTEL: rpc.service) */
|
|
68
|
+
export const RpcService = SemanticConvention('rpc.service');
|
|
69
|
+
/** RPC method name (standard OTEL: rpc.method) */
|
|
70
|
+
export const RpcMethod = SemanticConvention('rpc.method');
|
|
71
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Hook, SerializedData, Step, Storage, WorkflowRun } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Test helper functions for creating and updating storage entities through events.
|
|
4
|
+
* These helpers simplify test setup by providing a convenient API for common operations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new workflow run through the run_created event.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createRun(storage: Storage, data: {
|
|
10
|
+
deploymentId: string;
|
|
11
|
+
workflowName: string;
|
|
12
|
+
input: SerializedData;
|
|
13
|
+
executionContext?: Record<string, unknown>;
|
|
14
|
+
}): Promise<WorkflowRun>;
|
|
15
|
+
/**
|
|
16
|
+
* Update a workflow run's status through lifecycle events.
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateRun(storage: Storage, runId: string, eventType: 'run_started' | 'run_completed' | 'run_failed', eventData?: Record<string, unknown>): Promise<WorkflowRun>;
|
|
19
|
+
/**
|
|
20
|
+
* Create a new step through the step_created event.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createStep(storage: Storage, runId: string, data: {
|
|
23
|
+
stepId: string;
|
|
24
|
+
stepName: string;
|
|
25
|
+
input: SerializedData;
|
|
26
|
+
}): Promise<Step>;
|
|
27
|
+
/**
|
|
28
|
+
* Update a step's status through lifecycle events.
|
|
29
|
+
*/
|
|
30
|
+
export declare function updateStep(storage: Storage, runId: string, stepId: string, eventType: 'step_started' | 'step_completed' | 'step_failed', eventData?: Record<string, unknown>): Promise<Step>;
|
|
31
|
+
/**
|
|
32
|
+
* Create a new hook through the hook_created event.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createHook(storage: Storage, runId: string, data: {
|
|
35
|
+
hookId: string;
|
|
36
|
+
token: string;
|
|
37
|
+
metadata?: SerializedData;
|
|
38
|
+
}): Promise<Hook>;
|
|
39
|
+
/**
|
|
40
|
+
* Dispose a hook through the hook_disposed event.
|
|
41
|
+
*/
|
|
42
|
+
export declare function disposeHook(storage: Storage, runId: string, hookId: string): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,OAAO,EACP,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AAEH;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,GACA,OAAO,CAAC,WAAW,CAAC,CAUtB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,aAAa,GAAG,eAAe,GAAG,YAAY,EACzD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,CAUtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa,EAC5D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { SPEC_VERSION_CURRENT } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Test helper functions for creating and updating storage entities through events.
|
|
4
|
+
* These helpers simplify test setup by providing a convenient API for common operations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new workflow run through the run_created event.
|
|
8
|
+
*/
|
|
9
|
+
export async function createRun(storage, data) {
|
|
10
|
+
const result = await storage.events.create(null, {
|
|
11
|
+
eventType: 'run_created',
|
|
12
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
13
|
+
eventData: data,
|
|
14
|
+
});
|
|
15
|
+
if (!result.run) {
|
|
16
|
+
throw new Error('Expected run to be created');
|
|
17
|
+
}
|
|
18
|
+
return result.run;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Update a workflow run's status through lifecycle events.
|
|
22
|
+
*/
|
|
23
|
+
export async function updateRun(storage, runId, eventType, eventData) {
|
|
24
|
+
const result = await storage.events.create(runId, {
|
|
25
|
+
eventType,
|
|
26
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
27
|
+
eventData,
|
|
28
|
+
});
|
|
29
|
+
if (!result.run) {
|
|
30
|
+
throw new Error('Expected run to be updated');
|
|
31
|
+
}
|
|
32
|
+
return result.run;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a new step through the step_created event.
|
|
36
|
+
*/
|
|
37
|
+
export async function createStep(storage, runId, data) {
|
|
38
|
+
const result = await storage.events.create(runId, {
|
|
39
|
+
eventType: 'step_created',
|
|
40
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
41
|
+
correlationId: data.stepId,
|
|
42
|
+
eventData: { stepName: data.stepName, input: data.input },
|
|
43
|
+
});
|
|
44
|
+
if (!result.step) {
|
|
45
|
+
throw new Error('Expected step to be created');
|
|
46
|
+
}
|
|
47
|
+
return result.step;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update a step's status through lifecycle events.
|
|
51
|
+
*/
|
|
52
|
+
export async function updateStep(storage, runId, stepId, eventType, eventData) {
|
|
53
|
+
const result = await storage.events.create(runId, {
|
|
54
|
+
eventType,
|
|
55
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
56
|
+
correlationId: stepId,
|
|
57
|
+
eventData,
|
|
58
|
+
});
|
|
59
|
+
if (!result.step) {
|
|
60
|
+
throw new Error('Expected step to be updated');
|
|
61
|
+
}
|
|
62
|
+
return result.step;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a new hook through the hook_created event.
|
|
66
|
+
*/
|
|
67
|
+
export async function createHook(storage, runId, data) {
|
|
68
|
+
const result = await storage.events.create(runId, {
|
|
69
|
+
eventType: 'hook_created',
|
|
70
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
71
|
+
correlationId: data.hookId,
|
|
72
|
+
eventData: { token: data.token, metadata: data.metadata },
|
|
73
|
+
});
|
|
74
|
+
if (!result.hook) {
|
|
75
|
+
throw new Error('Expected hook to be created');
|
|
76
|
+
}
|
|
77
|
+
return result.hook;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Dispose a hook through the hook_disposed event.
|
|
81
|
+
*/
|
|
82
|
+
export async function disposeHook(storage, runId, hookId) {
|
|
83
|
+
await storage.events.create(runId, {
|
|
84
|
+
eventType: 'hook_disposed',
|
|
85
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
86
|
+
correlationId: hookId,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/world-local",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0-beta.29",
|
|
4
4
|
"description": "Local development World implementation for Workflow DevKit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,20 +23,21 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@vercel/queue": "0.0.0-alpha.
|
|
27
|
-
"
|
|
28
|
-
"
|
|
26
|
+
"@vercel/queue": "0.0.0-alpha.36",
|
|
27
|
+
"async-sema": "3.1.1",
|
|
28
|
+
"ulid": "3.0.1",
|
|
29
|
+
"undici": "6.22.0",
|
|
29
30
|
"zod": "4.1.11",
|
|
30
|
-
"@workflow/
|
|
31
|
-
"@workflow/
|
|
31
|
+
"@workflow/errors": "4.1.0-beta.14",
|
|
32
|
+
"@workflow/utils": "4.1.0-beta.11",
|
|
33
|
+
"@workflow/world": "4.1.0-beta.2"
|
|
32
34
|
},
|
|
33
35
|
"devDependencies": {
|
|
34
|
-
"@opentelemetry/api": "
|
|
35
|
-
"@types/ms": "
|
|
36
|
+
"@opentelemetry/api": "1.9.0",
|
|
37
|
+
"@types/ms": "0.7.34",
|
|
36
38
|
"@types/node": "22.19.0",
|
|
37
39
|
"ms": "2.1.3",
|
|
38
40
|
"vitest": "^3.2.4",
|
|
39
|
-
"@workflow/errors": "4.0.1-beta.4",
|
|
40
41
|
"@workflow/tsconfig": "4.0.1-beta.0"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|