@workflow/next 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/builder-deferred.d.ts.map +1 -1
- package/dist/builder-deferred.js +416 -501
- package/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +60 -76
- package/dist/builder.d.ts +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +4 -4
- package/dist/environment-flag.d.ts +2 -0
- package/dist/environment-flag.d.ts.map +1 -0
- package/dist/environment-flag.js +15 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +267 -10
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +59 -60
- package/dist/runtime.js +1 -1
- package/dist/socket-server.d.ts +20 -0
- package/dist/socket-server.d.ts.map +1 -1
- package/dist/socket-server.js +29 -2
- package/docs/api-reference/with-workflow.mdx +34 -2
- package/docs/next.mdx +5 -3
- package/package.json +4 -5
- package/dist/builder-deferred.js.map +0 -1
- package/dist/builder-eager.js.map +0 -1
- package/dist/builder.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/loader.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/socket-server.js.map +0 -1
- package/dist/step-copy-utils.d.ts +0 -19
- package/dist/step-copy-utils.d.ts.map +0 -1
- package/dist/step-copy-utils.js +0 -101
- package/dist/step-copy-utils.js.map +0 -1
package/dist/loader.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldNotifySocketForDiscoveredPattern = shouldNotifySocketForDiscoveredPattern;
|
|
3
4
|
exports.default = workflowLoader;
|
|
4
5
|
const node_fs_1 = require("node:fs");
|
|
5
6
|
const promises_1 = require("node:fs/promises");
|
|
@@ -7,17 +8,47 @@ const node_net_1 = require("node:net");
|
|
|
7
8
|
const node_path_1 = require("node:path");
|
|
8
9
|
const core_1 = require("@swc/core");
|
|
9
10
|
const socket_server_js_1 = require("./socket-server.js");
|
|
10
|
-
const step_copy_utils_js_1 = require("./step-copy-utils.js");
|
|
11
11
|
// Cache decorator options per working directory to avoid reading tsconfig for every file
|
|
12
12
|
const decoratorOptionsCache = new Map();
|
|
13
13
|
// Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)
|
|
14
14
|
let cachedBuildersModule = null;
|
|
15
15
|
let cachedLoaderStaticDependencies = null;
|
|
16
16
|
const discoveredPatternStateByFilePath = new Map();
|
|
17
|
+
function shouldNotifySocketForDiscoveredPattern(patternStateChanged, patternState) {
|
|
18
|
+
return (patternStateChanged ||
|
|
19
|
+
patternState.hasWorkflow ||
|
|
20
|
+
patternState.hasStep ||
|
|
21
|
+
patternState.hasSerde);
|
|
22
|
+
}
|
|
17
23
|
// Cache socket connection to avoid reconnecting on every file.
|
|
18
24
|
let socketClientPromise = null;
|
|
19
25
|
let socketClient = null;
|
|
20
26
|
let socketClientKey = null;
|
|
27
|
+
/**
|
|
28
|
+
* Wrap a TCP connect failure with context about where the connection was
|
|
29
|
+
* attempted, where the credentials came from, and which source file was
|
|
30
|
+
* being processed when it failed. ECONNREFUSED is the common case here, and
|
|
31
|
+
* the message points the user at the most likely root cause (stale
|
|
32
|
+
* socket-info file).
|
|
33
|
+
*/
|
|
34
|
+
function annotateConnectionError(originalError, credentials) {
|
|
35
|
+
const errorCode = originalError instanceof Error &&
|
|
36
|
+
'code' in originalError &&
|
|
37
|
+
typeof originalError.code === 'string'
|
|
38
|
+
? originalError.code
|
|
39
|
+
: undefined;
|
|
40
|
+
const errorMessage = originalError instanceof Error
|
|
41
|
+
? originalError.message
|
|
42
|
+
: String(originalError);
|
|
43
|
+
const lines = [
|
|
44
|
+
`Workflow discovery socket connect failed: ${errorCode ?? errorMessage} (127.0.0.1:${credentials.port})`,
|
|
45
|
+
];
|
|
46
|
+
const annotated = new Error(lines.join('\n'));
|
|
47
|
+
if (originalError instanceof Error) {
|
|
48
|
+
annotated.cause = originalError;
|
|
49
|
+
}
|
|
50
|
+
return annotated;
|
|
51
|
+
}
|
|
21
52
|
const ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';
|
|
22
53
|
const ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS = 120_000;
|
|
23
54
|
let pendingDeferredRouteStubBuildPromise = null;
|
|
@@ -63,7 +94,6 @@ function resolveLoaderStaticDependencies() {
|
|
|
63
94
|
const files = new Set([
|
|
64
95
|
__filename,
|
|
65
96
|
require.resolve('./socket-server'),
|
|
66
|
-
require.resolve('./step-copy-utils'),
|
|
67
97
|
swcPluginPath,
|
|
68
98
|
swcPluginBuildHashPath,
|
|
69
99
|
workflowBuildersPath,
|
|
@@ -110,10 +140,10 @@ function getSocketInfoFilePath() {
|
|
|
110
140
|
// Fallback for worker processes that don't inherit dynamic env updates
|
|
111
141
|
// from the process that created the socket server.
|
|
112
142
|
const distDir = process.env.WORKFLOW_NEXT_DIST_DIR || '.next';
|
|
113
|
-
const cwdFallbackPath = (0, node_path_1.join)(process.cwd(), distDir,
|
|
143
|
+
const cwdFallbackPath = (0, node_path_1.join)(process.cwd(), distDir, socket_server_js_1.SOCKET_INFO_FILENAME);
|
|
114
144
|
const projectRoot = process.env.WORKFLOW_PROJECT_ROOT;
|
|
115
145
|
if (projectRoot) {
|
|
116
|
-
const projectRootFallbackPath = (0, node_path_1.join)(projectRoot, distDir,
|
|
146
|
+
const projectRootFallbackPath = (0, node_path_1.join)(projectRoot, distDir, socket_server_js_1.SOCKET_INFO_FILENAME);
|
|
117
147
|
if ((0, node_fs_1.existsSync)(projectRootFallbackPath)) {
|
|
118
148
|
return projectRootFallbackPath;
|
|
119
149
|
}
|
|
@@ -199,12 +229,12 @@ async function getSocketClient() {
|
|
|
199
229
|
};
|
|
200
230
|
const onError = (error) => {
|
|
201
231
|
cleanup();
|
|
202
|
-
reject(error);
|
|
232
|
+
reject(annotateConnectionError(error, socketCredentials));
|
|
203
233
|
};
|
|
204
234
|
const timeout = setTimeout(() => {
|
|
205
235
|
cleanup();
|
|
206
236
|
socket.destroy();
|
|
207
|
-
reject(new Error('Socket connection timeout'));
|
|
237
|
+
reject(annotateConnectionError(new Error('Socket connection timeout'), socketCredentials));
|
|
208
238
|
}, 1000);
|
|
209
239
|
const cleanup = () => {
|
|
210
240
|
clearTimeout(timeout);
|
|
@@ -273,7 +303,7 @@ async function createSocketConnection(socketCredentials, timeoutMs = 1_000) {
|
|
|
273
303
|
const timeout = setTimeout(() => {
|
|
274
304
|
cleanup();
|
|
275
305
|
socket.destroy();
|
|
276
|
-
reject(new Error('Socket connection timeout'));
|
|
306
|
+
reject(annotateConnectionError(new Error('Socket connection timeout'), socketCredentials));
|
|
277
307
|
}, timeoutMs);
|
|
278
308
|
const cleanup = () => {
|
|
279
309
|
clearTimeout(timeout);
|
|
@@ -288,7 +318,7 @@ async function createSocketConnection(socketCredentials, timeoutMs = 1_000) {
|
|
|
288
318
|
const onError = (error) => {
|
|
289
319
|
cleanup();
|
|
290
320
|
socket.destroy();
|
|
291
|
-
reject(error);
|
|
321
|
+
reject(annotateConnectionError(error, socketCredentials));
|
|
292
322
|
};
|
|
293
323
|
socket.on('connect', onConnect);
|
|
294
324
|
socket.on('error', onError);
|
|
@@ -444,10 +474,6 @@ async function getRelativeFilenameForSwc(filename, workingDir) {
|
|
|
444
474
|
}
|
|
445
475
|
return relativeFilename;
|
|
446
476
|
}
|
|
447
|
-
function stripDeferredStepSourceMetadataComment(source) {
|
|
448
|
-
const metadataPattern = new RegExp(`^\\s*//\\s*${step_copy_utils_js_1.DEFERRED_STEP_SOURCE_METADATA_PREFIX}[A-Za-z0-9+/=]+\\s*\\r?\\n?`);
|
|
449
|
-
return source.replace(metadataPattern, '');
|
|
450
|
-
}
|
|
451
477
|
function workflowLoader(source, sourceMap) {
|
|
452
478
|
const callback = this.async?.();
|
|
453
479
|
const run = async () => {
|
|
@@ -455,29 +481,12 @@ function workflowLoader(source, sourceMap) {
|
|
|
455
481
|
const normalizedSource = source.toString();
|
|
456
482
|
const workingDir = process.cwd();
|
|
457
483
|
const swcPluginPath = registerTransformDependencies(this);
|
|
458
|
-
const
|
|
459
|
-
const deferredStepSourceMetadata = isDeferredStepCopyFile
|
|
460
|
-
? (0, step_copy_utils_js_1.parseDeferredStepSourceMetadata)(normalizedSource)
|
|
461
|
-
: null;
|
|
462
|
-
const sourceWithoutDeferredMetadata = isDeferredStepCopyFile
|
|
463
|
-
? stripDeferredStepSourceMetadataComment(normalizedSource)
|
|
464
|
-
: normalizedSource;
|
|
465
|
-
const deferredSourceMapResult = isDeferredStepCopyFile
|
|
466
|
-
? (0, step_copy_utils_js_1.parseInlineSourceMapComment)(sourceWithoutDeferredMetadata)
|
|
467
|
-
: {
|
|
468
|
-
sourceWithoutMapComment: sourceWithoutDeferredMetadata,
|
|
469
|
-
sourceMap: null,
|
|
470
|
-
};
|
|
471
|
-
const sourceForTransform = deferredSourceMapResult.sourceWithoutMapComment;
|
|
472
|
-
const discoveryFilePath = deferredStepSourceMetadata?.absolutePath || filename;
|
|
473
|
-
if (deferredStepSourceMetadata?.absolutePath) {
|
|
474
|
-
// Ensure edits to the original source invalidate deferred step copies.
|
|
475
|
-
registerFileDependency(this, deferredStepSourceMetadata.absolutePath);
|
|
476
|
-
}
|
|
484
|
+
const sourceForTransform = normalizedSource;
|
|
477
485
|
const isGeneratedWorkflowFile = await checkGeneratedFile(filename);
|
|
478
|
-
// Skip generated workflow route files to avoid re-processing them
|
|
479
|
-
//
|
|
480
|
-
|
|
486
|
+
// Skip generated workflow route files to avoid re-processing them.
|
|
487
|
+
// Deferred route stubs are a special case: wait for the generated route
|
|
488
|
+
// output to become available before returning.
|
|
489
|
+
if (isGeneratedWorkflowFile) {
|
|
481
490
|
if (process.env.WORKFLOW_NEXT_LAZY_DISCOVERY === '1' &&
|
|
482
491
|
isWorkflowRouteStubSource(normalizedSource)) {
|
|
483
492
|
try {
|
|
@@ -497,25 +506,18 @@ function workflowLoader(source, sourceMap) {
|
|
|
497
506
|
const patterns = await detectPatterns(sourceForTransform);
|
|
498
507
|
// Always notify discovery tracking, even for `false/false`, so files that
|
|
499
508
|
// previously had workflow/step usage are removed from the tracked sets.
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
};
|
|
509
|
-
const { shouldNotify } = updateDiscoveredPatternState(discoveryFilePath, nextPatternState);
|
|
510
|
-
if (shouldNotify) {
|
|
511
|
-
await notifySocketServer(discoveryFilePath, nextPatternState.hasWorkflow, nextPatternState.hasStep, nextPatternState.hasSerde);
|
|
512
|
-
}
|
|
509
|
+
const nextPatternState = {
|
|
510
|
+
hasWorkflow: patterns.hasUseWorkflow,
|
|
511
|
+
hasStep: patterns.hasUseStep,
|
|
512
|
+
hasSerde: patterns.hasSerde,
|
|
513
|
+
};
|
|
514
|
+
const { shouldNotify } = updateDiscoveredPatternState(filename, nextPatternState);
|
|
515
|
+
if (shouldNotifySocketForDiscoveredPattern(shouldNotify, nextPatternState)) {
|
|
516
|
+
await notifySocketServer(filename, nextPatternState.hasWorkflow, nextPatternState.hasStep, nextPatternState.hasSerde);
|
|
513
517
|
}
|
|
514
|
-
if
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
return { code: normalizedSource, map: sourceMap };
|
|
518
|
-
}
|
|
518
|
+
// Check if file needs transformation based on patterns and path
|
|
519
|
+
if (!(await checkShouldTransform(filename, patterns))) {
|
|
520
|
+
return { code: normalizedSource, map: sourceMap };
|
|
519
521
|
}
|
|
520
522
|
const isTypeScript = filename.endsWith('.ts') ||
|
|
521
523
|
filename.endsWith('.tsx') ||
|
|
@@ -523,16 +525,15 @@ function workflowLoader(source, sourceMap) {
|
|
|
523
525
|
filename.endsWith('.cts');
|
|
524
526
|
// Calculate relative filename for SWC plugin
|
|
525
527
|
// The SWC plugin uses filename to generate workflowId, so it must be relative
|
|
526
|
-
const relativeFilename =
|
|
527
|
-
(await getRelativeFilenameForSwc(filename, workingDir));
|
|
528
|
+
const relativeFilename = await getRelativeFilenameForSwc(filename, workingDir);
|
|
528
529
|
// Get decorator options from tsconfig (cached per working directory)
|
|
529
530
|
const { options: decoratorOptions, configPath } = await getDecoratorOptions(workingDir);
|
|
530
531
|
if (configPath) {
|
|
531
532
|
registerFileDependency(this, configPath);
|
|
532
533
|
}
|
|
533
534
|
// Resolve module specifier for packages (node_modules or workspace packages)
|
|
534
|
-
const moduleSpecifier = await getModuleSpecifier(
|
|
535
|
-
const mode =
|
|
535
|
+
const moduleSpecifier = await getModuleSpecifier(filename, workingDir);
|
|
536
|
+
const mode = 'step';
|
|
536
537
|
// Transform with SWC
|
|
537
538
|
const result = await (0, core_1.transform)(sourceForTransform, {
|
|
538
539
|
filename: relativeFilename,
|
|
@@ -563,9 +564,7 @@ function workflowLoader(source, sourceMap) {
|
|
|
563
564
|
},
|
|
564
565
|
},
|
|
565
566
|
minify: false,
|
|
566
|
-
inputSourceMap:
|
|
567
|
-
? deferredSourceMapResult.sourceMap || sourceMap
|
|
568
|
-
: sourceMap,
|
|
567
|
+
inputSourceMap: sourceMap,
|
|
569
568
|
sourceMaps: true,
|
|
570
569
|
inlineSourcesContent: true,
|
|
571
570
|
});
|
|
@@ -592,4 +591,4 @@ function workflowLoader(source, sourceMap) {
|
|
|
592
591
|
callback(error instanceof Error ? error : new Error(String(error)));
|
|
593
592
|
});
|
|
594
593
|
}
|
|
595
|
-
//# sourceMappingURL=loader.js.map
|
|
594
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVDQSx3RkFVQztBQTBtQkQsaUNBcUpDO0FBaHpCRCxxQ0FBcUM7QUFDckMsK0NBQTRDO0FBQzVDLHVDQUFnRDtBQUNoRCx5Q0FBb0Q7QUFDcEQsb0NBQXNDO0FBQ3RDLHlEQUs0QjtBQU01Qix5RkFBeUY7QUFDekYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFHbEMsQ0FBQztBQUNKLHlHQUF5RztBQUN6RyxJQUFJLG9CQUFvQixHQUErQyxJQUFJLENBQUM7QUFLNUUsSUFBSSw4QkFBOEIsR0FBb0MsSUFBSSxDQUFDO0FBTzNFLE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxHQUFHLEVBRzdDLENBQUM7QUFFSixTQUFnQixzQ0FBc0MsQ0FDcEQsbUJBQTRCLEVBQzVCLFlBQW9DO0lBRXBDLE9BQU8sQ0FDTCxtQkFBbUI7UUFDbkIsWUFBWSxDQUFDLFdBQVc7UUFDeEIsWUFBWSxDQUFDLE9BQU87UUFDcEIsWUFBWSxDQUFDLFFBQVEsQ0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsSUFBSSxtQkFBbUIsR0FBa0MsSUFBSSxDQUFDO0FBQzlELElBQUksWUFBWSxHQUFrQixJQUFJLENBQUM7QUFDdkMsSUFBSSxlQUFlLEdBQWtCLElBQUksQ0FBQztBQU8xQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLHVCQUF1QixDQUM5QixhQUFzQixFQUN0QixXQUE4QjtJQUU5QixNQUFNLFNBQVMsR0FDYixhQUFhLFlBQVksS0FBSztRQUM5QixNQUFNLElBQUksYUFBYTtRQUN2QixPQUFRLGFBQW9DLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDNUQsQ0FBQyxDQUFHLGFBQWtDLENBQUMsSUFBZTtRQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLE1BQU0sWUFBWSxHQUNoQixhQUFhLFlBQVksS0FBSztRQUM1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RSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxHQUFHLEVBQUU7U0FDUCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekQsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDeEIsUUFBUSxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY29ubmVjdCwgdHlwZSBTb2NrZXQgfSBmcm9tICdub2RlOm5ldCc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICdAc3djL2NvcmUnO1xuaW1wb3J0IHtcbiAgcGFyc2VNZXNzYWdlLFxuICBTT0NLRVRfSU5GT19GSUxFTkFNRSxcbiAgdHlwZSBTb2NrZXRNZXNzYWdlLFxuICBzZXJpYWxpemVNZXNzYWdlLFxufSBmcm9tICcuL3NvY2tldC1zZXJ2ZXIuanMnO1xuXG50eXBlIERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aCA9XG4gIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJykuRGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoO1xudHlwZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCA9IGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJykuV29ya2Zsb3dQYXR0ZXJuTWF0Y2g7XG5cbi8vIENhY2hlIGRlY29yYXRvciBvcHRpb25zIHBlciB3b3JraW5nIGRpcmVjdG9yeSB0byBhdm9pZCByZWFkaW5nIHRzY29uZmlnIGZvciBldmVyeSBmaWxlXG5jb25zdCBkZWNvcmF0b3JPcHRpb25zQ2FjaGUgPSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIFByb21pc2U8RGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoPlxuPigpO1xuLy8gQ2FjaGUgZm9yIHNoYXJlZCB1dGlsaXRpZXMgZnJvbSBAd29ya2Zsb3cvYnVpbGRlcnMgKEVTTSBtb2R1bGUgbG9hZGVkIGR5bmFtaWNhbGx5IGluIENvbW1vbkpTIGNvbnRleHQpXG5sZXQgY2FjaGVkQnVpbGRlcnNNb2R1bGU6IHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpIHwgbnVsbCA9IG51bGw7XG50eXBlIExvYWRlclN0YXRpY0RlcGVuZGVuY2llcyA9IHtcbiAgc3djUGx1Z2luUGF0aDogc3RyaW5nO1xuICBmaWxlczogc3RyaW5nW107XG59O1xubGV0IGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llczogTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzIHwgbnVsbCA9IG51bGw7XG5cbnR5cGUgRGlzY292ZXJlZFBhdHRlcm5TdGF0ZSA9IHtcbiAgaGFzV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1N0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufTtcbmNvbnN0IGRpc2NvdmVyZWRQYXR0ZXJuU3RhdGVCeUZpbGVQYXRoID0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBEaXNjb3ZlcmVkUGF0dGVyblN0YXRlXG4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGROb3RpZnlTb2NrZXRGb3JEaXNjb3ZlcmVkUGF0dGVybihcbiAgcGF0dGVyblN0YXRlQ2hhbmdlZDogYm9vbGVhbixcbiAgcGF0dGVyblN0YXRlOiBEaXNjb3ZlcmVkUGF0dGVyblN0YXRlXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwYXR0ZXJuU3RhdGVDaGFuZ2VkIHx8XG4gICAgcGF0dGVyblN0YXRlLmhhc1dvcmtmbG93IHx8XG4gICAgcGF0dGVyblN0YXRlLmhhc1N0ZXAgfHxcbiAgICBwYXR0ZXJuU3RhdGUuaGFzU2VyZGVcbiAgKTtcbn1cblxuLy8gQ2FjaGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gYXZvaWQgcmVjb25uZWN0aW5nIG9uIGV2ZXJ5IGZpbGUuXG5sZXQgc29ja2V0Q2xpZW50UHJvbWlzZTogUHJvbWlzZTxTb2NrZXQgfCBudWxsPiB8IG51bGwgPSBudWxsO1xubGV0IHNvY2tldENsaWVudDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG5sZXQgc29ja2V0Q2xpZW50S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxudHlwZSBTb2NrZXRDcmVkZW50aWFscyA9IHtcbiAgcG9ydDogbnVtYmVyO1xuICBhdXRoVG9rZW46IHN0cmluZztcbn07XG5cbi8qKlxuICogV3JhcCBhIFRDUCBjb25uZWN0IGZhaWx1cmUgd2l0aCBjb250ZXh0IGFib3V0IHdoZXJlIHRoZSBjb25uZWN0aW9uIHdhc1xuICogYXR0ZW1wdGVkLCB3aGVyZSB0aGUgY3JlZGVudGlhbHMgY2FtZSBmcm9tLCBhbmQgd2hpY2ggc291cmNlIGZpbGUgd2FzXG4gKiBiZWluZyBwcm9jZXNzZWQgd2hlbiBpdCBmYWlsZWQuIEVDT05OUkVGVVNFRCBpcyB0aGUgY29tbW9uIGNhc2UgaGVyZSwgYW5kXG4gKiB0aGUgbWVzc2FnZSBwb2ludHMgdGhlIHVzZXIgYXQgdGhlIG1vc3QgbGlrZWx5IHJvb3QgY2F1c2UgKHN0YWxlXG4gKiBzb2NrZXQtaW5mbyBmaWxlKS5cbiAqL1xuZnVuY3Rpb24gYW5ub3RhdGVDb25uZWN0aW9uRXJyb3IoXG4gIG9yaWdpbmFsRXJyb3I6IHVua25vd24sXG4gIGNyZWRlbnRpYWxzOiBTb2NrZXRDcmVkZW50aWFsc1xuKTogRXJyb3Ige1xuICBjb25zdCBlcnJvckNvZGUgPVxuICAgIG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICdjb2RlJyBpbiBvcmlnaW5hbEVycm9yICYmXG4gICAgdHlwZW9mIChvcmlnaW5hbEVycm9yIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSA9PT0gJ3N0cmluZydcbiAgICAgID8gKChvcmlnaW5hbEVycm9yIGFzIHsgY29kZTogc3RyaW5nIH0pLmNvZGUgYXMgc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgb3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZVxuICAgICAgOiBTdHJpbmcob3JpZ2luYWxFcnJvcik7XG5cbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYFdvcmtmbG93IGRpc2NvdmVyeSBzb2NrZXQgY29ubmVjdCBmYWlsZWQ6ICR7ZXJyb3JDb2RlID8/IGVycm9yTWVzc2FnZX0gKDEyNy4wLjAuMToke2NyZWRlbnRpYWxzLnBvcnR9KWAsXG4gIF07XG5cbiAgY29uc3QgYW5ub3RhdGVkID0gbmV3IEVycm9yKGxpbmVzLmpvaW4oJ1xcbicpKTtcbiAgaWYgKG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIChhbm5vdGF0ZWQgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2UgPSBvcmlnaW5hbEVycm9yO1xuICB9XG4gIHJldHVybiBhbm5vdGF0ZWQ7XG59XG5cbmNvbnN0IFJPVVRFX1NUVUJfRklMRV9NQVJLRVIgPSAnV09SS0ZMT1dfUk9VVEVfU1RVQl9GSUxFJztcbmNvbnN0IFJPVVRFX1NUVUJfQlVJTERfV0FJVF9USU1FT1VUX01TID0gMTIwXzAwMDtcbmxldCBwZW5kaW5nRGVmZXJyZWRSb3V0ZVN0dWJCdWlsZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gcmVnaXN0ZXJGaWxlRGVwZW5kZW5jeShcbiAgbG9hZGVyQ29udGV4dDogV29ya2Zsb3dMb2FkZXJDb250ZXh0LFxuICBkZXBlbmRlbmN5UGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgbG9hZGVyQ29udGV4dC5hZGREZXBlbmRlbmN5Py4oZGVwZW5kZW5jeVBhdGgpO1xuICBsb2FkZXJDb250ZXh0LmFkZEJ1aWxkRGVwZW5kZW5jeT8uKGRlcGVuZGVuY3lQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGlzY292ZXJlZFBhdHRlcm5TdGF0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbmV4dFN0YXRlOiBEaXNjb3ZlcmVkUGF0dGVyblN0YXRlXG4pOiB7IHNob3VsZE5vdGlmeTogYm9vbGVhbjsgcHJldmlvdXNTdGF0ZT86IERpc2NvdmVyZWRQYXR0ZXJuU3RhdGUgfSB7XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBkaXNjb3ZlcmVkUGF0dGVyblN0YXRlQnlGaWxlUGF0aC5nZXQoZmlsZVBhdGgpO1xuICBjb25zdCBoYXNBbnlQYXR0ZXJuID1cbiAgICBuZXh0U3RhdGUuaGFzV29ya2Zsb3cgfHwgbmV4dFN0YXRlLmhhc1N0ZXAgfHwgbmV4dFN0YXRlLmhhc1NlcmRlO1xuXG4gIGlmICghaGFzQW55UGF0dGVybikge1xuICAgIGlmICghcHJldmlvdXNTdGF0ZSkge1xuICAgICAgcmV0dXJuIHsgc2hvdWxkTm90aWZ5OiBmYWxzZSB9O1xuICAgIH1cbiAgICBkaXNjb3ZlcmVkUGF0dGVyblN0YXRlQnlGaWxlUGF0aC5kZWxldGUoZmlsZVBhdGgpO1xuICAgIHJldHVybiB7IHNob3VsZE5vdGlmeTogdHJ1ZSwgcHJldmlvdXNTdGF0ZSB9O1xuICB9XG5cbiAgaWYgKFxuICAgIHByZXZpb3VzU3RhdGUgJiZcbiAgICBwcmV2aW91c1N0YXRlLmhhc1dvcmtmbG93ID09PSBuZXh0U3RhdGUuaGFzV29ya2Zsb3cgJiZcbiAgICBwcmV2aW91c1N0YXRlLmhhc1N0ZXAgPT09IG5leHRTdGF0ZS5oYXNTdGVwICYmXG4gICAgcHJldmlvdXNTdGF0ZS5oYXNTZXJkZSA9PT0gbmV4dFN0YXRlLmhhc1NlcmRlXG4gICkge1xuICAgIHJldHVybiB7IHNob3VsZE5vdGlmeTogZmFsc2UsIHByZXZpb3VzU3RhdGUgfTtcbiAgfVxuXG4gIGRpc2NvdmVyZWRQYXR0ZXJuU3RhdGVCeUZpbGVQYXRoLnNldChmaWxlUGF0aCwgbmV4dFN0YXRlKTtcbiAgcmV0dXJuIHsgc2hvdWxkTm90aWZ5OiB0cnVlLCBwcmV2aW91c1N0YXRlIH07XG59XG5cbmZ1bmN0aW9uIGFkZElmRXhpc3RzKGZpbGVzOiBTZXQ8c3RyaW5nPiwgZGVwZW5kZW5jeVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3RzU3luYyhkZXBlbmRlbmN5UGF0aCkpIHtcbiAgICBmaWxlcy5hZGQoZGVwZW5kZW5jeVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMoKTogTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzIHtcbiAgaWYgKGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llcykge1xuICAgIHJldHVybiBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBjb25zdCBzd2NQbHVnaW5QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvc3djLXBsdWdpbicpO1xuICBjb25zdCBzd2NQbHVnaW5CdWlsZEhhc2hQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFxuICAgICdAd29ya2Zsb3cvc3djLXBsdWdpbi9idWlsZC1oYXNoLmpzb24nXG4gICk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvYnVpbGRlcnMnKTtcblxuICAvLyBEZXJpdmUgcGFja2FnZS5qc29uIHBhdGhzIGZyb20gcmVzb2x2ZWQgZW50cnlwb2ludHMgdG8gYXZvaWRcbiAgLy8gVHVyYm9wYWNrIGxvYWRlci1ldmFsIGZhaWx1cmVzIGFyb3VuZCAuLi9wYWNrYWdlLmpzb24gcmVzb2x1dGlvbi5cbiAgY29uc3Qgc3djUGx1Z2luUGFja2FnZUpzb25QYXRoID0gam9pbihkaXJuYW1lKHN3Y1BsdWdpblBhdGgpLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYWNrYWdlSnNvblBhdGggPSBqb2luKFxuICAgIGRpcm5hbWUod29ya2Zsb3dCdWlsZGVyc1BhdGgpLFxuICAgICcuLi9wYWNrYWdlLmpzb24nXG4gICk7XG5cbiAgY29uc3QgZmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgIF9fZmlsZW5hbWUsXG4gICAgcmVxdWlyZS5yZXNvbHZlKCcuL3NvY2tldC1zZXJ2ZXInKSxcbiAgICBzd2NQbHVnaW5QYXRoLFxuICAgIHN3Y1BsdWdpbkJ1aWxkSGFzaFBhdGgsXG4gICAgd29ya2Zsb3dCdWlsZGVyc1BhdGgsXG4gIF0pO1xuICBhZGRJZkV4aXN0cyhmaWxlcywgc3djUGx1Z2luUGFja2FnZUpzb25QYXRoKTtcbiAgYWRkSWZFeGlzdHMoZmlsZXMsIHdvcmtmbG93QnVpbGRlcnNQYWNrYWdlSnNvblBhdGgpO1xuXG4gIGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llcyA9IHtcbiAgICBzd2NQbHVnaW5QYXRoLFxuICAgIGZpbGVzOiBBcnJheS5mcm9tKGZpbGVzKSxcbiAgfTtcbiAgcmV0dXJuIGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJUcmFuc2Zvcm1EZXBlbmRlbmNpZXMoXG4gIGxvYWRlckNvbnRleHQ6IFdvcmtmbG93TG9hZGVyQ29udGV4dFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdGljRGVwZW5kZW5jaWVzID0gcmVzb2x2ZUxvYWRlclN0YXRpY0RlcGVuZGVuY2llcygpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3lQYXRoIG9mIHN0YXRpY0RlcGVuZGVuY2llcy5maWxlcykge1xuICAgIHJlZ2lzdGVyRmlsZURlcGVuZGVuY3kobG9hZGVyQ29udGV4dCwgZGVwZW5kZW5jeVBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRpY0RlcGVuZGVuY2llcy5zd2NQbHVnaW5QYXRoO1xufVxuXG5mdW5jdGlvbiByZXNldFNvY2tldENsaWVudChjYWNoZWRTb2NrZXQ/OiBTb2NrZXQpOiB2b2lkIHtcbiAgaWYgKGNhY2hlZFNvY2tldCAmJiBzb2NrZXRDbGllbnQgJiYgc29ja2V0Q2xpZW50ICE9PSBjYWNoZWRTb2NrZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzb2NrZXRDbGllbnRQcm9taXNlID0gbnVsbDtcbiAgc29ja2V0Q2xpZW50ID0gbnVsbDtcbiAgc29ja2V0Q2xpZW50S2V5ID0gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTb2NrZXRNZXNzYWdlKFxuICBzb2NrZXQ6IFNvY2tldCxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNvY2tldC53cml0ZShtZXNzYWdlLCAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTb2NrZXRJbmZvRmlsZVBhdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRoID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09DS0VUX0lORk9fUEFUSDtcbiAgaWYgKGNvbmZpZ3VyZWRQYXRoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWRQYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIHdvcmtlciBwcm9jZXNzZXMgdGhhdCBkb24ndCBpbmhlcml0IGR5bmFtaWMgZW52IHVwZGF0ZXNcbiAgLy8gZnJvbSB0aGUgcHJvY2VzcyB0aGF0IGNyZWF0ZWQgdGhlIHNvY2tldCBzZXJ2ZXIuXG4gIGNvbnN0IGRpc3REaXIgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX0RJU1RfRElSIHx8ICcubmV4dCc7XG4gIGNvbnN0IGN3ZEZhbGxiYWNrUGF0aCA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgZGlzdERpciwgU09DS0VUX0lORk9fRklMRU5BTUUpO1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuZW52LldPUktGTE9XX1BST0pFQ1RfUk9PVDtcbiAgaWYgKHByb2plY3RSb290KSB7XG4gICAgY29uc3QgcHJvamVjdFJvb3RGYWxsYmFja1BhdGggPSBqb2luKFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBkaXN0RGlyLFxuICAgICAgU09DS0VUX0lORk9fRklMRU5BTUVcbiAgICApO1xuICAgIGlmIChleGlzdHNTeW5jKHByb2plY3RSb290RmFsbGJhY2tQYXRoKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RSb290RmFsbGJhY2tQYXRoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3dkRmFsbGJhY2tQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRTb2NrZXRDcmVkZW50aWFsc0Zyb21FbnYoKTogU29ja2V0Q3JlZGVudGlhbHMgfCBudWxsIHtcbiAgY29uc3Qgc29ja2V0UG9ydCA9IHByb2Nlc3MuZW52LldPUktGTE9XX1NPQ0tFVF9QT1JUO1xuICBjb25zdCBhdXRoVG9rZW4gPSBwcm9jZXNzLmVudi5XT1JLRkxPV19TT0NLRVRfQVVUSDtcbiAgaWYgKCFzb2NrZXRQb3J0IHx8ICFhdXRoVG9rZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIucGFyc2VJbnQoc29ja2V0UG9ydCwgMTApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBvcnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHsgcG9ydCwgYXV0aFRva2VuIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNvY2tldENyZWRlbnRpYWxzRnJvbUZpbGUoKTogUHJvbWlzZTxTb2NrZXRDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgY29uc3Qgc29ja2V0SW5mb0ZpbGVQYXRoID0gZ2V0U29ja2V0SW5mb0ZpbGVQYXRoKCk7XG4gIGlmICghc29ja2V0SW5mb0ZpbGVQYXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFleGlzdHNTeW5jKHNvY2tldEluZm9GaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoc29ja2V0SW5mb0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7XG4gICAgICBwb3J0PzogdW5rbm93bjtcbiAgICAgIGF1dGhUb2tlbj86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBhdXRoVG9rZW4gPVxuICAgICAgdHlwZW9mIHBhcnNlZC5hdXRoVG9rZW4gPT09ICdzdHJpbmcnID8gcGFyc2VkLmF1dGhUb2tlbiA6IG51bGw7XG4gICAgY29uc3QgbnVtZXJpY1BvcnQgPVxuICAgICAgdHlwZW9mIHBhcnNlZC5wb3J0ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IHBhcnNlZC5wb3J0XG4gICAgICAgIDogTnVtYmVyLnBhcnNlSW50KFN0cmluZyhwYXJzZWQucG9ydCksIDEwKTtcblxuICAgIGlmICghYXV0aFRva2VuIHx8IE51bWJlci5pc05hTihudW1lcmljUG9ydCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcG9ydDogbnVtZXJpY1BvcnQsXG4gICAgICBhdXRoVG9rZW4sXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U29ja2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxTb2NrZXRDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgY29uc3QgZW52Q3JlZGVudGlhbHMgPSBnZXRTb2NrZXRDcmVkZW50aWFsc0Zyb21FbnYoKTtcbiAgaWYgKGVudkNyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIGVudkNyZWRlbnRpYWxzO1xuICB9XG4gIHJldHVybiBhd2FpdCBnZXRTb2NrZXRDcmVkZW50aWFsc0Zyb21GaWxlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNvY2tldENsaWVudCgpOiBQcm9taXNlPFNvY2tldCB8IG51bGw+IHtcbiAgY29uc3Qgc29ja2V0Q3JlZGVudGlhbHMgPSBhd2FpdCBnZXRTb2NrZXRDcmVkZW50aWFscygpO1xuICBpZiAoIXNvY2tldENyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoc29ja2V0Q2xpZW50Py5kZXN0cm95ZWQpIHtcbiAgICByZXNldFNvY2tldENsaWVudChzb2NrZXRDbGllbnQpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNvY2tldEtleSA9IGAke3NvY2tldENyZWRlbnRpYWxzLnBvcnR9OiR7c29ja2V0Q3JlZGVudGlhbHMuYXV0aFRva2VufWA7XG4gIGlmIChzb2NrZXRDbGllbnRLZXkgJiYgc29ja2V0Q2xpZW50S2V5ICE9PSBjdXJyZW50U29ja2V0S2V5KSB7XG4gICAgaWYgKHNvY2tldENsaWVudCkge1xuICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0Q2xpZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRTb2NrZXRDbGllbnQoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXNvY2tldENsaWVudFByb21pc2UpIHtcbiAgICBzb2NrZXRDbGllbnRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Qoe1xuICAgICAgICAgIHBvcnQ6IHNvY2tldENyZWRlbnRpYWxzLnBvcnQsXG4gICAgICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIGNvbm5lY3Rpb25cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5zZXROb0RlbGF5KHRydWUpO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHJlamVjdChhbm5vdGF0ZUNvbm5lY3Rpb25FcnJvcihlcnJvciwgc29ja2V0Q3JlZGVudGlhbHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIGFubm90YXRlQ29ubmVjdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gdGltZW91dCcpLFxuICAgICAgICAgICAgICAgIHNvY2tldENyZWRlbnRpYWxzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHNvY2tldC5vZmYoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgICAgICAgc29ja2V0Lm9mZignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc29ja2V0Lm9uKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc29ja2V0Q2xpZW50ID0gc29ja2V0O1xuICAgICAgICBzb2NrZXRDbGllbnRLZXkgPSBjdXJyZW50U29ja2V0S2V5O1xuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuICByZXR1cm4gc29ja2V0Q2xpZW50UHJvbWlzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm90aWZ5U29ja2V0U2VydmVyKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBoYXNXb3JrZmxvdzogYm9vbGVhbixcbiAgaGFzU3RlcDogYm9vbGVhbixcbiAgaGFzU2VyZGU6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb2NrZXRDcmVkZW50aWFscyA9IGF3YWl0IGdldFNvY2tldENyZWRlbnRpYWxzKCk7XG4gIGlmICghc29ja2V0Q3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBnZXRTb2NrZXRDbGllbnQoKTtcbiAgaWYgKCFzb2NrZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFyaWFudDogbWlzc2luZyB3b3JrZmxvdyBzb2NrZXQgY29ubmVjdGlvbicpO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZTogU29ja2V0TWVzc2FnZSA9IHtcbiAgICB0eXBlOiAnZmlsZS1kaXNjb3ZlcmVkJyxcbiAgICBmaWxlUGF0aDogZmlsZW5hbWUsXG4gICAgaGFzV29ya2Zsb3csXG4gICAgaGFzU3RlcCxcbiAgICBoYXNTZXJkZSxcbiAgfTtcbiAgY29uc3Qgc2VyaWFsaXplZE1lc3NhZ2UgPSBzZXJpYWxpemVNZXNzYWdlKFxuICAgIG1lc3NhZ2UsXG4gICAgc29ja2V0Q3JlZGVudGlhbHMuYXV0aFRva2VuXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZVNvY2tldE1lc3NhZ2Uoc29ja2V0LCBzZXJpYWxpemVkTWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0KTtcbiAgICBjb25zdCByZWNvbm5lY3RlZFNvY2tldCA9IGF3YWl0IGdldFNvY2tldENsaWVudCgpO1xuICAgIGlmICghcmVjb25uZWN0ZWRTb2NrZXQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZVNvY2tldE1lc3NhZ2UocmVjb25uZWN0ZWRTb2NrZXQsIHNlcmlhbGl6ZWRNZXNzYWdlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93Um91dGVTdHViU291cmNlKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzb3VyY2UuaW5jbHVkZXMoUk9VVEVfU1RVQl9GSUxFX01BUktFUik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNvY2tldENvbm5lY3Rpb24oXG4gIHNvY2tldENyZWRlbnRpYWxzOiBTb2NrZXRDcmVkZW50aWFscyxcbiAgdGltZW91dE1zID0gMV8wMDBcbik6IFByb21pc2U8U29ja2V0PiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxTb2NrZXQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHtcbiAgICAgIHBvcnQ6IHNvY2tldENyZWRlbnRpYWxzLnBvcnQsXG4gICAgICBob3N0OiAnMTI3LjAuMC4xJyxcbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBhbm5vdGF0ZUNvbm5lY3Rpb25FcnJvcihcbiAgICAgICAgICBuZXcgRXJyb3IoJ1NvY2tldCBjb25uZWN0aW9uIHRpbWVvdXQnKSxcbiAgICAgICAgICBzb2NrZXRDcmVkZW50aWFsc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHNvY2tldC5vZmYoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgc29ja2V0Lm9mZignZXJyb3InLCBvbkVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHNvY2tldC5zZXROb0RlbGF5KHRydWUpO1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcmVzb2x2ZShzb2NrZXQpO1xuICAgIH07XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICByZWplY3QoYW5ub3RhdGVDb25uZWN0aW9uRXJyb3IoZXJyb3IsIHNvY2tldENyZWRlbnRpYWxzKSk7XG4gICAgfTtcblxuICAgIHNvY2tldC5vbignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckRlZmVycmVkQnVpbGRDb21wbGV0ZShcbiAgc29ja2V0OiBTb2NrZXQsXG4gIGF1dGhUb2tlbjogc3RyaW5nLFxuICB0aW1lb3V0TXMgPSBST1VURV9TVFVCX0JVSUxEX1dBSVRfVElNRU9VVF9NU1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgYnVmZmVyID0gJyc7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBkZWZlcnJlZCByb3V0ZSBidWlsZCBjb21wbGV0aW9uJylcbiAgICAgICk7XG4gICAgfSwgdGltZW91dE1zKTtcbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgc29ja2V0Lm9mZignZGF0YScsIG9uRGF0YSk7XG4gICAgICBzb2NrZXQub2ZmKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgc29ja2V0Lm9mZignY2xvc2UnLCBvbkNsb3NlKTtcbiAgICAgIHNvY2tldC5vZmYoJ2VuZCcsIG9uQ2xvc2UpO1xuICAgIH07XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcignU29ja2V0IGNsb3NlZCBiZWZvcmUgZGVmZXJyZWQgcm91dGUgYnVpbGQgY29tcGxldGVkJykpO1xuICAgIH07XG4gICAgY29uc3Qgb25EYXRhID0gKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgIGJ1ZmZlciArPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgbGV0IG5ld2xpbmVJbmRleCA9IGJ1ZmZlci5pbmRleE9mKCdcXG4nKTtcbiAgICAgIHdoaWxlIChuZXdsaW5lSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBidWZmZXIuc2xpY2UoMCwgbmV3bGluZUluZGV4KTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKG5ld2xpbmVJbmRleCArIDEpO1xuICAgICAgICBuZXdsaW5lSW5kZXggPSBidWZmZXIuaW5kZXhPZignXFxuJyk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlTWVzc2FnZShsaW5lLCBhdXRoVG9rZW4pO1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gJ2J1aWxkLWNvbXBsZXRlJykge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNvY2tldC5vbignZGF0YScsIG9uRGF0YSk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlKTtcbiAgICBzb2NrZXQub24oJ2VuZCcsIG9uQ2xvc2UpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJpZ2dlckRlZmVycmVkUm91dGVTdHViQnVpbGRBbmRXYWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb2NrZXRDcmVkZW50aWFscyA9IGF3YWl0IGdldFNvY2tldENyZWRlbnRpYWxzKCk7XG4gIGlmICghc29ja2V0Q3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc29ja2V0ID0gYXdhaXQgY3JlYXRlU29ja2V0Q29ubmVjdGlvbihzb2NrZXRDcmVkZW50aWFscyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVTb2NrZXRNZXNzYWdlKFxuICAgICAgc29ja2V0LFxuICAgICAgc2VyaWFsaXplTWVzc2FnZSh7IHR5cGU6ICd0cmlnZ2VyLWJ1aWxkJyB9LCBzb2NrZXRDcmVkZW50aWFscy5hdXRoVG9rZW4pXG4gICAgKTtcbiAgICBhd2FpdCB3YWl0Rm9yRGVmZXJyZWRCdWlsZENvbXBsZXRlKHNvY2tldCwgc29ja2V0Q3JlZGVudGlhbHMuYXV0aFRva2VuKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzb2NrZXQuZGVzdHJveSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURlZmVycmVkUm91dGVTdHViQnVpbGRBbmRXYWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGVuZGluZ0RlZmVycmVkUm91dGVTdHViQnVpbGRQcm9taXNlKSB7XG4gICAgcmV0dXJuIHBlbmRpbmdEZWZlcnJlZFJvdXRlU3R1YkJ1aWxkUHJvbWlzZTtcbiAgfVxuICBjb25zdCBwZW5kaW5nUHJvbWlzZSA9IHRyaWdnZXJEZWZlcnJlZFJvdXRlU3R1YkJ1aWxkQW5kV2FpdCgpO1xuICBwZW5kaW5nRGVmZXJyZWRSb3V0ZVN0dWJCdWlsZFByb21pc2UgPSBwZW5kaW5nUHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocGVuZGluZ0RlZmVycmVkUm91dGVTdHViQnVpbGRQcm9taXNlID09PSBwZW5kaW5nUHJvbWlzZSkge1xuICAgICAgcGVuZGluZ0RlZmVycmVkUm91dGVTdHViQnVpbGRQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZ0RlZmVycmVkUm91dGVTdHViQnVpbGRQcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRCdWlsZGVyc01vZHVsZSgpOiBQcm9taXNlPFxuICB0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKVxuPiB7XG4gIGlmIChjYWNoZWRCdWlsZGVyc01vZHVsZSkge1xuICAgIHJldHVybiBjYWNoZWRCdWlsZGVyc01vZHVsZTtcbiAgfVxuICAvLyBEeW5hbWljIGltcG9ydCB0byBoYW5kbGUgRVNNIG1vZHVsZSBmcm9tIENvbW1vbkpTIGNvbnRleHRcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOiBOZWVkIHRvIHVzZSBldmFsIGhlcmUgdG8gYXZvaWQgVHlwZVNjcmlwdCBmcm9tIHRyYW5zcGlsaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IGludG8gYHJlcXVpcmUoKWBcbiAgY2FjaGVkQnVpbGRlcnNNb2R1bGUgPSAoYXdhaXQgZXZhbChcbiAgICAnaW1wb3J0KFwiQHdvcmtmbG93L2J1aWxkZXJzXCIpJ1xuICApKSBhcyB0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKTtcbiAgcmV0dXJuIGNhY2hlZEJ1aWxkZXJzTW9kdWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZWNvcmF0b3JPcHRpb25zKFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8RGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGRlY29yYXRvck9wdGlvbnNDYWNoZS5nZXQod29ya2luZ0Rpcik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgcHJvbWlzZSA9IChhc3luYyAoKTogUHJvbWlzZTxEZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGg+ID0+IHtcbiAgICBjb25zdCB7IGdldERlY29yYXRvck9wdGlvbnNGb3JEaXJlY3RvcnlXaXRoQ29uZmlnUGF0aCB9ID1cbiAgICAgIGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gICAgcmV0dXJuIGdldERlY29yYXRvck9wdGlvbnNGb3JEaXJlY3RvcnlXaXRoQ29uZmlnUGF0aCh3b3JraW5nRGlyKTtcbiAgfSkoKTtcblxuICBkZWNvcmF0b3JPcHRpb25zQ2FjaGUuc2V0KHdvcmtpbmdEaXIsIHByb21pc2UpO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0UGF0dGVybnMoc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtmbG93UGF0dGVybk1hdGNoPiB7XG4gIGNvbnN0IHsgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tHZW5lcmF0ZWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBpc0dlbmVyYXRlZFdvcmtmbG93RmlsZSB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIGlzR2VuZXJhdGVkV29ya2Zsb3dGaWxlKGZpbGVQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tTaG91bGRUcmFuc2Zvcm0oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHBhdHRlcm5zOiBXb3JrZmxvd1BhdHRlcm5NYXRjaFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgc2hvdWxkVHJhbnNmb3JtRmlsZSB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIHNob3VsZFRyYW5zZm9ybUZpbGUoZmlsZVBhdGgsIHBhdHRlcm5zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TW9kdWxlU3BlY2lmaWVyKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IHJlc29sdmVNb2R1bGVTcGVjaWZpZXIgfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCkubW9kdWxlU3BlY2lmaWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya2Zsb3dBbGlhc1BhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHdvcmtpbmdEaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyByZXNvbHZlV29ya2Zsb3dBbGlhc1JlbGF0aXZlUGF0aCB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIHJlc29sdmVXb3JrZmxvd0FsaWFzUmVsYXRpdmVQYXRoKGZpbGVQYXRoLCB3b3JraW5nRGlyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVsYXRpdmVGaWxlbmFtZUZvclN3YyhcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHdvcmtpbmdEaXJcbiAgICAucmVwbGFjZSgvXFxcXC9nLCAnLycpXG4gICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlcGF0aCA9IGZpbGVuYW1lLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICAvLyBXaW5kb3dzIGZpeDogVXNlIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiB0byB3b3JrIGFyb3VuZCBkcml2ZSBsZXR0ZXIgY2FzaW5nIGlzc3Vlc1xuICBjb25zdCBsb3dlcldkID0gbm9ybWFsaXplZFdvcmtpbmdEaXIudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbG93ZXJQYXRoID0gbm9ybWFsaXplZEZpbGVwYXRoLnRvTG93ZXJDYXNlKCk7XG5cbiAgbGV0IHJlbGF0aXZlRmlsZW5hbWU6IHN0cmluZztcbiAgaWYgKGxvd2VyUGF0aC5zdGFydHNXaXRoKGAke2xvd2VyV2R9L2ApKSB7XG4gICAgLy8gRmlsZSBpcyB1bmRlciB3b3JraW5nIGRpcmVjdG9yeSAtIG1hbnVhbGx5IGNhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoXG4gICAgcmVsYXRpdmVGaWxlbmFtZSA9IG5vcm1hbGl6ZWRGaWxlcGF0aC5zdWJzdHJpbmcoXG4gICAgICBub3JtYWxpemVkV29ya2luZ0Rpci5sZW5ndGggKyAxXG4gICAgKTtcbiAgfSBlbHNlIGlmIChsb3dlclBhdGggPT09IGxvd2VyV2QpIHtcbiAgICAvLyBGaWxlIElTIHRoZSB3b3JraW5nIGRpcmVjdG9yeSAoc2hvdWxkbid0IGhhcHBlbilcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gJy4nO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSByZWxhdGl2ZSgpIGZvciBmaWxlcyBvdXRzaWRlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgcmVsYXRpdmVGaWxlbmFtZSA9IHJlbGF0aXZlKHdvcmtpbmdEaXIsIGZpbGVuYW1lKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICBpZiAocmVsYXRpdmVGaWxlbmFtZS5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgY29uc3QgYWxpYXNlZFJlbGF0aXZlUGF0aCA9IGF3YWl0IHJlc29sdmVXb3JrZmxvd0FsaWFzUGF0aChcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIHdvcmtpbmdEaXJcbiAgICAgICk7XG4gICAgICBpZiAoYWxpYXNlZFJlbGF0aXZlUGF0aCkge1xuICAgICAgICByZWxhdGl2ZUZpbGVuYW1lID0gYWxpYXNlZFJlbGF0aXZlUGF0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSByZWxhdGl2ZUZpbGVuYW1lXG4gICAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSAnLi4nKVxuICAgICAgICAgIC5qb2luKCcvJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluYWwgc2FmZXR5IGNoZWNrIC0gZW5zdXJlIHdlIG5ldmVyIHBhc3MgYW4gYWJzb2x1dGUgcGF0aCB0byBTV0NcbiAgaWYgKHJlbGF0aXZlRmlsZW5hbWUuaW5jbHVkZXMoJzonKSB8fCByZWxhdGl2ZUZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHJhcmVseSBoYXBwZW4sIGJ1dCB1c2UgZmlsZW5hbWUgc3BsaXQgYXMgbGFzdCByZXNvcnRcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gbm9ybWFsaXplZEZpbGVwYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgJ3Vua25vd24udHMnO1xuICB9XG5cbiAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWU7XG59XG5cbi8vIFRoaXMgbG9hZGVyIGFwcGxpZXMgdGhlIFwidXNlIHdvcmtmbG93XCIvXCJ1c2Ugc3RlcFwiIHRyYW5zZm9ybS5cbi8vIEFsbCBmaWxlcyB1c2Ugc3RlcCBtb2RlOyB0aGUgU1dDIHBsdWdpbiBkZWNpZGVzIHBlci1mdW5jdGlvbiB3aGV0aGVyXG4vLyB0byBlbWl0IHdvcmtmbG93IG9yIHN0ZXAgYmluZGluZ3MgYmFzZWQgb24gdGhlIHNvdXJjZSdzIGRpcmVjdGl2ZXMuXG50eXBlIFdvcmtmbG93TG9hZGVyQ29udGV4dCA9IHtcbiAgcmVzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIGFzeW5jPzogKCkgPT4gKFxuICAgIGVycm9yOiBFcnJvciB8IG51bGwsXG4gICAgY29udGVudD86IHN0cmluZyxcbiAgICBzb3VyY2VNYXA/OiBhbnlcbiAgKSA9PiB2b2lkO1xuICBhZGREZXBlbmRlbmN5PzogKGRlcGVuZGVuY3k6IHN0cmluZykgPT4gdm9pZDtcbiAgYWRkQnVpbGREZXBlbmRlbmN5PzogKGRlcGVuZGVuY3k6IHN0cmluZykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdvcmtmbG93TG9hZGVyKFxuICB0aGlzOiBXb3JrZmxvd0xvYWRlckNvbnRleHQsXG4gIHNvdXJjZTogc3RyaW5nIHwgQnVmZmVyLFxuICBzb3VyY2VNYXA6IGFueVxuKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgdm9pZCB7XG4gIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5hc3luYz8uKCk7XG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpOiBQcm9taXNlPHsgY29kZTogc3RyaW5nOyBtYXA6IGFueSB9PiA9PiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnJlc291cmNlUGF0aDtcbiAgICBjb25zdCBub3JtYWxpemVkU291cmNlID0gc291cmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgc3djUGx1Z2luUGF0aCA9IHJlZ2lzdGVyVHJhbnNmb3JtRGVwZW5kZW5jaWVzKHRoaXMpO1xuICAgIGNvbnN0IHNvdXJjZUZvclRyYW5zZm9ybSA9IG5vcm1hbGl6ZWRTb3VyY2U7XG5cbiAgICBjb25zdCBpc0dlbmVyYXRlZFdvcmtmbG93RmlsZSA9IGF3YWl0IGNoZWNrR2VuZXJhdGVkRmlsZShmaWxlbmFtZSk7XG4gICAgLy8gU2tpcCBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgdG8gYXZvaWQgcmUtcHJvY2Vzc2luZyB0aGVtLlxuICAgIC8vIERlZmVycmVkIHJvdXRlIHN0dWJzIGFyZSBhIHNwZWNpYWwgY2FzZTogd2FpdCBmb3IgdGhlIGdlbmVyYXRlZCByb3V0ZVxuICAgIC8vIG91dHB1dCB0byBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSByZXR1cm5pbmcuXG4gICAgaWYgKGlzR2VuZXJhdGVkV29ya2Zsb3dGaWxlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlkgPT09ICcxJyAmJlxuICAgICAgICBpc1dvcmtmbG93Um91dGVTdHViU291cmNlKG5vcm1hbGl6ZWRTb3VyY2UpXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVEZWZlcnJlZFJvdXRlU3R1YkJ1aWxkQW5kV2FpdCgpO1xuICAgICAgICAgIGNvbnN0IHJlZnJlc2hlZFNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVuYW1lLCAndXRmOCcpO1xuICAgICAgICAgIGlmICghaXNXb3JrZmxvd1JvdXRlU3R1YlNvdXJjZShyZWZyZXNoZWRTb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb2RlOiByZWZyZXNoZWRTb3VyY2UsIG1hcDogc291cmNlTWFwIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbd29ya2Zsb3ddIEZhaWxlZCB3YWl0aW5nIGZvciBkZWZlcnJlZCByb3V0ZSBidWlsZCBmb3IgJHtmaWxlbmFtZX0sIHVzaW5nIHN0dWIgb3V0cHV0YCxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZTogbm9ybWFsaXplZFNvdXJjZSwgbWFwOiBzb3VyY2VNYXAgfTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgd29ya2Zsb3cgcGF0dGVybnMgaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgZGV0ZWN0UGF0dGVybnMoc291cmNlRm9yVHJhbnNmb3JtKTtcbiAgICAvLyBBbHdheXMgbm90aWZ5IGRpc2NvdmVyeSB0cmFja2luZywgZXZlbiBmb3IgYGZhbHNlL2ZhbHNlYCwgc28gZmlsZXMgdGhhdFxuICAgIC8vIHByZXZpb3VzbHkgaGFkIHdvcmtmbG93L3N0ZXAgdXNhZ2UgYXJlIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2tlZCBzZXRzLlxuICAgIGNvbnN0IG5leHRQYXR0ZXJuU3RhdGU6IERpc2NvdmVyZWRQYXR0ZXJuU3RhdGUgPSB7XG4gICAgICBoYXNXb3JrZmxvdzogcGF0dGVybnMuaGFzVXNlV29ya2Zsb3csXG4gICAgICBoYXNTdGVwOiBwYXR0ZXJucy5oYXNVc2VTdGVwLFxuICAgICAgaGFzU2VyZGU6IHBhdHRlcm5zLmhhc1NlcmRlLFxuICAgIH07XG4gICAgY29uc3QgeyBzaG91bGROb3RpZnkgfSA9IHVwZGF0ZURpc2NvdmVyZWRQYXR0ZXJuU3RhdGUoXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIG5leHRQYXR0ZXJuU3RhdGVcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHNob3VsZE5vdGlmeVNvY2tldEZvckRpc2NvdmVyZWRQYXR0ZXJuKHNob3VsZE5vdGlmeSwgbmV4dFBhdHRlcm5TdGF0ZSlcbiAgICApIHtcbiAgICAgIGF3YWl0IG5vdGlmeVNvY2tldFNlcnZlcihcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIG5leHRQYXR0ZXJuU3RhdGUuaGFzV29ya2Zsb3csXG4gICAgICAgIG5leHRQYXR0ZXJuU3RhdGUuaGFzU3RlcCxcbiAgICAgICAgbmV4dFBhdHRlcm5TdGF0ZS5oYXNTZXJkZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBmaWxlIG5lZWRzIHRyYW5zZm9ybWF0aW9uIGJhc2VkIG9uIHBhdHRlcm5zIGFuZCBwYXRoXG4gICAgaWYgKCEoYXdhaXQgY2hlY2tTaG91bGRUcmFuc2Zvcm0oZmlsZW5hbWUsIHBhdHRlcm5zKSkpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IG5vcm1hbGl6ZWRTb3VyY2UsIG1hcDogc291cmNlTWFwIH07XG4gICAgfVxuXG4gICAgY29uc3QgaXNUeXBlU2NyaXB0ID1cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKCcudHMnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy50c3gnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy5tdHMnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy5jdHMnKTtcblxuICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBmaWxlbmFtZSBmb3IgU1dDIHBsdWdpblxuICAgIC8vIFRoZSBTV0MgcGx1Z2luIHVzZXMgZmlsZW5hbWUgdG8gZ2VuZXJhdGUgd29ya2Zsb3dJZCwgc28gaXQgbXVzdCBiZSByZWxhdGl2ZVxuICAgIGNvbnN0IHJlbGF0aXZlRmlsZW5hbWUgPSBhd2FpdCBnZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKFxuICAgICAgZmlsZW5hbWUsXG4gICAgICB3b3JraW5nRGlyXG4gICAgKTtcblxuICAgIC8vIEdldCBkZWNvcmF0b3Igb3B0aW9ucyBmcm9tIHRzY29uZmlnIChjYWNoZWQgcGVyIHdvcmtpbmcgZGlyZWN0b3J5KVxuICAgIGNvbnN0IHsgb3B0aW9uczogZGVjb3JhdG9yT3B0aW9ucywgY29uZmlnUGF0aCB9ID1cbiAgICAgIGF3YWl0IGdldERlY29yYXRvck9wdGlvbnMod29ya2luZ0Rpcik7XG4gICAgaWYgKGNvbmZpZ1BhdGgpIHtcbiAgICAgIHJlZ2lzdGVyRmlsZURlcGVuZGVuY3kodGhpcywgY29uZmlnUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBtb2R1bGUgc3BlY2lmaWVyIGZvciBwYWNrYWdlcyAobm9kZV9tb2R1bGVzIG9yIHdvcmtzcGFjZSBwYWNrYWdlcylcbiAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBhd2FpdCBnZXRNb2R1bGVTcGVjaWZpZXIoZmlsZW5hbWUsIHdvcmtpbmdEaXIpO1xuICAgIGNvbnN0IG1vZGUgPSAnc3RlcCc7XG5cbiAgICAvLyBUcmFuc2Zvcm0gd2l0aCBTV0NcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlRm9yVHJhbnNmb3JtLCB7XG4gICAgICBmaWxlbmFtZTogcmVsYXRpdmVGaWxlbmFtZSxcbiAgICAgIGpzYzoge1xuICAgICAgICBwYXJzZXI6IHtcbiAgICAgICAgICAuLi4oaXNUeXBlU2NyaXB0XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzeW50YXg6ICd0eXBlc2NyaXB0JyxcbiAgICAgICAgICAgICAgICB0c3g6IGZpbGVuYW1lLmVuZHNXaXRoKCcudHN4JyksXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBzeW50YXg6ICdlY21hc2NyaXB0JyxcbiAgICAgICAgICAgICAgICBqc3g6IGZpbGVuYW1lLmVuZHNXaXRoKCcuanN4JyksXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JzLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgICAgcGx1Z2luczogW1tzd2NQbHVnaW5QYXRoLCB7IG1vZGUsIG1vZHVsZVNwZWNpZmllciB9XV0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgIHJlYWN0OiB7XG4gICAgICAgICAgICBydW50aW1lOiAncHJlc2VydmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVnYWN5RGVjb3JhdG9yOiBkZWNvcmF0b3JPcHRpb25zLmxlZ2FjeURlY29yYXRvcixcbiAgICAgICAgICBkZWNvcmF0b3JNZXRhZGF0YTogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JNZXRhZGF0YSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgaW5wdXRTb3VyY2VNYXA6IHNvdXJjZU1hcCxcbiAgICAgIHNvdXJjZU1hcHM6IHRydWUsXG4gICAgICBpbmxpbmVTb3VyY2VzQ29udGVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCB0cmFuc2Zvcm1lZE1hcCA9IHNvdXJjZU1hcDtcbiAgICBpZiAodHlwZW9mIHJlc3VsdC5tYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0cmFuc2Zvcm1lZE1hcCA9IEpTT04ucGFyc2UocmVzdWx0Lm1hcCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJhbnNmb3JtZWRNYXAgPSByZXN1bHQubWFwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVzdWx0Lm1hcCkge1xuICAgICAgdHJhbnNmb3JtZWRNYXAgPSByZXN1bHQubWFwO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IHRyYW5zZm9ybWVkTWFwIH07XG4gIH07XG5cbiAgaWYgKCFjYWxsYmFjaykge1xuICAgIHJldHVybiBydW4oKS50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5jb2RlKTtcbiAgfVxuXG4gIHZvaWQgcnVuKClcbiAgICAudGhlbigocmVzdWx0KSA9PiBjYWxsYmFjayhudWxsLCByZXN1bHQuY29kZSwgcmVzdWx0Lm1hcCkpXG4gICAgLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTtcbiAgICB9KTtcbn1cbiJdfQ==
|
package/dist/runtime.js
CHANGED
|
@@ -18,4 +18,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
// require @workflow/core be a dependency as well as
|
|
19
19
|
// @workflow/next
|
|
20
20
|
__exportStar(require("@workflow/core/dist/runtime"), exports);
|
|
21
|
-
//# sourceMappingURL=
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBaUQ7QUFDakQsb0RBQW9EO0FBQ3BELGlCQUFpQjtBQUNqQiw4REFBNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZS1leHBvcnQgcnVudGltZSBhcyBzdHViIGZvciByZXNvbHZpbmcgdG8gbm90XG4vLyByZXF1aXJlIEB3b3JrZmxvdy9jb3JlIGJlIGEgZGVwZW5kZW5jeSBhcyB3ZWxsIGFzXG4vLyBAd29ya2Zsb3cvbmV4dFxuZXhwb3J0ICogZnJvbSAnQHdvcmtmbG93L2NvcmUvZGlzdC9ydW50aW1lJztcbiJdfQ==
|
package/dist/socket-server.d.ts
CHANGED
|
@@ -28,6 +28,26 @@ export interface SocketIO {
|
|
|
28
28
|
emit(event: 'build-complete'): void;
|
|
29
29
|
getAuthToken(): string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Filename for the socket-info file.
|
|
33
|
+
*/
|
|
34
|
+
export declare const SOCKET_INFO_FILENAME = "workflow-socket.json";
|
|
35
|
+
/**
|
|
36
|
+
* Previous filesystem location for the socket-info file. This file lives
|
|
37
|
+
* inside `.next/cache/`, which Vercel and Turborepo preserve across builds —
|
|
38
|
+
* a stale file from a prior build would cause the loader to attempt to
|
|
39
|
+
* connect to a dead port (ECONNREFUSED). The current location is a sibling
|
|
40
|
+
* of `cache/` so it isn't preserved.
|
|
41
|
+
*
|
|
42
|
+
* Exported so the builders can unlink the legacy path at boot, cleaning up
|
|
43
|
+
* any leftover file written by older versions of the SDK.
|
|
44
|
+
*/
|
|
45
|
+
export declare const LEGACY_SOCKET_INFO_RELATIVE_PATH: string;
|
|
46
|
+
/**
|
|
47
|
+
* Remove any stale socket-info files at boot.
|
|
48
|
+
* @param distDir absolute path to the project's `.next` directory.
|
|
49
|
+
*/
|
|
50
|
+
export declare function cleanupStaleSocketInfoFiles(distDir: string): Promise<void>;
|
|
31
51
|
/**
|
|
32
52
|
* Serialize a message with authentication preamble
|
|
33
53
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-server.d.ts","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"socket-server.d.ts","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D;;;;;;;;;GASG;AACH,eAAO,MAAM,gCAAgC,QAG5C,CAAC;AAMF;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI,CAoCtB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAoGnB"}
|
package/dist/socket-server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LEGACY_SOCKET_INFO_RELATIVE_PATH = exports.SOCKET_INFO_FILENAME = void 0;
|
|
4
|
+
exports.cleanupStaleSocketInfoFiles = cleanupStaleSocketInfoFiles;
|
|
3
5
|
exports.serializeMessage = serializeMessage;
|
|
4
6
|
exports.parseMessage = parseMessage;
|
|
5
7
|
exports.createSocketServer = createSocketServer;
|
|
@@ -19,8 +21,33 @@ const MESSAGE_PREAMBLE = 'WF:';
|
|
|
19
21
|
function generateAuthToken() {
|
|
20
22
|
return (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Filename for the socket-info file.
|
|
26
|
+
*/
|
|
27
|
+
exports.SOCKET_INFO_FILENAME = 'workflow-socket.json';
|
|
28
|
+
/**
|
|
29
|
+
* Previous filesystem location for the socket-info file. This file lives
|
|
30
|
+
* inside `.next/cache/`, which Vercel and Turborepo preserve across builds —
|
|
31
|
+
* a stale file from a prior build would cause the loader to attempt to
|
|
32
|
+
* connect to a dead port (ECONNREFUSED). The current location is a sibling
|
|
33
|
+
* of `cache/` so it isn't preserved.
|
|
34
|
+
*
|
|
35
|
+
* Exported so the builders can unlink the legacy path at boot, cleaning up
|
|
36
|
+
* any leftover file written by older versions of the SDK.
|
|
37
|
+
*/
|
|
38
|
+
exports.LEGACY_SOCKET_INFO_RELATIVE_PATH = (0, node_path_1.join)('cache', exports.SOCKET_INFO_FILENAME);
|
|
22
39
|
function getDefaultSocketInfoFilePath() {
|
|
23
|
-
return (0, node_path_1.join)(process.cwd(), '.next',
|
|
40
|
+
return (0, node_path_1.join)(process.cwd(), '.next', exports.SOCKET_INFO_FILENAME);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove any stale socket-info files at boot.
|
|
44
|
+
* @param distDir absolute path to the project's `.next` directory.
|
|
45
|
+
*/
|
|
46
|
+
async function cleanupStaleSocketInfoFiles(distDir) {
|
|
47
|
+
await Promise.all([
|
|
48
|
+
(0, promises_1.rm)((0, node_path_1.join)(distDir, exports.SOCKET_INFO_FILENAME), { force: true }),
|
|
49
|
+
(0, promises_1.rm)((0, node_path_1.join)(distDir, exports.LEGACY_SOCKET_INFO_RELATIVE_PATH), { force: true }),
|
|
50
|
+
]);
|
|
24
51
|
}
|
|
25
52
|
/**
|
|
26
53
|
* Serialize a message with authentication preamble
|
|
@@ -151,4 +178,4 @@ async function createSocketServer(config) {
|
|
|
151
178
|
getAuthToken: () => authToken,
|
|
152
179
|
};
|
|
153
180
|
}
|
|
154
|
-
//# sourceMappingURL=socket-server.js.map
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb2NrZXQtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9GQSxrRUFPQztBQUtELDRDQUtDO0FBTUQsb0NBdUNDO0FBU0QsZ0RBc0dDO0FBalFELDZDQUEwQztBQUMxQywrQ0FBd0Q7QUFDeEQsdUNBQWtFO0FBQ2xFLHlDQUEwQztBQUUxQzs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQjs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQjtJQUN4QixPQUFPLElBQUEseUJBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQXVDRDs7R0FFRztBQUNVLFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFFM0Q7Ozs7Ozs7OztHQVNHO0FBQ1UsUUFBQSxnQ0FBZ0MsR0FBRyxJQUFBLGdCQUFJLEVBQ2xELE9BQU8sRUFDUCw0QkFBb0IsQ0FDckIsQ0FBQztBQUVGLFNBQVMsNEJBQTRCO0lBQ25DLE9BQU8sSUFBQSxnQkFBSSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsNEJBQW9CLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxPQUFlO0lBRWYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hCLElBQUEsYUFBRSxFQUFDLElBQUEsZ0JBQUksRUFBQyxPQUFPLEVBQUUsNEJBQW9CLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4RCxJQUFBLGFBQUUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLHdDQUFnQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDckUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztB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LENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDTCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxJQUFJLEVBQUUsQ0FBQyxNQUF3QixFQUFFLEVBQUU7WUFDakMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hFLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgbWtkaXIsIHJtLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciwgdHlwZSBTZXJ2ZXIsIHR5cGUgU29ja2V0IH0gZnJvbSAnbm9kZTpuZXQnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogTWFnaWMgcHJlYW1ibGUgdGhhdCBtdXN0IHByZWZpeCBhbGwgbWVzc2FnZXMgdG8gYXV0aGVudGljYXRlIHRoZW0gYXMgd29ya2Zsb3cgbWVzc2FnZXMuXG4gKiBUaGlzIHByZXZlbnRzIGFjY2lkZW50YWwgcHJvY2Vzc2luZyBvZiBtZXNzYWdlcyBmcm9tIHBvcnQgc2Nhbm5lcnMgb3Igb3RoZXIgbG9jYWwgcHJvY2Vzc2VzLlxuICovXG5jb25zdCBNRVNTQUdFX1BSRUFNQkxFID0gJ1dGOic7XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gYXV0aGVudGljYXRpb24gdG9rZW4gZm9yIHRoaXMgc2VydmVyIHNlc3Npb24uXG4gKiBDbGllbnRzIG11c3QgaW5jbHVkZSB0aGlzIHRva2VuIGluIGFsbCBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVBdXRoVG9rZW4oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKlxuICogTWVzc2FnZSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IGJldHdlZW4gbG9hZGVyIGFuZCBidWlsZGVyXG4gKi9cbmV4cG9ydCB0eXBlIFNvY2tldE1lc3NhZ2UgPVxuICB8IHtcbiAgICAgIHR5cGU6ICdmaWxlLWRpc2NvdmVyZWQnO1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGhhc1dvcmtmbG93OiBib29sZWFuO1xuICAgICAgaGFzU3RlcDogYm9vbGVhbjtcbiAgICAgIGhhc1NlcmRlOiBib29sZWFuO1xuICAgIH1cbiAgfCB7IHR5cGU6ICd0cmlnZ2VyLWJ1aWxkJyB9XG4gIHwgeyB0eXBlOiAnYnVpbGQtY29tcGxldGUnIH07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHNvY2tldCBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRTZXJ2ZXJDb25maWcge1xuICBpc0RldlNlcnZlcjogYm9vbGVhbjtcbiAgb25GaWxlRGlzY292ZXJlZDogKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgaGFzV29ya2Zsb3c6IGJvb2xlYW4sXG4gICAgaGFzU3RlcDogYm9vbGVhbixcbiAgICBoYXNTZXJkZTogYm9vbGVhblxuICApID0+IHZvaWQ7XG4gIG9uVHJpZ2dlckJ1aWxkOiAoKSA9PiB2b2lkO1xuICBzb2NrZXRJbmZvRmlsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgc29ja2V0IElPIGluc3RhbmNlIHJldHVybmVkIGJ5IGNyZWF0ZVNvY2tldFNlcnZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldElPIHtcbiAgZW1pdChldmVudDogJ2J1aWxkLWNvbXBsZXRlJyk6IHZvaWQ7XG4gIGdldEF1dGhUb2tlbigpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsZW5hbWUgZm9yIHRoZSBzb2NrZXQtaW5mbyBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgU09DS0VUX0lORk9fRklMRU5BTUUgPSAnd29ya2Zsb3ctc29ja2V0Lmpzb24nO1xuXG4vKipcbiAqIFByZXZpb3VzIGZpbGVzeXN0ZW0gbG9jYXRpb24gZm9yIHRoZSBzb2NrZXQtaW5mbyBmaWxlLiBUaGlzIGZpbGUgbGl2ZXNcbiAqIGluc2lkZSBgLm5leHQvY2FjaGUvYCwgd2hpY2ggVmVyY2VsIGFuZCBUdXJib3JlcG8gcHJlc2VydmUgYWNyb3NzIGJ1aWxkcyDigJRcbiAqIGEgc3RhbGUgZmlsZSBmcm9tIGEgcHJpb3IgYnVpbGQgd291bGQgY2F1c2UgdGhlIGxvYWRlciB0byBhdHRlbXB0IHRvXG4gKiBjb25uZWN0IHRvIGEgZGVhZCBwb3J0IChFQ09OTlJFRlVTRUQpLiBUaGUgY3VycmVudCBsb2NhdGlvbiBpcyBhIHNpYmxpbmdcbiAqIG9mIGBjYWNoZS9gIHNvIGl0IGlzbid0IHByZXNlcnZlZC5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0aGUgYnVpbGRlcnMgY2FuIHVubGluayB0aGUgbGVnYWN5IHBhdGggYXQgYm9vdCwgY2xlYW5pbmcgdXBcbiAqIGFueSBsZWZ0b3ZlciBmaWxlIHdyaXR0ZW4gYnkgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESy5cbiAqL1xuZXhwb3J0IGNvbnN0IExFR0FDWV9TT0NLRVRfSU5GT19SRUxBVElWRV9QQVRIID0gam9pbihcbiAgJ2NhY2hlJyxcbiAgU09DS0VUX0lORk9fRklMRU5BTUVcbik7XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRTb2NrZXRJbmZvRmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5uZXh0JywgU09DS0VUX0lORk9fRklMRU5BTUUpO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhbnkgc3RhbGUgc29ja2V0LWluZm8gZmlsZXMgYXQgYm9vdC5cbiAqIEBwYXJhbSBkaXN0RGlyIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3QncyBgLm5leHRgIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBTdGFsZVNvY2tldEluZm9GaWxlcyhcbiAgZGlzdERpcjogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJtKGpvaW4oZGlzdERpciwgU09DS0VUX0lORk9fRklMRU5BTUUpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIHJtKGpvaW4oZGlzdERpciwgTEVHQUNZX1NPQ0tFVF9JTkZPX1JFTEFUSVZFX1BBVEgpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICBdKTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgYSBtZXNzYWdlIHdpdGggYXV0aGVudGljYXRpb24gcHJlYW1ibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UsXG4gIGF1dGhUb2tlbjogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7TUVTU0FHRV9QUkVBTUJMRX0ke2F1dGhUb2tlbn06JHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1cXG5gO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCBhdXRoZW50aWNhdGUgYSBtZXNzYWdlIGZyb20gdGhlIHNvY2tldFxuICogUmV0dXJucyB0aGUgcGFyc2VkIG1lc3NhZ2UgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1lc3NhZ2UoXG4gIGxpbmU6IHN0cmluZyxcbiAgYXV0aFRva2VuOiBzdHJpbmdcbik6IFNvY2tldE1lc3NhZ2UgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBwcmVhbWJsZVxuICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChNRVNTQUdFX1BSRUFNQkxFKSkge1xuICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHByZWFtYmxlLCBpZ25vcmluZycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCBwYXlsb2FkXG4gIGNvbnN0IHdpdGhvdXRQcmVhbWJsZSA9IHRyaW1tZWQuc2xpY2UoTUVTU0FHRV9QUkVBTUJMRS5sZW5ndGgpO1xuICBjb25zdCBjb2xvbkluZGV4ID0gd2l0aG91dFByZWFtYmxlLmluZGV4T2YoJzonKTtcbiAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBtZXNzYWdlIHdpdGhvdXQgYXV0aCB0b2tlbiBzZXBhcmF0b3IsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVG9rZW4gPSB3aXRob3V0UHJlYW1ibGUuc2xpY2UoMCwgY29sb25JbmRleCk7XG4gIGNvbnN0IHBheWxvYWQgPSB3aXRob3V0UHJlYW1ibGUuc2xpY2UoY29sb25JbmRleCArIDEpO1xuXG4gIC8vIFZlcmlmeSBhdXRoIHRva2VuXG4gIGlmIChtZXNzYWdlVG9rZW4gIT09IGF1dGhUb2tlbikge1xuICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIGludmFsaWQgYXV0aCB0b2tlbiwgaWdub3JpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFBhcnNlIEpTT04gcGF5bG9hZFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHBheWxvYWQpIGFzIFNvY2tldE1lc3NhZ2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIHNvY2tldCBtZXNzYWdlIEpTT046JywgZXJyb3IpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgVENQIHNvY2tldCBzZXJ2ZXIgZm9yIGxvYWRlcjwtPmJ1aWxkZXIgY29tbXVuaWNhdGlvbi5cbiAqIFJldHVybnMgYSBTb2NrZXRJTyBpbnRlcmZhY2UgZm9yIGJyb2FkY2FzdGluZyBtZXNzYWdlcyBhbmQgdGhlIGF1dGggdG9rZW4uXG4gKlxuICogU0VDVVJJVFk6IFNlcnZlciBsaXN0ZW5zIG9uIDEyNy4wLjAuMSAobG9jYWxob3N0IG9ubHkpIGFuZCB1c2VzXG4gKiBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBvZiB1bmF1dGhvcml6ZWQgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTb2NrZXRTZXJ2ZXIoXG4gIGNvbmZpZzogU29ja2V0U2VydmVyQ29uZmlnXG4pOiBQcm9taXNlPFNvY2tldElPPiB7XG4gIGNvbnN0IGF1dGhUb2tlbiA9IGdlbmVyYXRlQXV0aFRva2VuKCk7XG4gIGNvbnN0IGNsaWVudHMgPSBuZXcgU2V0PFNvY2tldD4oKTtcbiAgbGV0IGJ1aWxkVHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgY29uc3Qgc2VydmVyOiBTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKHNvY2tldDogU29ja2V0KSA9PiB7XG4gICAgc29ja2V0LnNldE5vRGVsYXkodHJ1ZSk7XG4gICAgY2xpZW50cy5hZGQoc29ja2V0KTtcblxuICAgIC8vIFNlbmQgYnVpbGQtY29tcGxldGUgaWYgYnVpbGQgYWxyZWFkeSBmaW5pc2hlZCAocHJvZHVjdGlvbiBtb2RlKVxuICAgIGlmIChidWlsZFRyaWdnZXJlZCAmJiAhY29uZmlnLmlzRGV2U2VydmVyKSB7XG4gICAgICBzb2NrZXQud3JpdGUoc2VyaWFsaXplTWVzc2FnZSh7IHR5cGU6ICdidWlsZC1jb21wbGV0ZScgfSwgYXV0aFRva2VuKSk7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9ICcnO1xuXG4gICAgc29ja2V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgYnVmZmVyICs9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgLy8gUHJvY2VzcyBjb21wbGV0ZSBtZXNzYWdlcyAobmV3bGluZS1kZWxpbWl0ZWQpXG4gICAgICBsZXQgbmV3bGluZUluZGV4ID0gYnVmZmVyLmluZGV4T2YoJ1xcbicpO1xuICAgICAgd2hpbGUgKG5ld2xpbmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGJ1ZmZlci5zbGljZSgwLCBuZXdsaW5lSW5kZXgpO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UobmV3bGluZUluZGV4ICsgMSk7XG4gICAgICAgIG5ld2xpbmVJbmRleCA9IGJ1ZmZlci5pbmRleE9mKCdcXG4nKTtcblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gcGFyc2VNZXNzYWdlKGxpbmUsIGF1dGhUb2tlbik7XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZpbGUtZGlzY292ZXJlZCcpIHtcbiAgICAgICAgICBjb25maWcub25GaWxlRGlzY292ZXJlZChcbiAgICAgICAgICAgIG1lc3NhZ2UuZmlsZVBhdGgsXG4gICAgICAgICAgICBtZXNzYWdlLmhhc1dvcmtmbG93LFxuICAgICAgICAgICAgbWVzc2FnZS5oYXNTdGVwLFxuICAgICAgICAgICAgbWVzc2FnZS5oYXNTZXJkZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSAndHJpZ2dlci1idWlsZCcpIHtcbiAgICAgICAgICBjb25maWcub25UcmlnZ2VyQnVpbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnRzLmRlbGV0ZShzb2NrZXQpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTb2NrZXQgZXJyb3I6JywgZXJyKTtcbiAgICAgIGNsaWVudHMuZGVsZXRlKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExpc3RlbiBvbiByYW5kb20gYXZhaWxhYmxlIHBvcnQgKGxvY2FsaG9zdCBvbmx5KVxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICBzZXJ2ZXIubGlzdGVuKDAsICcxMjcuMC4wLjEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgIGlmIChhZGRyZXNzICYmIHR5cGVvZiBhZGRyZXNzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBzb2NrZXRJbmZvRmlsZVBhdGggPVxuICAgICAgICAgIGNvbmZpZy5zb2NrZXRJbmZvRmlsZVBhdGggfHwgZ2V0RGVmYXVsdFNvY2tldEluZm9GaWxlUGF0aCgpO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoc29ja2V0SW5mb0ZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgICAgICAgIHNvY2tldEluZm9GaWxlUGF0aCxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcG9ydDogYWRkcmVzcy5wb3J0LFxuICAgICAgICAgICAgICAgICAgYXV0aFRva2VuLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19TT0NLRVRfSU5GT19QQVRIID0gc29ja2V0SW5mb0ZpbGVQYXRoO1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09DS0VUX1BPUlQgPSBTdHJpbmcoYWRkcmVzcy5wb3J0KTtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1NPQ0tFVF9BVVRIID0gYXV0aFRva2VuO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIG9idGFpbiB3b3JrZmxvdyBzb2NrZXQgc2VydmVyIGFkZHJlc3MnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZW1pdDogKF9ldmVudDogJ2J1aWxkLWNvbXBsZXRlJykgPT4ge1xuICAgICAgYnVpbGRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHNlcmlhbGl6ZU1lc3NhZ2UoeyB0eXBlOiAnYnVpbGQtY29tcGxldGUnIH0sIGF1dGhUb2tlbik7XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICAgIGNsaWVudC53cml0ZShtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldEF1dGhUb2tlbjogKCkgPT4gYXV0aFRva2VuLFxuICB9O1xufVxuIl19
|
|
@@ -27,6 +27,15 @@ const workflowConfig = {}
|
|
|
27
27
|
export default withWorkflow(nextConfig, workflowConfig); // [!code highlight]
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
<Callout type="warn">
|
|
31
|
+
If a package in `serverExternalPackages` contains workflow code (`"use step"`,
|
|
32
|
+
`"use workflow"`, or serialization classes), `withWorkflow()` automatically
|
|
33
|
+
removes it from `serverExternalPackages` for the current build and prints a
|
|
34
|
+
warning. Workflow still compiles the package so its directives are transformed.
|
|
35
|
+
Remove that package from `serverExternalPackages` in your
|
|
36
|
+
`next.config` to silence the warning.
|
|
37
|
+
</Callout>
|
|
38
|
+
|
|
30
39
|
### Monorepos and Workspace Imports
|
|
31
40
|
|
|
32
41
|
By default, Next.js detects the correct workspace root automatically. If your Next.js app lives in a subdirectory such as `apps/web` and workspace resolution is not working correctly, you can set `outputFileTracingRoot` as a workaround:
|
|
@@ -59,18 +68,40 @@ const nextConfig: NextConfig = {};
|
|
|
59
68
|
|
|
60
69
|
export default withWorkflow(nextConfig, {
|
|
61
70
|
workflows: {
|
|
62
|
-
lazyDiscovery:
|
|
71
|
+
lazyDiscovery: false,
|
|
63
72
|
local: {
|
|
64
73
|
port: 4000,
|
|
65
74
|
},
|
|
75
|
+
sourcemap: false,
|
|
66
76
|
},
|
|
67
77
|
});
|
|
68
78
|
```
|
|
69
79
|
|
|
70
80
|
| Option | Type | Default | Description |
|
|
71
81
|
| --- | --- | --- | --- |
|
|
72
|
-
| `workflows.lazyDiscovery` | `boolean` | `
|
|
82
|
+
| `workflows.lazyDiscovery` | `boolean` | `true` | Defers workflow discovery until files are requested instead of scanning eagerly at startup. Set to `false` to force eager discovery (scanning the project up front). Requires a Next.js version that supports deferred entries; older versions fall back to eager discovery automatically. |
|
|
73
83
|
| `workflows.local.port` | `number` | — | Overrides the `PORT` environment variable for local development. Has no effect when deployed to Vercel. |
|
|
84
|
+
| `workflows.sourcemap` | `boolean \| 'inline' \| 'linked' \| 'external' \| 'both'` | `'inline'` (dev) / `false` (prod) | Controls source maps on generated workflow bundles. See [Source maps](#source-maps) below. |
|
|
85
|
+
|
|
86
|
+
### Source maps
|
|
87
|
+
|
|
88
|
+
The step bundle and intermediate workflow bundle default to `'inline'` source maps **in development** — so stack traces from step errors and workflow VM errors point at your source files — and to **`false` in production**, so function bundles stay small. The `sourcemap` option lets you change that:
|
|
89
|
+
|
|
90
|
+
| Value | Behavior |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| `true` / `'inline'` | Base64-encode the source map and append it to the bundle (default in development). |
|
|
93
|
+
| `'linked'` | Write a separate `.map` file and add a `sourceMappingURL` comment. |
|
|
94
|
+
| `'external'` | Write a separate `.map` file without the comment. |
|
|
95
|
+
| `'both'` | Emit both inline and external source maps. |
|
|
96
|
+
| `false` | Omit source maps entirely. |
|
|
97
|
+
|
|
98
|
+
In production, source maps are already off by default. Setting `sourcemap: false` explicitly also turns them off in development, and it drops the inline source map from every bundle while skipping the source-map-support runtime shim on the Vercel step function (the same behavior production gets by default) — the main lever for staying under the Vercel 250MB function size limit. The tradeoff is that workflow VM stack traces will reference generated code (e.g. `evalmachine.<anonymous>`) rather than your source files.
|
|
99
|
+
|
|
100
|
+
<Callout type="info">
|
|
101
|
+
Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower — it only toggles source maps on the final workflow wrapper and webhook bundle (which default to off). It continues to work, but new code should use the `sourcemap` option or the `WORKFLOW_SOURCEMAP` environment variable instead.
|
|
102
|
+
</Callout>
|
|
103
|
+
|
|
104
|
+
The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, which accepts the same values plus `'0'` / `'1'` as aliases for `false` / `true`. Precedence is: explicit config > `WORKFLOW_SOURCEMAP` > the environment-aware default (`'inline'` in development, `false` in production). Development is detected from `next dev` / `NODE_ENV=development`, so the config option and the env var both let you force either behavior in either environment.
|
|
74
105
|
|
|
75
106
|
<Callout type="info">
|
|
76
107
|
The `workflows.local` options only affect local development. When deployed to Vercel, the runtime ignores `local` settings and uses the Vercel world automatically.
|
|
@@ -78,6 +109,7 @@ The `workflows.local` options only affect local development. When deployed to Ve
|
|
|
78
109
|
|
|
79
110
|
## Exporting a Function
|
|
80
111
|
|
|
112
|
+
|
|
81
113
|
If you are exporting a function in your `next.config` you will need to ensure you call the function returned from `withWorkflow`.
|
|
82
114
|
|
|
83
115
|
```typescript title="next.config.ts" lineNumbers
|
package/docs/next.mdx
CHANGED
|
@@ -75,9 +75,9 @@ To enable helpful hints in your IDE, setup the workflow plugin in `tsconfig.json
|
|
|
75
75
|
</Accordion>
|
|
76
76
|
|
|
77
77
|
<Accordion type="single" collapsible>
|
|
78
|
-
<AccordionItem value="
|
|
78
|
+
<AccordionItem value="configure-proxy-handler" className="[&_h3]:my-0">
|
|
79
79
|
<AccordionTrigger className="text-sm">
|
|
80
|
-
|
|
80
|
+
<h3 id="configure-proxy-handler">Configure Proxy Handler (if applicable)</h3>
|
|
81
81
|
</AccordionTrigger>
|
|
82
82
|
<AccordionContent className="[&_p]:my-2">
|
|
83
83
|
|
|
@@ -85,7 +85,9 @@ If your Next.js app has a [proxy handler](https://nextjs.org/docs/app/api-refere
|
|
|
85
85
|
(formerly known as "middleware"), you'll need to update the matcher pattern to exclude Workflow's
|
|
86
86
|
internal paths to prevent the proxy handler from running on them.
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This is especially easy to miss in Next.js 16, where `proxy.ts` replaced `middleware.ts`.
|
|
89
|
+
|
|
90
|
+
Add `.well-known/workflow/*` to your matcher exclusion list:
|
|
89
91
|
|
|
90
92
|
```typescript title="proxy.ts" lineNumbers
|
|
91
93
|
import { NextResponse } from "next/server";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/next",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.20",
|
|
4
4
|
"description": "Next.js integration for Workflow SDK",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,12 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@swc/core": "1.15.3",
|
|
30
|
-
"enhanced-resolve": "5.19.0",
|
|
31
30
|
"semver": "7.7.4",
|
|
32
31
|
"watchpack": "2.5.1",
|
|
33
|
-
"@workflow/builders": "5.0.0-beta.
|
|
34
|
-
"@workflow/core": "5.0.0-beta.
|
|
35
|
-
"@workflow/swc-plugin": "5.0.0-beta.
|
|
32
|
+
"@workflow/builders": "5.0.0-beta.20",
|
|
33
|
+
"@workflow/core": "5.0.0-beta.20",
|
|
34
|
+
"@workflow/swc-plugin": "5.0.0-beta.5"
|
|
36
35
|
},
|
|
37
36
|
"devDependencies": {
|
|
38
37
|
"@types/node": "22.19.0",
|