@workflow/world-local 5.0.0-beta.2 → 5.0.0-beta.20
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 +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/fs.d.ts +64 -5
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +148 -19
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -9
- package/dist/init.js +1 -1
- package/dist/instrumentObject.d.ts.map +1 -1
- package/dist/instrumentObject.js +69 -3
- package/dist/queue.d.ts +2 -2
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +64 -12
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +1393 -601
- package/dist/storage/filters.js +1 -1
- package/dist/storage/helpers.d.ts +13 -0
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +23 -1
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +11 -4
- package/dist/storage/index.d.ts +10 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +9 -11
- package/dist/storage/legacy.d.ts.map +1 -1
- package/dist/storage/legacy.js +10 -5
- package/dist/storage/runs-storage.d.ts +29 -3
- package/dist/storage/runs-storage.d.ts.map +1 -1
- package/dist/storage/runs-storage.js +76 -4
- package/dist/storage/steps-storage.d.ts.map +1 -1
- package/dist/storage/steps-storage.js +5 -2
- package/dist/storage.js +1 -1
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +45 -32
- package/dist/telemetry.d.ts +8 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +5 -1
- package/dist/test-helpers.d.ts +1 -0
- package/dist/test-helpers.d.ts.map +1 -1
- package/dist/test-helpers.js +1 -1
- package/dist/util.js +1 -1
- package/package.json +6 -6
- package/dist/config.js.map +0 -1
- package/dist/fs.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.js.map +0 -1
- package/dist/instrumentObject.js.map +0 -1
- package/dist/queue.js.map +0 -1
- package/dist/storage/events-storage.js.map +0 -1
- package/dist/storage/filters.js.map +0 -1
- package/dist/storage/helpers.js.map +0 -1
- package/dist/storage/hooks-storage.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/legacy.js.map +0 -1
- package/dist/storage/runs-storage.js.map +0 -1
- package/dist/storage/steps-storage.js.map +0 -1
- package/dist/storage.js.map +0 -1
- package/dist/streamer.js.map +0 -1
- package/dist/telemetry.js.map +0 -1
- package/dist/test-helpers.js.map +0 -1
- package/dist/util.js.map +0 -1
package/dist/streamer.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { monotonicFactory } from 'ulid';
|
|
4
5
|
import { z } from 'zod';
|
|
5
|
-
import {
|
|
6
|
+
import { assertSafeEntityId, readBuffer, readFirstByte, readJSONWithFallback, taggedPath, write, writeJSON, } from './fs.js';
|
|
6
7
|
// Create a monotonic ULID factory that ensures ULIDs are always increasing
|
|
7
8
|
// even when generated within the same millisecond
|
|
8
9
|
const monotonicUlid = monotonicFactory(() => Math.random());
|
|
@@ -10,46 +11,59 @@ const monotonicUlid = monotonicFactory(() => Math.random());
|
|
|
10
11
|
const RunStreamsSchema = z.object({
|
|
11
12
|
streams: z.array(z.string()),
|
|
12
13
|
});
|
|
14
|
+
const EOF_MARKER = 1;
|
|
15
|
+
function isEofByte(byte) {
|
|
16
|
+
return byte === EOF_MARKER;
|
|
17
|
+
}
|
|
13
18
|
export function serializeChunk(chunk) {
|
|
14
|
-
const eofByte = Buffer.from([chunk.eof ?
|
|
19
|
+
const eofByte = Buffer.from([chunk.eof ? EOF_MARKER : 0]);
|
|
15
20
|
return Buffer.concat([eofByte, chunk.chunk]);
|
|
16
21
|
}
|
|
17
22
|
/** Check only the EOF flag byte without copying chunk payload. */
|
|
18
23
|
export function isEofChunk(serialized) {
|
|
19
|
-
return serialized[0]
|
|
24
|
+
return isEofByte(serialized[0]);
|
|
20
25
|
}
|
|
21
26
|
export function deserializeChunk(serialized) {
|
|
22
|
-
const eof = serialized
|
|
27
|
+
const eof = isEofChunk(serialized);
|
|
23
28
|
// Create a copy instead of a view to prevent ArrayBuffer detachment
|
|
24
29
|
const chunk = Buffer.from(serialized.subarray(1));
|
|
25
30
|
return { eof, chunk };
|
|
26
31
|
}
|
|
32
|
+
async function listChunkEntries(chunksDir) {
|
|
33
|
+
try {
|
|
34
|
+
return await fs.readdir(chunksDir);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error.code === 'ENOENT')
|
|
38
|
+
return [];
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function addChunkFilesByExtension(extMap, entries, sourceExtension, fileExtension = sourceExtension, include = () => true) {
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (!entry.endsWith(sourceExtension))
|
|
45
|
+
continue;
|
|
46
|
+
const file = entry.slice(0, -sourceExtension.length);
|
|
47
|
+
if (include(file))
|
|
48
|
+
extMap.set(file, fileExtension);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
27
51
|
/**
|
|
28
52
|
* List chunk files for a stream, sorted chronologically (ULID order).
|
|
29
53
|
* Returns both the sorted file names and a map of file → extension for
|
|
30
54
|
* resolving the full path. Handles tagged and legacy (.json) formats.
|
|
31
55
|
*/
|
|
32
56
|
async function listChunkFilesForStream(chunksDir, name, tag) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
];
|
|
37
|
-
if (tag) {
|
|
38
|
-
listPromises.push(listFilesByExtension(chunksDir, `.${tag}.bin`));
|
|
39
|
-
}
|
|
40
|
-
const [binFiles, jsonFiles, ...taggedResults] = await Promise.all(listPromises);
|
|
41
|
-
const taggedBinFiles = taggedResults[0] ?? [];
|
|
57
|
+
// Name is used as a filename prefix below; validate it can't escape chunksDir.
|
|
58
|
+
assertSafeEntityId('streamName', name);
|
|
59
|
+
const entries = await listChunkEntries(chunksDir);
|
|
42
60
|
const extMap = new Map();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
continue;
|
|
49
|
-
extMap.set(f, '.bin');
|
|
61
|
+
addChunkFilesByExtension(extMap, entries, '.json');
|
|
62
|
+
addChunkFilesByExtension(extMap, entries, '.bin', '.bin', tag ? (file) => !file.endsWith(`.${tag}`) : undefined);
|
|
63
|
+
if (tag) {
|
|
64
|
+
const taggedExtension = `.${tag}.bin`;
|
|
65
|
+
addChunkFilesByExtension(extMap, entries, taggedExtension);
|
|
50
66
|
}
|
|
51
|
-
for (const f of taggedBinFiles)
|
|
52
|
-
extMap.set(f, `.${tag}.bin`);
|
|
53
67
|
const files = [...extMap.keys()]
|
|
54
68
|
.filter((file) => file.startsWith(`${name}-`))
|
|
55
69
|
.sort();
|
|
@@ -62,6 +76,8 @@ export function createStreamer(basedir, tag) {
|
|
|
62
76
|
const registeredStreams = new Set();
|
|
63
77
|
// Helper to record the runId <> streamId association
|
|
64
78
|
async function registerStreamForRun(runId, streamName) {
|
|
79
|
+
assertSafeEntityId('runId', runId);
|
|
80
|
+
assertSafeEntityId('streamName', streamName);
|
|
65
81
|
const cacheKey = `${runId}:${streamName}`;
|
|
66
82
|
if (registeredStreams.has(cacheKey)) {
|
|
67
83
|
return; // Already registered in this session
|
|
@@ -166,6 +182,7 @@ export function createStreamer(basedir, tag) {
|
|
|
166
182
|
streamEmitter.emit(`close:${name}`, { streamName: name });
|
|
167
183
|
},
|
|
168
184
|
async list(runId) {
|
|
185
|
+
assertSafeEntityId('runId', runId);
|
|
169
186
|
const data = await readJSONWithFallback(basedir, 'streams/runs', runId, RunStreamsSchema, tag);
|
|
170
187
|
return data?.streams ?? [];
|
|
171
188
|
},
|
|
@@ -194,7 +211,7 @@ export function createStreamer(basedir, tag) {
|
|
|
194
211
|
const filePath = path.join(chunksDir, `${file}${ext}`);
|
|
195
212
|
// Before the cursor: only need to check EOF (1 byte), skip content
|
|
196
213
|
if (dataIndex < startIndex) {
|
|
197
|
-
if (
|
|
214
|
+
if (isEofByte(await readFirstByte(filePath))) {
|
|
198
215
|
streamDone = true;
|
|
199
216
|
break;
|
|
200
217
|
}
|
|
@@ -203,7 +220,7 @@ export function createStreamer(basedir, tag) {
|
|
|
203
220
|
}
|
|
204
221
|
// Collected enough data chunks — peek at the next file for EOF/hasMore
|
|
205
222
|
if (resultChunks.length >= limit) {
|
|
206
|
-
if (
|
|
223
|
+
if (isEofByte(await readFirstByte(filePath))) {
|
|
207
224
|
streamDone = true;
|
|
208
225
|
}
|
|
209
226
|
else {
|
|
@@ -240,13 +257,12 @@ export function createStreamer(basedir, tag) {
|
|
|
240
257
|
async getInfo(_runId, name) {
|
|
241
258
|
const chunksDir = path.join(basedir, 'streams', 'chunks');
|
|
242
259
|
const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(chunksDir, name, tag);
|
|
243
|
-
//
|
|
244
|
-
// deserialization needed since we just need a count.
|
|
260
|
+
// Read only the EOF marker byte because metadata never needs payloads.
|
|
245
261
|
let streamDone = false;
|
|
246
262
|
let dataCount = 0;
|
|
247
263
|
for (const file of chunkFiles) {
|
|
248
264
|
const ext = fileExtMap.get(file) ?? '.bin';
|
|
249
|
-
if (
|
|
265
|
+
if (isEofByte(await readFirstByte(path.join(chunksDir, `${file}${ext}`)))) {
|
|
250
266
|
streamDone = true;
|
|
251
267
|
break;
|
|
252
268
|
}
|
|
@@ -329,10 +345,7 @@ export function createStreamer(basedir, tag) {
|
|
|
329
345
|
chunkFiles.length > 0) {
|
|
330
346
|
const lastFile = chunkFiles[chunkFiles.length - 1];
|
|
331
347
|
const lastExt = fileExtMap.get(lastFile) ?? '.bin';
|
|
332
|
-
|
|
333
|
-
// Acceptable since negative startIndex is not a hot path.
|
|
334
|
-
const lastChunk = deserializeChunk(await readBuffer(path.join(chunksDir, `${lastFile}${lastExt}`)));
|
|
335
|
-
if (lastChunk?.eof === true) {
|
|
348
|
+
if (isEofByte(await readFirstByte(path.join(chunksDir, `${lastFile}${lastExt}`)))) {
|
|
336
349
|
dataChunkCount--;
|
|
337
350
|
}
|
|
338
351
|
}
|
|
@@ -475,4 +488,4 @@ export function createStreamer(basedir, tag) {
|
|
|
475
488
|
},
|
|
476
489
|
};
|
|
477
490
|
}
|
|
478
|
-
//# sourceMappingURL=streamer.js.map
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RyZWFtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUVqQiwyRUFBMkU7QUFDM0Usa0RBQWtEO0FBQ2xELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTVELDZDQUE2QztBQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLENBQUMsQ0FBQztBQWNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixTQUFTLFNBQVMsQ0FBQyxJQUF3QjtJQUN6QyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBWTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sTUFBTSxD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LENBQUM7b0NBQVMsQ0FBQztnQ0FDVCxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUNwQixDQUFDO3dCQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDVixDQUFDO29CQUVELE1BQU07d0JBQ0osZUFBZSxFQUFFLENBQUM7d0JBQ2xCLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDNUIsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsQ0FBQztvQkFDSCxDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0Q2h1bmtzT3B0aW9ucyxcbiAgU3RyZWFtQ2h1bmtzUmVzcG9uc2UsXG4gIFN0cmVhbWVyLFxuICBTdHJlYW1JbmZvUmVzcG9uc2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgcmVhZEJ1ZmZlcixcbiAgcmVhZEZpcnN0Qnl0ZSxcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuXG4vLyBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbi8vIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kXG5jb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLy8gU2NoZW1hIGZvciB0aGUgcnVuLXRvLXN0cmVhbXMgbWFwcGluZyBmaWxlXG5jb25zdCBSdW5TdHJlYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJlYW1zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5cbi8qKlxuICogQSBjaHVuayBjb25zaXN0cyBvZiBhIGJvb2xlYW4gYGVvZmAgaW5kaWNhdGluZyBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLFxuICogYW5kIGEgYGNodW5rYCB3aGljaCBpcyBhIEJ1ZmZlciBvZiBkYXRhLlxuICogVGhlIHNlcmlhbGl6ZWQgZm9ybWF0IGlzOlxuICogLSAxIGJ5dGUgZm9yIGBlb2ZgICgwIG9yIDEpXG4gKiAtIGFuZCB0aGUgcmVzdCBpcyB0aGUgY2h1bmsgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaHVuayB7XG4gIGVvZjogYm9vbGVhbjtcbiAgY2h1bms6IEJ1ZmZlcjtcbn1cblxuY29uc3QgRU9GX01BUktFUiA9IDE7XG5cbmZ1bmN0aW9uIGlzRW9mQnl0ZShieXRlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJ5dGUgPT09IEVPRl9NQVJLRVI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDaHVuayhjaHVuazogQ2h1bmspIHtcbiAgY29uc3QgZW9mQnl0ZSA9IEJ1ZmZlci5mcm9tKFtjaHVuay5lb2YgPyBFT0ZfTUFSS0VSIDogMF0pO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbZW9mQnl0ZSwgY2h1bmsuY2h1bmtdKTtcbn1cblxuLyoqIENoZWNrIG9ubHkgdGhlIEVPRiBmbGFnIGJ5dGUgd2l0aG91dCBjb3B5aW5nIGNodW5rIHBheWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFb2ZDaHVuayhzZXJpYWxpemVkOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRW9mQnl0ZShzZXJpYWxpemVkWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ2h1bmsoc2VyaWFsaXplZDogQnVmZmVyKSB7XG4gIGNvbnN0IGVvZiA9IGlzRW9mQ2h1bmsoc2VyaWFsaXplZCk7XG4gIC8vIENyZWF0ZSBhIGNvcHkgaW5zdGVhZCBvZiBhIHZpZXcgdG8gcHJldmVudCBBcnJheUJ1ZmZlciBkZXRhY2htZW50XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZC5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7IGVvZiwgY2h1bmsgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENodW5rRW50cmllcyhjaHVua3NEaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZGRpcihjaHVua3NEaXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihcbiAgZXh0TWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBlbnRyaWVzOiBzdHJpbmdbXSxcbiAgc291cmNlRXh0ZW5zaW9uOiBzdHJpbmcsXG4gIGZpbGVFeHRlbnNpb24gPSBzb3VyY2VFeHRlbnNpb24sXG4gIGluY2x1ZGU6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChzb3VyY2VFeHRlbnNpb24pKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWxlID0gZW50cnkuc2xpY2UoMCwgLXNvdXJjZUV4dGVuc2lvbi5sZW5ndGgpO1xuICAgIGlmIChpbmNsdWRlKGZpbGUpKSBleHRNYXAuc2V0KGZpbGUsIGZpbGVFeHRlbnNpb24pO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBjaHVuayBmaWxlcyBmb3IgYSBzdHJlYW0sIHNvcnRlZCBjaHJvbm9sb2dpY2FsbHkgKFVMSUQgb3JkZXIpLlxuICogUmV0dXJucyBib3RoIHRoZSBzb3J0ZWQgZmlsZSBuYW1lcyBhbmQgYSBtYXAgb2YgZmlsZSDihpIgZXh0ZW5zaW9uIGZvclxuICogcmVzb2x2aW5nIHRoZSBmdWxsIHBhdGguIEhhbmRsZXMgdGFnZ2VkIGFuZCBsZWdhY3kgKC5qc29uKSBmb3JtYXRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0Q2h1bmtGaWxlc0ZvclN0cmVhbShcbiAgY2h1bmtzRGlyOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgZmlsZXM6IHN0cmluZ1tdOyBleHRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gfT4ge1xuICAvLyBOYW1lIGlzIHVzZWQgYXMgYSBmaWxlbmFtZSBwcmVmaXggYmVsb3c7IHZhbGlkYXRlIGl0IGNhbid0IGVzY2FwZSBjaHVua3NEaXIuXG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIG5hbWUpO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgbGlzdENodW5rRW50cmllcyhjaHVua3NEaXIpO1xuICBjb25zdCBleHRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCAnLmpzb24nKTtcbiAgYWRkQ2h1bmtGaWxlc0J5RXh0ZW5zaW9uKFxuICAgIGV4dE1hcCxcbiAgICBlbnRyaWVzLFxuICAgICcuYmluJyxcbiAgICAnLmJpbicsXG4gICAgdGFnID8gKGZpbGUpID0+ICFmaWxlLmVuZHNXaXRoKGAuJHt0YWd9YCkgOiB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAodGFnKSB7XG4gICAgY29uc3QgdGFnZ2VkRXh0ZW5zaW9uID0gYC4ke3RhZ30uYmluYDtcbiAgICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCB0YWdnZWRFeHRlbnNpb24pO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBbLi4uZXh0TWFwLmtleXMoKV1cbiAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXJ0c1dpdGgoYCR7bmFtZX0tYCkpXG4gICAgLnNvcnQoKTtcblxuICByZXR1cm4geyBmaWxlcywgZXh0TWFwIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW1lcihiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IFN0cmVhbWVyIHtcbiAgY29uc3QgdGFnU3VmZml4ID0gdGFnID8gYC4ke3RhZ31gIDogJyc7XG4gIGNvbnN0IHN0cmVhbUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBba2V5OiBgY2h1bms6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgIH0sXG4gICAgXTtcbiAgICBba2V5OiBgY2xvc2U6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9PigpO1xuXG4gIC8vIFRyYWNrIHdoaWNoIHN0cmVhbXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgYSBydW4gKGluLW1lbW9yeSBjYWNoZSlcbiAgY29uc3QgcmVnaXN0ZXJlZFN0cmVhbXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXIgdG8gcmVjb3JkIHRoZSBydW5JZCA8PiBzdHJlYW1JZCBhc3NvY2lhdGlvblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3RlclN0cmVhbUZvclJ1bihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0cmVhbU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIHN0cmVhbU5hbWUpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVuSWR9OiR7c3RyZWFtTmFtZX1gO1xuICAgIGlmIChyZWdpc3RlcmVkU3RyZWFtcy5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICB9XG5cbiAgICBjb25zdCBydW5TdHJlYW1zUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0cmVhbXMvcnVucycsIHJ1bklkLCB0YWcpO1xuXG4gICAgLy8gUmVhZCBleGlzdGluZyBzdHJlYW1zIGZvciB0aGlzIHJ1biAodHJ5IHRhZ2dlZCBmaXJzdCwgZmFsbCBiYWNrIHRvIHVudGFnZ2VkKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICBydW5JZCxcbiAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXMgPSBleGlzdGluZz8uc3RyZWFtcyA/PyBbXTtcblxuICAgIC8vIEFkZCBzdHJlYW0gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghc3RyZWFtcy5pbmNsdWRlcyhzdHJlYW1OYW1lKSkge1xuICAgICAgc3RyZWFtcy5wdXNoKHN0cmVhbU5hbWUpO1xuICAgICAgYXdhaXQgd3JpdGVKU09OKHJ1blN0cmVhbXNQYXRoLCB7IHN0cmVhbXMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJlZFN0cmVhbXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBjb252ZXJ0IGEgY2h1bmsgdG8gYSBCdWZmZXJcbiAgZnVuY3Rpb24gdG9CdWZmZXIoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKSk7XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtczoge1xuICAgICAgYXN5bmMgd3JpdGUoXG4gICAgICAgIF9ydW5JZDogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+LFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5XG4gICAgICApIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgVUxJRCBzeW5jaHJvbm91c2x5IEJFRk9SRSBhbnkgYXdhaXQgdG8gcHJlc2VydmUgY2FsbCBvcmRlci5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2h1bmtzIHdyaXR0ZW4gaW4gc2VxdWVuY2UgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlblxuICAgICAgICAvLyB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZSB0aGF0IG11bHRpcGxlIHdyaXRlcyBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgY29uc3QgY2h1bmtJZCA9IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWA7XG5cbiAgICAgICAgLy8gQXdhaXQgcnVuSWQgaWYgaXQncyBhIHByb21pc2UgdG8gZW5zdXJlIHByb3BlciBmbHVzaGluZ1xuICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IF9ydW5JZDtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHN0cmVhbSBmb3IgdGhlIHJ1blxuICAgICAgICBhd2FpdCByZWdpc3RlclN0cmVhbUZvclJ1bihydW5JZCwgbmFtZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBjaHVuayB0byBidWZmZXIgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3QgY2h1bmtCdWZmZXIgPSB0b0J1ZmZlcihjaHVuayk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUNodW5rKHtcbiAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgZW9mOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy8gRW1pdCByZWFsLXRpbWUgZXZlbnQgd2l0aCBVaW50OEFycmF5IChjcmVhdGUgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnQpXG4gICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlcik7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwge1xuICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgd3JpdGVNdWx0aShcbiAgICAgICAgX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2h1bmtzOiAoc3RyaW5nIHwgVWludDhBcnJheSlbXVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIFVMSURzIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaHVua3MgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlbiB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgY2h1bmtJZHMgPSBjaHVua3MubWFwKCgpID0+IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWApO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNodW5rIGRhdGEgZm9yIHBhcmFsbGVsIHdyaXRlc1xuICAgICAgICBjb25zdCBjaHVua0J1ZmZlcnMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gdG9CdWZmZXIoY2h1bmspKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY2h1bmtzIGluIHBhcmFsbGVsIGZvciBlZmZpY2llbmN5LCBidXQgdHJhY2sgaW5kaXZpZHVhbCBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZXMgPSBjaHVua0J1ZmZlcnMubWFwKGFzeW5jIChjaHVua0J1ZmZlciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblxuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVDaHVuayh7XG4gICAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgICBlb2Y6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdHJlYW1zJyxcbiAgICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgICAgYCR7bmFtZX0tJHtjaHVua0lkfSR7dGFnU3VmZml4fS5iaW5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgICAvLyBSZXR1cm4gZGF0YSBuZWVkZWQgZm9yIGV2ZW50IGVtaXNzaW9uXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW1pdCBldmVudHMgaW4gb3JkZXIsIHdhaXRpbmcgZm9yIGVhY2ggY2h1bmsncyB3cml0ZSB0byBjb21wbGV0ZVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZXZlbnRzIGFyZSBlbWl0dGVkIGluIG9yZGVyIHdoaWxlIHdyaXRlcyBoYXBwZW4gaW4gcGFyYWxsZWxcbiAgICAgICAgZm9yIChjb25zdCB3cml0ZVByb21pc2Ugb2Ygd3JpdGVQcm9taXNlcykge1xuICAgICAgICAgIGNvbnN0IHsgY2h1bmtJZCwgY2h1bmtEYXRhIH0gPSBhd2FpdCB3cml0ZVByb21pc2U7XG5cbiAgICAgICAgICBzdHJlYW1FbWl0dGVyLmVtaXQoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCB7XG4gICAgICAgICAgICBzdHJlYW1OYW1lOiBuYW1lLFxuICAgICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgY2xvc2UoX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICAvLyBHZW5lcmF0ZSBVTElEIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICBjb25zdCBjaHVua0lkID0gYGNobmtfJHttb25vdG9uaWNVbGlkKCl9YDtcblxuICAgICAgICAvLyBBd2FpdCBydW5JZCBpZiBpdCdzIGEgcHJvbWlzZSB0byBlbnN1cmUgcHJvcGVyIGZsdXNoaW5nXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuIChpbiBjYXNlIHdyaXRlIHdhc24ndCBjYWxsZWQpXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKFxuICAgICAgICAgIGNodW5rUGF0aCxcbiAgICAgICAgICBzZXJpYWxpemVDaHVuayh7IGNodW5rOiBCdWZmZXIuZnJvbShbXSksIGVvZjogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHN0cmVhbUVtaXR0ZXIuZW1pdChgY2xvc2U6JHtuYW1lfWAgYXMgY29uc3QsIHsgc3RyZWFtTmFtZTogbmFtZSB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGxpc3QocnVuSWQ6IHN0cmluZykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAnc3RyZWFtcy9ydW5zJyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBSdW5TdHJlYW1zU2NoZW1hLFxuICAgICAgICAgIHRhZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZGF0YT8uc3RyZWFtcyA/PyBbXTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldENodW5rcyhcbiAgICAgICAgX3J1bklkOiBzdHJpbmcsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IEdldENodW5rc09wdGlvbnNcbiAgICAgICk6IFByb21pc2U8U3RyZWFtQ2h1bmtzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAxMDA7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBEZWNvZGUgY3Vyc29yXG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmN1cnNvcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgQnVmZmVyLmZyb20ob3B0aW9ucy5jdXJzb3IsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBkZWNvZGVkLmk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWxrIGZyb20gc3RhcnRJbmRleCwgcmVhZGluZyBvbmx5IHRoZSBmaWxlcyB3ZSBuZWVkLlxuICAgICAgICAvLyBGaWxlcyBiZWZvcmUgdGhlIGN1cnNvciBhcmUgc2tpcHBlZCBlbnRpcmVseS5cbiAgICAgICAgbGV0IHN0cmVhbURvbmUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q2h1bmtzOiB7IGluZGV4OiBudW1iZXI7IGRhdGE6IFVpbnQ4QXJyYXkgfVtdID0gW107XG4gICAgICAgIGxldCBkYXRhSW5kZXggPSAwOyAvLyBydW5uaW5nIGNvdW50IG9mIGRhdGEgKG5vbi1FT0YpIGZpbGVzIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCk7XG5cbiAgICAgICAgICAvLyBCZWZvcmUgdGhlIGN1cnNvcjogb25seSBuZWVkIHRvIGNoZWNrIEVPRiAoMSBieXRlKSwgc2tpcCBjb250ZW50XG4gICAgICAgICAgaWYgKGRhdGFJbmRleCA8IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpc0VvZkJ5dGUoYXdhaXQgcmVhZEZpcnN0Qnl0ZShmaWxlUGF0aCkpKSB7XG4gICAgICAgICAgICAgIHN0cmVhbURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29sbGVjdGVkIGVub3VnaCBkYXRhIGNodW5rcyDigJQgcGVlayBhdCB0aGUgbmV4dCBmaWxlIGZvciBFT0YvaGFzTW9yZVxuICAgICAgICAgIGlmIChyZXN1bHRDaHVua3MubGVuZ3RoID49IGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAoaXNFb2ZCeXRlKGF3YWl0IHJlYWRGaXJzdEJ5dGUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE1vcmUgZGF0YSBmaWxlcyBleGlzdCBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW4gdGhlIHBhZ2Ugd2luZG93OiBkZXNlcmlhbGl6ZSBmdWxseVxuICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhhd2FpdCByZWFkQnVmZmVyKGZpbGVQYXRoKSk7XG4gICAgICAgICAgaWYgKGNodW5rLmVvZikge1xuICAgICAgICAgICAgc3RyZWFtRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Q2h1bmtzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGRhdGFJbmRleCxcbiAgICAgICAgICAgIGRhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVuay5jaHVuayksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGF0YUluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYXNNb3JlID0gd2Uga25vdyB0aGVyZSBhcmUgZGF0YSBmaWxlcyBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGhhc01vcmUgPVxuICAgICAgICAgICFzdHJlYW1Eb25lICYmIGRhdGFJbmRleCA+IHN0YXJ0SW5kZXggKyByZXN1bHRDaHVua3MubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzdGFydEluZGV4ICsgcmVzdWx0Q2h1bmtzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV4dEN1cnNvciA9IGhhc01vcmVcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgaTogbmV4dEluZGV4IH0pKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiByZXN1bHRDaHVua3MsXG4gICAgICAgICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgZG9uZTogc3RyZWFtRG9uZSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldEluZm8oX3J1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RyZWFtSW5mb1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBSZWFkIG9ubHkgdGhlIEVPRiBtYXJrZXIgYnl0ZSBiZWNhdXNlIG1ldGFkYXRhIG5ldmVyIG5lZWRzIHBheWxvYWRzLlxuICAgICAgICBsZXQgc3RyZWFtRG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGF0YUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRhaWxJbmRleDogZGF0YUNvdW50IC0gMSwgZG9uZTogc3RyZWFtRG9uZSB9O1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgbGV0IHJlbW92ZUxpc3RlbmVycyA9ICgpID0+IHt9O1xuICAgICAgICBsZXQgcG9sbEludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBjaHVua3MgZGVsaXZlcmVkIHZpYSBldmVudHMgdG8gcHJldmVudCBkdXBsaWNhdGVzIGFuZCBtYWludGFpbiBvcmRlci5cbiAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJlZENodW5rSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAvLyBCdWZmZXIgZm9yIGNodW5rcyB0aGF0IGFycml2ZSB2aWEgZXZlbnRzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkRXZlbnRDaHVua3M6IEFycmF5PHtcbiAgICAgICAgICAgICAgY2h1bmtJZDogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICB9PiA9IFtdO1xuICAgICAgICAgICAgbGV0IGlzUmVhZGluZ0Zyb21EaXNrID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBjbG9zZSBldmVudCBpZiBpdCBhcnJpdmVzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGxldCBwZW5kaW5nQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFNldCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZDsgZ3VhcmRzIGFnYWluc3QgZW5xdWV1ZS1hZnRlci1jbG9zZVxuICAgICAgICAgICAgLy8gaW4gdGhlIHBvbGxpbmcgY2FsbGJhY2sgd2hlbiBjbG9zZUxpc3RlbmVyIGZpcmVzIG1pZC1pdGVyYXRpb24uXG4gICAgICAgICAgICBsZXQgc3RyZWFtQ2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGlzdGVuZXIgPSAoZXZlbnQ6IHtcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBjaHVua3MgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBkaXNrIHJlYWRpbmcgYmVoYXZpb3JcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmNodW5rRGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGV2ZW50LmNodW5rSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBCdWZmZXIgY2h1bmtzIHRoYXQgYXJyaXZlIGR1cmluZyBkaXNrIHJlYWRpbmcgdG8gbWFpbnRhaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCB3aGVuIGVucXVldWVkIGxhdGVyXG4gICAgICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGV2ZW50LmNodW5rSWQsXG4gICAgICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShldmVudC5jaHVua0RhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWxpdmVyZWRDaHVua0lkcy5oYXMoZXZlbnQuY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGR1cGxpY2F0ZXM6IHBvbGxpbmcgbWF5IGhhdmUgYWxyZWFkeSBjbGFpbWVkIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBjaHVuayBiZXR3ZWVuIGl0cyBoYXMoKSBjaGVjayBhbmQgcmVhZEJ1ZmZlcigpIHlpZWxkLlxuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBBZnRlciBkaXNrIHJlYWRpbmcgaXMgY29tcGxldGUsIGRlbGl2ZXIgY2h1bmtzIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnRcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGV2ZW50LmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgZGlzayByZWFkaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdDbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgYmVmb3JlIGNsb3NpbmdcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCBjaHVua0xpc3RlbmVyKTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNsb3NlOiR7bmFtZX1gIGFzIGNvbnN0LCBjbG9zZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCAoZS5nLiwgZnJvbSBjYW5jZWwoKSBvciBFT0YpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMgPSBjbG9zZUxpc3RlbmVyO1xuXG4gICAgICAgICAgICAvLyBTZXQgdXAgbGlzdGVuZXJzIEZJUlNUIHRvIGF2b2lkIG1pc3NpbmcgZXZlbnRzXG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG5cbiAgICAgICAgICAgIC8vIE5vdyBsb2FkIGV4aXN0aW5nIGNodW5rcyBmcm9tIGRpc2suXG4gICAgICAgICAgICBjb25zdCB7IGZpbGVzOiBjaHVua0ZpbGVzLCBleHRNYXA6IGZpbGVFeHRNYXAgfSA9XG4gICAgICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBuZWdhdGl2ZSBzdGFydEluZGV4IHJlbGF0aXZlIHRvIHRoZSBudW1iZXIgb2YgZGF0YSBjaHVua3NcbiAgICAgICAgICAgIC8vIChleGNsdWRpbmcgdGhlIHRyYWlsaW5nIEVPRiBtYXJrZXIgY2h1bmssIGlmIHByZXNlbnQpLlxuICAgICAgICAgICAgbGV0IGRhdGFDaHVua0NvdW50ID0gY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICBzdGFydEluZGV4IDwgMCAmJlxuICAgICAgICAgICAgICBjaHVua0ZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBsYXN0RmlsZSA9IGNodW5rRmlsZXNbY2h1bmtGaWxlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEV4dCA9IGZpbGVFeHRNYXAuZ2V0KGxhc3RGaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc0VvZkJ5dGUoXG4gICAgICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtsYXN0RmlsZX0ke2xhc3RFeHR9YClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFDaHVua0NvdW50LS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3RhcnRJbmRleCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJiBzdGFydEluZGV4IDwgMFxuICAgICAgICAgICAgICAgID8gTWF0aC5tYXgoMCwgZGF0YUNodW5rQ291bnQgKyBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgIDogc3RhcnRJbmRleDtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyBleGlzdGluZyBjaHVua3MsIHNraXBwaW5nIGFueSBhbHJlYWR5IGRlbGl2ZXJlZCB2aWEgZXZlbnRzXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlc29sdmVkU3RhcnRJbmRleDsgaSA8IGNodW5rRmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGNodW5rRmlsZXNbaV07XG4gICAgICAgICAgICAgIC8vIEV4dHJhY3QgY2h1bmsgSUQgZnJvbSBmaWxlbmFtZTogXCJzdHJlYW1OYW1lLWNodW5rSWRcIiBvciBcInN0cmVhbU5hbWUtY2h1bmtJZC50YWdcIlxuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgLy8gU3RyaXAgdGFnIHN1ZmZpeCAoZS5nLiwgXCJjaG5rX1VMSUQudml0ZXN0LTBcIiDihpIgXCJjaG5rX1VMSURcIilcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyZWRDaHVua0lkcy5oYXMoY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBkZXNlcmlhbGl6ZUNodW5rKFxuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWRCdWZmZXIocGF0aC5qb2luKGNodW5rc0RpciwgYCR7ZmlsZX0ke2V4dH1gKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUcmFjayBhcyBoYW5kbGVkIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyXG4gICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChjaHVua0lkKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gZGlzayAtIG5vdyBkZWxpdmVyIGJ1ZmZlcmVkIGV2ZW50IGNodW5rcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBpc1JlYWRpbmdGcm9tRGlzayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBTb3J0IGJ1ZmZlcmVkIGNodW5rcyBieSBVTElEIChjaHJvbm9sb2dpY2FsIG9yZGVyKVxuICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBhLmNodW5rSWQubG9jYWxlQ29tcGFyZShiLmNodW5rSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXJlZCBvZiBidWZmZXJlZEV2ZW50Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgZm9yIGRlZmVuc2UgaW4gZGVwdGggKGFscmVhZHkgY29waWVkIGF0IHN0b3JhZ2UsIGJ1dCBiZSBleHRyYSBzYWZlKVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGJ1ZmZlcmVkLmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkIChlLmcuLCBmcm9tIGNsb3NlTGlzdGVuZXIgZXZlbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIGNsb3NlIGV2ZW50IHRoYXQgYXJyaXZlZCBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZ0Nsb3NlKSB7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgcHJlLXN0YXJ0SW5kZXggY2h1bmtzIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyIHRoZW1cbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgaSA8IHJlc29sdmVkU3RhcnRJbmRleCAmJiBpIDwgY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjaHVua0ZpbGVzW2ldO1xuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGZpbGVzeXN0ZW0gcG9sbGluZyBmb3IgY3Jvc3MtcHJvY2VzcyBzdHJlYW1pbmcgc3VwcG9ydC5cbiAgICAgICAgICAgIC8vIFRoZSBFdmVudEVtaXR0ZXIgb25seSB3b3JrcyBpbi1wcm9jZXNzOyB3aGVuIHRoZSB3cml0ZXIgaXMgaW4gYVxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgcHJvY2VzcyAoZS5nLiBlMmUgdGVzdCBydW5uZXIg4oaUIHdvcmtiZW5jaCBhcHApLCBwb2xsaW5nXG4gICAgICAgICAgICAvLyB0aGUgc2hhcmVkIGZpbGVzeXN0ZW0gaXMgdGhlIGZhbGxiYWNrIGRlbGl2ZXJ5IG1lY2hhbmlzbS5cbiAgICAgICAgICAgIGxldCBpc1BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzUG9sbGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICBpc1BvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsZXM6IGN1cnJlbnRGaWxlcywgZXh0TWFwOiBjdXJyZW50RXh0TWFwIH0gPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzRGlyLCBuYW1lLCB0YWcpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGN1cnJlbnRGaWxlcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmF3Q2h1bmtJZCA9IGZpbGUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0lkID0gdGFnXG4gICAgICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgICAgIDogcmF3Q2h1bmtJZDtcblxuICAgICAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJlZENodW5rSWRzLmhhcyhjaHVua0lkKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGN1cnJlbnRFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEJ1ZmZlcihwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBlbnF1ZXVlLWFmdGVyLWNsb3NlOiBjbG9zZUxpc3RlbmVyIG1heSBoYXZlXG4gICAgICAgICAgICAgICAgICAvLyBmaXJlZCBiZXR3ZWVuIG91ciByZWFkQnVmZmVyKCkgeWllbGQgYW5kIHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5jaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0cmFuc2llbnQgZmlsZXN5c3RlbSBlcnJvcnMgKEVOT0VOVCwgRUFDQ0VTLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgdW5leHBlY3RlZCBlcnJvcnMgc28gYnVncyBhcmVuJ3QgaGlkZGVuXG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t3b3JsZC1sb2NhbF0gVW5leHBlY3RlZCBwb2xsaW5nIGVycm9yOicsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlzUG9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGlmIChwb2xsSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
package/dist/telemetry.d.ts
CHANGED
|
@@ -25,4 +25,12 @@ export declare const RpcService: (value: string) => {
|
|
|
25
25
|
export declare const RpcMethod: (value: string) => {
|
|
26
26
|
[k: string]: string;
|
|
27
27
|
};
|
|
28
|
+
/** Unique identifier for a specific workflow run instance */
|
|
29
|
+
export declare const WorkflowRunId: (value: string) => {
|
|
30
|
+
[k: string]: string;
|
|
31
|
+
};
|
|
32
|
+
/** Unique identifier for the step instance */
|
|
33
|
+
export declare const StepId: (value: string) => {
|
|
34
|
+
[k: string]: string;
|
|
35
|
+
};
|
|
28
36
|
//# sourceMappingURL=telemetry.d.ts.map
|
package/dist/telemetry.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
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;AAElE,6DAA6D;AAC7D,eAAO,MAAM,aAAa;;CAAgD,CAAC;AAE3E,8CAA8C;AAC9C,eAAO,MAAM,MAAM;;CAAwC,CAAC"}
|
package/dist/telemetry.js
CHANGED
|
@@ -68,4 +68,8 @@ export const RpcSystem = SemanticConvention('rpc.system');
|
|
|
68
68
|
export const RpcService = SemanticConvention('rpc.service');
|
|
69
69
|
/** RPC method name (standard OTEL: rpc.method) */
|
|
70
70
|
export const RpcMethod = SemanticConvention('rpc.method');
|
|
71
|
-
|
|
71
|
+
/** Unique identifier for a specific workflow run instance */
|
|
72
|
+
export const WorkflowRunId = SemanticConvention('workflow.run.id');
|
|
73
|
+
/** Unique identifier for the step instance */
|
|
74
|
+
export const StepId = SemanticConvention('step.id');
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxrREFBa0Q7QUFDbEQsSUFBSSxjQUFjLEdBQXNDLElBQUksQ0FBQztBQUU3RCxLQUFLLFVBQVUsVUFBVTtJQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELElBQUksYUFBYSxHQUFzQyxJQUFJLENBQUM7QUFFNUQsS0FBSyxVQUFVLFNBQVM7SUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6QyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQy9DLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsS0FBSyxDQUN6QixRQUFnQixFQUNoQixHQUFHLElBRXFEO0lBRXhELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQ2hCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVU7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxFQUFFO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSztnQkFDL0IsT0FBTyxFQUFHLENBQVcsQ0FBQyxPQUFPO2FBQzlCLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixLQUE0QjtJQUU1QixNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxpREFBaUQ7QUFDakQscURBQXFEO0FBQ3JELFNBQVMsa0JBQWtCLENBQUksR0FBRyxLQUFlO0lBQy9DLE9BQU8sQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV0RSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFTLFlBQVksQ0FBQyxDQUFDO0FBRWxFLG9EQUFvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQVMsYUFBYSxDQUFDLENBQUM7QUFFcEUsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBUyxZQUFZLENBQUMsQ0FBQztBQUVsRSw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFTLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBUyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWluaW1hbCB0ZWxlbWV0cnkgdXRpbGl0aWVzIGZvciB3b3JsZC1sb2NhbCBwYWNrYWdlLlxuICpcbiAqIE5PVEU6IFRoaXMgbW9kdWxlIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHdvcmxkLXZlcmNlbCdzIHRlbGVtZXRyeS5cbiAqIEl0IHByb3ZpZGVzIHRyYWNpbmcgY2FwYWJpbGl0aWVzIGZvciBsb2NhbCBkZXZlbG9wbWVudCB0byBtYXRjaFxuICogdGhlIG9ic2VydmFiaWxpdHkgZXhwZXJpZW5jZSBpbiBwcm9kdWN0aW9uLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyBtb2R1bGUgdXNlcyB0aGUgc2FtZSB0cmFjZXIgbmFtZSAnd29ya2Zsb3cnIGFzIEB3b3JrZmxvdy9jb3JlIHRvIGVuc3VyZVxuICogYWxsIHNwYW5zIGFyZSByZXBvcnRlZCB1bmRlciB0aGUgcGFyZW50IGFwcGxpY2F0aW9uJ3Mgc2VydmljZSwgbm90IGFzIGEgc2VwYXJhdGUgc2VydmljZS5cbiAqL1xuaW1wb3J0IHR5cGUgKiBhcyBhcGkgZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbktpbmQsIFNwYW5PcHRpb25zIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcblxuLy8gTGF6eSBsb2FkIE9wZW5UZWxlbWV0cnkgQVBJIHRvIG1ha2UgaXQgb3B0aW9uYWxcbmxldCBvdGVsQXBpUHJvbWlzZTogUHJvbWlzZTx0eXBlb2YgYXBpIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3RlbEFwaSgpOiBQcm9taXNlPHR5cGVvZiBhcGkgfCBudWxsPiB7XG4gIGlmICghb3RlbEFwaVByb21pc2UpIHtcbiAgICBvdGVsQXBpUHJvbWlzZSA9IGltcG9ydCgnQG9wZW50ZWxlbWV0cnkvYXBpJykuY2F0Y2goKCkgPT4gbnVsbCk7XG4gIH1cbiAgcmV0dXJuIG90ZWxBcGlQcm9taXNlO1xufVxuXG5sZXQgdHJhY2VyUHJvbWlzZTogUHJvbWlzZTxhcGkuVHJhY2VyIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhY2VyKCk6IFByb21pc2U8YXBpLlRyYWNlciB8IG51bGw+IHtcbiAgaWYgKCF0cmFjZXJQcm9taXNlKSB7XG4gICAgdHJhY2VyUHJvbWlzZSA9IGdldE90ZWxBcGkoKS50aGVuKChvdGVsKSA9PlxuICAgICAgb3RlbCA/IG90ZWwudHJhY2UuZ2V0VHJhY2VyKCd3b3JrZmxvdycpIDogbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRyYWNlclByb21pc2U7XG59XG5cbi8qKlxuICogV3JhcCBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIGEgdHJhY2Ugc3Bhbi5cbiAqIE5vLW9wIGlmIE9wZW5UZWxlbWV0cnkgaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlPFQ+KFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOlxuICAgIHwgW2ZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4gICAgfCBbb3B0czogU3Bhbk9wdGlvbnMsIGZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgW3RyYWNlciwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbZ2V0VHJhY2VyKCksIGdldE90ZWxBcGkoKV0pO1xuICBjb25zdCB7IGZuLCBvcHRzIH0gPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHsgZm46IGFyZ3NbMF0sIG9wdHM6IHt9IH1cbiAgICAgIDogeyBmbjogYXJnc1sxXSwgb3B0czogYXJnc1swXSB9O1xuICBpZiAoIWZuKSB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIHRvIHRyYWNlIG11c3QgYmUgcHJvdmlkZWQnKTtcblxuICBpZiAoIXRyYWNlciB8fCAhb3RlbCkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9XG5cbiAgcmV0dXJuIHRyYWNlci5zdGFydEFjdGl2ZVNwYW4oc3Bhbk5hbWUsIG9wdHMsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHNwYW4pO1xuICAgICAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgIGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6IChlIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IFNwYW5LaW5kIGVudW0gdmFsdWUgYnkgbmFtZS5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIE9wZW5UZWxlbWV0cnkgaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNwYW5LaW5kKFxuICBmaWVsZDoga2V5b2YgdHlwZW9mIFNwYW5LaW5kXG4pOiBQcm9taXNlPFNwYW5LaW5kIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBnZXRPdGVsQXBpKCk7XG4gIGlmICghb3RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG90ZWwuU3BhbktpbmRbZmllbGRdO1xufVxuXG4vLyBTZW1hbnRpYyBjb252ZW50aW9ucyBmb3IgV29ybGQvU3RvcmFnZSB0cmFjaW5nXG4vLyBTdGFuZGFyZCBPVEVMIGNvbnZlbnRpb25zIGZvciBwZWVyIHNlcnZpY2UgbWFwcGluZ1xuZnVuY3Rpb24gU2VtYW50aWNDb252ZW50aW9uPFQ+KC4uLm5hbWVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gKHZhbHVlOiBUKSA9PlxuICAgIE9iamVjdC5mcm9tRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpID0+IFtuYW1lLCB2YWx1ZV0gYXMgY29uc3QpKTtcbn1cblxuLyoqIFRoZSByZW1vdGUgc2VydmljZSBuYW1lIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwcyAoRGF0YWRvZy1zcGVjaWZpYzogcGVlci5zZXJ2aWNlKSAqL1xuZXhwb3J0IGNvbnN0IFBlZXJTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3BlZXIuc2VydmljZScpO1xuXG4vKiogUlBDIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBycGMuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IFJwY1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMuc3lzdGVtJyk7XG5cbi8qKiBSUEMgc2VydmljZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBycGMuc2VydmljZSkgKi9cbmV4cG9ydCBjb25zdCBScGNTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5zZXJ2aWNlJyk7XG5cbi8qKiBSUEMgbWV0aG9kIG5hbWUgKHN0YW5kYXJkIE9URUw6IHJwYy5tZXRob2QpICovXG5leHBvcnQgY29uc3QgUnBjTWV0aG9kID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5tZXRob2QnKTtcblxuLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHdvcmtmbG93IHJ1biBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93UnVuSWQgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignd29ya2Zsb3cucnVuLmlkJyk7XG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0ZXAgaW5zdGFuY2UgKi9cbmV4cG9ydCBjb25zdCBTdGVwSWQgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignc3RlcC5pZCcpO1xuIl19
|
package/dist/test-helpers.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare function createRun(storage: Storage, data: {
|
|
|
11
11
|
workflowName: string;
|
|
12
12
|
input: SerializedData;
|
|
13
13
|
executionContext?: Record<string, unknown>;
|
|
14
|
+
attributes?: Record<string, string>;
|
|
14
15
|
}): Promise<WorkflowRun>;
|
|
15
16
|
/**
|
|
16
17
|
* Update a workflow run's status through lifecycle events.
|
|
@@ -1 +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,IAAI,EACJ,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;
|
|
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,IAAI,EACJ,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;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,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,GAAG,eAAe,EAC3E,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,EACL,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,eAAe,EACnB,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;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
package/dist/test-helpers.js
CHANGED
|
@@ -115,4 +115,4 @@ export async function completeWait(storage, runId, waitId) {
|
|
|
115
115
|
}
|
|
116
116
|
return result.wait;
|
|
117
117
|
}
|
|
118
|
-
//# sourceMappingURL=test-helpers.js.map
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3QtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RDs7O0dBR0c7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixPQUFnQixFQUNoQixJQU1DO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDL0MsU0FBUyxFQUFFLGFBQWE7UUFDeEIsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixPQUFnQixFQUNoQixLQUFhLEVBQ2IsU0FBMkUsRUFDM0UsU0FBbUM7SUFFbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDaEQsU0FBUztRQUNULFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsU0FBUztLQUNILENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxV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QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUNyQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FDaEMsT0FBZ0IsRUFDaEIsS0FBYSxFQUNiLE1BQWM7SUFFZCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNoRCxTQUFTLEVBQUUsZ0JBQWdCO1FBQzNCLFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsYUFBYSxFQUFFLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogVGVzdCBoZWxwZXIgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgdXBkYXRpbmcgc3RvcmFnZSBlbnRpdGllcyB0aHJvdWdoIGV2ZW50cy5cbiAqIFRoZXNlIGhlbHBlcnMgc2ltcGxpZnkgdGVzdCBzZXR1cCBieSBwcm92aWRpbmcgYSBjb252ZW5pZW50IEFQSSBmb3IgY29tbW9uIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgd29ya2Zsb3cgcnVuIHRocm91Z2ggdGhlIHJ1bl9jcmVhdGVkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUnVuKFxuICBzdG9yYWdlOiBTdG9yYWdlLFxuICBkYXRhOiB7XG4gICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfVxuKTogUHJvbWlzZTxXb3JrZmxvd1J1bj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmV2ZW50cy5jcmVhdGUobnVsbCwge1xuICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgZXZlbnREYXRhOiBkYXRhLFxuICB9KTtcbiAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBydW4gdG8gYmUgY3JlYXRlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHQucnVuO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhIHdvcmtmbG93IHJ1bidzIHN0YXR1cyB0aHJvdWdoIGxpZmVjeWNsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVSdW4oXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyB8ICdydW5fY29tcGxldGVkJyB8ICdydW5fZmFpbGVkJyB8ICdydW5fY2FuY2VsbGVkJyxcbiAgZXZlbnREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8V29ya2Zsb3dSdW4+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgZXZlbnRUeXBlLFxuICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICBldmVudERhdGEsXG4gIH0gYXMgYW55KTtcbiAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBydW4gdG8gYmUgdXBkYXRlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHQucnVuO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBzdGVwIHRocm91Z2ggdGhlIHN0ZXBfY3JlYXRlZCBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRhdGE6IHtcbiAgICBzdGVwSWQ6IHN0cmluZztcbiAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgfVxuKTogUHJvbWlzZTxTdGVwPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuc3RlcElkLFxuICAgIGV2ZW50RGF0YTogeyBzdGVwTmFtZTogZGF0YS5zdGVwTmFtZSwgaW5wdXQ6IGRhdGEuaW5wdXQgfSxcbiAgfSk7XG4gIGlmICghcmVzdWx0LnN0ZXApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHN0ZXAgdG8gYmUgY3JlYXRlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHQuc3RlcDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYSBzdGVwJ3Mgc3RhdHVzIHRocm91Z2ggbGlmZWN5Y2xlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVN0ZXAoXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHN0ZXBJZDogc3RyaW5nLFxuICBldmVudFR5cGU6XG4gICAgfCAnc3RlcF9zdGFydGVkJ1xuICAgIHwgJ3N0ZXBfY29tcGxldGVkJ1xuICAgIHwgJ3N0ZXBfZmFpbGVkJ1xuICAgIHwgJ3N0ZXBfcmV0cnlpbmcnLFxuICBldmVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxTdGVwPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgIGV2ZW50VHlwZSxcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgIGV2ZW50RGF0YSxcbiAgfSBhcyBhbnkpO1xuICBpZiAoIXJlc3VsdC5zdGVwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdGVwIHRvIGJlIHVwZGF0ZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnN0ZXA7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGhvb2sgdGhyb3VnaCB0aGUgaG9va19jcmVhdGVkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSG9vayhcbiAgc3RvcmFnZTogU3RvcmFnZSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGF0YToge1xuICAgIGhvb2tJZDogc3RyaW5nO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBTZXJpYWxpemVkRGF0YTtcbiAgfVxuKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcsXG4gICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuaG9va0lkLFxuICAgIGV2ZW50RGF0YTogeyB0b2tlbjogZGF0YS50b2tlbiwgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEgfSxcbiAgfSk7XG4gIGlmICghcmVzdWx0Lmhvb2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvb2sgdG8gYmUgY3JlYXRlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHQuaG9vaztcbn1cblxuLyoqXG4gKiBEaXNwb3NlIGEgaG9vayB0aHJvdWdoIHRoZSBob29rX2Rpc3Bvc2VkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZUhvb2soXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcmFnZS5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tJZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHdhaXQgdGhyb3VnaCB0aGUgd2FpdF9jcmVhdGVkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV2FpdChcbiAgc3RvcmFnZTogU3RvcmFnZSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGF0YToge1xuICAgIHdhaXRJZDogc3RyaW5nO1xuICAgIHJlc3VtZUF0OiBEYXRlO1xuICB9XG4pOiBQcm9taXNlPFdhaXQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgY29ycmVsYXRpb25JZDogZGF0YS53YWl0SWQsXG4gICAgZXZlbnREYXRhOiB7IHJlc3VtZUF0OiBkYXRhLnJlc3VtZUF0IH0sXG4gIH0pO1xuICBpZiAoIXJlc3VsdC53YWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB3YWl0IHRvIGJlIGNyZWF0ZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LndhaXQ7XG59XG5cbi8qKlxuICogQ29tcGxldGUgYSB3YWl0IHRocm91Z2ggdGhlIHdhaXRfY29tcGxldGVkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcGxldGVXYWl0KFxuICBzdG9yYWdlOiBTdG9yYWdlLFxuICBydW5JZDogc3RyaW5nLFxuICB3YWl0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxXYWl0PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyxcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgY29ycmVsYXRpb25JZDogd2FpdElkLFxuICB9KTtcbiAgaWYgKCFyZXN1bHQud2FpdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgd2FpdCB0byBiZSBjb21wbGV0ZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LndhaXQ7XG59XG4iXX0=
|
package/dist/util.js
CHANGED
|
@@ -18,4 +18,4 @@ export function once(fn) {
|
|
|
18
18
|
};
|
|
19
19
|
return result;
|
|
20
20
|
}
|
|
21
|
-
//# sourceMappingURL=
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUksRUFBVztJQUNqQyxNQUFNLE1BQU0sR0FBRztRQUNiLElBQUksS0FBSztZQUNQLE1BQU0sS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSBsYXppbHktZXZhbHVhdGVkLCBtZW1vaXplZCB2ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGV4cG9zZXMgYSBgdmFsdWVgIGdldHRlciB0aGF0IGNhbGxzIGBmbmAgb25seSBvbmNlLFxuICogY2FjaGVzIGl0cyByZXN1bHQsIGFuZCByZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUgb24gc3Vic2VxdWVudCBhY2Nlc3Nlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGFuZCB3aG9zZSByZXN1bHQgd2lsbCBiZSBjYWNoZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGB2YWx1ZWAgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRoZSBtZW1vaXplZCByZXN1bHQgb2YgYGZuYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uY2U8VD4oZm46ICgpID0+IFQpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZm4oKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsICd2YWx1ZScsIHsgdmFsdWUgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/world-local",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.20",
|
|
4
4
|
"description": "Local development World implementation for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@vercel/queue": "0.1
|
|
26
|
+
"@vercel/queue": "0.3.1",
|
|
27
27
|
"async-sema": "3.1.1",
|
|
28
28
|
"ulid": "~3.0.1",
|
|
29
|
-
"undici": "7.
|
|
29
|
+
"undici": "7.28.0",
|
|
30
30
|
"zod": "4.3.6",
|
|
31
|
-
"@workflow/errors": "5.0.0-beta.
|
|
32
|
-
"@workflow/utils": "5.0.0-beta.
|
|
33
|
-
"@workflow/world": "5.0.0-beta.
|
|
31
|
+
"@workflow/errors": "5.0.0-beta.8",
|
|
32
|
+
"@workflow/utils": "5.0.0-beta.4",
|
|
33
|
+
"@workflow/world": "5.0.0-beta.12"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@opentelemetry/api": "1.9.0",
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,gBAAgB,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAC7C,CAAC,CAAC;AAoBF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAS,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB;IAC1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,oBAAoB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IAC7C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,oBAAoB,YAAY,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import { getWorkflowPort } from '@workflow/utils/get-port';\nimport { once } from './util.js';\n\nconst getDataDirFromEnv = () => {\n return process.env.WORKFLOW_LOCAL_DATA_DIR || '.workflow-data';\n};\n\nexport const DEFAULT_RESOLVE_DATA_OPTION = 'all';\n\nconst getBaseUrlFromEnv = () => {\n return process.env.WORKFLOW_LOCAL_BASE_URL;\n};\n\nexport type Config = {\n dataDir: string;\n port?: number;\n baseUrl?: string;\n /**\n * Optional tag to scope filesystem operations.\n * When set, files are written as `{id}.{tag}.json` and `clear()` only deletes\n * files matching this tag. Used by vitest to isolate test data in the shared\n * `.workflow-data` directory.\n */\n tag?: string;\n /**\n * Override the flush interval (in ms) for buffered stream writes.\n * Default is 10ms. Set to 0 for immediate flushing.\n */\n streamFlushIntervalMs?: number;\n};\n\nexport const config = once<Config>(() => {\n const dataDir = getDataDirFromEnv();\n const baseUrl = getBaseUrlFromEnv();\n\n return { dataDir, baseUrl };\n});\n\n/**\n * Resolves the base URL for queue requests following the priority order:\n * 1. config.baseUrl (highest priority - full override from args)\n * 2. WORKFLOW_LOCAL_BASE_URL env var (checked directly to handle late env var setting)\n * 3. config.port (explicit port override from args)\n * 4. PORT env var (explicit configuration)\n * 5. Auto-detected port via getPort (detect actual listening port)\n */\nexport async function resolveBaseUrl(config: Partial<Config>): Promise<string> {\n if (config.baseUrl) {\n return config.baseUrl;\n }\n\n // Check env var directly in case it was set after the config was cached\n // This is important for CLI tools that set the env var after module import\n if (process.env.WORKFLOW_LOCAL_BASE_URL) {\n return process.env.WORKFLOW_LOCAL_BASE_URL;\n }\n\n if (typeof config.port === 'number') {\n return `http://localhost:${config.port}`;\n }\n\n if (process.env.PORT) {\n return `http://localhost:${process.env.PORT}`;\n }\n\n const detectedPort = await getWorkflowPort();\n if (detectedPort) {\n return `http://localhost:${detectedPort}`;\n }\n\n throw new Error('Unable to resolve base URL for workflow queue.');\n}\n"]}
|
package/dist/fs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { EntityConflictError } from '@workflow/errors';\nimport type { PaginatedResponse } from '@workflow/world';\nimport { monotonicFactory } from 'ulid';\nimport { z } from 'zod';\n\nconst ulid = monotonicFactory(() => Math.random());\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Execute a filesystem operation with retry logic on Windows.\n * On Windows, file operations can fail with EPERM/EBUSY/EACCES when files\n * are briefly locked by another process or antivirus. This wrapper adds\n * exponential backoff retry logic. On non-Windows platforms, executes directly.\n */\nasync function withWindowsRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 5\n): Promise<T> {\n if (!isWindows) return fn();\n\n const retryableErrors = ['EPERM', 'EBUSY', 'EACCES'];\n const baseDelayMs = 10;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n const isRetryable =\n attempt < maxRetries && retryableErrors.includes(error.code);\n if (!isRetryable) throw error;\n // Exponential backoff with jitter\n const delay = baseDelayMs * 2 ** attempt + Math.random() * baseDelayMs;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n // TypeScript: unreachable, but satisfies return type\n throw new Error('Retry loop exited unexpectedly');\n}\n\n// In-memory cache of created files to avoid expensive fs.access() calls\n// This is safe because we only write once per file path (no overwrites without explicit flag)\nconst createdFilesCache = new Set<string>();\n\n/**\n * Clear the created files cache. Useful for testing or when files are deleted externally.\n */\nexport function clearCreatedFilesCache(): void {\n createdFilesCache.clear();\n}\n\nexport { ulidToDate } from '@workflow/world';\n\n/**\n * Regex matching a tag suffix on a fileId (after `.json` has been stripped).\n * E.g., `wrun_ABC.vitest-0` → the `.vitest-0` part.\n * Tags start with a letter and contain alphanumeric chars and hyphens.\n * Entity IDs (ULIDs, step_N, etc.) never contain dots, so the first dot\n * always marks the tag boundary.\n */\nconst TAG_PATTERN = /\\.[a-zA-Z][a-zA-Z0-9-]*$/;\n\n/**\n * Strip a tag suffix from a fileId.\n * `wrun_ABC.vitest-0` → `wrun_ABC`\n * `wrun_ABC` → `wrun_ABC` (no-op if no tag)\n */\nexport function stripTag(fileId: string): string {\n return fileId.replace(TAG_PATTERN, '');\n}\n\n/**\n * Build the file path for an entity, with optional tag embedded in the filename.\n * `taggedPath('runs', 'wrun_ABC', 'vitest-0')` → `runs/wrun_ABC.vitest-0.json`\n * `taggedPath('runs', 'wrun_ABC')` → `runs/wrun_ABC.json`\n */\nexport function taggedPath(\n basedir: string,\n entityDir: string,\n fileId: string,\n tag?: string\n): string {\n const filename = tag ? `${fileId}.${tag}.json` : `${fileId}.json`;\n return path.join(basedir, entityDir, filename);\n}\n\n/**\n * Read a JSON entity with tagged fallback.\n * When a tag is set, tries the tagged path first, then falls back to the\n * untagged path (so a tagged world can read entities written without a tag).\n */\nexport async function readJSONWithFallback<T>(\n basedir: string,\n entityDir: string,\n fileId: string,\n schema: z.ZodType<T>,\n tag?: string\n): Promise<T | null> {\n if (tag) {\n const result = await readJSON(\n path.join(basedir, entityDir, `${fileId}.${tag}.json`),\n schema\n );\n if (result !== null) return result;\n }\n return readJSON(path.join(basedir, entityDir, `${fileId}.json`), schema);\n}\n\n/**\n * List all filenames in a directory that have a specific tag.\n * Returns full filenames (e.g., `wrun_ABC.vitest-0.json`).\n */\nexport async function listTaggedFiles(\n dirPath: string,\n tag: string\n): Promise<string[]> {\n const suffix = `.${tag}.json`;\n try {\n const files = await fs.readdir(dirPath);\n return files.filter((f) => f.endsWith(suffix));\n } catch (error) {\n if ((error as any).code === 'ENOENT') return [];\n throw error;\n }\n}\n\n/**\n * List all filenames in a directory that have a specific tag and extension.\n * Returns full filenames (e.g., `stream-chnk_ABC.vitest-0.bin`).\n */\nexport async function listTaggedFilesByExtension(\n dirPath: string,\n tag: string,\n extension: string\n): Promise<string[]> {\n const suffix = `.${tag}${extension}`;\n try {\n const files = await fs.readdir(dirPath);\n return files.filter((f) => f.endsWith(suffix));\n } catch (error) {\n if ((error as any).code === 'ENOENT') return [];\n throw error;\n }\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (_error) {\n // Ignore if already exists\n }\n}\n\ninterface WriteOptions {\n overwrite?: boolean;\n}\n\n/**\n * Custom JSON replacer that encodes Uint8Array as base64 strings.\n * Format: { __type: 'Uint8Array', data: '<base64>' }\n */\nexport function jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Uint8Array) {\n return {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n }\n return value;\n}\n\n/**\n * Custom JSON reviver that decodes base64 strings back to Uint8Array.\n */\nexport function jsonReviver(_key: string, value: unknown): unknown {\n if (\n value !== null &&\n typeof value === 'object' &&\n (value as any).__type === 'Uint8Array' &&\n typeof (value as any).data === 'string'\n ) {\n return new Uint8Array(Buffer.from((value as any).data, 'base64'));\n }\n return value;\n}\n\nexport async function writeJSON(\n filePath: string,\n data: any,\n opts?: WriteOptions\n): Promise<void> {\n return write(filePath, JSON.stringify(data, jsonReplacer, 2), opts);\n}\n\n/**\n * Writes data to a file using atomic write-rename pattern.\n *\n * Note: While this function uses temp files to avoid partial writes,\n * it does not provide protection against concurrent writes from multiple\n * processes. In a multi-writer scenario, the last writer wins.\n * For production use with multiple writers, consider using a proper\n * database or locking mechanism.\n */\nexport async function write(\n filePath: string,\n data: string | Buffer,\n opts?: WriteOptions\n): Promise<void> {\n if (!opts?.overwrite) {\n // Fast path: check in-memory cache first to avoid expensive fs.access() calls\n // This provides significant performance improvement when creating many files\n if (createdFilesCache.has(filePath)) {\n throw new EntityConflictError(\n `File ${filePath} already exists and 'overwrite' is false`\n );\n }\n\n // Slow path: check filesystem for files created before this process started\n try {\n await fs.access(filePath);\n // File exists on disk, add to cache for future checks\n createdFilesCache.add(filePath);\n throw new EntityConflictError(\n `File ${filePath} already exists and 'overwrite' is false`\n );\n } catch (error: any) {\n // If file doesn't exist (ENOENT), continue with write\n if (error.code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n const tempPath = `${filePath}.tmp.${ulid()}`;\n let tempFileCreated = false;\n try {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(tempPath, data);\n tempFileCreated = true;\n await withWindowsRetry(() => fs.rename(tempPath, filePath));\n // Track this file in cache so future writes know it exists\n createdFilesCache.add(filePath);\n } catch (error) {\n // Only try to clean up temp file if it was actually created\n if (tempFileCreated) {\n await withWindowsRetry(() => fs.unlink(tempPath), 3).catch(() => {});\n }\n throw error;\n }\n}\n\nexport async function readJSON<T>(\n filePath: string,\n decoder: z.ZodType<T>\n): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return decoder.parse(JSON.parse(content, jsonReviver));\n } catch (error) {\n if ((error as any).code === 'ENOENT') return null;\n throw error;\n }\n}\n\nexport async function readBuffer(filePath: string): Promise<Buffer> {\n const content = await fs.readFile(filePath);\n return content;\n}\n\nexport async function deleteJSON(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as any).code !== 'ENOENT') throw error;\n }\n}\n\n/**\n * Atomically create a file using O_CREAT | O_EXCL flags.\n * Returns true if the file was created, false if it already exists.\n * This is atomic at the OS level, safe for concurrent access.\n */\nexport async function writeExclusive(\n filePath: string,\n data: string\n): Promise<boolean> {\n await ensureDir(path.dirname(filePath));\n try {\n await fs.writeFile(filePath, data, { flag: 'wx' });\n return true;\n } catch (error: any) {\n if (error.code === 'EEXIST') {\n return false;\n }\n throw error;\n }\n}\n\nexport async function listJSONFiles(dirPath: string): Promise<string[]> {\n return listFilesByExtension(dirPath, '.json');\n}\n\nexport async function listFilesByExtension(\n dirPath: string,\n extension: string\n): Promise<string[]> {\n try {\n const files = await fs.readdir(dirPath);\n return files\n .filter((f) => f.endsWith(extension))\n .map((f) => f.slice(0, -extension.length));\n } catch (error) {\n if ((error as any).code === 'ENOENT') return [];\n throw error;\n }\n}\n\ninterface PaginatedFileSystemQueryConfig<T> {\n directory: string;\n schema: z.ZodType<T>;\n filePrefix?: string;\n filter?: (item: T) => boolean;\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n cursor?: string;\n getCreatedAt(filename: string): Date | null;\n getId?(item: T): string;\n}\n// Cursor format: \"timestamp|id\" for tie-breaking\ninterface ParsedCursor {\n timestamp: Date;\n id: string | null;\n}\n\nfunction parseCursor(cursor: string | undefined): ParsedCursor | null {\n if (!cursor) return null;\n\n const parts = cursor.split('|');\n return {\n timestamp: new Date(parts[0]),\n id: parts[1] || null,\n };\n}\n\nfunction createCursor(timestamp: Date, id: string | undefined): string {\n return id ? `${timestamp.toISOString()}|${id}` : timestamp.toISOString();\n}\n\nexport async function paginatedFileSystemQuery<T extends { createdAt: Date }>(\n config: PaginatedFileSystemQueryConfig<T>\n): Promise<PaginatedResponse<T>> {\n const {\n directory,\n schema,\n filePrefix,\n filter,\n sortOrder = 'desc',\n limit = 20,\n cursor,\n getCreatedAt,\n getId,\n } = config;\n\n // 1. Get all JSON files in directory\n const fileIds = await listJSONFiles(directory);\n\n // 2. Filter by prefix if provided\n const relevantFileIds = filePrefix\n ? fileIds.filter((fileId) => fileId.startsWith(filePrefix))\n : fileIds;\n\n // 3. ULID Optimization: Filter by cursor using filename timestamps before loading JSON\n const parsedCursor = parseCursor(cursor);\n let candidateFileIds = relevantFileIds;\n\n if (parsedCursor) {\n candidateFileIds = relevantFileIds.filter((fileId) => {\n const filenameDate = getCreatedAt(`${fileId}.json`);\n if (filenameDate) {\n // Use filename timestamp for cursor filtering\n // We need to be careful here: if parsedCursor has an ID (for tie-breaking),\n // we need to include items with the same timestamp for later ID-based filtering.\n // If no ID, we can use strict inequality for optimization.\n const cursorTime = parsedCursor.timestamp.getTime();\n const fileTime = filenameDate.getTime();\n\n if (parsedCursor.id) {\n // Tie-breaking mode: include items at or near cursor timestamp\n return sortOrder === 'desc'\n ? fileTime <= cursorTime\n : fileTime >= cursorTime;\n } else {\n // No tie-breaking: strict inequality\n return sortOrder === 'desc'\n ? fileTime < cursorTime\n : fileTime > cursorTime;\n }\n }\n // Can't extract timestamp from filename (e.g., steps use sequential IDs).\n // Include the file and defer to JSON-based filtering below.\n return true;\n });\n }\n\n // 4. Load files individually and collect valid items\n const validItems: T[] = [];\n\n for (const fileId of candidateFileIds) {\n const filePath = path.join(directory, `${fileId}.json`);\n let item: T | null = null;\n try {\n item = await readJSON(filePath, schema);\n } catch (error: unknown) {\n // We don't expect zod errors to happen, but if the JSON does get malformed,\n // we skip the item. Preferably, we'd have a way to mark items as malformed,\n // so that the UI can display them as such, with richer messaging. In the meantime,\n // we just log a warning and skip the item.\n if (error instanceof z.ZodError) {\n console.warn(\n `Skipping item ${fileId} due to malformed JSON: ${error.message}`\n );\n continue;\n }\n throw error;\n }\n\n if (item) {\n // Apply custom filter early if provided\n if (filter && !filter(item)) continue;\n\n // Double-check cursor filtering with actual createdAt from JSON\n // (in case ULID timestamp differs from stored createdAt)\n if (parsedCursor) {\n const itemTime = item.createdAt.getTime();\n const cursorTime = parsedCursor.timestamp.getTime();\n\n if (sortOrder === 'desc') {\n // For descending order, skip items >= cursor\n if (itemTime > cursorTime) continue;\n // If timestamps are equal, use ID for tie-breaking (skip if ID >= cursorId)\n if (itemTime === cursorTime && parsedCursor.id && getId) {\n const itemId = getId(item);\n if (itemId >= parsedCursor.id) continue;\n }\n } else {\n // For ascending order, skip items <= cursor\n if (itemTime < cursorTime) continue;\n // If timestamps are equal, use ID for tie-breaking (skip if ID <= cursorId)\n if (itemTime === cursorTime && parsedCursor.id && getId) {\n const itemId = getId(item);\n if (itemId <= parsedCursor.id) continue;\n }\n }\n }\n\n validItems.push(item);\n }\n }\n\n // 5. Sort by createdAt (and by ID for tie-breaking if getId is provided)\n validItems.sort((a, b) => {\n const aTime = a.createdAt.getTime();\n const bTime = b.createdAt.getTime();\n const timeComparison = sortOrder === 'asc' ? aTime - bTime : bTime - aTime;\n\n // If timestamps are equal and we have getId, use ID for stable sorting\n if (timeComparison === 0 && getId) {\n const aId = getId(a);\n const bId = getId(b);\n return sortOrder === 'asc'\n ? aId.localeCompare(bId)\n : bId.localeCompare(aId);\n }\n\n return timeComparison;\n });\n\n // 6. Apply pagination\n const hasMore = validItems.length > limit;\n const items = hasMore ? validItems.slice(0, limit) : validItems;\n const nextCursor =\n items.length > 0\n ? createCursor(\n items[items.length - 1].createdAt,\n getId?.(items[items.length - 1])\n )\n : null;\n\n return {\n data: items,\n cursor: nextCursor,\n hasMore,\n };\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport { rm } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { World } from '@workflow/world';\nimport { reenqueueActiveRuns, SPEC_VERSION_CURRENT } from '@workflow/world';\nimport type { Config } from './config.js';\nimport { config } from './config.js';\nimport {\n clearCreatedFilesCache,\n deleteJSON,\n listTaggedFiles,\n listTaggedFilesByExtension,\n readJSON,\n} from './fs.js';\nimport { initDataDir } from './init.js';\nimport { instrumentObject } from './instrumentObject.js';\nimport { createQueue, type DirectHandler } from './queue.js';\nimport { hashToken } from './storage/helpers.js';\nimport { createStorage } from './storage.js';\nimport { createStreamer } from './streamer.js';\n\n// Re-export init types and utilities for consumers\nexport {\n DataDirAccessError,\n DataDirVersionError,\n ensureDataDir,\n initDataDir,\n type ParsedVersion,\n parseVersion,\n} from './init.js';\n\nexport type { DirectHandler } from './queue.js';\n\nexport type LocalWorld = World & {\n /** Register a direct in-process handler for a queue prefix, bypassing HTTP. */\n registerHandler(\n prefix: '__wkf_step_' | '__wkf_workflow_',\n handler: DirectHandler\n ): void;\n /** Clear all workflow data (runs, steps, events, hooks, streams). */\n clear(): Promise<void>;\n};\n\n/**\n * Creates a local world instance that combines queue, storage, and streamer functionalities.\n *\n * @param args - Optional configuration object\n * @param args.dataDir - Directory for storing workflow data (default: `.workflow-data/`)\n * @param args.port - Port override for queue transport (default: auto-detected)\n * @param args.baseUrl - Full base URL override for queue transport (default: `http://localhost:{port}`)\n * @param args.tag - Optional tag to scope files (e.g., `vitest-0`). When set, files are written\n * as `{id}.{tag}.json` and `clear()` only deletes files matching this tag.\n * @throws {DataDirAccessError} If the data directory cannot be created or accessed\n * @throws {DataDirVersionError} If the data directory version is incompatible\n */\nexport function createLocalWorld(args?: Partial<Config>): LocalWorld {\n const definedArgs = args\n ? Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined)\n )\n : {};\n const mergedConfig = { ...config.value, ...definedArgs };\n const tag = mergedConfig.tag;\n const queue = createQueue(mergedConfig);\n const storage = createStorage(mergedConfig.dataDir, tag);\n return {\n specVersion: SPEC_VERSION_CURRENT,\n ...queue,\n ...createStorage(mergedConfig.dataDir, tag),\n ...instrumentObject('world.streams', {\n ...createStreamer(mergedConfig.dataDir, tag),\n ...(mergedConfig.streamFlushIntervalMs !== undefined && {\n streamFlushIntervalMs: mergedConfig.streamFlushIntervalMs,\n }),\n }),\n async start() {\n await initDataDir(mergedConfig.dataDir);\n await reenqueueActiveRuns(storage.runs, queue.queue, 'world-local');\n },\n async close() {\n await queue.close();\n },\n async clear() {\n if (tag) {\n // Selectively delete only files matching this tag\n const basedir = mergedConfig.dataDir;\n\n // Delete hook token constraint files BEFORE deleting the hooks,\n // since we need to read each hook to extract its token hash.\n // Constraint files are untagged ({sha256}.json) so listTaggedFiles\n // won't find them — we must resolve them via the hook data.\n const hooksDir = path.join(basedir, 'hooks');\n const taggedHookFiles = await listTaggedFiles(hooksDir, tag);\n const { HookSchema } = await import('@workflow/world');\n await Promise.all(\n taggedHookFiles.map(async (hookFile) => {\n const hook = await readJSON(\n path.join(hooksDir, hookFile),\n HookSchema\n );\n if (hook?.token) {\n await deleteJSON(\n path.join(hooksDir, 'tokens', `${hashToken(hook.token)}.json`)\n );\n }\n })\n );\n\n // Delete tagged entity files across all directories\n const entityDirs = [\n 'runs',\n 'steps',\n 'events',\n 'hooks',\n 'waits',\n 'streams/runs',\n ];\n await Promise.all(\n entityDirs.map(async (dir) => {\n const fullDir = path.join(basedir, dir);\n const files = await listTaggedFiles(fullDir, tag);\n await Promise.all(\n files.map((f) => deleteJSON(path.join(fullDir, f)))\n );\n })\n );\n // Clean up lock files used for atomic terminal-state guards\n await fs\n .rm(path.join(basedir, '.locks'), { recursive: true, force: true })\n .catch(() => {});\n // Delete tagged stream chunks (.{tag}.bin files)\n const chunksDir = path.join(basedir, 'streams', 'chunks');\n const taggedBinFiles = await listTaggedFilesByExtension(\n chunksDir,\n tag,\n '.bin'\n );\n await Promise.all(\n taggedBinFiles.map((f) =>\n fs.unlink(path.join(chunksDir, f)).catch(() => {})\n )\n );\n // Clear the in-memory write cache so deleted paths are forgotten\n clearCreatedFilesCache();\n } else {\n await rm(mergedConfig.dataDir, { recursive: true, force: true });\n await initDataDir(mergedConfig.dataDir);\n }\n },\n };\n}\n"]}
|
package/dist/init.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n access,\n constants,\n mkdir,\n readFile,\n unlink,\n writeFile,\n} from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Package name - hardcoded since it doesn't change */\nconst PACKAGE_NAME = '@workflow/world-local';\n\ninterface PackageInfo {\n name: string;\n version: string;\n}\n\nlet cachedPackageInfo: PackageInfo | null = null;\n\n/**\n * Get the directory path for this module.\n * Works in ESM and falls back to a constant in CJS contexts (which shouldn't happen)\n */\nfunction getModuleDir(): string | null {\n // In bundled CJS contexts, import.meta.url may be undefined or empty\n if (typeof import.meta.url === 'string' && import.meta.url) {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n return null;\n}\n\n/**\n * Returns the package name and version from package.json.\n * The result is cached after the first read.\n *\n * In bundled contexts where package.json cannot be read,\n * returns 'bundled' as the version.\n */\nexport async function getPackageInfo(): Promise<PackageInfo> {\n if (cachedPackageInfo) {\n return cachedPackageInfo;\n }\n\n const moduleDir = getModuleDir();\n if (moduleDir) {\n try {\n const content = await readFile(\n path.join(moduleDir, '../package.json'),\n 'utf-8'\n );\n cachedPackageInfo = JSON.parse(content) as PackageInfo;\n return cachedPackageInfo;\n } catch {\n // Fall through to bundled fallback\n }\n }\n\n // Bundled context - package.json not accessible\n cachedPackageInfo = {\n name: PACKAGE_NAME,\n version: 'bundled',\n };\n return cachedPackageInfo;\n}\n\n/** Filename for storing version information in the data directory */\nconst VERSION_FILENAME = 'version.txt';\n\n/**\n * Represents a parsed semantic version with optional prerelease tag.\n */\nexport interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n raw: string;\n}\n\n/**\n * Error thrown when the data directory cannot be accessed or created.\n */\nexport class DataDirAccessError extends Error {\n readonly dataDir: string;\n readonly code?: string;\n\n constructor(message: string, dataDir: string, code?: string) {\n super(message);\n this.name = 'DataDirAccessError';\n this.dataDir = dataDir;\n this.code = code;\n }\n}\n\n/**\n * Error thrown when data directory version is incompatible.\n */\nexport class DataDirVersionError extends Error {\n readonly oldVersion: ParsedVersion;\n readonly newVersion: ParsedVersion;\n readonly suggestedVersion?: string;\n\n constructor(\n message: string,\n oldVersion: ParsedVersion,\n newVersion: ParsedVersion,\n suggestedVersion?: string\n ) {\n super(message);\n this.name = 'DataDirVersionError';\n this.oldVersion = oldVersion;\n this.newVersion = newVersion;\n this.suggestedVersion = suggestedVersion;\n }\n}\n\n/**\n * Parses a version string into its components.\n *\n * @param versionString - Version string like \"4.0.1\" or \"4.0.1-beta.20\"\n * @returns Parsed version object with major, minor, patch, and optional prerelease\n */\nexport function parseVersion(versionString: string): ParsedVersion {\n // Match: major.minor.patch with optional prerelease\n const match = versionString.match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/);\n\n if (!match) {\n throw new Error(`Invalid version string: \"${versionString}\"`);\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n prerelease: match[4],\n raw: versionString,\n };\n}\n\n/**\n * Formats a parsed version back to a string.\n */\nexport function formatVersion(version: ParsedVersion): string {\n const base = `${version.major}.${version.minor}.${version.patch}`;\n return version.prerelease ? `${base}-${version.prerelease}` : base;\n}\n\n/**\n * Parses the version file content to extract package name and version.\n *\n * @param content - Content like \"@workflow/world-local@4.0.1-beta.20\"\n * @returns Object with packageName and version\n */\nexport function parseVersionFile(content: string): {\n packageName: string;\n version: ParsedVersion;\n} {\n const trimmed = content.trim();\n const lastAtIndex = trimmed.lastIndexOf('@');\n\n if (lastAtIndex <= 0) {\n throw new Error(`Invalid version file content: \"${content}\"`);\n }\n\n const packageName = trimmed.substring(0, lastAtIndex);\n const versionString = trimmed.substring(lastAtIndex + 1);\n\n return {\n packageName,\n version: parseVersion(versionString),\n };\n}\n\n/**\n * Formats the version file content.\n */\nexport function formatVersionFile(\n packageName: string,\n version: ParsedVersion\n): string {\n return `${packageName}@${formatVersion(version)}`;\n}\n\n/**\n * Handles version upgrades between old and new versions.\n * This function is called when the data directory was created with a different version.\n *\n * @param oldVersion - The version that created the data directory\n * @param newVersion - The current package version\n * @throws {DataDirVersionError} If the versions are incompatible\n */\nexport function upgradeVersion(\n oldVersion: ParsedVersion,\n newVersion: ParsedVersion\n): void {\n console.log(\n `[world-local] Upgrading from version ${formatVersion(oldVersion)} to ${formatVersion(newVersion)}`\n );\n}\n\n/**\n * Ensures the data directory exists and is writable.\n * Creates the directory if it doesn't exist.\n *\n * @param dataDir - The path to the data directory\n * @throws {DataDirAccessError} If the directory cannot be created or accessed\n */\nexport async function ensureDataDir(dataDir: string): Promise<void> {\n const absolutePath = path.resolve(dataDir);\n\n // Try to create the directory if it doesn't exist\n try {\n await mkdir(absolutePath, { recursive: true });\n } catch (error: unknown) {\n const nodeError = error as NodeJS.ErrnoException;\n // EEXIST is fine - directory already exists\n if (nodeError.code !== 'EEXIST') {\n throw new DataDirAccessError(\n `Failed to create data directory \"${absolutePath}\": ${nodeError.message}`,\n absolutePath,\n nodeError.code\n );\n }\n }\n\n // Verify the directory is accessible (readable)\n try {\n await access(absolutePath, constants.R_OK);\n } catch (error: unknown) {\n const nodeError = error as NodeJS.ErrnoException;\n throw new DataDirAccessError(\n `Data directory \"${absolutePath}\" is not readable: ${nodeError.message}`,\n absolutePath,\n nodeError.code\n );\n }\n\n // Verify the directory is writable by attempting to write a temp file\n const testFile = path.join(\n absolutePath,\n `.workflow-write-test-${Date.now()}`\n );\n try {\n await writeFile(testFile, '');\n // Clean up test file — ENOENT during cleanup is harmless (may race\n // with another process performing the same check concurrently)\n await unlink(testFile).catch((e: NodeJS.ErrnoException) => {\n if (e.code !== 'ENOENT') throw e;\n });\n } catch (error: unknown) {\n const nodeError = error as NodeJS.ErrnoException;\n throw new DataDirAccessError(\n `Data directory \"${absolutePath}\" is not writable: ${nodeError.message}`,\n absolutePath,\n nodeError.code\n );\n }\n}\n\n/**\n * Reads the version from the data directory's version file.\n *\n * @param dataDir - Path to the data directory\n * @returns The parsed version info, or null if the file doesn't exist\n */\nasync function readVersionFile(dataDir: string): Promise<{\n packageName: string;\n version: ParsedVersion;\n} | null> {\n const versionFilePath = path.join(path.resolve(dataDir), VERSION_FILENAME);\n\n try {\n const content = await readFile(versionFilePath, 'utf-8');\n return parseVersionFile(content);\n } catch (error: unknown) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Writes the current version to the data directory's version file.\n *\n * @param dataDir - Path to the data directory\n * @param version - The version to write\n */\nasync function writeVersionFile(\n dataDir: string,\n version: ParsedVersion\n): Promise<void> {\n const versionFilePath = path.join(path.resolve(dataDir), VERSION_FILENAME);\n const packageInfo = await getPackageInfo();\n const content = formatVersionFile(packageInfo.name, version);\n await writeFile(versionFilePath, content);\n}\n\n/**\n * Gets the suggested downgrade version based on the old version.\n * If a specific version is suggested in the error, use that.\n * Otherwise, suggest the previous minor version if patch is 0,\n * or previous major version if minor is also 0.\n */\nfunction getSuggestedDowngradeVersion(\n oldVersion: ParsedVersion,\n suggestedVersion?: string\n): string {\n if (suggestedVersion) {\n return suggestedVersion;\n }\n\n // Suggest the old version as the downgrade target\n return formatVersion(oldVersion);\n}\n\n/**\n * Initializes the data directory, ensuring it exists, is accessible,\n * and handles version compatibility.\n *\n * @param dataDir - The path to the data directory\n * @throws {DataDirAccessError} If the directory cannot be created or accessed\n */\nexport async function initDataDir(dataDir: string): Promise<void> {\n // First ensure the directory exists and is accessible\n await ensureDataDir(dataDir);\n\n const packageInfo = await getPackageInfo();\n const currentVersion = parseVersion(packageInfo.version);\n\n // Read existing version file\n const existingVersionInfo = await readVersionFile(dataDir);\n\n if (existingVersionInfo === null) {\n // New data directory - write the current version\n await writeVersionFile(dataDir, currentVersion);\n return;\n }\n\n const { version: oldVersion } = existingVersionInfo;\n\n // Check if versions are the same (no upgrade needed)\n if (formatVersion(oldVersion) === formatVersion(currentVersion)) {\n return;\n }\n\n // Attempt upgrade\n try {\n upgradeVersion(oldVersion, currentVersion);\n // Upgrade succeeded - write the new version\n await writeVersionFile(dataDir, currentVersion);\n } catch (error: unknown) {\n const suggestedVersion =\n error instanceof DataDirVersionError ? error.suggestedVersion : undefined;\n\n const downgradeTarget = getSuggestedDowngradeVersion(\n oldVersion,\n suggestedVersion\n );\n\n console.error(\n `[world-local] Failed to upgrade data directory from version ${formatVersion(oldVersion)} to ${formatVersion(currentVersion)}:`,\n error instanceof Error ? error.message : error\n );\n console.error(\n `[world-local] Data is not compatible with the current version. ` +\n `Please downgrade to ${packageInfo.name}@${downgradeTarget}`\n );\n\n throw error;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentObject.js","sourceRoot":"","sources":["../src/instrumentObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,KAAK,EACL,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,iDAAiD;AACjD,MAAM,mBAAmB,GAAG;IAC1B,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,OAAO;IAClB,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAe;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAA4B,CAAC;QAChD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAmB,MAAc,EAAE,CAAI;IACrE,MAAM,QAAQ,GAAG,EAAO,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAgB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,+CAA+C;YAC/C,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;gBAC3C,8DAA8D;gBAC9D,IAAI,QAAQ,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;gBACzC,IAAI,MAAM,KAAK,cAAc,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACzD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACd,QAAQ,GAAG,GAAG,MAAM,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAED,OAAO,KAAK,CACV,QAAQ,EACR,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,EACvC,KAAK,EAAE,IAAI,EAAE,EAAE;oBACb,+CAA+C;oBAC/C,sEAAsE;oBACtE,IAAI,EAAE,aAAa,CAAC;wBAClB,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC;wBAC/C,GAAG,SAAS,CAAC,mBAAmB,CAAC,SAAS,CAAC;wBAC3C,GAAG,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC;wBAC7C,GAAG,SAAS,CAAC,QAAQ,CAAC;qBACvB,CAAC,CAAC;oBACH,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpB,CAAC,CACF,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Utility to instrument object methods with tracing.\n * This mirrors world-vercel's implementation for consistent observability.\n */\nimport {\n trace,\n getSpanKind,\n PeerService,\n RpcSystem,\n RpcService,\n RpcMethod,\n} from './telemetry.js';\n\n/** Configuration for peer service attribution */\nconst WORLD_LOCAL_SERVICE = {\n peerService: 'world-local',\n rpcSystem: 'local',\n rpcService: 'world-local',\n};\n\n/**\n * Extracts the event type from arguments for events.create calls.\n * The event data is the second argument and contains eventType.\n */\nfunction extractEventType(args: unknown[]): string | undefined {\n if (args.length >= 2 && typeof args[1] === 'object' && args[1] !== null) {\n const data = args[1] as Record<string, unknown>;\n if (typeof data.eventType === 'string') {\n return data.eventType;\n }\n }\n return undefined;\n}\n\n/**\n * Wraps all methods of an object with tracing spans.\n * @param prefix - Prefix for span names (e.g., \"world.runs\")\n * @param o - Object with methods to instrument\n * @returns Instrumented object with same interface\n */\nexport function instrumentObject<T extends object>(prefix: string, o: T): T {\n const handlers = {} as T;\n for (const key of Object.keys(o) as (keyof T)[]) {\n if (typeof o[key] !== 'function') {\n handlers[key] = o[key];\n } else {\n const f = o[key];\n const methodName = String(key);\n // @ts-expect-error - dynamic function wrapping\n handlers[key] = async (...args: unknown[]) => {\n // Build span name - for events.create, include the event type\n let spanName = `${prefix}.${methodName}`;\n if (prefix === 'world.events' && methodName === 'create') {\n const eventType = extractEventType(args);\n if (eventType) {\n spanName = `${prefix}.${methodName} ${eventType}`;\n }\n }\n\n return trace(\n spanName,\n { kind: await getSpanKind('INTERNAL') },\n async (span) => {\n // Add peer service attributes for service maps\n // Use spanName for rpc.method so Datadog shows event type in resource\n span?.setAttributes({\n ...PeerService(WORLD_LOCAL_SERVICE.peerService),\n ...RpcSystem(WORLD_LOCAL_SERVICE.rpcSystem),\n ...RpcService(WORLD_LOCAL_SERVICE.rpcService),\n ...RpcMethod(spanName),\n });\n return f(...args);\n }\n );\n };\n }\n }\n return handlers;\n}\n"]}
|