@dbx-tools/appkit 0.9.70 → 0.9.72
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/README.md +39 -18
- package/index.ts +4 -3
- package/lib/index.d.ts +4 -3
- package/lib/index.js +2 -2
- package/lib/src/appkit.d.ts +3 -3
- package/lib/src/appkit.js +2 -2
- package/lib/src/child-process.d.ts +42 -16
- package/lib/src/child-process.js +125 -73
- package/lib/src/interceptor.d.ts +3 -33
- package/lib/src/interceptor.js +2 -71
- package/lib/src/tool-provider.d.ts +10 -1
- package/lib/src/tool-provider.js +2 -2
- package/package.json +7 -7
- package/src/appkit.ts +3 -3
- package/src/child-process.ts +170 -89
- package/src/interceptor.ts +3 -97
- package/src/tool-provider.ts +16 -1
package/lib/src/child-process.js
CHANGED
|
@@ -4,29 +4,35 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import * as exec from "@dbx-tools/core/exec";
|
|
7
|
+
import { asyncUtils } from "@dbx-tools/shared-core";
|
|
8
|
+
const DEFAULT_HEALTH_CHECK_INTERVAL_MS = 200;
|
|
9
|
+
const DEFAULT_HEALTH_CHECK_TIMEOUT_MS = 30_000;
|
|
10
|
+
const DEFAULT_RUN_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
7
11
|
/**
|
|
8
12
|
* Start and stop one AppKit-owned subprocess.
|
|
9
13
|
*
|
|
10
14
|
* The spawn arguments use {@link exec.ExecOptions}, including core exec's
|
|
11
15
|
* stdin, output capture, line handlers, exit checking, and trim policy.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* When configured, {@link AppKitChildProcessOptions.healthCheck} is polled
|
|
17
|
+
* until ready before {@link start} resolves. Shutdown aborts any active probe
|
|
18
|
+
* and delegates process-tree termination to {@link exec.kill}.
|
|
14
19
|
*/
|
|
15
20
|
export class AppKitChildProcess {
|
|
16
21
|
#spawnArgs;
|
|
17
|
-
#
|
|
18
|
-
#
|
|
22
|
+
#killOptions;
|
|
23
|
+
#healthCheck;
|
|
24
|
+
#healthCheckIntervalMs;
|
|
25
|
+
#healthCheckTimeoutMs;
|
|
19
26
|
#child;
|
|
27
|
+
#healthCheckController;
|
|
20
28
|
#shutdownPromise;
|
|
21
29
|
constructor(spawnArgs, options = {}) {
|
|
22
30
|
this.#spawnArgs = spawnArgs;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
this.#detached = spawnOptions(spawnArgs)?.detached === true;
|
|
31
|
+
const { healthCheck, healthCheckIntervalMs = DEFAULT_HEALTH_CHECK_INTERVAL_MS, healthCheckTimeoutMs = DEFAULT_HEALTH_CHECK_TIMEOUT_MS, ...killOptions } = options;
|
|
32
|
+
this.#healthCheck = healthCheck;
|
|
33
|
+
this.#healthCheckIntervalMs = positiveMilliseconds(healthCheckIntervalMs, "healthCheckIntervalMs");
|
|
34
|
+
this.#healthCheckTimeoutMs = positiveMilliseconds(healthCheckTimeoutMs, "healthCheckTimeoutMs");
|
|
35
|
+
this.#killOptions = killOptions;
|
|
30
36
|
}
|
|
31
37
|
/** Current child handle, or `undefined` when no child is running. */
|
|
32
38
|
get process() {
|
|
@@ -36,7 +42,7 @@ export class AppKitChildProcess {
|
|
|
36
42
|
get running() {
|
|
37
43
|
return this.#child !== undefined && !hasExited(this.#child);
|
|
38
44
|
}
|
|
39
|
-
/**
|
|
45
|
+
/** Spawn the child and resolve only after its optional readiness probe succeeds. */
|
|
40
46
|
start() {
|
|
41
47
|
if (this.running)
|
|
42
48
|
throw new Error("Child process is already running");
|
|
@@ -44,85 +50,131 @@ export class AppKitChildProcess {
|
|
|
44
50
|
throw new Error("Child process is shutting down or has been shut down");
|
|
45
51
|
}
|
|
46
52
|
const child = exec.spawn(...this.#spawnArgs);
|
|
53
|
+
const controller = new AbortController();
|
|
47
54
|
this.#child = child;
|
|
55
|
+
this.#healthCheckController = controller;
|
|
48
56
|
void child.once("close", () => {
|
|
49
57
|
if (this.#child === child)
|
|
50
58
|
this.#child = undefined;
|
|
51
59
|
});
|
|
52
|
-
return child;
|
|
60
|
+
return this.#completeStart(child, controller);
|
|
53
61
|
}
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Start, await, and shut down one foreground child while preserving parent
|
|
64
|
+
* termination signals.
|
|
65
|
+
*/
|
|
66
|
+
async run(options = {}) {
|
|
67
|
+
const signals = options.signals ?? DEFAULT_RUN_SIGNALS;
|
|
68
|
+
if (signals.includes("SIGKILL")) {
|
|
69
|
+
throw new Error("SIGKILL cannot be intercepted by a Node process");
|
|
70
|
+
}
|
|
71
|
+
const handlers = new Map();
|
|
72
|
+
let stopping = false;
|
|
73
|
+
const removeHandlers = () => {
|
|
74
|
+
for (const [signal, handler] of handlers)
|
|
75
|
+
process.off(signal, handler);
|
|
76
|
+
};
|
|
77
|
+
for (const signal of signals) {
|
|
78
|
+
const handler = () => {
|
|
79
|
+
if (stopping)
|
|
80
|
+
return;
|
|
81
|
+
stopping = true;
|
|
82
|
+
removeHandlers();
|
|
83
|
+
void this.shutdown()
|
|
84
|
+
.finally(() => process.kill(process.pid, signal))
|
|
85
|
+
.catch(() => undefined);
|
|
86
|
+
};
|
|
87
|
+
handlers.set(signal, handler);
|
|
88
|
+
process.once(signal, handler);
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
await this.start();
|
|
92
|
+
const child = this.#child;
|
|
93
|
+
if (!child)
|
|
94
|
+
throw new Error("Child process exited after startup");
|
|
95
|
+
return await child;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
removeHandlers();
|
|
99
|
+
await this.shutdown();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Abort readiness and stop the process tree once.
|
|
104
|
+
*
|
|
105
|
+
* An explicit non-`SIGKILL` signal runs only the graceful polling phase.
|
|
106
|
+
* Explicit `SIGKILL` skips directly to forced polling. Omitting the signal
|
|
107
|
+
* uses the configured graceful and forced policy.
|
|
108
|
+
*/
|
|
109
|
+
shutdown(signal) {
|
|
110
|
+
this.#healthCheckController?.abort(new DOMException("Child process shutdown requested", "AbortError"));
|
|
111
|
+
const killOptions = signal === undefined
|
|
112
|
+
? this.#killOptions
|
|
113
|
+
: signal === "SIGKILL"
|
|
114
|
+
? { ...this.#killOptions, gracefulSignal: false, forceSignal: signal }
|
|
115
|
+
: { ...this.#killOptions, gracefulSignal: signal, forceSignal: false };
|
|
116
|
+
this.#shutdownPromise ??= this.#performShutdown(killOptions);
|
|
57
117
|
return this.#shutdownPromise;
|
|
58
118
|
}
|
|
59
|
-
async #
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
119
|
+
async #completeStart(child, controller) {
|
|
120
|
+
try {
|
|
121
|
+
if (this.#healthCheck) {
|
|
122
|
+
await Promise.race([
|
|
123
|
+
this.#waitUntilHealthy(child, controller.signal),
|
|
124
|
+
child.then((result) => {
|
|
125
|
+
throw new Error(`Child process ${child.pid ?? "<unknown>"} exited before becoming ready ` +
|
|
126
|
+
`(exit ${result.exitCode})`);
|
|
127
|
+
}),
|
|
128
|
+
]);
|
|
129
|
+
}
|
|
64
130
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
131
|
+
catch (error) {
|
|
132
|
+
try {
|
|
133
|
+
await this.shutdown();
|
|
134
|
+
}
|
|
135
|
+
catch (shutdownError) {
|
|
136
|
+
throw new AggregateError([error, shutdownError], `Child process ${child.pid ?? "<unknown>"} failed readiness and shutdown`);
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
if (this.#healthCheckController === controller) {
|
|
142
|
+
this.#healthCheckController = undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async #waitUntilHealthy(child, signal) {
|
|
147
|
+
const healthCheck = this.#healthCheck;
|
|
148
|
+
if (!healthCheck)
|
|
69
149
|
return;
|
|
150
|
+
for await (const healthy of asyncUtils.poll(({ attempt, signal: pollSignal }) => healthCheck({ process: child, signal: pollSignal, attempt }), {
|
|
151
|
+
intervalMs: this.#healthCheckIntervalMs,
|
|
152
|
+
timeoutMs: this.#healthCheckTimeoutMs,
|
|
153
|
+
signal,
|
|
154
|
+
predicate: (healthy) => !healthy,
|
|
155
|
+
})) {
|
|
156
|
+
if (healthy)
|
|
157
|
+
return;
|
|
70
158
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
159
|
+
}
|
|
160
|
+
async #performShutdown(options) {
|
|
161
|
+
const child = this.#child;
|
|
162
|
+
if (!child) {
|
|
163
|
+
this.#child = undefined;
|
|
164
|
+
return;
|
|
74
165
|
}
|
|
166
|
+
await exec.kill(child, options);
|
|
75
167
|
if (this.#child === child)
|
|
76
168
|
this.#child = undefined;
|
|
77
169
|
}
|
|
78
170
|
}
|
|
79
|
-
function spawnOptions(args) {
|
|
80
|
-
const value = args.at(-1);
|
|
81
|
-
return isExecOptions(value) ? value : undefined;
|
|
82
|
-
}
|
|
83
|
-
function isExecOptions(value) {
|
|
84
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
85
|
-
}
|
|
86
171
|
function hasExited(child) {
|
|
87
172
|
return child.exitCode !== null || child.signalCode !== null;
|
|
88
173
|
}
|
|
89
|
-
function
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
process.kill(-child.pid, signal);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// Fall back to the direct child when the process group already exited.
|
|
97
|
-
}
|
|
174
|
+
function positiveMilliseconds(value, name) {
|
|
175
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
176
|
+
throw new RangeError(`${name} must be a finite positive number`);
|
|
98
177
|
}
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
function waitForExit(child, timeoutMs) {
|
|
102
|
-
if (hasExited(child))
|
|
103
|
-
return Promise.resolve(true);
|
|
104
|
-
return new Promise((resolve) => {
|
|
105
|
-
let timer;
|
|
106
|
-
let settled = false;
|
|
107
|
-
const finish = (exited) => {
|
|
108
|
-
if (settled)
|
|
109
|
-
return;
|
|
110
|
-
settled = true;
|
|
111
|
-
if (timer)
|
|
112
|
-
clearTimeout(timer);
|
|
113
|
-
void child.off("exit", onExit);
|
|
114
|
-
void child.off("error", onError);
|
|
115
|
-
resolve(exited);
|
|
116
|
-
};
|
|
117
|
-
const onExit = () => finish(true);
|
|
118
|
-
const onError = () => finish(true);
|
|
119
|
-
void child.once("exit", onExit);
|
|
120
|
-
void child.once("error", onError);
|
|
121
|
-
if (hasExited(child)) {
|
|
122
|
-
finish(true);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
timer = setTimeout(() => finish(false), timeoutMs);
|
|
126
|
-
});
|
|
178
|
+
return value;
|
|
127
179
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGQtcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGlsZC1wcm9jZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBaUI3Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUNwQixVQUFVLENBQWtCO0lBQzVCLFFBQVEsQ0FBc0M7SUFDOUMsU0FBUyxDQUFVO0lBRTVCLE1BQU0sQ0FBMkI7SUFDakMsZ0JBQWdCLENBQWlCO0lBRWpDLFlBQVksU0FBMEIsRUFBRSxVQUFxQyxFQUFFO1FBQzdFLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxTQUFTO1lBQ25ELGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxLQUFLO1lBQ3JELFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFNBQVM7WUFDN0MsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksS0FBSztTQUNoRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxLQUFLLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUks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RUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2IsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBjaGlsZC1wcm9jZXNzIGxpZmVjeWNsZSBidWlsdCBvbiBgQGRieC10b29scy9jb3JlL2V4ZWNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0ICogYXMgZXhlYyBmcm9tIFwiQGRieC10b29scy9jb3JlL2V4ZWNcIjtcblxuLyoqIFNwYXduIGFyZ3VtZW50cyBhY2NlcHRlZCBieSB7QGxpbmsgQXBwS2l0Q2hpbGRQcm9jZXNzfS4gKi9cbmV4cG9ydCB0eXBlIEFwcEtpdFNwYXduQXJncyA9IGV4ZWMuU3Bhd25BcmdzPGV4ZWMuRXhlY09wdGlvbnM+O1xuXG4vKiogR3JhY2VmdWwgYW5kIGZvcmNlZCBzaHV0ZG93biBwb2xpY3kgZm9yIGFuIEFwcEtpdCBjaGlsZCBwcm9jZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRDaGlsZFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqIFNpZ25hbCBzZW50IHdoZW4gc2h1dGRvd24gc3RhcnRzLiBEZWZhdWx0cyB0byBgU0lHVEVSTWAuICovXG4gIGdyYWNlZnVsU2lnbmFsPzogTm9kZUpTLlNpZ25hbHM7XG4gIC8qKiBUaW1lIHRvIHdhaXQgYWZ0ZXIgdGhlIGdyYWNlZnVsIHNpZ25hbC4gRGVmYXVsdHMgdG8gNyBzZWNvbmRzLiAqL1xuICBncmFjZWZ1bFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIFNpZ25hbCBzZW50IHdoZW4gZ3JhY2VmdWwgc2h1dGRvd24gdGltZXMgb3V0LiBEZWZhdWx0cyB0byBgU0lHS0lMTGAuICovXG4gIGZvcmNlU2lnbmFsPzogTm9kZUpTLlNpZ25hbHM7XG4gIC8qKiBUaW1lIHRvIHdhaXQgYWZ0ZXIgdGhlIGZvcmNlIHNpZ25hbC4gRGVmYXVsdHMgdG8gMSBzZWNvbmQuICovXG4gIGZvcmNlVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0YXJ0IGFuZCBzdG9wIG9uZSBBcHBLaXQtb3duZWQgc3VicHJvY2Vzcy5cbiAqXG4gKiBUaGUgc3Bhd24gYXJndW1lbnRzIHVzZSB7QGxpbmsgZXhlYy5FeGVjT3B0aW9uc30sIGluY2x1ZGluZyBjb3JlIGV4ZWMnc1xuICogc3RkaW4sIG91dHB1dCBjYXB0dXJlLCBsaW5lIGhhbmRsZXJzLCBleGl0IGNoZWNraW5nLCBhbmQgdHJpbSBwb2xpY3kuXG4gKiBTaHV0ZG93biBpcyBpZGVtcG90ZW50IGFuZCBlc2NhbGF0ZXMgZnJvbSB0aGUgZ3JhY2VmdWwgc2lnbmFsIHRvIHRoZSBmb3JjZVxuICogc2lnbmFsIHdoZW4gdGhlIGNoaWxkIGRvZXMgbm90IGV4aXQgd2l0aGluIHRoZSBjb25maWd1cmVkIHRpbWVvdXRzLlxuICovXG5leHBvcnQgY2xhc3MgQXBwS2l0Q2hpbGRQcm9jZXNzIHtcbiAgcmVhZG9ubHkgI3NwYXduQXJnczogQXBwS2l0U3Bhd25BcmdzO1xuICByZWFkb25seSAjb3B0aW9uczogUmVxdWlyZWQ8QXBwS2l0Q2hpbGRQcm9jZXNzT3B0aW9ucz47XG4gIHJlYWRvbmx5ICNkZXRhY2hlZDogYm9vbGVhbjtcblxuICAjY2hpbGQ/OiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdDtcbiAgI3NodXRkb3duUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3Ioc3Bhd25BcmdzOiBBcHBLaXRTcGF3bkFyZ3MsIG9wdGlvbnM6IEFwcEtpdENoaWxkUHJvY2Vzc09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuI3NwYXduQXJncyA9IHNwYXduQXJncztcbiAgICB0aGlzLiNvcHRpb25zID0ge1xuICAgICAgZ3JhY2VmdWxTaWduYWw6IG9wdGlvbnMuZ3JhY2VmdWxTaWduYWwgPz8gXCJTSUdURVJNXCIsXG4gICAgICBncmFjZWZ1bFRpbWVvdXRNczogb3B0aW9ucy5ncmFjZWZ1bFRpbWVvdXRNcyA/PyA3XzAwMCxcbiAgICAgIGZvcmNlU2lnbmFsOiBvcHRpb25zLmZvcmNlU2lnbmFsID8/IFwiU0lHS0lMTFwiLFxuICAgICAgZm9yY2VUaW1lb3V0TXM6IG9wdGlvbnMuZm9yY2VUaW1lb3V0TXMgPz8gMV8wMDAsXG4gICAgfTtcbiAgICB0aGlzLiNkZXRhY2hlZCA9IHNwYXduT3B0aW9ucyhzcGF3bkFyZ3MpPy5kZXRhY2hlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGNoaWxkIGhhbmRsZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyBjaGlsZCBpcyBydW5uaW5nLiAqL1xuICBnZXQgcHJvY2VzcygpOiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2NoaWxkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGN1cnJlbnQgY2hpbGQgaGFzIG5vdCByZXBvcnRlZCBhbiBleGl0IGNvZGUgb3Igc2lnbmFsLiAqL1xuICBnZXQgcnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2hpbGQgIT09IHVuZGVmaW5lZCAmJiAhaGFzRXhpdGVkKHRoaXMuI2NoaWxkKTtcbiAgfVxuXG4gIC8qKiBTdGFydCB0aGUgY29uZmlndXJlZCBjaGlsZCBwcm9jZXNzLiAqL1xuICBzdGFydCgpOiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gICAgaWYgKHRoaXMucnVubmluZykgdGhyb3cgbmV3IEVycm9yKFwiQ2hpbGQgcHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgaWYgKHRoaXMuI3NodXRkb3duUHJvbWlzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2hpbGQgcHJvY2VzcyBpcyBzaHV0dGluZyBkb3duIG9yIGhhcyBiZWVuIHNodXQgZG93blwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZCA9IGV4ZWMuc3Bhd24oLi4udGhpcy4jc3Bhd25BcmdzKTtcbiAgICB0aGlzLiNjaGlsZCA9IGNoaWxkO1xuICAgIHZvaWQgY2hpbGQub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNjaGlsZCA9PT0gY2hpbGQpIHRoaXMuI2NoaWxkID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBjaGlsZCBvbmNlLCBlc2NhbGF0aW5nIHdoZW4gZ3JhY2VmdWwgc2h1dGRvd24gdGltZXMgb3V0LiAqL1xuICBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLiNzaHV0ZG93blByb21pc2UgPz89IHRoaXMuI3BlcmZvcm1TaHV0ZG93bigpO1xuICAgIHJldHVybiB0aGlzLiNzaHV0ZG93blByb21pc2U7XG4gIH1cblxuICBhc3luYyAjcGVyZm9ybVNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNoaWxkID0gdGhpcy4jY2hpbGQ7XG4gICAgaWYgKCFjaGlsZCB8fCBoYXNFeGl0ZWQoY2hpbGQpKSB7XG4gICAgICB0aGlzLiNjaGlsZCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzaWduYWxDaGlsZChjaGlsZCwgdGhpcy4jb3B0aW9ucy5ncmFjZWZ1bFNpZ25hbCwgdGhpcy4jZGV0YWNoZWQpO1xuICAgIGlmIChhd2FpdCB3YWl0Rm9yRXhpdChjaGlsZCwgdGhpcy4jb3B0aW9ucy5ncmFjZWZ1bFRpbWVvdXRNcykpIHtcbiAgICAgIGlmICh0aGlzLiNjaGlsZCA9PT0gY2hpbGQpIHRoaXMuI2NoaWxkID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNpZ25hbENoaWxkKGNoaWxkLCB0aGlzLiNvcHRpb25zLmZvcmNlU2lnbmFsLCB0aGlzLiNkZXRhY2hlZCk7XG4gICAgaWYgKCEoYXdhaXQgd2FpdEZvckV4aXQoY2hpbGQsIHRoaXMuI29wdGlvbnMuZm9yY2VUaW1lb3V0TXMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGlsZCBwcm9jZXNzICR7Y2hpbGQucGlkID8/IFwiPHVua25vd24+XCJ9IGRpZCBub3QgdGVybWluYXRlYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNjaGlsZCA9PT0gY2hpbGQpIHRoaXMuI2NoaWxkID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNwYXduT3B0aW9ucyhhcmdzOiBBcHBLaXRTcGF3bkFyZ3MpOiBleGVjLkV4ZWNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBhcmdzLmF0KC0xKTtcbiAgcmV0dXJuIGlzRXhlY09wdGlvbnModmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRXhlY09wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBleGVjLkV4ZWNPcHRpb25zIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGhhc0V4aXRlZChjaGlsZDogZXhlYy5DaGlsZFByb2Nlc3NSZXN1bHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoaWxkLmV4aXRDb2RlICE9PSBudWxsIHx8IGNoaWxkLnNpZ25hbENvZGUgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbENoaWxkKFxuICBjaGlsZDogZXhlYy5DaGlsZFByb2Nlc3NSZXN1bHQsXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIGRldGFjaGVkOiBib29sZWFuLFxuKTogdm9pZCB7XG4gIGlmIChkZXRhY2hlZCAmJiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIgJiYgY2hpbGQucGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbCgtY2hpbGQucGlkLCBzaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBkaXJlY3QgY2hpbGQgd2hlbiB0aGUgcHJvY2VzcyBncm91cCBhbHJlYWR5IGV4aXRlZC5cbiAgICB9XG4gIH1cbiAgY2hpbGQua2lsbChzaWduYWwpO1xufVxuXG5mdW5jdGlvbiB3YWl0Rm9yRXhpdChjaGlsZDogZXhlYy5DaGlsZFByb2Nlc3NSZXN1bHQsIHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChoYXNFeGl0ZWQoY2hpbGQpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxldCB0aW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGZpbmlzaCA9IChleGl0ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHZvaWQgY2hpbGQub2ZmKFwiZXhpdFwiLCBvbkV4aXQpO1xuICAgICAgdm9pZCBjaGlsZC5vZmYoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgIHJlc29sdmUoZXhpdGVkKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uRXhpdCA9ICgpID0+IGZpbmlzaCh0cnVlKTtcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gZmluaXNoKHRydWUpO1xuXG4gICAgdm9pZCBjaGlsZC5vbmNlKFwiZXhpdFwiLCBvbkV4aXQpO1xuICAgIHZvaWQgY2hpbGQub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgIGlmIChoYXNFeGl0ZWQoY2hpbGQpKSB7XG4gICAgICBmaW5pc2godHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBmaW5pc2goZmFsc2UpLCB0aW1lb3V0TXMpO1xuICB9KTtcbn1cbiJdfQ==
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGQtcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGlsZC1wcm9jZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxNQUFNLGdDQUFnQyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQztBQUMvQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQVUsQ0FBQztBQW9DckU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3BCLFVBQVUsQ0FBa0I7SUFDNUIsWUFBWSxDQUFtQjtJQUMvQixZQUFZLENBQWlDO0lBQzdDLHNCQUFzQixDQUFTO0lBQy9CLHFCQUFxQixDQUFTO0lBRXZDLE1BQU0sQ0FBMkI7SUFDakMsc0JBQXNCLENBQW1CO0lBQ3pDLGdCQUFnQixDQUFpQjtJQUVqQyxZQUFZLFNBQTBCLEVBQUUsVUFBcUMsRUFBRTtRQUM3RSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixNQUFNLEVBQ0osV0FBVyxFQUNYLHFCQUFxQixHQUFHLGdDQUFnQyxFQUN4RCxvQkFBb0IsR0FBRywrQkFBK0IsRUFDdEQsR0FBRyxXQUFXLEVBQ2YsR0FBRyxPQUFPLENBQUM7UUFDWixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsb0JBQW9CLENBQ2hELHFCQUFxQixFQUNyQix1QkFBdUIsQ0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQyxvQkFBb0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLEdBQUcs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TUFBTTtZQUNOLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ2pDLENBQ0YsRUFBRSxDQUFDO1lBQ0YsSUFBSSxPQUFPO2dCQUFFLE9BQU87UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBeUI7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUs7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUE4QjtJQUMvQyxPQUFPLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDO0FBQzlELENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBjaGlsZC1wcm9jZXNzIGxpZmVjeWNsZSBidWlsdCBvbiBgQGRieC10b29scy9jb3JlL2V4ZWNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0ICogYXMgZXhlYyBmcm9tIFwiQGRieC10b29scy9jb3JlL2V4ZWNcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBERUZBVUxUX0hFQUxUSF9DSEVDS19JTlRFUlZBTF9NUyA9IDIwMDtcbmNvbnN0IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5jb25zdCBERUZBVUxUX1JVTl9TSUdOQUxTID0gW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiLCBcIlNJR0hVUFwiXSBhcyBjb25zdDtcblxuLyoqIFNwYXduIGFyZ3VtZW50cyBhY2NlcHRlZCBieSB7QGxpbmsgQXBwS2l0Q2hpbGRQcm9jZXNzfS4gKi9cbmV4cG9ydCB0eXBlIEFwcEtpdFNwYXduQXJncyA9IGV4ZWMuU3Bhd25BcmdzPGV4ZWMuRXhlY09wdGlvbnM+O1xuXG4vKiogQ29udGV4dCBwYXNzZWQgdG8gb25lIGNoaWxkLXByb2Nlc3MgcmVhZGluZXNzIHByb2JlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRDaGlsZFByb2Nlc3NIZWFsdGhDaGVja0NvbnRleHQge1xuICAvKiogU3Bhd25lZCBwcm9jZXNzIGJlaW5nIGNoZWNrZWQuICovXG4gIHJlYWRvbmx5IHByb2Nlc3M6IGV4ZWMuQ2hpbGRQcm9jZXNzUmVzdWx0O1xuICAvKiogQWJvcnRzIHdoZW4gc2h1dGRvd24gYmVnaW5zIG9yIHRoZSByZWFkaW5lc3MgdGltZW91dCBleHBpcmVzLiAqL1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xuICAvKiogWmVyby1iYXNlZCByZWFkaW5lc3MgYXR0ZW1wdC4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xufVxuXG4vKiogUmV0dXJuIGB0cnVlYCB3aGVuIHRoZSBzcGF3bmVkIHByb2Nlc3MgaXMgcmVhZHkgdG8gc2VydmUgY2FsbGVycy4gKi9cbmV4cG9ydCB0eXBlIEFwcEtpdENoaWxkUHJvY2Vzc0hlYWx0aENoZWNrID0gKFxuICBjb250ZXh0OiBBcHBLaXRDaGlsZFByb2Nlc3NIZWFsdGhDaGVja0NvbnRleHQsXG4pID0+IGJvb2xlYW4gfCBQcm9taXNlTGlrZTxib29sZWFuPjtcblxuLyoqIFJlYWRpbmVzcyBhbmQgdHJlZS1zaHV0ZG93biBwb2xpY3kgZm9yIGFuIEFwcEtpdCBjaGlsZCBwcm9jZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRDaGlsZFByb2Nlc3NPcHRpb25zIGV4dGVuZHMgZXhlYy5LaWxsT3B0aW9ucyB7XG4gIC8qKiBPcHRpb25hbCByZWFkaW5lc3MgcHJvYmUgcG9sbGVkIGFmdGVyIHRoZSBwcm9jZXNzIGlzIHNwYXduZWQuICovXG4gIGhlYWx0aENoZWNrPzogQXBwS2l0Q2hpbGRQcm9jZXNzSGVhbHRoQ2hlY2s7XG4gIC8qKiBEZWxheSBiZXR3ZWVuIHJlYWRpbmVzcyBwcm9iZXMuIERlZmF1bHRzIHRvIDIwMCBtaWxsaXNlY29uZHMuICovXG4gIGhlYWx0aENoZWNrSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBhbGxvd2VkIGZvciByZWFkaW5lc3MuIERlZmF1bHRzIHRvIDMwIHNlY29uZHMuICovXG4gIGhlYWx0aENoZWNrVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKiogRm9yZWdyb3VuZCBzaWduYWwgcG9saWN5IGZvciB7QGxpbmsgQXBwS2l0Q2hpbGRQcm9jZXNzLnJ1bn0uICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdENoaWxkUHJvY2Vzc1J1bk9wdGlvbnMge1xuICAvKiogUGFyZW50IHNpZ25hbHMgdGhhdCB0cmlnZ2VyIHRyZWUgc2h1dGRvd24gYmVmb3JlIGJlaW5nIHJlLXJhaXNlZC4gKi9cbiAgc2lnbmFscz86IHJlYWRvbmx5IE5vZGVKUy5TaWduYWxzW107XG59XG5cbi8qKlxuICogU3RhcnQgYW5kIHN0b3Agb25lIEFwcEtpdC1vd25lZCBzdWJwcm9jZXNzLlxuICpcbiAqIFRoZSBzcGF3biBhcmd1bWVudHMgdXNlIHtAbGluayBleGVjLkV4ZWNPcHRpb25zfSwgaW5jbHVkaW5nIGNvcmUgZXhlYydzXG4gKiBzdGRpbiwgb3V0cHV0IGNhcHR1cmUsIGxpbmUgaGFuZGxlcnMsIGV4aXQgY2hlY2tpbmcsIGFuZCB0cmltIHBvbGljeS5cbiAqIFdoZW4gY29uZmlndXJlZCwge0BsaW5rIEFwcEtpdENoaWxkUHJvY2Vzc09wdGlvbnMuaGVhbHRoQ2hlY2t9IGlzIHBvbGxlZFxuICogdW50aWwgcmVhZHkgYmVmb3JlIHtAbGluayBzdGFydH0gcmVzb2x2ZXMuIFNodXRkb3duIGFib3J0cyBhbnkgYWN0aXZlIHByb2JlXG4gKiBhbmQgZGVsZWdhdGVzIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiB0byB7QGxpbmsgZXhlYy5raWxsfS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdENoaWxkUHJvY2VzcyB7XG4gIHJlYWRvbmx5ICNzcGF3bkFyZ3M6IEFwcEtpdFNwYXduQXJncztcbiAgcmVhZG9ubHkgI2tpbGxPcHRpb25zOiBleGVjLktpbGxPcHRpb25zO1xuICByZWFkb25seSAjaGVhbHRoQ2hlY2s/OiBBcHBLaXRDaGlsZFByb2Nlc3NIZWFsdGhDaGVjaztcbiAgcmVhZG9ubHkgI2hlYWx0aENoZWNrSW50ZXJ2YWxNczogbnVtYmVyO1xuICByZWFkb25seSAjaGVhbHRoQ2hlY2tUaW1lb3V0TXM6IG51bWJlcjtcblxuICAjY2hpbGQ/OiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdDtcbiAgI2hlYWx0aENoZWNrQ29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgI3NodXRkb3duUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3Ioc3Bhd25BcmdzOiBBcHBLaXRTcGF3bkFyZ3MsIG9wdGlvbnM6IEFwcEtpdENoaWxkUHJvY2Vzc09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuI3NwYXduQXJncyA9IHNwYXduQXJncztcbiAgICBjb25zdCB7XG4gICAgICBoZWFsdGhDaGVjayxcbiAgICAgIGhlYWx0aENoZWNrSW50ZXJ2YWxNcyA9IERFRkFVTFRfSEVBTFRIX0NIRUNLX0lOVEVSVkFMX01TLFxuICAgICAgaGVhbHRoQ2hlY2tUaW1lb3V0TXMgPSBERUZBVUxUX0hFQUxUSF9DSEVDS19USU1FT1VUX01TLFxuICAgICAgLi4ua2lsbE9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLiNoZWFsdGhDaGVjayA9IGhlYWx0aENoZWNrO1xuICAgIHRoaXMuI2hlYWx0aENoZWNrSW50ZXJ2YWxNcyA9IHBvc2l0aXZlTWlsbGlzZWNvbmRzKFxuICAgICAgaGVhbHRoQ2hlY2tJbnRlcnZhbE1zLFxuICAgICAgXCJoZWFsdGhDaGVja0ludGVydmFsTXNcIixcbiAgICApO1xuICAgIHRoaXMuI2hlYWx0aENoZWNrVGltZW91dE1zID0gcG9zaXRpdmVNaWxsaXNlY29uZHMoaGVhbHRoQ2hlY2tUaW1lb3V0TXMsIFwiaGVhbHRoQ2hlY2tUaW1lb3V0TXNcIik7XG4gICAgdGhpcy4ja2lsbE9wdGlvbnMgPSBraWxsT3B0aW9ucztcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGNoaWxkIGhhbmRsZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyBjaGlsZCBpcyBydW5uaW5nLiAqL1xuICBnZXQgcHJvY2VzcygpOiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2NoaWxkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGN1cnJlbnQgY2hpbGQgaGFzIG5vdCByZXBvcnRlZCBhbiBleGl0IGNvZGUgb3Igc2lnbmFsLiAqL1xuICBnZXQgcnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2hpbGQgIT09IHVuZGVmaW5lZCAmJiAhaGFzRXhpdGVkKHRoaXMuI2NoaWxkKTtcbiAgfVxuXG4gIC8qKiBTcGF3biB0aGUgY2hpbGQgYW5kIHJlc29sdmUgb25seSBhZnRlciBpdHMgb3B0aW9uYWwgcmVhZGluZXNzIHByb2JlIHN1Y2NlZWRzLiAqL1xuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5ydW5uaW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJDaGlsZCBwcm9jZXNzIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICBpZiAodGhpcy4jc2h1dGRvd25Qcm9taXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGlsZCBwcm9jZXNzIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzIGJlZW4gc2h1dCBkb3duXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkID0gZXhlYy5zcGF3biguLi50aGlzLiNzcGF3bkFyZ3MpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy4jY2hpbGQgPSBjaGlsZDtcbiAgICB0aGlzLiNoZWFsdGhDaGVja0NvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHZvaWQgY2hpbGQub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNjaGlsZCA9PT0gY2hpbGQpIHRoaXMuI2NoaWxkID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLiNjb21wbGV0ZVN0YXJ0KGNoaWxkLCBjb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCwgYXdhaXQsIGFuZCBzaHV0IGRvd24gb25lIGZvcmVncm91bmQgY2hpbGQgd2hpbGUgcHJlc2VydmluZyBwYXJlbnRcbiAgICogdGVybWluYXRpb24gc2lnbmFscy5cbiAgICovXG4gIGFzeW5jIHJ1bihvcHRpb25zOiBBcHBLaXRDaGlsZFByb2Nlc3NSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPGV4ZWMuRXhlY1Jlc3VsdD4ge1xuICAgIGNvbnN0IHNpZ25hbHMgPSBvcHRpb25zLnNpZ25hbHMgPz8gREVGQVVMVF9SVU5fU0lHTkFMUztcbiAgICBpZiAoc2lnbmFscy5pbmNsdWRlcyhcIlNJR0tJTExcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNJR0tJTEwgY2Fubm90IGJlIGludGVyY2VwdGVkIGJ5IGEgTm9kZSBwcm9jZXNzXCIpO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIGhhbmRsZXJzKSBwcm9jZXNzLm9mZihzaWduYWwsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykge1xuICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG4gICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcnMoKTtcbiAgICAgICAgdm9pZCB0aGlzLnNodXRkb3duKClcbiAgICAgICAgICAuZmluYWxseSgoKSA9PiBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgICAgaGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLiNjaGlsZDtcbiAgICAgIGlmICghY2hpbGQpIHRocm93IG5ldyBFcnJvcihcIkNoaWxkIHByb2Nlc3MgZXhpdGVkIGFmdGVyIHN0YXJ0dXBcIik7XG4gICAgICByZXR1cm4gYXdhaXQgY2hpbGQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbW92ZUhhbmRsZXJzKCk7XG4gICAgICBhd2FpdCB0aGlzLnNodXRkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IHJlYWRpbmVzcyBhbmQgc3RvcCB0aGUgcHJvY2VzcyB0cmVlIG9uY2UuXG4gICAqXG4gICAqIEFuIGV4cGxpY2l0IG5vbi1gU0lHS0lMTGAgc2lnbmFsIHJ1bnMgb25seSB0aGUgZ3JhY2VmdWwgcG9sbGluZyBwaGFzZS5cbiAgICogRXhwbGljaXQgYFNJR0tJTExgIHNraXBzIGRpcmVjdGx5IHRvIGZvcmNlZCBwb2xsaW5nLiBPbWl0dGluZyB0aGUgc2lnbmFsXG4gICAqIHVzZXMgdGhlIGNvbmZpZ3VyZWQgZ3JhY2VmdWwgYW5kIGZvcmNlZCBwb2xpY3kuXG4gICAqL1xuICBzaHV0ZG93bihzaWduYWw/OiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuI2hlYWx0aENoZWNrQ29udHJvbGxlcj8uYWJvcnQoXG4gICAgICBuZXcgRE9NRXhjZXB0aW9uKFwiQ2hpbGQgcHJvY2VzcyBzaHV0ZG93biByZXF1ZXN0ZWRcIiwgXCJBYm9ydEVycm9yXCIpLFxuICAgICk7XG4gICAgY29uc3Qga2lsbE9wdGlvbnM6IGV4ZWMuS2lsbE9wdGlvbnMgPVxuICAgICAgc2lnbmFsID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiNraWxsT3B0aW9uc1xuICAgICAgICA6IHNpZ25hbCA9PT0gXCJTSUdLSUxMXCJcbiAgICAgICAgICA/IHsgLi4udGhpcy4ja2lsbE9wdGlvbnMsIGdyYWNlZnVsU2lnbmFsOiBmYWxzZSwgZm9yY2VTaWduYWw6IHNpZ25hbCB9XG4gICAgICAgICAgOiB7IC4uLnRoaXMuI2tpbGxPcHRpb25zLCBncmFjZWZ1bFNpZ25hbDogc2lnbmFsLCBmb3JjZVNpZ25hbDogZmFsc2UgfTtcbiAgICB0aGlzLiNzaHV0ZG93blByb21pc2UgPz89IHRoaXMuI3BlcmZvcm1TaHV0ZG93bihraWxsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuI3NodXRkb3duUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jICNjb21wbGV0ZVN0YXJ0KGNoaWxkOiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdCwgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLiNoZWFsdGhDaGVjaykge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgIHRoaXMuI3dhaXRVbnRpbEhlYWx0aHkoY2hpbGQsIGNvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBjaGlsZC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYENoaWxkIHByb2Nlc3MgJHtjaGlsZC5waWQgPz8gXCI8dW5rbm93bj5cIn0gZXhpdGVkIGJlZm9yZSBiZWNvbWluZyByZWFkeSBgICtcbiAgICAgICAgICAgICAgICBgKGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaHV0ZG93bigpO1xuICAgICAgfSBjYXRjaCAoc2h1dGRvd25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgW2Vycm9yLCBzaHV0ZG93bkVycm9yXSxcbiAgICAgICAgICBgQ2hpbGQgcHJvY2VzcyAke2NoaWxkLnBpZCA/PyBcIjx1bmtub3duPlwifSBmYWlsZWQgcmVhZGluZXNzIGFuZCBzaHV0ZG93bmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI2hlYWx0aENoZWNrQ29udHJvbGxlciA9PT0gY29udHJvbGxlcikge1xuICAgICAgICB0aGlzLiNoZWFsdGhDaGVja0NvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI3dhaXRVbnRpbEhlYWx0aHkoY2hpbGQ6IGV4ZWMuQ2hpbGRQcm9jZXNzUmVzdWx0LCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2sgPSB0aGlzLiNoZWFsdGhDaGVjaztcbiAgICBpZiAoIWhlYWx0aENoZWNrKSByZXR1cm47XG4gICAgZm9yIGF3YWl0IChjb25zdCBoZWFsdGh5IG9mIGFzeW5jVXRpbHMucG9sbChcbiAgICAgICh7IGF0dGVtcHQsIHNpZ25hbDogcG9sbFNpZ25hbCB9KSA9PlxuICAgICAgICBoZWFsdGhDaGVjayh7IHByb2Nlc3M6IGNoaWxkLCBzaWduYWw6IHBvbGxTaWduYWwsIGF0dGVtcHQgfSksXG4gICAgICB7XG4gICAgICAgIGludGVydmFsTXM6IHRoaXMuI2hlYWx0aENoZWNrSW50ZXJ2YWxNcyxcbiAgICAgICAgdGltZW91dE1zOiB0aGlzLiNoZWFsdGhDaGVja1RpbWVvdXRNcyxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBwcmVkaWNhdGU6IChoZWFsdGh5KSA9PiAhaGVhbHRoeSxcbiAgICAgIH0sXG4gICAgKSkge1xuICAgICAgaWYgKGhlYWx0aHkpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBhc3luYyAjcGVyZm9ybVNodXRkb3duKG9wdGlvbnM6IGV4ZWMuS2lsbE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGlsZCA9IHRoaXMuI2NoaWxkO1xuICAgIGlmICghY2hpbGQpIHtcbiAgICAgIHRoaXMuI2NoaWxkID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGV4ZWMua2lsbChjaGlsZCwgb3B0aW9ucyk7XG4gICAgaWYgKHRoaXMuI2NoaWxkID09PSBjaGlsZCkgdGhpcy4jY2hpbGQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzRXhpdGVkKGNoaWxkOiBleGVjLkNoaWxkUHJvY2Vzc1Jlc3VsdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVNaWxsaXNlY29uZHModmFsdWU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZmluaXRlIHBvc2l0aXZlIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
|
package/lib/src/interceptor.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The `createApp` INTERCEPTOR context: an in-process handle an app hands to
|
|
3
3
|
* add-ons (the tunnel, chiefly) so they can read the env auto-configuration
|
|
4
|
-
* computed
|
|
5
|
-
* unit - concurrently-style, where any death takes the whole set down.
|
|
4
|
+
* computed and hook AppKit's lifecycle.
|
|
6
5
|
*
|
|
7
6
|
* An interceptor is a plain function `(ctx) => void | Promise<void>` passed to
|
|
8
7
|
* `appkit.createApp`'s `interceptor` option ("one or many"). `appkit.createApp`
|
|
@@ -19,7 +18,6 @@
|
|
|
19
18
|
*
|
|
20
19
|
* @module
|
|
21
20
|
*/
|
|
22
|
-
import type { ChildProcess } from "node:child_process";
|
|
23
21
|
import { Plugin, type BasePluginConfig } from "@databricks/appkit";
|
|
24
22
|
import type { LakebaseConnection } from "./lakebase-resolver.ts";
|
|
25
23
|
/**
|
|
@@ -52,13 +50,6 @@ export interface ResolvedAppEnv {
|
|
|
52
50
|
/** Resolved Databricks workspace host (`DATABRICKS_HOST`), when known. */
|
|
53
51
|
readonly databricksHost?: string;
|
|
54
52
|
}
|
|
55
|
-
/**
|
|
56
|
-
* A process {@link InterceptorContext.bindProcess} can supervise. A bare
|
|
57
|
-
* `node:child_process` `ChildProcess` (e.g. portr) satisfies this, and so does
|
|
58
|
-
* `@dbx-tools/core`'s `spawn()` result (a `ChildProcessResult` IS a
|
|
59
|
-
* `ChildProcess`) - one code path handles both.
|
|
60
|
-
*/
|
|
61
|
-
export type BindableProcess = Pick<ChildProcess, "pid" | "kill" | "killed" | "once">;
|
|
62
53
|
/**
|
|
63
54
|
* The handle passed to each interceptor.
|
|
64
55
|
*
|
|
@@ -68,9 +59,8 @@ export type BindableProcess = Pick<ChildProcess, "pid" | "kill" | "killed" | "on
|
|
|
68
59
|
* await appkit.createApp({
|
|
69
60
|
* plugins: [server()],
|
|
70
61
|
* interceptor: (ctx) => {
|
|
71
|
-
* const
|
|
72
|
-
* ctx.
|
|
73
|
-
* ctx.onLifecycle("shutdown", () => portr.kill("SIGTERM"));
|
|
62
|
+
* const auxiliary = startAuxiliary(ctx.env.databricksHost);
|
|
63
|
+
* ctx.onLifecycle("shutdown", () => auxiliary.stop());
|
|
74
64
|
* },
|
|
75
65
|
* });
|
|
76
66
|
*/
|
|
@@ -84,20 +74,6 @@ export interface InterceptorContext {
|
|
|
84
74
|
* retroactively (same semantics as AppKit).
|
|
85
75
|
*/
|
|
86
76
|
onLifecycle(event: LifecycleEvent, fn: LifecycleHandler): void;
|
|
87
|
-
/** Register synchronous cleanup that runs before any bound process is killed. */
|
|
88
|
-
onTeardown(fn: () => void): void;
|
|
89
|
-
/**
|
|
90
|
-
* Broadcast a termination signal from the main app to every bound process.
|
|
91
|
-
* Called automatically when this process receives `SIGINT`/`SIGTERM`/`SIGHUP`;
|
|
92
|
-
* exposed so an interceptor can trigger teardown itself.
|
|
93
|
-
*/
|
|
94
|
-
broadcastSignal(signal: NodeJS.Signals): void;
|
|
95
|
-
/**
|
|
96
|
-
* Supervise a child process alongside the app, concurrently-style: signals pass
|
|
97
|
-
* through, and if EITHER the child or the app dies the whole set comes down.
|
|
98
|
-
* Safe to call for several children; teardown is idempotent.
|
|
99
|
-
*/
|
|
100
|
-
bindProcess(child: BindableProcess): void;
|
|
101
77
|
}
|
|
102
78
|
/** A single interceptor, or several. The `createApp` `interceptor?:` option. */
|
|
103
79
|
export type Interceptor = (ctx: InterceptorContext) => void | Promise<void>;
|
|
@@ -114,12 +90,6 @@ export interface InterceptorRuntime {
|
|
|
114
90
|
}
|
|
115
91
|
/**
|
|
116
92
|
* Build an {@link InterceptorContext} + its {@link InterceptorRuntime}.
|
|
117
|
-
*
|
|
118
|
-
* Teardown is the generalized `superviseExit`: the first child exit or main-process
|
|
119
|
-
* termination signal flips a one-shot guard, `SIGTERM`s the other bound children,
|
|
120
|
-
* then `process.exit`s after {@link TEARDOWN_GRACE_MS} (an `unref`'d timer, so it
|
|
121
|
-
* never itself holds the loop open). The process-signal listeners are installed
|
|
122
|
-
* lazily on the first `bindProcess` so an app that binds nothing is untouched.
|
|
123
93
|
*/
|
|
124
94
|
export declare function createInterceptorContext(env: ResolvedAppEnv): InterceptorRuntime;
|
|
125
95
|
/** Config for {@link LifecycleBridgePlugin}: the sink its captured events flow to. */
|
package/lib/src/interceptor.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The `createApp` INTERCEPTOR context: an in-process handle an app hands to
|
|
3
3
|
* add-ons (the tunnel, chiefly) so they can read the env auto-configuration
|
|
4
|
-
* computed
|
|
5
|
-
* unit - concurrently-style, where any death takes the whole set down.
|
|
4
|
+
* computed and hook AppKit's lifecycle.
|
|
6
5
|
*
|
|
7
6
|
* An interceptor is a plain function `(ctx) => void | Promise<void>` passed to
|
|
8
7
|
* `appkit.createApp`'s `interceptor` option ("one or many"). `appkit.createApp`
|
|
@@ -22,73 +21,11 @@
|
|
|
22
21
|
import { Plugin, toPlugin } from "@databricks/appkit";
|
|
23
22
|
import { log } from "@dbx-tools/shared-core";
|
|
24
23
|
const logger = log.logger("interceptor");
|
|
25
|
-
/** How long bound children get to exit on `SIGTERM` before the app force-exits. */
|
|
26
|
-
const TEARDOWN_GRACE_MS = 10_000;
|
|
27
|
-
/** The signals that trigger teardown when the MAIN process receives them. */
|
|
28
|
-
const TEARDOWN_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
29
|
-
const boundChildren = new Set();
|
|
30
|
-
const teardownHandlers = new Set();
|
|
31
|
-
let processShuttingDown = false;
|
|
32
|
-
let processSignalsBound = false;
|
|
33
|
-
function teardownProcess(code) {
|
|
34
|
-
if (processShuttingDown)
|
|
35
|
-
return;
|
|
36
|
-
processShuttingDown = true;
|
|
37
|
-
for (const handler of teardownHandlers)
|
|
38
|
-
handler();
|
|
39
|
-
teardownHandlers.clear();
|
|
40
|
-
const children = [...boundChildren];
|
|
41
|
-
for (const child of children) {
|
|
42
|
-
if (!child.killed)
|
|
43
|
-
child.kill("SIGTERM");
|
|
44
|
-
}
|
|
45
|
-
boundChildren.clear();
|
|
46
|
-
setTimeout(() => {
|
|
47
|
-
for (const child of children)
|
|
48
|
-
child.kill("SIGKILL");
|
|
49
|
-
process.exit(code);
|
|
50
|
-
}, TEARDOWN_GRACE_MS).unref();
|
|
51
|
-
}
|
|
52
|
-
function broadcastProcessSignal(signal) {
|
|
53
|
-
for (const child of boundChildren) {
|
|
54
|
-
if (!child.killed)
|
|
55
|
-
child.kill(signal);
|
|
56
|
-
}
|
|
57
|
-
teardownProcess(0);
|
|
58
|
-
}
|
|
59
|
-
function bindProcessSignals() {
|
|
60
|
-
if (processSignalsBound)
|
|
61
|
-
return;
|
|
62
|
-
processSignalsBound = true;
|
|
63
|
-
for (const signal of TEARDOWN_SIGNALS) {
|
|
64
|
-
process.on(signal, () => broadcastProcessSignal(signal));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
24
|
/**
|
|
68
25
|
* Build an {@link InterceptorContext} + its {@link InterceptorRuntime}.
|
|
69
|
-
*
|
|
70
|
-
* Teardown is the generalized `superviseExit`: the first child exit or main-process
|
|
71
|
-
* termination signal flips a one-shot guard, `SIGTERM`s the other bound children,
|
|
72
|
-
* then `process.exit`s after {@link TEARDOWN_GRACE_MS} (an `unref`'d timer, so it
|
|
73
|
-
* never itself holds the loop open). The process-signal listeners are installed
|
|
74
|
-
* lazily on the first `bindProcess` so an app that binds nothing is untouched.
|
|
75
26
|
*/
|
|
76
27
|
export function createInterceptorContext(env) {
|
|
77
28
|
const handlers = new Map();
|
|
78
|
-
if (processShuttingDown && boundChildren.size === 0)
|
|
79
|
-
processShuttingDown = false;
|
|
80
|
-
if (processSignalsBound &&
|
|
81
|
-
TEARDOWN_SIGNALS.every((signal) => process.listenerCount(signal) === 0)) {
|
|
82
|
-
processSignalsBound = false;
|
|
83
|
-
}
|
|
84
|
-
const bindProcess = (child) => {
|
|
85
|
-
bindProcessSignals();
|
|
86
|
-
boundChildren.add(child);
|
|
87
|
-
child.once("exit", (code) => {
|
|
88
|
-
logger.warn("bound process exited; tearing down the app", { code });
|
|
89
|
-
teardownProcess(typeof code === "number" ? code : 1);
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
29
|
const onLifecycle = (event, fn) => {
|
|
93
30
|
const list = handlers.get(event);
|
|
94
31
|
if (list)
|
|
@@ -114,12 +51,6 @@ export function createInterceptorContext(env) {
|
|
|
114
51
|
const context = {
|
|
115
52
|
env,
|
|
116
53
|
onLifecycle,
|
|
117
|
-
onTeardown: (fn) => {
|
|
118
|
-
bindProcessSignals();
|
|
119
|
-
teardownHandlers.add(fn);
|
|
120
|
-
},
|
|
121
|
-
broadcastSignal: broadcastProcessSignal,
|
|
122
|
-
bindProcess,
|
|
123
54
|
};
|
|
124
55
|
return { context, emitLifecycle };
|
|
125
56
|
}
|
|
@@ -158,4 +89,4 @@ export class LifecycleBridgePlugin extends Plugin {
|
|
|
158
89
|
}
|
|
159
90
|
/** Factory for the injected {@link LifecycleBridgePlugin}. */
|
|
160
91
|
export const lifecycleBridge = toPlugin(LifecycleBridgePlugin);
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBR0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQThDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUF1RnpDLG1GQUFtRjtBQUNuRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUVqQyw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDbEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBYyxDQUFDO0FBQy9DLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDLFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsSUFBSSxtQkFBbUI7UUFBRSxPQUFPO0lBQ2hDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUMzQixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2xELGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUNwQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFD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QztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDM0YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgY3JlYXRlQXBwYCBJTlRFUkNFUFRPUiBjb250ZXh0OiBhbiBpbi1wcm9jZXNzIGhhbmRsZSBhbiBhcHAgaGFuZHMgdG9cbiAqIGFkZC1vbnMgKHRoZSB0dW5uZWwsIGNoaWVmbHkpIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb25cbiAqIGNvbXB1dGVkLCBob29rIEFwcEtpdCdzIGxpZmVjeWNsZSwgYW5kIHN1cGVydmlzZSBzaWJsaW5nIGNoaWxkIHByb2Nlc3NlcyBhcyBvbmVcbiAqIHVuaXQgLSBjb25jdXJyZW50bHktc3R5bGUsIHdoZXJlIGFueSBkZWF0aCB0YWtlcyB0aGUgd2hvbGUgc2V0IGRvd24uXG4gKlxuICogQW4gaW50ZXJjZXB0b3IgaXMgYSBwbGFpbiBmdW5jdGlvbiBgKGN0eCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5gIHBhc3NlZCB0b1xuICogYGFwcGtpdC5jcmVhdGVBcHBgJ3MgYGludGVyY2VwdG9yYCBvcHRpb24gKFwib25lIG9yIG1hbnlcIikuIGBhcHBraXQuY3JlYXRlQXBwYFxuICogcnVucyBlYWNoIG9uZSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gaGFzIHBvcHVsYXRlZCBgcHJvY2Vzcy5lbnZgIGJ1dCBhcyBwYXJ0XG4gKiBvZiBib290aW5nIHRoZSBhcHAsIHNvIGFuIGludGVyY2VwdG9yIHNlZXMgdGhlIHJlc29sdmVkIGNvbm5lY3Rpb24gYW5kIGNhbiBiaW5kXG4gKiBwcm9jZXNzZXMgYmVmb3JlIG9yIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBUaGUgbmFtZXMgaGVyZSBtaXJyb3IgQXBwS2l0J3Mgb3duIHZvY2FidWxhcnkgcmF0aGVyIHRoYW4gaW52ZW50aW5nIHBhcmFsbGVsXG4gKiBvbmVzOiB7QGxpbmsgTGlmZWN5Y2xlRXZlbnR9IGFuZCB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0Lm9uTGlmZWN5Y2xlfSBhcmUgdGhlXG4gKiBleGFjdCBzaGFwZSBvZiBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgKGBzZXR1cDpjb21wbGV0ZWAgLyBgc2VydmVyOnJlYWR5YCAvXG4gKiBgc2h1dGRvd25gKS4gVGhlIGJyaWRnZSB0aGF0IG1ha2VzIHRoYXQgaG9vayByZWFjaGFibGUgZnJvbSBPVVRTSURFIGEgcGx1Z2luIC1cbiAqIHdoZXJlIGludGVyY2VwdG9ycyBydW4gLSBpcyB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSwgYSB0aW55IGludGVybmFsIHBsdWdpblxuICogYGFwcGtpdC5jcmVhdGVBcHBgIGluamVjdHMgdG8gY2FwdHVyZSBgdGhpcy5jb250ZXh0YCBhbmQgcmVsYXkgaXRzIGV2ZW50cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBQbHVnaW4sIHRvUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiaW50ZXJjZXB0b3JcIik7XG5cbi8qKlxuICogQXBwS2l0J3MgcGx1Z2luLWxpZmVjeWNsZSBldmVudHMsIHZlcmJhdGltIGZyb20gYFBsdWdpbkNvbnRleHRgXG4gKiAoYG5vZGVfbW9kdWxlcy9AZGF0YWJyaWNrcy9hcHBraXQvLi4uL2NvcmUvcGx1Z2luLWNvbnRleHQuZC50c2ApLiBSZS1kZWNsYXJlZFxuICogc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGVkIGJlY2F1c2UgYFBsdWdpbkNvbnRleHRgIGlzIG5vdCBpbiB0aGVcbiAqIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwICh0aGUgc2FtZSByZWFzb24ge0BsaW5rIFBsdWdpbkNvbnRleHRMaWtlfSBleGlzdHMgaW5cbiAqIGAuL3BsdWdpbmApLlxuICpcbiAqIC0gYHNldHVwOmNvbXBsZXRlYCAtIGV2ZXJ5IHBsdWdpbidzIGBzZXR1cCgpYCBoYXMgcmVzb2x2ZWQuXG4gKiAtIGBzZXJ2ZXI6cmVhZHlgIC0gdGhlIGBzZXJ2ZXIoKWAgcGx1Z2luIGlzIGxpc3RlbmluZyAobmV2ZXIgZmlyZXMgZm9yIGFcbiAqICAgc2VydmVybGVzcyBhcHAsIGUuZy4gdGhlIHR1bm5lbCBnYXRlKS5cbiAqIC0gYHNodXRkb3duYCAtIHRoZSBhcHAgaXMgdGVhcmluZyBkb3duLlxuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVFdmVudCA9IFwic2V0dXA6Y29tcGxldGVcIiB8IFwic2VydmVyOnJlYWR5XCIgfCBcInNodXRkb3duXCI7XG5cbi8qKiBBIGxpZmVjeWNsZSBzdWJzY3JpYmVyLiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHByb3BhZ2F0ZWQgKG1hdGNoZXMgQXBwS2l0KS4gKi9cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgZW52IGF1dG8tY29uZmlndXJhdGlvbiByZXNvbHZlZCBiZWZvcmUgYm9vdCwgZXhwb3NlZCB0byBpbnRlcmNlcHRvcnMgc29cbiAqIHRoZXkgcmVhZCBDT01QVVRFRCB2YWx1ZXMgaW5zdGVhZCBvZiByZS1yZWFkaW5nIGBwcm9jZXNzLmVudmAgdGhlbXNlbHZlcy5cbiAqXG4gKiBgbGFrZWJhc2VgIGlzIHRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHdoZW4gTGFrZWJhc2UgYXV0by1jb25maWcgcmFuXG4gKiAoc2VlIGBhcHBraXQuYXV0b0NvbmZpZ3VyZWApLCBlbHNlIGB1bmRlZmluZWRgLiBgZGF0YWJyaWNrc0hvc3RgIGlzIHRoZVxuICogd29ya3NwYWNlIGhvc3QgYXMgcmVzb2x2ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hpY2ggdGhlXG4gKiB0dW5uZWwgaW50ZXJjZXB0b3IgYm90aCByZWFkcyBhbmQsIHdoZW4gaXQgbXVzdCwgc2V0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcEVudiB7XG4gIC8qKiBSZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uLCB3aGVuIGF1dG8tY29uZmlnIHJlc29sdmVkIG9uZS4gKi9cbiAgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZUNvbm5lY3Rpb247XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0IChgREFUQUJSSUNLU19IT1NUYCksIHdoZW4ga25vd24uICovXG4gIHJlYWRvbmx5IGRhdGFicmlja3NIb3N0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvY2VzcyB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0LmJpbmRQcm9jZXNzfSBjYW4gc3VwZXJ2aXNlLiBBIGJhcmVcbiAqIGBub2RlOmNoaWxkX3Byb2Nlc3NgIGBDaGlsZFByb2Nlc3NgIChlLmcuIHBvcnRyKSBzYXRpc2ZpZXMgdGhpcywgYW5kIHNvIGRvZXNcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYHNwYXduKClgIHJlc3VsdCAoYSBgQ2hpbGRQcm9jZXNzUmVzdWx0YCBJUyBhXG4gKiBgQ2hpbGRQcm9jZXNzYCkgLSBvbmUgY29kZSBwYXRoIGhhbmRsZXMgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGFibGVQcm9jZXNzID0gUGljazxDaGlsZFByb2Nlc3MsIFwicGlkXCIgfCBcImtpbGxcIiB8IFwia2lsbGVkXCIgfCBcIm9uY2VcIj47XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtzZXJ2ZXIoKV0sXG4gKiAgIGludGVyY2VwdG9yOiAoY3R4KSA9PiB7XG4gKiAgICAgY29uc3QgcG9ydHIgPSBzcGF3blBvcnRyKGN0eC5lbnYuZGF0YWJyaWNrc0hvc3QpO1xuICogICAgIGN0eC5iaW5kUHJvY2Vzcyhwb3J0cik7ICAgICAgICAgICAgLy8gYXBwIDwtPiBwb3J0ciBsaXZlL2RpZSB0b2dldGhlclxuICogICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHBvcnRyLmtpbGwoXCJTSUdURVJNXCIpKTtcbiAqICAgfSxcbiAqIH0pO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyY2VwdG9yQ29udGV4dCB7XG4gIC8qKiBUaGUgZW52IGF1dG8tY29uZmlndXJhdGlvbiBjb21wdXRlZCBiZWZvcmUgYm9vdC4gKi9cbiAgcmVhZG9ubHkgZW52OiBSZXNvbHZlZEFwcEVudjtcbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhbiBBcHBLaXQgbGlmZWN5Y2xlIGV2ZW50LiBNaXJyb3JzIGBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlYDtcbiAgICogdGhlIGluamVjdGVkIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9IHJlbGF5cyB0aGUgcmVhbCBldmVudHMgaGVyZSBvbmNlIHRoZSBhcHBcbiAgICogYm9vdHMuIEEgaGFuZGxlciByZWdpc3RlcmVkIGZvciBhbiBldmVudCB0aGF0IGFscmVhZHkgZmlyZWQgaXMgTk9UIGNhbGxlZFxuICAgKiByZXRyb2FjdGl2ZWx5IChzYW1lIHNlbWFudGljcyBhcyBBcHBLaXQpLlxuICAgKi9cbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlciBzeW5jaHJvbm91cyBjbGVhbnVwIHRoYXQgcnVucyBiZWZvcmUgYW55IGJvdW5kIHByb2Nlc3MgaXMga2lsbGVkLiAqL1xuICBvblRlYXJkb3duKGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBhIHRlcm1pbmF0aW9uIHNpZ25hbCBmcm9tIHRoZSBtYWluIGFwcCB0byBldmVyeSBib3VuZCBwcm9jZXNzLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoaXMgcHJvY2VzcyByZWNlaXZlcyBgU0lHSU5UYC9gU0lHVEVSTWAvYFNJR0hVUGA7XG4gICAqIGV4cG9zZWQgc28gYW4gaW50ZXJjZXB0b3IgY2FuIHRyaWdnZXIgdGVhcmRvd24gaXRzZWxmLlxuICAgKi9cbiAgYnJvYWRjYXN0U2lnbmFsKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkO1xuICAvKipcbiAgICogU3VwZXJ2aXNlIGEgY2hpbGQgcHJvY2VzcyBhbG9uZ3NpZGUgdGhlIGFwcCwgY29uY3VycmVudGx5LXN0eWxlOiBzaWduYWxzIHBhc3NcbiAgICogdGhyb3VnaCwgYW5kIGlmIEVJVEhFUiB0aGUgY2hpbGQgb3IgdGhlIGFwcCBkaWVzIHRoZSB3aG9sZSBzZXQgY29tZXMgZG93bi5cbiAgICogU2FmZSB0byBjYWxsIGZvciBzZXZlcmFsIGNoaWxkcmVuOyB0ZWFyZG93biBpcyBpZGVtcG90ZW50LlxuICAgKi9cbiAgYmluZFByb2Nlc3MoY2hpbGQ6IEJpbmRhYmxlUHJvY2Vzcyk6IHZvaWQ7XG59XG5cbi8qKiBBIHNpbmdsZSBpbnRlcmNlcHRvciwgb3Igc2V2ZXJhbC4gVGhlIGBjcmVhdGVBcHBgIGBpbnRlcmNlcHRvcj86YCBvcHRpb24uICovXG5leHBvcnQgdHlwZSBJbnRlcmNlcHRvciA9IChjdHg6IEludGVyY2VwdG9yQ29udGV4dCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbi8qKiBIb3cgbG9uZyBib3VuZCBjaGlsZHJlbiBnZXQgdG8gZXhpdCBvbiBgU0lHVEVSTWAgYmVmb3JlIHRoZSBhcHAgZm9yY2UtZXhpdHMuICovXG5jb25zdCBURUFSRE9XTl9HUkFDRV9NUyA9IDEwXzAwMDtcblxuLyoqIFRoZSBzaWduYWxzIHRoYXQgdHJpZ2dlciB0ZWFyZG93biB3aGVuIHRoZSBNQUlOIHByb2Nlc3MgcmVjZWl2ZXMgdGhlbS4gKi9cbmNvbnN0IFRFQVJET1dOX1NJR05BTFMgPSBbXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHSFVQXCJdIGFzIGNvbnN0O1xuY29uc3QgYm91bmRDaGlsZHJlbiA9IG5ldyBTZXQ8QmluZGFibGVQcm9jZXNzPigpO1xuY29uc3QgdGVhcmRvd25IYW5kbGVycyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbmxldCBwcm9jZXNzU2h1dHRpbmdEb3duID0gZmFsc2U7XG5sZXQgcHJvY2Vzc1NpZ25hbHNCb3VuZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiB0ZWFyZG93blByb2Nlc3MoY29kZTogbnVtYmVyKTogdm9pZCB7XG4gIGlmIChwcm9jZXNzU2h1dHRpbmdEb3duKSByZXR1cm47XG4gIHByb2Nlc3NTaHV0dGluZ0Rvd24gPSB0cnVlO1xuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGVhcmRvd25IYW5kbGVycykgaGFuZGxlcigpO1xuICB0ZWFyZG93bkhhbmRsZXJzLmNsZWFyKCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gWy4uLmJvdW5kQ2hpbGRyZW5dO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKCFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICB9XG4gIGJvdW5kQ2hpbGRyZW4uY2xlYXIoKTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgY2hpbGQua2lsbChcIlNJR0tJTExcIik7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9LCBURUFSRE9XTl9HUkFDRV9NUykudW5yZWYoKTtcbn1cblxuZnVuY3Rpb24gYnJvYWRjYXN0UHJvY2Vzc1NpZ25hbChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgYm91bmRDaGlsZHJlbikge1xuICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKHNpZ25hbCk7XG4gIH1cbiAgdGVhcmRvd25Qcm9jZXNzKDApO1xufVxuXG5mdW5jdGlvbiBiaW5kUHJvY2Vzc1NpZ25hbHMoKTogdm9pZCB7XG4gIGlmIChwcm9jZXNzU2lnbmFsc0JvdW5kKSByZXR1cm47XG4gIHByb2Nlc3NTaWduYWxzQm91bmQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBURUFSRE9XTl9TSUdOQUxTKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IGJyb2FkY2FzdFByb2Nlc3NTaWduYWwoc2lnbmFsKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbXV0YWJsZSBtYWNoaW5lcnkgYmVoaW5kIGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9LiBTcGxpdCBvdXQgc29cbiAqIHtAbGluayBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHR9IGNhbiBoYW5kIHRoZSBwdWJsaWMgY29udGV4dCB0byBpbnRlcmNlcHRvcnNcbiAqIHdoaWxlIGBhcHBraXQuY3JlYXRlQXBwYCByZXRhaW5zIHRoZSBgZW1pdExpZmVjeWNsZWAgc2lkZS1jaGFubmVsIHRoZSBicmlkZ2UgZHJpdmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyY2VwdG9yUnVudGltZSB7XG4gIC8qKiBUaGUgY29udGV4dCBoYW5kZWQgdG8gZWFjaCBpbnRlcmNlcHRvci4gKi9cbiAgcmVhZG9ubHkgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0O1xuICAvKiogRmlyZSBhIGxpZmVjeWNsZSBldmVudCB0byBldmVyeSBzdWJzY3JpYmVyIChjYWxsZWQgYnkge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0pLiAqL1xuICBlbWl0TGlmZWN5Y2xlKGV2ZW50OiBMaWZlY3ljbGVFdmVudCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gKyBpdHMge0BsaW5rIEludGVyY2VwdG9yUnVudGltZX0uXG4gKlxuICogVGVhcmRvd24gaXMgdGhlIGdlbmVyYWxpemVkIGBzdXBlcnZpc2VFeGl0YDogdGhlIGZpcnN0IGNoaWxkIGV4aXQgb3IgbWFpbi1wcm9jZXNzXG4gKiB0ZXJtaW5hdGlvbiBzaWduYWwgZmxpcHMgYSBvbmUtc2hvdCBndWFyZCwgYFNJR1RFUk1gcyB0aGUgb3RoZXIgYm91bmQgY2hpbGRyZW4sXG4gKiB0aGVuIGBwcm9jZXNzLmV4aXRgcyBhZnRlciB7QGxpbmsgVEVBUkRPV05fR1JBQ0VfTVN9IChhbiBgdW5yZWZgJ2QgdGltZXIsIHNvIGl0XG4gKiBuZXZlciBpdHNlbGYgaG9sZHMgdGhlIGxvb3Agb3BlbikuIFRoZSBwcm9jZXNzLXNpZ25hbCBsaXN0ZW5lcnMgYXJlIGluc3RhbGxlZFxuICogbGF6aWx5IG9uIHRoZSBmaXJzdCBgYmluZFByb2Nlc3NgIHNvIGFuIGFwcCB0aGF0IGJpbmRzIG5vdGhpbmcgaXMgdW50b3VjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudjogUmVzb2x2ZWRBcHBFbnYpOiBJbnRlcmNlcHRvclJ1bnRpbWUge1xuICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8TGlmZWN5Y2xlRXZlbnQsIExpZmVjeWNsZUhhbmRsZXJbXT4oKTtcbiAgaWYgKHByb2Nlc3NTaHV0dGluZ0Rvd24gJiYgYm91bmRDaGlsZHJlbi5zaXplID09PSAwKSBwcm9jZXNzU2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGlmIChcbiAgICBwcm9jZXNzU2lnbmFsc0JvdW5kICYmXG4gICAgVEVBUkRPV05fU0lHTkFMUy5ldmVyeSgoc2lnbmFsKSA9PiBwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMClcbiAgKSB7XG4gICAgcHJvY2Vzc1NpZ25hbHNCb3VuZCA9IGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYmluZFByb2Nlc3MgPSAoY2hpbGQ6IEJpbmRhYmxlUHJvY2Vzcyk6IHZvaWQgPT4ge1xuICAgIGJpbmRQcm9jZXNzU2lnbmFscygpO1xuICAgIGJvdW5kQ2hpbGRyZW4uYWRkKGNoaWxkKTtcbiAgICBjaGlsZC5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oXCJib3VuZCBwcm9jZXNzIGV4aXRlZDsgdGVhcmluZyBkb3duIHRoZSBhcHBcIiwgeyBjb2RlIH0pO1xuICAgICAgdGVhcmRvd25Qcm9jZXNzKHR5cGVvZiBjb2RlID09PSBcIm51bWJlclwiID8gY29kZSA6IDEpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IG9uTGlmZWN5Y2xlID0gKGV2ZW50OiBMaWZlY3ljbGVFdmVudCwgZm46IExpZmVjeWNsZUhhbmRsZXIpOiB2b2lkID0+IHtcbiAgICBjb25zdCBsaXN0ID0gaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAobGlzdCkgbGlzdC5wdXNoKGZuKTtcbiAgICBlbHNlIGhhbmRsZXJzLnNldChldmVudCwgW2ZuXSk7XG4gIH07XG5cbiAgY29uc3QgZW1pdExpZmVjeWNsZSA9IGFzeW5jIChldmVudDogTGlmZWN5Y2xlRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBsaXN0ID0gaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWxpc3QpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGxpc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBNYXRjaCBBcHBLaXQ6IGEgZmFpbGluZyBsaWZlY3ljbGUgaGFuZGxlciBpcyBsb2dnZWQsIG5ldmVyIGZhdGFsLCBhbmRcbiAgICAgICAgLy8gbmV2ZXIgYmxvY2tzIGl0cyBzaWJsaW5ncy5cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJsaWZlY3ljbGUgaGFuZGxlciBmYWlsZWRcIiwgeyBldmVudCwgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbnRleHQ6IEludGVyY2VwdG9yQ29udGV4dCA9IHtcbiAgICBlbnYsXG4gICAgb25MaWZlY3ljbGUsXG4gICAgb25UZWFyZG93bjogKGZuKSA9PiB7XG4gICAgICBiaW5kUHJvY2Vzc1NpZ25hbHMoKTtcbiAgICAgIHRlYXJkb3duSGFuZGxlcnMuYWRkKGZuKTtcbiAgICB9LFxuICAgIGJyb2FkY2FzdFNpZ25hbDogYnJvYWRjYXN0UHJvY2Vzc1NpZ25hbCxcbiAgICBiaW5kUHJvY2VzcyxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiBgYXBwa2l0LmNyZWF0ZUFwcGAgaW5qZWN0cyB0byBtYWtlIEFwcEtpdCdzIGxpZmVjeWNsZVxuICogcmVhY2hhYmxlIGZyb20gaW50ZXJjZXB0b3IgY29kZS4gT24gYHNldHVwKClgIGl0IHJlYWRzIGl0cyBvd24gYHRoaXMuY29udGV4dGBcbiAqICh0aGUgcmVhbCBgUGx1Z2luQ29udGV4dGApIGFuZCBmb3J3YXJkcyBlYWNoIHtAbGluayBMaWZlY3ljbGVFdmVudH0gdG8gdGhlXG4gKiBpbnRlcmNlcHRvciBydW50aW1lLCBzbyBgY3R4Lm9uTGlmZWN5Y2xlKC4uLilgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmVcbiAqIGV2ZW50cy4gSXQgb3ducyBubyByb3V0ZXMsIGNvbmZpZyBzdXJmYWNlLCBvciBleHBvcnRzLlxuICovXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExpZmVjeWNsZUJyaWRnZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJkYnhUb29sc0xpZmVjeWNsZUJyaWRnZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkxpZmVjeWNsZSBCcmlkZ2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZWxheXMgQXBwS2l0IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGNyZWF0ZUFwcCBpbnRlcmNlcHRvciBjb250ZXh0LlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCI+O1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLmNvbmZpZy5ydW50aW1lO1xuICAgIGlmICghcnVudGltZSkgcmV0dXJuO1xuICAgIGlmICghaGFzT25MaWZlY3ljbGUodGhpcy5jb250ZXh0KSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwibm8gUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZSB0byBicmlkZ2U7IGludGVyY2VwdG9yIGxpZmVjeWNsZSBldmVudHMgaW5lcnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50czogTGlmZWN5Y2xlRXZlbnRbXSA9IFtcInNldHVwOmNvbXBsZXRlXCIsIFwic2VydmVyOnJlYWR5XCIsIFwic2h1dGRvd25cIl07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkxpZmVjeWNsZShldmVudCwgKCkgPT4gcnVudGltZS5lbWl0TGlmZWN5Y2xlKGV2ZW50KSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBGYWN0b3J5IGZvciB0aGUgaW5qZWN0ZWQge0BsaW5rIExpZmVjeWNsZUJyaWRnZVBsdWdpbn0uICovXG5leHBvcnQgY29uc3QgbGlmZWN5Y2xlQnJpZGdlID0gdG9QbHVnaW4oTGlmZWN5Y2xlQnJpZGdlUGx1Z2luKTtcbiJdfQ==
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBOEMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQTRFekM7O0dBRUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsR0FBbUI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7SUFFL0QsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFxQixFQUFFLEVBQW9CLEVBQVEsRUFBRTtRQUN4RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBQ25CLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsS0FBcUIsRUFBaUIsRUFBRTtRQUNuRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQztnQkFDSCxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2Ysd0VBQXdFO2dCQUN4RSw2QkFBNkI7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUF1QjtRQUNsQyxHQUFHO1FBQ0gsV0FBVztLQUNaLENBQUM7SUFFRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFpQkQsU0FBUyxjQUFjLENBQUMsT0FBZ0I7SUFDdEMsT0FBTyxPQUFRLE9BQTRDLEVBQUUsV0FBVyxLQUFLLFVBQVUsQ0FBQztBQUMxRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLE1BQTZCO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLFdBQVcsRUFBRSxzRUFBc0U7UUFDbkYsU0FBUyxFQUFFLE1BQU07UUFDakIsTUFBTSxFQUFFLElBQUk7UUFDWixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7S0FDVSxDQUFDO0lBRTdDLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztZQUMzRixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFxQixDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7O0FBR0gsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGBjcmVhdGVBcHBgIElOVEVSQ0VQVE9SIGNvbnRleHQ6IGFuIGluLXByb2Nlc3MgaGFuZGxlIGFuIGFwcCBoYW5kcyB0b1xuICogYWRkLW9ucyAodGhlIHR1bm5lbCwgY2hpZWZseSkgc28gdGhleSBjYW4gcmVhZCB0aGUgZW52IGF1dG8tY29uZmlndXJhdGlvblxuICogY29tcHV0ZWQgYW5kIGhvb2sgQXBwS2l0J3MgbGlmZWN5Y2xlLlxuICpcbiAqIEFuIGludGVyY2VwdG9yIGlzIGEgcGxhaW4gZnVuY3Rpb24gYChjdHgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+YCBwYXNzZWQgdG9cbiAqIGBhcHBraXQuY3JlYXRlQXBwYCdzIGBpbnRlcmNlcHRvcmAgb3B0aW9uIChcIm9uZSBvciBtYW55XCIpLiBgYXBwa2l0LmNyZWF0ZUFwcGBcbiAqIHJ1bnMgZWFjaCBvbmUgQUZURVIgYXV0by1jb25maWd1cmF0aW9uIGhhcyBwb3B1bGF0ZWQgYHByb2Nlc3MuZW52YCBidXQgYXMgcGFydFxuICogb2YgYm9vdGluZyB0aGUgYXBwLCBzbyBhbiBpbnRlcmNlcHRvciBzZWVzIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIGFuZCBjYW4gYmluZFxuICogcHJvY2Vzc2VzIGJlZm9yZSBvciBkdXJpbmcgc2V0dXAuXG4gKlxuICogVGhlIG5hbWVzIGhlcmUgbWlycm9yIEFwcEtpdCdzIG93biB2b2NhYnVsYXJ5IHJhdGhlciB0aGFuIGludmVudGluZyBwYXJhbGxlbFxuICogb25lczoge0BsaW5rIExpZmVjeWNsZUV2ZW50fSBhbmQge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dC5vbkxpZmVjeWNsZX0gYXJlIHRoZVxuICogZXhhY3Qgc2hhcGUgb2YgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgIChgc2V0dXA6Y29tcGxldGVgIC8gYHNlcnZlcjpyZWFkeWAgL1xuICogYHNodXRkb3duYCkuIFRoZSBicmlkZ2UgdGhhdCBtYWtlcyB0aGF0IGhvb2sgcmVhY2hhYmxlIGZyb20gT1VUU0lERSBhIHBsdWdpbiAtXG4gKiB3aGVyZSBpbnRlcmNlcHRvcnMgcnVuIC0gaXMge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0sIGEgdGlueSBpbnRlcm5hbCBwbHVnaW5cbiAqIGBhcHBraXQuY3JlYXRlQXBwYCBpbmplY3RzIHRvIGNhcHR1cmUgYHRoaXMuY29udGV4dGAgYW5kIHJlbGF5IGl0cyBldmVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdG9QbHVnaW4sIHR5cGUgQmFzZVBsdWdpbkNvbmZpZywgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJpbnRlcmNlcHRvclwiKTtcblxuLyoqXG4gKiBBcHBLaXQncyBwbHVnaW4tbGlmZWN5Y2xlIGV2ZW50cywgdmVyYmF0aW0gZnJvbSBgUGx1Z2luQ29udGV4dGBcbiAqIChgbm9kZV9tb2R1bGVzL0BkYXRhYnJpY2tzL2FwcGtpdC8uLi4vY29yZS9wbHVnaW4tY29udGV4dC5kLnRzYCkuIFJlLWRlY2xhcmVkXG4gKiBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYmVjYXVzZSBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGluIHRoZVxuICogcGFja2FnZSdzIGBleHBvcnRzYCBtYXAgKHRoZSBzYW1lIHJlYXNvbiB7QGxpbmsgUGx1Z2luQ29udGV4dExpa2V9IGV4aXN0cyBpblxuICogYC4vcGx1Z2luYCkuXG4gKlxuICogLSBgc2V0dXA6Y29tcGxldGVgIC0gZXZlcnkgcGx1Z2luJ3MgYHNldHVwKClgIGhhcyByZXNvbHZlZC5cbiAqIC0gYHNlcnZlcjpyZWFkeWAgLSB0aGUgYHNlcnZlcigpYCBwbHVnaW4gaXMgbGlzdGVuaW5nIChuZXZlciBmaXJlcyBmb3IgYVxuICogICBzZXJ2ZXJsZXNzIGFwcCwgZS5nLiB0aGUgdHVubmVsIGdhdGUpLlxuICogLSBgc2h1dGRvd25gIC0gdGhlIGFwcCBpcyB0ZWFyaW5nIGRvd24uXG4gKi9cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUV2ZW50ID0gXCJzZXR1cDpjb21wbGV0ZVwiIHwgXCJzZXJ2ZXI6cmVhZHlcIiB8IFwic2h1dGRvd25cIjtcblxuLyoqIEEgbGlmZWN5Y2xlIHN1YnNjcmliZXIuIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcHJvcGFnYXRlZCAobWF0Y2hlcyBBcHBLaXQpLiAqL1xuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlSGFuZGxlciA9ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBlbnYgYXV0by1jb25maWd1cmF0aW9uIHJlc29sdmVkIGJlZm9yZSBib290LCBleHBvc2VkIHRvIGludGVyY2VwdG9ycyBzb1xuICogdGhleSByZWFkIENPTVBVVEVEIHZhbHVlcyBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgYHByb2Nlc3MuZW52YCB0aGVtc2VsdmVzLlxuICpcbiAqIGBsYWtlYmFzZWAgaXMgdGhlIHJlc29sdmVkIFBvc3RncmVzIGNvbm5lY3Rpb24gd2hlbiBMYWtlYmFzZSBhdXRvLWNvbmZpZyByYW5cbiAqIChzZWUgYGFwcGtpdC5hdXRvQ29uZmlndXJlYCksIGVsc2UgYHVuZGVmaW5lZGAuIGBkYXRhYnJpY2tzSG9zdGAgaXMgdGhlXG4gKiB3b3Jrc3BhY2UgaG9zdCBhcyByZXNvbHZlZCBpbnRvIHRoZSBlbnZpcm9ubWVudCAoYERBVEFCUklDS1NfSE9TVGApLCB3aGljaCB0aGVcbiAqIHR1bm5lbCBpbnRlcmNlcHRvciBib3RoIHJlYWRzIGFuZCwgd2hlbiBpdCBtdXN0LCBzZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXBwRW52IHtcbiAgLyoqIFJlc29sdmVkIExha2ViYXNlIGNvbm5lY3Rpb24sIHdoZW4gYXV0by1jb25maWcgcmVzb2x2ZWQgb25lLiAqL1xuICByZWFkb25seSBsYWtlYmFzZT86IExha2ViYXNlQ29ubmVjdGlvbjtcbiAgLyoqIFJlc29sdmVkIERhdGFicmlja3Mgd29ya3NwYWNlIGhvc3QgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hlbiBrbm93bi4gKi9cbiAgcmVhZG9ubHkgZGF0YWJyaWNrc0hvc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtzZXJ2ZXIoKV0sXG4gKiAgIGludGVyY2VwdG9yOiAoY3R4KSA9PiB7XG4gKiAgICAgY29uc3QgYXV4aWxpYXJ5ID0gc3RhcnRBdXhpbGlhcnkoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCk7XG4gKiAgICAgY3R4Lm9uTGlmZWN5Y2xlKFwic2h1dGRvd25cIiwgKCkgPT4gYXV4aWxpYXJ5LnN0b3AoKSk7XG4gKiAgIH0sXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmNlcHRvckNvbnRleHQge1xuICAvKiogVGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZWQgYmVmb3JlIGJvb3QuICovXG4gIHJlYWRvbmx5IGVudjogUmVzb2x2ZWRBcHBFbnY7XG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYW4gQXBwS2l0IGxpZmVjeWNsZSBldmVudC4gTWlycm9ycyBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWA7XG4gICAqIHRoZSBpbmplY3RlZCB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSByZWxheXMgdGhlIHJlYWwgZXZlbnRzIGhlcmUgb25jZSB0aGUgYXBwXG4gICAqIGJvb3RzLiBBIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgYW4gZXZlbnQgdGhhdCBhbHJlYWR5IGZpcmVkIGlzIE5PVCBjYWxsZWRcbiAgICogcmV0cm9hY3RpdmVseSAoc2FtZSBzZW1hbnRpY3MgYXMgQXBwS2l0KS5cbiAgICovXG4gIG9uTGlmZWN5Y2xlKGV2ZW50OiBMaWZlY3ljbGVFdmVudCwgZm46IExpZmVjeWNsZUhhbmRsZXIpOiB2b2lkO1xufVxuXG4vKiogQSBzaW5nbGUgaW50ZXJjZXB0b3IsIG9yIHNldmVyYWwuIFRoZSBgY3JlYXRlQXBwYCBgaW50ZXJjZXB0b3I/OmAgb3B0aW9uLiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJjZXB0b3IgPSAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBtdXRhYmxlIG1hY2hpbmVyeSBiZWhpbmQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0uIFNwbGl0IG91dCBzb1xuICoge0BsaW5rIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dH0gY2FuIGhhbmQgdGhlIHB1YmxpYyBjb250ZXh0IHRvIGludGVyY2VwdG9yc1xuICogd2hpbGUgYGFwcGtpdC5jcmVhdGVBcHBgIHJldGFpbnMgdGhlIGBlbWl0TGlmZWN5Y2xlYCBzaWRlLWNoYW5uZWwgdGhlIGJyaWRnZSBkcml2ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgLyoqIFRoZSBjb250ZXh0IGhhbmRlZCB0byBlYWNoIGludGVyY2VwdG9yLiAqL1xuICByZWFkb25seSBjb250ZXh0OiBJbnRlcmNlcHRvckNvbnRleHQ7XG4gIC8qKiBGaXJlIGEgbGlmZWN5Y2xlIGV2ZW50IHRvIGV2ZXJ5IHN1YnNjcmliZXIgKGNhbGxlZCBieSB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSkuICovXG4gIGVtaXRMaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50KTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSArIGl0cyB7QGxpbmsgSW50ZXJjZXB0b3JSdW50aW1lfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dChlbnY6IFJlc29sdmVkQXBwRW52KTogSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyW10+KCk7XG5cbiAgY29uc3Qgb25MaWZlY3ljbGUgPSAoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2goZm4pO1xuICAgIGVsc2UgaGFuZGxlcnMuc2V0KGV2ZW50LCBbZm5dKTtcbiAgfTtcblxuICBjb25zdCBlbWl0TGlmZWN5Y2xlID0gYXN5bmMgKGV2ZW50OiBMaWZlY3ljbGVFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZm4gb2YgbGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE1hdGNoIEFwcEtpdDogYSBmYWlsaW5nIGxpZmVjeWNsZSBoYW5kbGVyIGlzIGxvZ2dlZCwgbmV2ZXIgZmF0YWwsIGFuZFxuICAgICAgICAvLyBuZXZlciBibG9ja3MgaXRzIHNpYmxpbmdzLlxuICAgICAgICBsb2dnZXIud2FybihcImxpZmVjeWNsZSBoYW5kbGVyIGZhaWxlZFwiLCB7IGV2ZW50LCBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0ID0ge1xuICAgIGVudixcbiAgICBvbkxpZmVjeWNsZSxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiBgYXBwa2l0LmNyZWF0ZUFwcGAgaW5qZWN0cyB0byBtYWtlIEFwcEtpdCdzIGxpZmVjeWNsZVxuICogcmVhY2hhYmxlIGZyb20gaW50ZXJjZXB0b3IgY29kZS4gT24gYHNldHVwKClgIGl0IHJlYWRzIGl0cyBvd24gYHRoaXMuY29udGV4dGBcbiAqICh0aGUgcmVhbCBgUGx1Z2luQ29udGV4dGApIGFuZCBmb3J3YXJkcyBlYWNoIHtAbGluayBMaWZlY3ljbGVFdmVudH0gdG8gdGhlXG4gKiBpbnRlcmNlcHRvciBydW50aW1lLCBzbyBgY3R4Lm9uTGlmZWN5Y2xlKC4uLilgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmVcbiAqIGV2ZW50cy4gSXQgb3ducyBubyByb3V0ZXMsIGNvbmZpZyBzdXJmYWNlLCBvciBleHBvcnRzLlxuICovXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExpZmVjeWNsZUJyaWRnZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJkYnhUb29sc0xpZmVjeWNsZUJyaWRnZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkxpZmVjeWNsZSBCcmlkZ2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZWxheXMgQXBwS2l0IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGNyZWF0ZUFwcCBpbnRlcmNlcHRvciBjb250ZXh0LlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCI+O1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLmNvbmZpZy5ydW50aW1lO1xuICAgIGlmICghcnVudGltZSkgcmV0dXJuO1xuICAgIGlmICghaGFzT25MaWZlY3ljbGUodGhpcy5jb250ZXh0KSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwibm8gUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZSB0byBicmlkZ2U7IGludGVyY2VwdG9yIGxpZmVjeWNsZSBldmVudHMgaW5lcnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50czogTGlmZWN5Y2xlRXZlbnRbXSA9IFtcInNldHVwOmNvbXBsZXRlXCIsIFwic2VydmVyOnJlYWR5XCIsIFwic2h1dGRvd25cIl07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkxpZmVjeWNsZShldmVudCwgKCkgPT4gcnVudGltZS5lbWl0TGlmZWN5Y2xlKGV2ZW50KSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBGYWN0b3J5IGZvciB0aGUgaW5qZWN0ZWQge0BsaW5rIExpZmVjeWNsZUJyaWRnZVBsdWdpbn0uICovXG5leHBvcnQgY29uc3QgbGlmZWN5Y2xlQnJpZGdlID0gdG9QbHVnaW4oTGlmZWN5Y2xlQnJpZGdlUGx1Z2luKTtcbiJdfQ==
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/** AppKit plugin base for tools backed by the native registry helpers. */
|
|
2
2
|
import { Plugin, type BasePluginConfig } from "@databricks/appkit";
|
|
3
3
|
import { type AgentToolDefinition, type ToolProvider, type ToolRegistry } from "@databricks/appkit/beta";
|
|
4
|
+
/** Optional request state supplied by an agent host when dispatching a plugin tool. */
|
|
5
|
+
export interface AgentToolExecutionContext {
|
|
6
|
+
/** Resource identity associated with the current agent turn. */
|
|
7
|
+
readonly resourceId?: string;
|
|
8
|
+
/** Model endpoint selected for the current agent turn. */
|
|
9
|
+
readonly model?: string;
|
|
10
|
+
/** Best-effort progress sink validated by the hosting integration. */
|
|
11
|
+
readonly writeProgress?: (event: unknown) => Promise<void>;
|
|
12
|
+
}
|
|
4
13
|
/**
|
|
5
14
|
* Implements AppKit's `ToolProvider` contract from one native tool registry.
|
|
6
15
|
*
|
|
@@ -13,5 +22,5 @@ export declare abstract class ToolRegistryPlugin<TConfig extends BasePluginConfi
|
|
|
13
22
|
/** Tool definitions offered to an AppKit agent. */
|
|
14
23
|
getAgentTools(): AgentToolDefinition[];
|
|
15
24
|
/** Validate and dispatch one AppKit agent tool call. */
|
|
16
|
-
executeAgentTool(name: string, args: unknown, signal?: AbortSignal): Promise<unknown>;
|
|
25
|
+
executeAgentTool(name: string, args: unknown, signal?: AbortSignal, _context?: AgentToolExecutionContext): Promise<unknown>;
|
|
17
26
|
}
|
package/lib/src/tool-provider.js
CHANGED
|
@@ -13,8 +13,8 @@ export class ToolRegistryPlugin extends Plugin {
|
|
|
13
13
|
return toolsFromRegistry(this.toolRegistry);
|
|
14
14
|
}
|
|
15
15
|
/** Validate and dispatch one AppKit agent tool call. */
|
|
16
|
-
executeAgentTool(name, args, signal) {
|
|
16
|
+
executeAgentTool(name, args, signal, _context) {
|
|
17
17
|
return executeFromRegistry(this.toolRegistry, name, args, signal);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRTtBQUUxRSxPQUFPLEVBQUUsTUFBTSxFQUF5QixNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEdBSWxCLE1BQU0seUJBQXlCLENBQUM7QUFZakM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLGtCQUNwQixTQUFRLE1BQWU7SUFNdkIsbURBQW1EO0lBQ25ELGFBQWE7UUFDWCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELGdCQUFnQixDQUNkLElBQVksRUFDWixJQUFhLEVBQ2IsTUFBb0IsRUFDcEIsUUFBb0M7UUFFcEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEFwcEtpdCBwbHVnaW4gYmFzZSBmb3IgdG9vbHMgYmFja2VkIGJ5IHRoZSBuYXRpdmUgcmVnaXN0cnkgaGVscGVycy4gKi9cblxuaW1wb3J0IHsgUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBleGVjdXRlRnJvbVJlZ2lzdHJ5LFxuICB0b29sc0Zyb21SZWdpc3RyeSxcbiAgdHlwZSBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICB0eXBlIFRvb2xQcm92aWRlcixcbiAgdHlwZSBUb29sUmVnaXN0cnksXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuXG4vKiogT3B0aW9uYWwgcmVxdWVzdCBzdGF0ZSBzdXBwbGllZCBieSBhbiBhZ2VudCBob3N0IHdoZW4gZGlzcGF0Y2hpbmcgYSBwbHVnaW4gdG9vbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB7XG4gIC8qKiBSZXNvdXJjZSBpZGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYWdlbnQgdHVybi4gKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZD86IHN0cmluZztcbiAgLyoqIE1vZGVsIGVuZHBvaW50IHNlbGVjdGVkIGZvciB0aGUgY3VycmVudCBhZ2VudCB0dXJuLiAqL1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgLyoqIEJlc3QtZWZmb3J0IHByb2dyZXNzIHNpbmsgdmFsaWRhdGVkIGJ5IHRoZSBob3N0aW5nIGludGVncmF0aW9uLiAqL1xuICByZWFkb25seSB3cml0ZVByb2dyZXNzPzogKGV2ZW50OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAgY29udHJhY3QgZnJvbSBvbmUgbmF0aXZlIHRvb2wgcmVnaXN0cnkuXG4gKlxuICogU3ViY2xhc3NlcyBvd24gb25seSB0aGVpciByZWdpc3RyeSBlbnRyaWVzLiBWYWxpZGF0aW9uLCBMTE0tZnJpZW5kbHkgc2NoZW1hXG4gKiBlcnJvcnMsIHRvb2wgZGVzY3JpcHRpb25zLCBhbmQgZGlzcGF0Y2ggc3RheSBvbiBBcHBLaXQncyBuYXRpdmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRvb2xSZWdpc3RyeVBsdWdpbjxUQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyA9IEJhc2VQbHVnaW5Db25maWc+XG4gIGV4dGVuZHMgUGx1Z2luPFRDb25maWc+XG4gIGltcGxlbWVudHMgVG9vbFByb3ZpZGVyXG57XG4gIC8qKiBOYXRpdmUgQXBwS2l0IHRvb2wgZW50cmllcyBleHBvc2VkIGJ5IHRoaXMgcGx1Z2luLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnk7XG5cbiAgLyoqIFRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBBcHBLaXQgYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29sUmVnaXN0cnkpO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGFuZCBkaXNwYXRjaCBvbmUgQXBwS2l0IGFnZW50IHRvb2wgY2FsbC4gKi9cbiAgZXhlY3V0ZUFnZW50VG9vbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBfY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbFJlZ2lzdHJ5LCBuYW1lLCBhcmdzLCBzaWduYWwpO1xuICB9XG59XG4iXX0=
|