@workflow/world-local 4.0.1-beta.6 → 4.1.0-beta.28
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 +109 -14
- 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/queue.d.ts +2 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +83 -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 +527 -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 +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +20 -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 +10 -421
- 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 +103 -20
- package/dist/streamer.js.map +1 -1
- 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,97 @@
|
|
|
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
|
+
}
|
|
19
44
|
return {
|
|
20
|
-
async writeToStream(name, chunk) {
|
|
21
|
-
|
|
45
|
+
async writeToStream(name, _runId, chunk) {
|
|
46
|
+
// Generate ULID synchronously BEFORE any await to preserve call order.
|
|
47
|
+
// This ensures that chunks written in sequence maintain their order even
|
|
48
|
+
// when runId is a promise that multiple writes are waiting on.
|
|
49
|
+
const chunkId = `chnk_${monotonicUlid()}`;
|
|
50
|
+
// Await runId if it's a promise to ensure proper flushing
|
|
51
|
+
const runId = await _runId;
|
|
52
|
+
// Register this stream for the run
|
|
53
|
+
await registerStreamForRun(runId, name);
|
|
54
|
+
// Convert chunk to buffer for serialization
|
|
55
|
+
let chunkBuffer;
|
|
22
56
|
if (typeof chunk === 'string') {
|
|
23
|
-
|
|
57
|
+
chunkBuffer = Buffer.from(new TextEncoder().encode(chunk));
|
|
58
|
+
}
|
|
59
|
+
else if (chunk instanceof Buffer) {
|
|
60
|
+
chunkBuffer = chunk;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
chunkBuffer = Buffer.from(chunk);
|
|
24
64
|
}
|
|
25
65
|
const serialized = serializeChunk({
|
|
26
|
-
chunk:
|
|
66
|
+
chunk: chunkBuffer,
|
|
27
67
|
eof: false,
|
|
28
68
|
});
|
|
29
69
|
const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
|
|
30
70
|
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;
|
|
71
|
+
// Emit real-time event with Uint8Array (create copy to prevent ArrayBuffer detachment)
|
|
72
|
+
const chunkData = Uint8Array.from(chunkBuffer);
|
|
37
73
|
streamEmitter.emit(`chunk:${name}`, {
|
|
38
74
|
streamName: name,
|
|
39
75
|
chunkData,
|
|
40
76
|
chunkId,
|
|
41
77
|
});
|
|
42
78
|
},
|
|
43
|
-
async closeStream(name) {
|
|
44
|
-
|
|
79
|
+
async closeStream(name, _runId) {
|
|
80
|
+
// Generate ULID synchronously BEFORE any await to preserve call order.
|
|
81
|
+
const chunkId = `chnk_${monotonicUlid()}`;
|
|
82
|
+
// Await runId if it's a promise to ensure proper flushing
|
|
83
|
+
const runId = await _runId;
|
|
84
|
+
// Register this stream for the run (in case writeToStream wasn't called)
|
|
85
|
+
await registerStreamForRun(runId, name);
|
|
45
86
|
const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
|
|
46
87
|
await write(chunkPath, serializeChunk({ chunk: Buffer.from([]), eof: true }));
|
|
47
88
|
streamEmitter.emit(`close:${name}`, { streamName: name });
|
|
48
89
|
},
|
|
90
|
+
async listStreamsByRunId(runId) {
|
|
91
|
+
const runStreamsPath = path.join(basedir, 'streams', 'runs', `${runId}.json`);
|
|
92
|
+
const data = await readJSON(runStreamsPath, RunStreamsSchema);
|
|
93
|
+
return data?.streams ?? [];
|
|
94
|
+
},
|
|
49
95
|
async readFromStream(name, startIndex = 0) {
|
|
50
96
|
const chunksDir = path.join(basedir, 'streams', 'chunks');
|
|
51
97
|
let removeListeners = () => { };
|
|
@@ -56,25 +102,44 @@ export function createStreamer(basedir) {
|
|
|
56
102
|
// Buffer for chunks that arrive via events during disk reading
|
|
57
103
|
const bufferedEventChunks = [];
|
|
58
104
|
let isReadingFromDisk = true;
|
|
105
|
+
// Buffer close event if it arrives during disk reading
|
|
106
|
+
let pendingClose = false;
|
|
59
107
|
const chunkListener = (event) => {
|
|
60
108
|
deliveredChunkIds.add(event.chunkId);
|
|
109
|
+
// Skip empty chunks to maintain consistency with disk reading behavior
|
|
110
|
+
// Empty chunks are not enqueued when read from disk (see line 184-186)
|
|
111
|
+
if (event.chunkData.byteLength === 0) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
61
114
|
if (isReadingFromDisk) {
|
|
62
115
|
// Buffer chunks that arrive during disk reading to maintain order
|
|
116
|
+
// Create a copy to prevent ArrayBuffer detachment when enqueued later
|
|
63
117
|
bufferedEventChunks.push({
|
|
64
118
|
chunkId: event.chunkId,
|
|
65
|
-
chunkData: event.chunkData,
|
|
119
|
+
chunkData: Uint8Array.from(event.chunkData),
|
|
66
120
|
});
|
|
67
121
|
}
|
|
68
122
|
else {
|
|
69
123
|
// After disk reading is complete, deliver chunks immediately
|
|
70
|
-
|
|
124
|
+
// Create a copy to prevent ArrayBuffer detachment
|
|
125
|
+
controller.enqueue(Uint8Array.from(event.chunkData));
|
|
71
126
|
}
|
|
72
127
|
};
|
|
73
128
|
const closeListener = () => {
|
|
129
|
+
// Buffer close event if disk reading is still in progress
|
|
130
|
+
if (isReadingFromDisk) {
|
|
131
|
+
pendingClose = true;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
74
134
|
// Remove listeners before closing
|
|
75
135
|
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
76
136
|
streamEmitter.off(`close:${name}`, closeListener);
|
|
77
|
-
|
|
137
|
+
try {
|
|
138
|
+
controller.close();
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore if controller is already closed (e.g., from cancel() or EOF)
|
|
142
|
+
}
|
|
78
143
|
};
|
|
79
144
|
removeListeners = closeListener;
|
|
80
145
|
// Set up listeners FIRST to avoid missing events
|
|
@@ -101,7 +166,8 @@ export function createStreamer(basedir) {
|
|
|
101
166
|
break;
|
|
102
167
|
}
|
|
103
168
|
if (chunk.chunk.byteLength) {
|
|
104
|
-
|
|
169
|
+
// Create a copy to prevent ArrayBuffer detachment
|
|
170
|
+
controller.enqueue(Uint8Array.from(chunk.chunk));
|
|
105
171
|
}
|
|
106
172
|
}
|
|
107
173
|
// Finished reading from disk - now deliver buffered event chunks in chronological order
|
|
@@ -109,13 +175,30 @@ export function createStreamer(basedir) {
|
|
|
109
175
|
// Sort buffered chunks by ULID (chronological order)
|
|
110
176
|
bufferedEventChunks.sort((a, b) => a.chunkId.localeCompare(b.chunkId));
|
|
111
177
|
for (const buffered of bufferedEventChunks) {
|
|
112
|
-
|
|
178
|
+
// Create a copy for defense in depth (already copied at storage, but be extra safe)
|
|
179
|
+
controller.enqueue(Uint8Array.from(buffered.chunkData));
|
|
113
180
|
}
|
|
114
181
|
if (isComplete) {
|
|
115
182
|
removeListeners();
|
|
116
|
-
|
|
183
|
+
try {
|
|
184
|
+
controller.close();
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Ignore if controller is already closed (e.g., from closeListener event)
|
|
188
|
+
}
|
|
117
189
|
return;
|
|
118
190
|
}
|
|
191
|
+
// Process any pending close event that arrived during disk reading
|
|
192
|
+
if (pendingClose) {
|
|
193
|
+
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
194
|
+
streamEmitter.off(`close:${name}`, closeListener);
|
|
195
|
+
try {
|
|
196
|
+
controller.close();
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// Ignore if controller is already closed
|
|
200
|
+
}
|
|
201
|
+
}
|
|
119
202
|
},
|
|
120
203
|
cancel() {
|
|
121
204
|
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,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.28",
|
|
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.34",
|
|
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.1"
|
|
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": {
|