velocious 1.0.692 → 1.0.694
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 +5 -0
- package/build/background-jobs/scheduled-enqueue-bound.js +18 -0
- package/build/background-jobs/scheduled-enqueue-timeout-error.js +25 -0
- package/build/background-jobs/scheduler.js +121 -4
- package/build/cli/commands/mcp.js +7 -0
- package/build/cli/index.js +1 -1
- package/build/configuration-types.js +9 -0
- package/build/configuration.js +77 -2
- package/build/database/advisory-lock-bound.js +16 -0
- package/build/database/drivers/base.js +23 -2
- package/build/database/drivers/pgsql/index.js +27 -4
- package/build/environment-handlers/base.js +9 -0
- package/build/environment-handlers/node/cli/commands/mcp.js +87 -0
- package/build/environment-handlers/node.js +10 -0
- package/build/mcp/dispatcher.js +271 -0
- package/build/mcp/json-rpc-server.js +167 -0
- package/build/mcp/manifest-tools.js +310 -0
- package/build/routes/built-in/mcp/controller.js +63 -0
- package/build/routes/catch-all-route.js +58 -0
- package/build/routes/resolver.js +21 -8
- package/build/routes/root-route.js +26 -1
- package/build/src/background-jobs/scheduled-enqueue-bound.d.ts +15 -0
- package/build/src/background-jobs/scheduled-enqueue-bound.d.ts.map +1 -0
- package/build/src/background-jobs/scheduled-enqueue-bound.js +17 -0
- package/build/src/background-jobs/scheduled-enqueue-timeout-error.d.ts +24 -0
- package/build/src/background-jobs/scheduled-enqueue-timeout-error.d.ts.map +1 -0
- package/build/src/background-jobs/scheduled-enqueue-timeout-error.js +23 -0
- package/build/src/background-jobs/scheduler.d.ts +40 -0
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +111 -5
- package/build/src/cli/commands/mcp.d.ts +5 -0
- package/build/src/cli/commands/mcp.d.ts.map +1 -0
- package/build/src/cli/commands/mcp.js +7 -0
- package/build/src/cli/index.js +2 -2
- package/build/src/configuration-types.d.ts +30 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +9 -1
- package/build/src/configuration.d.ts +24 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +69 -3
- package/build/src/database/advisory-lock-bound.d.ts +15 -0
- package/build/src/database/advisory-lock-bound.d.ts.map +1 -0
- package/build/src/database/advisory-lock-bound.js +16 -0
- package/build/src/database/drivers/base.d.ts +13 -1
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +23 -3
- package/build/src/database/drivers/pgsql/index.d.ts +15 -3
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +23 -5
- package/build/src/environment-handlers/base.d.ts +6 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +9 -1
- package/build/src/environment-handlers/node/cli/commands/mcp.d.ts +19 -0
- package/build/src/environment-handlers/node/cli/commands/mcp.d.ts.map +1 -0
- package/build/src/environment-handlers/node/cli/commands/mcp.js +70 -0
- package/build/src/environment-handlers/node.d.ts +6 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +10 -1
- package/build/src/mcp/dispatcher.d.ts +133 -0
- package/build/src/mcp/dispatcher.d.ts.map +1 -0
- package/build/src/mcp/dispatcher.js +232 -0
- package/build/src/mcp/json-rpc-server.d.ts +47 -0
- package/build/src/mcp/json-rpc-server.d.ts.map +1 -0
- package/build/src/mcp/json-rpc-server.js +142 -0
- package/build/src/mcp/manifest-tools.d.ts +76 -0
- package/build/src/mcp/manifest-tools.d.ts.map +1 -0
- package/build/src/mcp/manifest-tools.js +273 -0
- package/build/src/routes/built-in/mcp/controller.d.ts +14 -0
- package/build/src/routes/built-in/mcp/controller.d.ts.map +1 -0
- package/build/src/routes/built-in/mcp/controller.js +55 -0
- package/build/src/routes/catch-all-route.d.ts +48 -0
- package/build/src/routes/catch-all-route.d.ts.map +1 -0
- package/build/src/routes/catch-all-route.js +50 -0
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +23 -9
- package/build/src/routes/root-route.d.ts +15 -1
- package/build/src/routes/root-route.d.ts.map +1 -1
- package/build/src/routes/root-route.js +24 -2
- package/package.json +1 -1
- package/src/background-jobs/scheduled-enqueue-bound.js +18 -0
- package/src/background-jobs/scheduled-enqueue-timeout-error.js +25 -0
- package/src/background-jobs/scheduler.js +121 -4
- package/src/cli/commands/mcp.js +7 -0
- package/src/cli/index.js +1 -1
- package/src/configuration-types.js +9 -0
- package/src/configuration.js +77 -2
- package/src/database/advisory-lock-bound.js +16 -0
- package/src/database/drivers/base.js +23 -2
- package/src/database/drivers/pgsql/index.js +27 -4
- package/src/environment-handlers/base.js +9 -0
- package/src/environment-handlers/node/cli/commands/mcp.js +87 -0
- package/src/environment-handlers/node.js +10 -0
- package/src/mcp/dispatcher.js +271 -0
- package/src/mcp/json-rpc-server.js +167 -0
- package/src/mcp/manifest-tools.js +310 -0
- package/src/routes/built-in/mcp/controller.js +63 -0
- package/src/routes/catch-all-route.js +58 -0
- package/src/routes/resolver.js +21 -8
- package/src/routes/root-route.js +26 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/scheduler.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/scheduler.js"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import { DEFAULT_SCHEDULED_ENQUEUE_TIMEOUT_MS } from "./scheduled-enqueue-bound.js";
|
|
3
|
+
import ScheduledBackgroundJobEnqueueTimeoutError from "./scheduled-enqueue-timeout-error.js";
|
|
2
4
|
import Logger from "../logger.js";
|
|
3
5
|
import { nextCronFireDate, parseCronExpression } from "./cron-expression.js";
|
|
4
6
|
/**
|
|
@@ -22,6 +24,11 @@ const DURATION_MULTIPLIERS = {
|
|
|
22
24
|
week: 7 * 24 * 60 * 60 * 1000,
|
|
23
25
|
weeks: 7 * 24 * 60 * 60 * 1000
|
|
24
26
|
};
|
|
27
|
+
// The watchdog below is internal machinery, not a schedule timer. Capturing the
|
|
28
|
+
// platform timers at module load keeps them out of a caller's schedule-timer
|
|
29
|
+
// observation, so bounding an enqueue never appears as an extra scheduled job.
|
|
30
|
+
const armWatchdogTimer = globalThis.setTimeout;
|
|
31
|
+
const cancelWatchdogTimer = globalThis.clearTimeout;
|
|
25
32
|
/**
|
|
26
33
|
* Runs the parseScheduledDuration helper.
|
|
27
34
|
* @param {number | string} value - Duration value.
|
|
@@ -62,6 +69,8 @@ export default class BackgroundJobsScheduler {
|
|
|
62
69
|
this.configuration = configuration;
|
|
63
70
|
this.enqueueJob = enqueueJob;
|
|
64
71
|
this.logger = new Logger(this);
|
|
72
|
+
/** @type {number | null} - Bound (ms) for one scheduled enqueue attempt; `null` disables the bound. */
|
|
73
|
+
this.scheduledEnqueueTimeoutMs = this._resolveScheduledEnqueueTimeoutMs();
|
|
65
74
|
/**
|
|
66
75
|
* Narrows the runtime value to the documented type.
|
|
67
76
|
* @type {Array<ReturnType<typeof setInterval>>} */
|
|
@@ -227,17 +236,114 @@ export default class BackgroundJobsScheduler {
|
|
|
227
236
|
// of identical scheduled jobs when the queue backed up. Dedup is by job identity (see the
|
|
228
237
|
// store), so the job keeps its queue-derived concurrency cap. A schedule can opt out with
|
|
229
238
|
// `deduplicateWhileQueued: false`.
|
|
230
|
-
await this.
|
|
231
|
-
args: Array.isArray(jobConfiguration.args) ? jobConfiguration.args : [],
|
|
232
|
-
jobClass: jobConfiguration.class,
|
|
239
|
+
await this._withScheduledEnqueueTimeout({
|
|
233
240
|
jobKey,
|
|
234
|
-
|
|
241
|
+
jobName: jobConfiguration.class.jobName(),
|
|
242
|
+
run: async () => {
|
|
243
|
+
await this.enqueueJob({
|
|
244
|
+
args: Array.isArray(jobConfiguration.args) ? jobConfiguration.args : [],
|
|
245
|
+
jobClass: jobConfiguration.class,
|
|
246
|
+
jobKey,
|
|
247
|
+
options: { deduplicateWhileQueued: true, ...(jobConfiguration.options || {}) }
|
|
248
|
+
});
|
|
249
|
+
}
|
|
235
250
|
});
|
|
236
251
|
}
|
|
237
252
|
catch (error) {
|
|
253
|
+
if (error instanceof ScheduledBackgroundJobEnqueueTimeoutError) {
|
|
254
|
+
this._reportScheduledEnqueueStall({ error, jobKey });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
238
257
|
await this.logger.error(() => ["Failed to enqueue scheduled background job", { jobKey, jobName: jobConfiguration.class.jobName() }, error]);
|
|
239
258
|
}
|
|
240
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Runs one durable enqueue attempt under the scheduled-enqueue bound.
|
|
262
|
+
*
|
|
263
|
+
* The bound is applied with a local race rather than `awaitery`'s `timeout()`:
|
|
264
|
+
* that helper starts its callback through `Promise.resolve().then(...)`, which
|
|
265
|
+
* would defer every scheduled enqueue by a microtask and change the tick
|
|
266
|
+
* semantics callers rely on. Here the attempt starts synchronously, and the
|
|
267
|
+
* watchdog uses the module-captured timers so it is never observable as a
|
|
268
|
+
* schedule timer. Only the watchdog raises the typed timeout error, so a
|
|
269
|
+
* timeout raised inside the enqueue itself keeps its own error path.
|
|
270
|
+
* @param {object} args - Options.
|
|
271
|
+
* @param {string} args.jobKey - Schedule key.
|
|
272
|
+
* @param {string} args.jobName - Resolved job class name.
|
|
273
|
+
* @param {() => Promise<void>} args.run - Enqueue attempt.
|
|
274
|
+
* @returns {Promise<void>} - Resolves when the attempt settles within the bound.
|
|
275
|
+
*/
|
|
276
|
+
async _withScheduledEnqueueTimeout({ jobKey, jobName, run }) {
|
|
277
|
+
const timeoutMs = this.scheduledEnqueueTimeoutMs;
|
|
278
|
+
/** @type {Promise<void>} */
|
|
279
|
+
let attempt;
|
|
280
|
+
try {
|
|
281
|
+
attempt = Promise.resolve(run());
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
attempt = Promise.reject(/** @type {Error} */ (error));
|
|
285
|
+
}
|
|
286
|
+
if (timeoutMs === null)
|
|
287
|
+
return await attempt;
|
|
288
|
+
/**
|
|
289
|
+
* Rejects the watchdog promise when the bound expires.
|
|
290
|
+
* @type {(error: Error) => void} */
|
|
291
|
+
let rejectScheduledEnqueueTimeout = () => { };
|
|
292
|
+
const watchdog = new Promise((_, reject) => { rejectScheduledEnqueueTimeout = reject; });
|
|
293
|
+
/**
|
|
294
|
+
* Watchdog timer handle.
|
|
295
|
+
* @type {ReturnType<typeof armWatchdogTimer>} */
|
|
296
|
+
const watchdogId = armWatchdogTimer(() => {
|
|
297
|
+
rejectScheduledEnqueueTimeout(new ScheduledBackgroundJobEnqueueTimeoutError({
|
|
298
|
+
jobKey,
|
|
299
|
+
jobName,
|
|
300
|
+
scheduledEnqueueTimeoutMs: timeoutMs
|
|
301
|
+
}));
|
|
302
|
+
}, timeoutMs);
|
|
303
|
+
try {
|
|
304
|
+
return await Promise.race([attempt, watchdog]);
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
cancelWatchdogTimer(watchdogId);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Surfaces a scheduled enqueue whose store call never settled. Without this report the only
|
|
312
|
+
* symptom is a schedule that silently stops enqueueing after one wedged call.
|
|
313
|
+
* @param {object} args - Options.
|
|
314
|
+
* @param {Error} args.error - Timeout error.
|
|
315
|
+
* @param {string} args.jobKey - Schedule key.
|
|
316
|
+
* @returns {void}
|
|
317
|
+
*/
|
|
318
|
+
_reportScheduledEnqueueStall({ error, jobKey }) {
|
|
319
|
+
const payload = {
|
|
320
|
+
context: {
|
|
321
|
+
jobKey,
|
|
322
|
+
scheduledEnqueueTimeoutMs: this.scheduledEnqueueTimeoutMs,
|
|
323
|
+
stage: "background-jobs-scheduled-enqueue-stall"
|
|
324
|
+
},
|
|
325
|
+
error
|
|
326
|
+
};
|
|
327
|
+
void this.logger.error(() => ["Scheduled background job enqueue stalled", payload.context, error]);
|
|
328
|
+
const errorEvents = typeof this.configuration?.getErrorEvents === "function" ? this.configuration.getErrorEvents() : undefined;
|
|
329
|
+
if (!errorEvents)
|
|
330
|
+
return;
|
|
331
|
+
errorEvents.emit("framework-error", payload);
|
|
332
|
+
errorEvents.emit("all-error", { ...payload, errorType: "framework-error" });
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Resolves the scheduled-enqueue bound from configuration.
|
|
336
|
+
* @returns {number | null} - Bound in milliseconds, or `null` for an unbounded wait.
|
|
337
|
+
*/
|
|
338
|
+
_resolveScheduledEnqueueTimeoutMs() {
|
|
339
|
+
const backgroundJobsConfig = typeof this.configuration?.getBackgroundJobsConfig === "function" ? this.configuration.getBackgroundJobsConfig() : undefined;
|
|
340
|
+
const configured = backgroundJobsConfig?.scheduledEnqueueTimeoutMs;
|
|
341
|
+
if (configured === null)
|
|
342
|
+
return null;
|
|
343
|
+
if (typeof configured === "number" && configured > 0)
|
|
344
|
+
return configured;
|
|
345
|
+
return DEFAULT_SCHEDULED_ENQUEUE_TIMEOUT_MS;
|
|
346
|
+
}
|
|
241
347
|
/**
|
|
242
348
|
* Runs normalize every.
|
|
243
349
|
* @param {NonNullable<import("../configuration-types.js").ScheduledBackgroundJobConfiguration["every"]>} every - Every config (caller must guarantee not undefined).
|
|
@@ -254,4 +360,4 @@ export default class BackgroundJobsScheduler {
|
|
|
254
360
|
return { everyValue: every };
|
|
255
361
|
}
|
|
256
362
|
}
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9zY2hlZHVsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUUxRTs7K0RBRStEO0FBQy9ELE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDdEIsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDeEIsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDekIsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUNqQixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3BCLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDckIsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJO0lBQ1osTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUNsQixFQUFFLEVBQUUsQ0FBQztJQUNMLENBQUMsRUFBRSxJQUFJO0lBQ1AsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsSUFBSTtJQUNiLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUMxQixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDN0IsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0NBQy9C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Z2dlci5qc1wiXG5pbXBvcnQge25leHRDcm9uRmlyZURhdGUsIHBhcnNlQ3JvbkV4cHJlc3Npb259IGZyb20gXCIuL2Nyb24tZXhwcmVzc2lvbi5qc1wiXG5cbi8qKlxuICogRHVyYXRpb25Vbml0IHR5cGUuXG4gKiBAdHlwZWRlZiB7a2V5b2YgdHlwZW9mIERVUkFUSU9OX01VTFRJUExJRVJTfSBEdXJhdGlvblVuaXQgKi9cbmNvbnN0IERVUkFUSU9OX01VTFRJUExJRVJTID0ge1xuICBkOiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICBkYXk6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIGRheXM6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIGg6IDYwICogNjAgKiAxMDAwLFxuICBob3VyOiA2MCAqIDYwICogMTAwMCxcbiAgaG91cnM6IDYwICogNjAgKiAxMDAwLFxuICBtOiA2MCAqIDEwMDAsXG4gIG1pbnV0ZTogNjAgKiAxMDAwLFxuICBtaW51dGVzOiA2MCAqIDEwMDAsXG4gIG1zOiAxLFxuICBzOiAxMDAwLFxuICBzZWNvbmQ6IDEwMDAsXG4gIHNlY29uZHM6IDEwMDAsXG4gIHc6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICB3ZWVrOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgd2Vla3M6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG59XG5cbi8qKlxuICogUnVucyB0aGUgcGFyc2VTY2hlZHVsZWREdXJhdGlvbiBoZWxwZXIuXG4gKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gdmFsdWUgLSBEdXJhdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgLSBGaWVsZCBuYW1lIGZvciBlcnJvcnMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NoZWR1bGVkRHVyYXRpb24odmFsdWUsIGZpZWxkTmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtmaWVsZE5hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLmApXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICF2YWx1ZS50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX0gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgbnVtYmVyLmApXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICBjb25zdCBtYXRjaCA9IG5vcm1hbGl6ZWRWYWx1ZS5tYXRjaCgvXihcXGQrKD86XFwuXFxkKyk/KVxccyoobXN8c3xtfGh8ZHx3fHNlY29uZHxzZWNvbmRzfG1pbnV0ZXxtaW51dGVzfGhvdXJ8aG91cnN8ZGF5fGRheXN8d2Vla3x3ZWVrcykkLylcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX06ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWNWYWx1ZSA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgbXVsdGlwbGllciA9IERVUkFUSU9OX01VTFRJUExJRVJTWy8qKiBAdHlwZSB7RHVyYXRpb25Vbml0fSAqLyAobWF0Y2hbMl0pXVxuXG4gIGlmICghbXVsdGlwbGllcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtmaWVsZE5hbWV9OiAke3ZhbHVlfWApXG4gIH1cblxuICByZXR1cm4gTWF0aC5yb3VuZChudW1lcmljVmFsdWUgKiBtdWx0aXBsaWVyKVxufVxuXG4vKiogUnVucyBjb25maWd1cmVkIHJlY3VycmluZyBiYWNrZ3JvdW5kIGpvYiBzY2hlZHVsZXMuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic1NjaGVkdWxlciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0geyhhcmdzOiB7YXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBqb2JDbGFzczogdHlwZW9mIGltcG9ydChcIi4vam9iLmpzXCIpLmRlZmF1bHQsIGpvYktleTogc3RyaW5nLCBvcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSkgPT4gUHJvbWlzZTx2b2lkPn0gYXJncy5lbnF1ZXVlSm9iIC0gRW5xdWV1ZSBjYWxsYmFjay5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBlbnF1ZXVlSm9ifSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmVucXVldWVKb2IgPSBlbnF1ZXVlSm9iXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4+fSAqL1xuICAgIHRoaXMuaW50ZXJ2YWxJZHMgPSBbXVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+fSAqL1xuICAgIHRoaXMudGltZW91dElkcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+Pn0gLSBJbi1mbGlnaHQgc2NoZWR1bGVkIGVucXVldWVzIGJ5IHNjaGVkdWxlIGtleSB0aGF0IHNodXRkb3duIG11c3QgZHJhaW4uICovXG4gICAgdGhpcy5wZW5kaW5nRW5xdWV1ZXNCeUpvYktleSA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSBUcnVlIGJldHdlZW4gc3RvcCgpIGFuZCB0aGUgbmV4dCBzdGFydCgpOyBjcm9uIHNlbGYtcmVzY2hlZHVsZXIgY2hlY2tzIHRoaXMgc28gYSBzdG9wKCkgZHVyaW5nIGFuIGluLWZsaWdodCBlbnF1ZXVlIGRvZXNuJ3QgaW1tZWRpYXRlbHkgcmUtYXJtLlxuICAgICAqL1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZyA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXRTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZygpXG5cbiAgICBpZiAoIXNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlnPy5qb2JzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGpvYktleSBvZiBPYmplY3Qua2V5cyhzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZy5qb2JzKSkge1xuICAgICAgY29uc3Qgam9iQ29uZmlndXJhdGlvbiA9IHNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlnLmpvYnNbam9iS2V5XVxuXG4gICAgICBpZiAoIWpvYkNvbmZpZ3VyYXRpb24gfHwgam9iQ29uZmlndXJhdGlvbi5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNjaGVkdWxlSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0b3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBpbi1mbGlnaHQgc2NoZWR1bGVkIGVucXVldWVzIGZpbmlzaC5cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5zdG9wcGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBpbnRlcnZhbElkIG9mIHRoaXMuaW50ZXJ2YWxJZHMpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRpbWVvdXRJZCBvZiB0aGlzLnRpbWVvdXRJZHMpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnZhbElkcyA9IFtdXG4gICAgdGhpcy50aW1lb3V0SWRzID0gW11cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucGVuZGluZ0VucXVldWVzQnlKb2JLZXkudmFsdWVzKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlZHVsZSBqb2IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIGlmICgham9iQ29uZmlndXJhdGlvbi5jbGFzcyB8fCB0eXBlb2Ygam9iQ29uZmlndXJhdGlvbi5jbGFzcy5wZXJmb3JtTGF0ZXJXaXRoT3B0aW9ucyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgYSBqb2IgY2xhc3MuYClcbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5jcm9uICE9PSB1bmRlZmluZWQgJiYgam9iQ29uZmlndXJhdGlvbi5ldmVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgZWl0aGVyIFwiZXZlcnlcIiBvciBcImNyb25cIiwgbm90IGJvdGguYClcbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5jcm9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVDcm9uSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5ldmVyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgZWl0aGVyIFwiZXZlcnlcIiBvciBcImNyb25cIi5gKVxuICAgIH1cblxuICAgIHRoaXMuc2NoZWR1bGVFdmVyeUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNjaGVkdWxlIGV2ZXJ5IGpvYi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlRXZlcnlKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBjb25zdCBldmVyeUNvbmZpZyA9IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIGpvYkNvbmZpZ3VyYXRpb24uZXZlcnk+fSAqLyAoam9iQ29uZmlndXJhdGlvbi5ldmVyeSlcbiAgICBjb25zdCB7ZXZlcnlWYWx1ZSwgZmlyc3RJblZhbHVlfSA9IHRoaXMubm9ybWFsaXplRXZlcnkoZXZlcnlDb25maWcpXG4gICAgY29uc3QgaW50ZXJ2YWxNcyA9IHBhcnNlU2NoZWR1bGVkRHVyYXRpb24oZXZlcnlWYWx1ZSwgYCR7am9iS2V5fS5ldmVyeWApXG4gICAgY29uc3QgZmlyc3RJbk1zID0gZmlyc3RJblZhbHVlICE9PSB1bmRlZmluZWQgPyBwYXJzZVNjaGVkdWxlZER1cmF0aW9uKGZpcnN0SW5WYWx1ZSwgYCR7am9iS2V5fS5maXJzdEluYCkgOiBpbnRlcnZhbE1zXG5cbiAgICBpZiAoaW50ZXJ2YWxNcyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fS5ldmVyeSBtdXN0IGJlIGF0IGxlYXN0IDEgbWlsbGlzZWNvbmQuYClcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZEVucXVldWUgPSB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcblxuICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuICAgICAgfSwgaW50ZXJ2YWxNcylcblxuICAgICAgdGhpcy5pbnRlcnZhbElkcy5wdXNoKGludGVydmFsSWQpXG5cbiAgICAgIHJldHVybiBzY2hlZHVsZWRFbnF1ZXVlXG4gICAgfSwgZmlyc3RJbk1zKVxuXG4gICAgdGhpcy50aW1lb3V0SWRzLnB1c2godGltZW91dElkKVxuICB9XG5cbiAgLyoqXG4gICAqIENyb250YWIgc2NoZWR1bGVzIGRvbid0IGhhdmUgYSBjb25zdGFudCBpbnRlcnZhbCAoYDAgOSAqICogMS01YFxuICAgKiBmaXJlcyBvbmNlIHBlciB3ZWVrZGF5IGF0IDkgQU0sIHdpdGggZ2FwcyBvZiB2YXJ5aW5nIGxlbmd0aCksIHNvXG4gICAqIHdlIHNlbGYtcmVzY2hlZHVsZSB3aXRoIGBzZXRUaW1lb3V0YCBhZnRlciBldmVyeSBmaXJlIGluc3RlYWQgb2ZcbiAgICogdXNpbmcgYHNldEludGVydmFsYC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlQ3JvbkpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIGNvbnN0IGNyb25FeHByZXNzaW9uID0gam9iQ29uZmlndXJhdGlvbi5jcm9uXG5cbiAgICBpZiAodHlwZW9mIGNyb25FeHByZXNzaW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0uY3JvbiBtdXN0IGJlIGEgc3RyaW5nLmApXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VDcm9uRXhwcmVzc2lvbihjcm9uRXhwcmVzc2lvbilcbiAgICBjb25zdCBzY2hlZHVsZU5leHQgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm5cblxuICAgICAgY29uc3QgbmV4dERhdGUgPSBuZXh0Q3JvbkZpcmVEYXRlKHBhcnNlZCwgbmV3IERhdGUoKSlcbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1heCgxLCBuZXh0RGF0ZS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKVxuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IHRoaXMucnVuU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuXG4gICAgICAgIC8vIFRoZSBhd2FpdCBhYm92ZSBjYW4geWllbGQgdG8gYSBzdG9wKCkgY2FsbC4gUmUtY2hlY2sgYmVmb3JlXG4gICAgICAgIC8vIHJlLWFybWluZyBzbyB3ZSBkb24ndCBrZWVwIGZpcmluZyBhZnRlciBzaHV0ZG93bi5cbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkgcmV0dXJuXG5cbiAgICAgICAgc2NoZWR1bGVOZXh0KClcbiAgICAgIH0sIGRlbGF5TXMpXG5cbiAgICAgIHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZClcbiAgICB9XG5cbiAgICBzY2hlZHVsZU5leHQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIHNjaGVkdWxlZCBlbnF1ZXVlIHNvIHN0b3AoKSBjYW5ub3QgcmV0dXJuIHdoaWxlIGl0IGNhbiBzdGlsbCBtdXRhdGUgdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSBlbnF1ZXVlIGF0dGVtcHQgZmluaXNoZXMuXG4gICAqL1xuICBhc3luYyBydW5TY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBpZiAodGhpcy5zdG9wcGVkIHx8IHRoaXMucGVuZGluZ0VucXVldWVzQnlKb2JLZXkuaGFzKGpvYktleSkpIHJldHVyblxuXG4gICAgY29uc3QgcGVuZGluZ0VucXVldWUgPSB0aGlzLmVucXVldWVTY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG4gICAgdGhpcy5wZW5kaW5nRW5xdWV1ZXNCeUpvYktleS5zZXQoam9iS2V5LCBwZW5kaW5nRW5xdWV1ZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwZW5kaW5nRW5xdWV1ZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBlbmRpbmdFbnF1ZXVlc0J5Sm9iS2V5LmRlbGV0ZShqb2JLZXkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5xdWV1ZSBzY2hlZHVsZWQgam9iLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZVNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZS1kdXBsaWNhdGUgc2NoZWR1bGVkIGVucXVldWVzIGJ5IGRlZmF1bHQ6IGEgcGVyaW9kaWMgam9iIHN0aWxsIHBlbmRpbmcgZnJvbSBhbiBlYXJsaWVyXG4gICAgICAvLyB0aWNrIGlzIG5vdCBlbnF1ZXVlZCBhZ2Fpbiwgd2hpY2ggaXMgd2hhdCBsZXQgdGhlIGJhY2tncm91bmRfam9icyB0YWJsZSBmaWxsIHdpdGggdGhvdXNhbmRzXG4gICAgICAvLyBvZiBpZGVudGljYWwgc2NoZWR1bGVkIGpvYnMgd2hlbiB0aGUgcXVldWUgYmFja2VkIHVwLiBEZWR1cCBpcyBieSBqb2IgaWRlbnRpdHkgKHNlZSB0aGVcbiAgICAgIC8vIHN0b3JlKSwgc28gdGhlIGpvYiBrZWVwcyBpdHMgcXVldWUtZGVyaXZlZCBjb25jdXJyZW5jeSBjYXAuIEEgc2NoZWR1bGUgY2FuIG9wdCBvdXQgd2l0aFxuICAgICAgLy8gYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWQ6IGZhbHNlYC5cbiAgICAgIGF3YWl0IHRoaXMuZW5xdWV1ZUpvYih7XG4gICAgICAgIGFyZ3M6IEFycmF5LmlzQXJyYXkoam9iQ29uZmlndXJhdGlvbi5hcmdzKSA/IGpvYkNvbmZpZ3VyYXRpb24uYXJncyA6IFtdLFxuICAgICAgICBqb2JDbGFzczogam9iQ29uZmlndXJhdGlvbi5jbGFzcyxcbiAgICAgICAgam9iS2V5LFxuICAgICAgICBvcHRpb25zOiB7ZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZDogdHJ1ZSwgLi4uKGpvYkNvbmZpZ3VyYXRpb24ub3B0aW9ucyB8fCB7fSl9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZW5xdWV1ZSBzY2hlZHVsZWQgYmFja2dyb3VuZCBqb2JcIiwge2pvYktleSwgam9iTmFtZTogam9iQ29uZmlndXJhdGlvbi5jbGFzcy5qb2JOYW1lKCl9LCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGV2ZXJ5LlxuICAgKiBAcGFyYW0ge05vbk51bGxhYmxlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb25bXCJldmVyeVwiXT59IGV2ZXJ5IC0gRXZlcnkgY29uZmlnIChjYWxsZXIgbXVzdCBndWFyYW50ZWUgbm90IHVuZGVmaW5lZCkuXG4gICAqIEByZXR1cm5zIHt7ZXZlcnlWYWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBmaXJzdEluVmFsdWU/OiBudW1iZXIgfCBzdHJpbmd9fSAtIE5vcm1hbGl6ZWQgaW50ZXJ2YWwgYW5kIGZpcnN0LXJ1biBkZWxheSB2YWx1ZXMuXG4gICAqL1xuICBub3JtYWxpemVFdmVyeShldmVyeSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZXJ5KSkge1xuICAgICAgY29uc3QgW2V2ZXJ5VmFsdWUsIGV2ZXJ5T3B0aW9uc10gPSBldmVyeVxuXG4gICAgICBpZiAoIWV2ZXJ5T3B0aW9ucyB8fCB0eXBlb2YgZXZlcnlPcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZXZlcnlPcHRpb25zKSkge1xuICAgICAgICByZXR1cm4ge2V2ZXJ5VmFsdWV9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7ZXZlcnlWYWx1ZSwgZmlyc3RJblZhbHVlOiBldmVyeU9wdGlvbnMuZmlyc3RJbn1cbiAgICB9XG5cbiAgICByZXR1cm4ge2V2ZXJ5VmFsdWU6IGV2ZXJ5fVxuICB9XG59XG4iXX0=
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9zY2hlZHVsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBQ2pGLE9BQU8seUNBQXlDLE1BQU0sc0NBQXNDLENBQUE7QUFFNUYsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFBO0FBRTFFOzsrREFFK0Q7QUFDL0QsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUN0QixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUN4QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUN6QixDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ2pCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDcEIsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUNyQixDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDWixNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDakIsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJO0lBQ2xCLEVBQUUsRUFBRSxDQUFDO0lBQ0wsQ0FBQyxFQUFFLElBQUk7SUFDUCxNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQzFCLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxF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QUFNLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSx5QkFBeUIsQ0FBQTtRQUVsRSxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDcEMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxHQUFHLENBQUM7WUFBRSxPQUFPLFVBQVUsQ0FBQTtRQUV2RSxPQUFPLG9DQUFvQyxDQUFBO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUE7WUFFeEMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNyRixPQUFPLEVBQUMsVUFBVSxFQUFDLENBQUE7WUFDckIsQ0FBQztZQUVELE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBRUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQTtJQUM1QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtERUZBVUxUX1NDSEVEVUxFRF9FTlFVRVVFX1RJTUVPVVRfTVN9IGZyb20gXCIuL3NjaGVkdWxlZC1lbnF1ZXVlLWJvdW5kLmpzXCJcbmltcG9ydCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRW5xdWV1ZVRpbWVvdXRFcnJvciBmcm9tIFwiLi9zY2hlZHVsZWQtZW5xdWV1ZS10aW1lb3V0LWVycm9yLmpzXCJcblxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB7bmV4dENyb25GaXJlRGF0ZSwgcGFyc2VDcm9uRXhwcmVzc2lvbn0gZnJvbSBcIi4vY3Jvbi1leHByZXNzaW9uLmpzXCJcblxuLyoqXG4gKiBEdXJhdGlvblVuaXQgdHlwZS5cbiAqIEB0eXBlZGVmIHtrZXlvZiB0eXBlb2YgRFVSQVRJT05fTVVMVElQTElFUlN9IER1cmF0aW9uVW5pdCAqL1xuY29uc3QgRFVSQVRJT05fTVVMVElQTElFUlMgPSB7XG4gIGQ6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIGRheTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgZGF5czogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgaDogNjAgKiA2MCAqIDEwMDAsXG4gIGhvdXI6IDYwICogNjAgKiAxMDAwLFxuICBob3VyczogNjAgKiA2MCAqIDEwMDAsXG4gIG06IDYwICogMTAwMCxcbiAgbWludXRlOiA2MCAqIDEwMDAsXG4gIG1pbnV0ZXM6IDYwICogMTAwMCxcbiAgbXM6IDEsXG4gIHM6IDEwMDAsXG4gIHNlY29uZDogMTAwMCxcbiAgc2Vjb25kczogMTAwMCxcbiAgdzogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIHdlZWs6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICB3ZWVrczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbn1cblxuLy8gVGhlIHdhdGNoZG9nIGJlbG93IGlzIGludGVybmFsIG1hY2hpbmVyeSwgbm90IGEgc2NoZWR1bGUgdGltZXIuIENhcHR1cmluZyB0aGVcbi8vIHBsYXRmb3JtIHRpbWVycyBhdCBtb2R1bGUgbG9hZCBrZWVwcyB0aGVtIG91dCBvZiBhIGNhbGxlcidzIHNjaGVkdWxlLXRpbWVyXG4vLyBvYnNlcnZhdGlvbiwgc28gYm91bmRpbmcgYW4gZW5xdWV1ZSBuZXZlciBhcHBlYXJzIGFzIGFuIGV4dHJhIHNjaGVkdWxlZCBqb2IuXG5jb25zdCBhcm1XYXRjaGRvZ1RpbWVyID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0XG5jb25zdCBjYW5jZWxXYXRjaGRvZ1RpbWVyID0gZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXRcblxuLyoqXG4gKiBSdW5zIHRoZSBwYXJzZVNjaGVkdWxlZER1cmF0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSB2YWx1ZSAtIER1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIGVycm9ycy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTY2hlZHVsZWREdXJhdGlvbih2YWx1ZSwgZmllbGROYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuYClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIXZhbHVlLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyBvciBudW1iZXIuYClcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGNvbnN0IG1hdGNoID0gbm9ybWFsaXplZFZhbHVlLm1hdGNoKC9eKFxcZCsoPzpcXC5cXGQrKT8pXFxzKihtc3xzfG18aHxkfHd8c2Vjb25kfHNlY29uZHN8bWludXRlfG1pbnV0ZXN8aG91cnxob3Vyc3xkYXl8ZGF5c3x3ZWVrfHdlZWtzKSQvKVxuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfTogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCBtdWx0aXBsaWVyID0gRFVSQVRJT05fTVVMVElQTElFUlNbLyoqIEB0eXBlIHtEdXJhdGlvblVuaXR9ICovIChtYXRjaFsyXSldXG5cbiAgaWYgKCFtdWx0aXBsaWVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX06ICR7dmFsdWV9YClcbiAgfVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWVyaWNWYWx1ZSAqIG11bHRpcGxpZXIpXG59XG5cbi8qKiBSdW5zIGNvbmZpZ3VyZWQgcmVjdXJyaW5nIGJhY2tncm91bmQgam9iIHNjaGVkdWxlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JzU2NoZWR1bGVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHthcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGpvYkNsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9qb2IuanNcIikuZGVmYXVsdCwgam9iS2V5OiBzdHJpbmcsIG9wdGlvbnM6IGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9KSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLmVucXVldWVKb2IgLSBFbnF1ZXVlIGNhbGxiYWNrLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGVucXVldWVKb2J9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZW5xdWV1ZUpvYiA9IGVucXVldWVKb2JcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICAvKiogQHR5cGUge251bWJlciB8IG51bGx9IC0gQm91bmQgKG1zKSBmb3Igb25lIHNjaGVkdWxlZCBlbnF1ZXVlIGF0dGVtcHQ7IGBudWxsYCBkaXNhYmxlcyB0aGUgYm91bmQuICovXG4gICAgdGhpcy5zY2hlZHVsZWRFbnF1ZXVlVGltZW91dE1zID0gdGhpcy5fcmVzb2x2ZVNjaGVkdWxlZEVucXVldWVUaW1lb3V0TXMoKVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+Pn0gKi9cbiAgICB0aGlzLmludGVydmFsSWRzID0gW11cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+Pn0gKi9cbiAgICB0aGlzLnRpbWVvdXRJZHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj59IC0gSW4tZmxpZ2h0IHNjaGVkdWxlZCBlbnF1ZXVlcyBieSBzY2hlZHVsZSBrZXkgdGhhdCBzaHV0ZG93biBtdXN0IGRyYWluLiAqL1xuICAgIHRoaXMucGVuZGluZ0VucXVldWVzQnlKb2JLZXkgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59IC0gVHJ1ZSBiZXR3ZWVuIHN0b3AoKSBhbmQgdGhlIG5leHQgc3RhcnQoKTsgY3JvbiBzZWxmLXJlc2NoZWR1bGVyIGNoZWNrcyB0aGlzIHNvIGEgc3RvcCgpIGR1cmluZyBhbiBpbi1mbGlnaHQgZW5xdWV1ZSBkb2Vzbid0IGltbWVkaWF0ZWx5IHJlLWFybS5cbiAgICAgKi9cbiAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZVxuXG4gICAgY29uc3Qgc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcoKVxuXG4gICAgaWYgKCFzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZz8uam9icykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBqb2JLZXkgb2YgT2JqZWN0LmtleXMoc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcuam9icykpIHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZ3VyYXRpb24gPSBzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZy5qb2JzW2pvYktleV1cblxuICAgICAgaWYgKCFqb2JDb25maWd1cmF0aW9uIHx8IGpvYkNvbmZpZ3VyYXRpb24uZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5zY2hlZHVsZUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgaW4tZmxpZ2h0IHNjaGVkdWxlZCBlbnF1ZXVlcyBmaW5pc2guXG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgaW50ZXJ2YWxJZCBvZiB0aGlzLmludGVydmFsSWRzKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0aW1lb3V0SWQgb2YgdGhpcy50aW1lb3V0SWRzKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIH1cblxuICAgIHRoaXMuaW50ZXJ2YWxJZHMgPSBbXVxuICAgIHRoaXMudGltZW91dElkcyA9IFtdXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnBlbmRpbmdFbnF1ZXVlc0J5Sm9iS2V5LnZhbHVlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2NoZWR1bGUgam9iLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBpZiAoIWpvYkNvbmZpZ3VyYXRpb24uY2xhc3MgfHwgdHlwZW9mIGpvYkNvbmZpZ3VyYXRpb24uY2xhc3MucGVyZm9ybUxhdGVyV2l0aE9wdGlvbnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9IG11c3QgZGVmaW5lIGEgam9iIGNsYXNzLmApXG4gICAgfVxuXG4gICAgaWYgKGpvYkNvbmZpZ3VyYXRpb24uY3JvbiAhPT0gdW5kZWZpbmVkICYmIGpvYkNvbmZpZ3VyYXRpb24uZXZlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9IG11c3QgZGVmaW5lIGVpdGhlciBcImV2ZXJ5XCIgb3IgXCJjcm9uXCIsIG5vdCBib3RoLmApXG4gICAgfVxuXG4gICAgaWYgKGpvYkNvbmZpZ3VyYXRpb24uY3JvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlQ3JvbkpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGpvYkNvbmZpZ3VyYXRpb24uZXZlcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9IG11c3QgZGVmaW5lIGVpdGhlciBcImV2ZXJ5XCIgb3IgXCJjcm9uXCIuYClcbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlRXZlcnlKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlZHVsZSBldmVyeSBqb2IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZUV2ZXJ5Sm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgY29uc3QgZXZlcnlDb25maWcgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBqb2JDb25maWd1cmF0aW9uLmV2ZXJ5Pn0gKi8gKGpvYkNvbmZpZ3VyYXRpb24uZXZlcnkpXG4gICAgY29uc3Qge2V2ZXJ5VmFsdWUsIGZpcnN0SW5WYWx1ZX0gPSB0aGlzLm5vcm1hbGl6ZUV2ZXJ5KGV2ZXJ5Q29uZmlnKVxuICAgIGNvbnN0IGludGVydmFsTXMgPSBwYXJzZVNjaGVkdWxlZER1cmF0aW9uKGV2ZXJ5VmFsdWUsIGAke2pvYktleX0uZXZlcnlgKVxuICAgIGNvbnN0IGZpcnN0SW5NcyA9IGZpcnN0SW5WYWx1ZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VTY2hlZHVsZWREdXJhdGlvbihmaXJzdEluVmFsdWUsIGAke2pvYktleX0uZmlyc3RJbmApIDogaW50ZXJ2YWxNc1xuXG4gICAgaWYgKGludGVydmFsTXMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0uZXZlcnkgbXVzdCBiZSBhdCBsZWFzdCAxIG1pbGxpc2Vjb25kLmApXG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBzY2hlZHVsZWRFbnF1ZXVlID0gdGhpcy5ydW5TY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG5cbiAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgICAgIH0sIGludGVydmFsTXMpXG5cbiAgICAgIHRoaXMuaW50ZXJ2YWxJZHMucHVzaChpbnRlcnZhbElkKVxuXG4gICAgICByZXR1cm4gc2NoZWR1bGVkRW5xdWV1ZVxuICAgIH0sIGZpcnN0SW5NcylcblxuICAgIHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcm9udGFiIHNjaGVkdWxlcyBkb24ndCBoYXZlIGEgY29uc3RhbnQgaW50ZXJ2YWwgKGAwIDkgKiAqIDEtNWBcbiAgICogZmlyZXMgb25jZSBwZXIgd2Vla2RheSBhdCA5IEFNLCB3aXRoIGdhcHMgb2YgdmFyeWluZyBsZW5ndGgpLCBzb1xuICAgKiB3ZSBzZWxmLXJlc2NoZWR1bGUgd2l0aCBgc2V0VGltZW91dGAgYWZ0ZXIgZXZlcnkgZmlyZSBpbnN0ZWFkIG9mXG4gICAqIHVzaW5nIGBzZXRJbnRlcnZhbGAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZUNyb25Kb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBjb25zdCBjcm9uRXhwcmVzc2lvbiA9IGpvYkNvbmZpZ3VyYXRpb24uY3JvblxuXG4gICAgaWYgKHR5cGVvZiBjcm9uRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9LmNyb24gbXVzdCBiZSBhIHN0cmluZy5gKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3JvbkV4cHJlc3Npb24oY3JvbkV4cHJlc3Npb24pXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RvcHBlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IG5leHREYXRlID0gbmV4dENyb25GaXJlRGF0ZShwYXJzZWQsIG5ldyBEYXRlKCkpXG4gICAgICBjb25zdCBkZWxheU1zID0gTWF0aC5tYXgoMSwgbmV4dERhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSlcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm5cblxuICAgICAgICBhd2FpdCB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcblxuICAgICAgICAvLyBUaGUgYXdhaXQgYWJvdmUgY2FuIHlpZWxkIHRvIGEgc3RvcCgpIGNhbGwuIFJlLWNoZWNrIGJlZm9yZVxuICAgICAgICAvLyByZS1hcm1pbmcgc28gd2UgZG9uJ3Qga2VlcCBmaXJpbmcgYWZ0ZXIgc2h1dGRvd24uXG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVyblxuXG4gICAgICAgIHNjaGVkdWxlTmV4dCgpXG4gICAgICB9LCBkZWxheU1zKVxuXG4gICAgICB0aGlzLnRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpXG4gICAgfVxuXG4gICAgc2NoZWR1bGVOZXh0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgYSBzY2hlZHVsZWQgZW5xdWV1ZSBzbyBzdG9wKCkgY2Fubm90IHJldHVybiB3aGlsZSBpdCBjYW4gc3RpbGwgbXV0YXRlIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgZW5xdWV1ZSBhdHRlbXB0IGZpbmlzaGVzLlxuICAgKi9cbiAgYXN5bmMgcnVuU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgaWYgKHRoaXMuc3RvcHBlZCB8fCB0aGlzLnBlbmRpbmdFbnF1ZXVlc0J5Sm9iS2V5Lmhhcyhqb2JLZXkpKSByZXR1cm5cblxuICAgIGNvbnN0IHBlbmRpbmdFbnF1ZXVlID0gdGhpcy5lbnF1ZXVlU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuICAgIHRoaXMucGVuZGluZ0VucXVldWVzQnlKb2JLZXkuc2V0KGpvYktleSwgcGVuZGluZ0VucXVldWUpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcGVuZGluZ0VucXVldWVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wZW5kaW5nRW5xdWV1ZXNCeUpvYktleS5kZWxldGUoam9iS2V5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVucXVldWUgc2NoZWR1bGVkIGpvYi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGVucXVldWVTY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICB0cnkge1xuICAgICAgLy8gRGUtZHVwbGljYXRlIHNjaGVkdWxlZCBlbnF1ZXVlcyBieSBkZWZhdWx0OiBhIHBlcmlvZGljIGpvYiBzdGlsbCBwZW5kaW5nIGZyb20gYW4gZWFybGllclxuICAgICAgLy8gdGljayBpcyBub3QgZW5xdWV1ZWQgYWdhaW4sIHdoaWNoIGlzIHdoYXQgbGV0IHRoZSBiYWNrZ3JvdW5kX2pvYnMgdGFibGUgZmlsbCB3aXRoIHRob3VzYW5kc1xuICAgICAgLy8gb2YgaWRlbnRpY2FsIHNjaGVkdWxlZCBqb2JzIHdoZW4gdGhlIHF1ZXVlIGJhY2tlZCB1cC4gRGVkdXAgaXMgYnkgam9iIGlkZW50aXR5IChzZWUgdGhlXG4gICAgICAvLyBzdG9yZSksIHNvIHRoZSBqb2Iga2VlcHMgaXRzIHF1ZXVlLWRlcml2ZWQgY29uY3VycmVuY3kgY2FwLiBBIHNjaGVkdWxlIGNhbiBvcHQgb3V0IHdpdGhcbiAgICAgIC8vIGBkZWR1cGxpY2F0ZVdoaWxlUXVldWVkOiBmYWxzZWAuXG4gICAgICBhd2FpdCB0aGlzLl93aXRoU2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXQoe1xuICAgICAgICBqb2JLZXksXG4gICAgICAgIGpvYk5hbWU6IGpvYkNvbmZpZ3VyYXRpb24uY2xhc3Muam9iTmFtZSgpLFxuICAgICAgICBydW46IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmVucXVldWVKb2Ioe1xuICAgICAgICAgICAgYXJnczogQXJyYXkuaXNBcnJheShqb2JDb25maWd1cmF0aW9uLmFyZ3MpID8gam9iQ29uZmlndXJhdGlvbi5hcmdzIDogW10sXG4gICAgICAgICAgICBqb2JDbGFzczogam9iQ29uZmlndXJhdGlvbi5jbGFzcyxcbiAgICAgICAgICAgIGpvYktleSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtkZWR1cGxpY2F0ZVdoaWxlUXVldWVkOiB0cnVlLCAuLi4oam9iQ29uZmlndXJhdGlvbi5vcHRpb25zIHx8IHt9KX1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRW5xdWV1ZVRpbWVvdXRFcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRTY2hlZHVsZWRFbnF1ZXVlU3RhbGwoe2Vycm9yLCBqb2JLZXl9KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZW5xdWV1ZSBzY2hlZHVsZWQgYmFja2dyb3VuZCBqb2JcIiwge2pvYktleSwgam9iTmFtZTogam9iQ29uZmlndXJhdGlvbi5jbGFzcy5qb2JOYW1lKCl9LCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGR1cmFibGUgZW5xdWV1ZSBhdHRlbXB0IHVuZGVyIHRoZSBzY2hlZHVsZWQtZW5xdWV1ZSBib3VuZC5cbiAgICpcbiAgICogVGhlIGJvdW5kIGlzIGFwcGxpZWQgd2l0aCBhIGxvY2FsIHJhY2UgcmF0aGVyIHRoYW4gYGF3YWl0ZXJ5YCdzIGB0aW1lb3V0KClgOlxuICAgKiB0aGF0IGhlbHBlciBzdGFydHMgaXRzIGNhbGxiYWNrIHRocm91Z2ggYFByb21pc2UucmVzb2x2ZSgpLnRoZW4oLi4uKWAsIHdoaWNoXG4gICAqIHdvdWxkIGRlZmVyIGV2ZXJ5IHNjaGVkdWxlZCBlbnF1ZXVlIGJ5IGEgbWljcm90YXNrIGFuZCBjaGFuZ2UgdGhlIHRpY2tcbiAgICogc2VtYW50aWNzIGNhbGxlcnMgcmVseSBvbi4gSGVyZSB0aGUgYXR0ZW1wdCBzdGFydHMgc3luY2hyb25vdXNseSwgYW5kIHRoZVxuICAgKiB3YXRjaGRvZyB1c2VzIHRoZSBtb2R1bGUtY2FwdHVyZWQgdGltZXJzIHNvIGl0IGlzIG5ldmVyIG9ic2VydmFibGUgYXMgYVxuICAgKiBzY2hlZHVsZSB0aW1lci4gT25seSB0aGUgd2F0Y2hkb2cgcmFpc2VzIHRoZSB0eXBlZCB0aW1lb3V0IGVycm9yLCBzbyBhXG4gICAqIHRpbWVvdXQgcmFpc2VkIGluc2lkZSB0aGUgZW5xdWV1ZSBpdHNlbGYga2VlcHMgaXRzIG93biBlcnJvciBwYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIFNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIFJlc29sdmVkIGpvYiBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGFyZ3MucnVuIC0gRW5xdWV1ZSBhdHRlbXB0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBhdHRlbXB0IHNldHRsZXMgd2l0aGluIHRoZSBib3VuZC5cbiAgICovXG4gIGFzeW5jIF93aXRoU2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXQoe2pvYktleSwgam9iTmFtZSwgcnVufSkge1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IHRoaXMuc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNc1xuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgICBsZXQgYXR0ZW1wdFxuXG4gICAgdHJ5IHtcbiAgICAgIGF0dGVtcHQgPSBQcm9taXNlLnJlc29sdmUocnVuKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF0dGVtcHQgPSBQcm9taXNlLnJlamVjdCgvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuICAgIH1cblxuICAgIGlmICh0aW1lb3V0TXMgPT09IG51bGwpIHJldHVybiBhd2FpdCBhdHRlbXB0XG5cbiAgICAvKipcbiAgICAgKiBSZWplY3RzIHRoZSB3YXRjaGRvZyBwcm9taXNlIHdoZW4gdGhlIGJvdW5kIGV4cGlyZXMuXG4gICAgICogQHR5cGUgeyhlcnJvcjogRXJyb3IpID0+IHZvaWR9ICovXG4gICAgbGV0IHJlamVjdFNjaGVkdWxlZEVucXVldWVUaW1lb3V0ID0gKCkgPT4ge31cbiAgICBjb25zdCB3YXRjaGRvZyA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHsgcmVqZWN0U2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXQgPSByZWplY3QgfSlcbiAgICAvKipcbiAgICAgKiBXYXRjaGRvZyB0aW1lciBoYW5kbGUuXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGFybVdhdGNoZG9nVGltZXI+fSAqL1xuICAgIGNvbnN0IHdhdGNoZG9nSWQgPSBhcm1XYXRjaGRvZ1RpbWVyKCgpID0+IHtcbiAgICAgIHJlamVjdFNjaGVkdWxlZEVucXVldWVUaW1lb3V0KG5ldyBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRW5xdWV1ZVRpbWVvdXRFcnJvcih7XG4gICAgICAgIGpvYktleSxcbiAgICAgICAgam9iTmFtZSxcbiAgICAgICAgc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNczogdGltZW91dE1zXG4gICAgICB9KSlcbiAgICB9LCB0aW1lb3V0TXMpXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbYXR0ZW1wdCwgd2F0Y2hkb2ddKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjYW5jZWxXYXRjaGRvZ1RpbWVyKHdhdGNoZG9nSWQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1cmZhY2VzIGEgc2NoZWR1bGVkIGVucXVldWUgd2hvc2Ugc3RvcmUgY2FsbCBuZXZlciBzZXR0bGVkLiBXaXRob3V0IHRoaXMgcmVwb3J0IHRoZSBvbmx5XG4gICAqIHN5bXB0b20gaXMgYSBzY2hlZHVsZSB0aGF0IHNpbGVudGx5IHN0b3BzIGVucXVldWVpbmcgYWZ0ZXIgb25lIHdlZGdlZCBjYWxsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBUaW1lb3V0IGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBTY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlcG9ydFNjaGVkdWxlZEVucXVldWVTdGFsbCh7ZXJyb3IsIGpvYktleX0pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgY29udGV4dDoge1xuICAgICAgICBqb2JLZXksXG4gICAgICAgIHNjaGVkdWxlZEVucXVldWVUaW1lb3V0TXM6IHRoaXMuc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNcyxcbiAgICAgICAgc3RhZ2U6IFwiYmFja2dyb3VuZC1qb2JzLXNjaGVkdWxlZC1lbnF1ZXVlLXN0YWxsXCJcbiAgICAgIH0sXG4gICAgICBlcnJvclxuICAgIH1cblxuICAgIHZvaWQgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiU2NoZWR1bGVkIGJhY2tncm91bmQgam9iIGVucXVldWUgc3RhbGxlZFwiLCBwYXlsb2FkLmNvbnRleHQsIGVycm9yXSlcblxuICAgIGNvbnN0IGVycm9yRXZlbnRzID0gdHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbj8uZ2V0RXJyb3JFdmVudHMgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIWVycm9yRXZlbnRzKSByZXR1cm5cblxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgcGF5bG9hZClcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5wYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzY2hlZHVsZWQtZW5xdWV1ZSBib3VuZCBmcm9tIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSAtIEJvdW5kIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIGZvciBhbiB1bmJvdW5kZWQgd2FpdC5cbiAgICovXG4gIF9yZXNvbHZlU2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNcygpIHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kSm9ic0NvbmZpZyA9IHR5cGVvZiB0aGlzLmNvbmZpZ3VyYXRpb24/LmdldEJhY2tncm91bmRKb2JzQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0QmFja2dyb3VuZEpvYnNDb25maWcoKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSBiYWNrZ3JvdW5kSm9ic0NvbmZpZz8uc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNc1xuXG4gICAgaWYgKGNvbmZpZ3VyZWQgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcIm51bWJlclwiICYmIGNvbmZpZ3VyZWQgPiAwKSByZXR1cm4gY29uZmlndXJlZFxuXG4gICAgcmV0dXJuIERFRkFVTFRfU0NIRURVTEVEX0VOUVVFVUVfVElNRU9VVF9NU1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGV2ZXJ5LlxuICAgKiBAcGFyYW0ge05vbk51bGxhYmxlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb25bXCJldmVyeVwiXT59IGV2ZXJ5IC0gRXZlcnkgY29uZmlnIChjYWxsZXIgbXVzdCBndWFyYW50ZWUgbm90IHVuZGVmaW5lZCkuXG4gICAqIEByZXR1cm5zIHt7ZXZlcnlWYWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBmaXJzdEluVmFsdWU/OiBudW1iZXIgfCBzdHJpbmd9fSAtIE5vcm1hbGl6ZWQgaW50ZXJ2YWwgYW5kIGZpcnN0LXJ1biBkZWxheSB2YWx1ZXMuXG4gICAqL1xuICBub3JtYWxpemVFdmVyeShldmVyeSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZXJ5KSkge1xuICAgICAgY29uc3QgW2V2ZXJ5VmFsdWUsIGV2ZXJ5T3B0aW9uc10gPSBldmVyeVxuXG4gICAgICBpZiAoIWV2ZXJ5T3B0aW9ucyB8fCB0eXBlb2YgZXZlcnlPcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZXZlcnlPcHRpb25zKSkge1xuICAgICAgICByZXR1cm4ge2V2ZXJ5VmFsdWV9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7ZXZlcnlWYWx1ZSwgZmlyc3RJblZhbHVlOiBldmVyeU9wdGlvbnMuZmlyc3RJbn1cbiAgICB9XG5cbiAgICByZXR1cm4ge2V2ZXJ5VmFsdWU6IGV2ZXJ5fVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/mcp.js"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,WAAW;IACxD,OAAO,kBAEZ;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import BaseCommand from "../base-command.js";
|
|
2
|
+
export default class VelociousCliCommandsMcp extends BaseCommand {
|
|
3
|
+
async execute() {
|
|
4
|
+
return await this.getConfiguration().getEnvironmentHandler().cliCommandsMcp(this);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9tY3AuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUE7QUFFNUMsTUFBTSxDQUFDLE9BQU8sT0FBTyx1QkFBd0IsU0FBUSxXQUFXO0lBQzlELEtBQUssQ0FBQyxPQUFPO1FBQ1gsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25GLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vYmFzZS1jb21tYW5kLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNNY3AgZXh0ZW5kcyBCYXNlQ29tbWFuZHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuY2xpQ29tbWFuZHNNY3AodGhpcylcbiAgfVxufVxuIl19
|
package/build/src/cli/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
const COMMAND_VALUE_OPTIONS = new Set(["--generation", "--initial-generation-state", "--lifecycle-socket", "--phase", "--socket", "--tenant"]);
|
|
2
|
+
const COMMAND_VALUE_OPTIONS = new Set(["--generation", "--initial-generation-state", "--lifecycle-socket", "--phase", "--request-context", "--socket", "--tenant"]);
|
|
3
3
|
export default class VelociousCli {
|
|
4
4
|
/**
|
|
5
5
|
* Runs constructor.
|
|
@@ -143,4 +143,4 @@ export default class VelociousCli {
|
|
|
143
143
|
return this.args.testing || false;
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLDRCQUE0QixFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUU5SSxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQVk7SUFDL0I7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7UUFFOUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBO1FBRXZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hELElBQUksTUFBTSxDQUFBO1FBRVYsS0FBSyxNQUFNLGtCQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQy9DLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtZQUU1RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLE1BQU0sSUFB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Q0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQTtJQUNuQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgQ09NTUFORF9WQUxVRV9PUFRJT05TID0gbmV3IFNldChbXCItLWdlbmVyYXRpb25cIiwgXCItLWluaXRpYWwtZ2VuZXJhdGlvbi1zdGF0ZVwiLCBcIi0tbGlmZWN5Y2xlLXNvY2tldFwiLCBcIi0tcGhhc2VcIiwgXCItLXNvY2tldFwiLCBcIi0tdGVuYW50XCJdKVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGkge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRpcmVjdG9yeV0gLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFthcmdzLmVudmlyb25tZW50SGFuZGxlcl0gLSBFbnZpcm9ubWVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQ+fSBbYXJncy5wYXJzZWRQcm9jZXNzQXJnc10gLSBQYXJzZWQgcHJvY2VzcyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5wcm9jZXNzQXJnc10gLSBQcm9jZXNzIGFyZ3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudGVzdGluZ10gLSBXaGV0aGVyIHRlc3RpbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICBpZiAoIWFyZ3MuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiY29uZmlndXJhdGlvbiBhcmd1bWVudCBpcyByZXF1aXJlZFwiKVxuXG4gICAgdGhpcy5hcmdzID0gYXJnc1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGFyZ3MuY29uZmlndXJhdGlvblxuXG4gICAgdGhpcy5lbnZpcm9ubWVudEhhbmRsZXIgPSBhcmdzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcbiAgICB0aGlzLmVudmlyb25tZW50SGFuZGxlci5zZXRBcmdzKGFyZ3MpXG4gICAgdGhpcy5lbnZpcm9ubWVudEhhbmRsZXIuc2V0Q29uZmlndXJhdGlvbihhcmdzLmNvbmZpZ3VyYXRpb24pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZmluYWwgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IGNvbW1hbmRHcm91cHMgPSBhd2FpdCB0aGlzLmNvbW1hbmRHcm91cHMoKVxuICAgIGxldCByZXN1bHRcblxuICAgIGZvciAoY29uc3QgY29tbWFuZFByb2Nlc3NBcmdzIG9mIGNvbW1hbmRHcm91cHMpIHtcbiAgICAgIGNvbnN0IHNob3VsZENsb3NlRGF0YWJhc2VDb25uZWN0aW9ucyA9ICF0aGlzLmhhc0N1cnJlbnREYXRhYmFzZUNvbm5lY3Rpb25zKClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZChjb21tYW5kUHJvY2Vzc0FyZ3MpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2hvdWxkQ2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUgY29tbWFuZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MgZm9yIGEgc2luZ2xlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kKHByb2Nlc3NBcmdzKSB7XG4gICAgaWYgKCFwcm9jZXNzQXJnc1swXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBjb21tYW5kIGFyZ3VtZW50XCIpXG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZFBhcnRzID0gcHJvY2Vzc0FyZ3NbMF0uc3BsaXQoXCI6XCIpXG4gICAgY29uc3QgcGFyc2VkQ29tbWFuZFBhcnRzID0gW11cblxuICAgIGZvciAobGV0IGNvbW1hbmRQYXJ0IG9mIGNvbW1hbmRQYXJ0cykge1xuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwiY1wiKSBjb21tYW5kUGFydCA9IFwiY29uc29sZVwiXG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJkXCIpIGNvbW1hbmRQYXJ0ID0gXCJkZXN0cm95XCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImdcIikgY29tbWFuZFBhcnQgPSBcImdlbmVyYXRlXCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcInNcIikgY29tbWFuZFBhcnQgPSBcInNlcnZlclwiXG5cbiAgICAgIHBhcnNlZENvbW1hbmRQYXJ0cy5wdXNoKGNvbW1hbmRQYXJ0KVxuICAgIH1cblxuICAgIGNvbnN0IENvbW1hbmRDbGFzcyA9IGF3YWl0IHRoaXMuZW52aXJvbm1lbnRIYW5kbGVyLnJlcXVpcmVDb21tYW5kKHtjb21tYW5kUGFydHM6IHBhcnNlZENvbW1hbmRQYXJ0c30pXG4gICAgY29uc3QgY29tbWFuZEluc3RhbmNlID0gbmV3IENvbW1hbmRDbGFzcyh7XG4gICAgICBhcmdzOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmFyZ3MsIHtwcm9jZXNzQXJnc30pLFxuICAgICAgY2xpOiB0aGlzXG4gICAgfSlcblxuICAgIGF3YWl0IGNvbW1hbmRJbnN0YW5jZS5pbml0aWFsaXplKClcblxuICAgIHJldHVybiBhd2FpdCBjb21tYW5kSW5zdGFuY2UuZXhlY3V0ZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb21tYW5kIGdyb3Vwcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW11bXT59IC0gQ29tbWFuZCBncm91cHMgd2l0aCBwcm9jZXNzIGFyZ3MgZm9yIGVhY2ggY29tbWFuZC5cbiAgICovXG4gIGFzeW5jIGNvbW1hbmRHcm91cHMoKSB7XG4gICAgY29uc3QgcHJvY2Vzc0FyZ3MgPSB0aGlzLmFyZ3MucHJvY2Vzc0FyZ3MgfHwgW11cbiAgICBjb25zdCBjb21tYW5kcyA9IGF3YWl0IHRoaXMuZW52aXJvbm1lbnRIYW5kbGVyLmZpbmRDb21tYW5kcygpXG4gICAgY29uc3QgY29tbWFuZE5hbWVzID0gbmV3IFNldChjb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+IGNvbW1hbmQubmFtZSkpXG4gICAgLyoqXG4gICAgICogR3JvdXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXVtdfSAqL1xuICAgIGNvbnN0IGdyb3VwcyA9IFtdXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBncm91cC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgbGV0IGN1cnJlbnRHcm91cCA9IFtdXG4gICAgbGV0IGV4cGVjdHNPcHRpb25WYWx1ZSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHByb2Nlc3NBcmcgb2YgcHJvY2Vzc0FyZ3MpIHtcbiAgICAgIGlmIChjdXJyZW50R3JvdXAubGVuZ3RoID09IDApIHtcbiAgICAgICAgaWYgKHByb2Nlc3NBcmcuc3RhcnRzV2l0aChcIi1cIikpIGNvbnRpbnVlXG5cbiAgICAgICAgY3VycmVudEdyb3VwID0gW3Byb2Nlc3NBcmddXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChleHBlY3RzT3B0aW9uVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEdyb3VwLnB1c2gocHJvY2Vzc0FyZylcbiAgICAgICAgZXhwZWN0c09wdGlvblZhbHVlID0gZmFsc2VcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcm9jZXNzQXJnLnN0YXJ0c1dpdGgoXCItXCIpICYmIGNvbW1hbmROYW1lcy5oYXMocHJvY2Vzc0FyZykpIHtcbiAgICAgICAgZ3JvdXBzLnB1c2goY3VycmVudEdyb3VwKVxuICAgICAgICBjdXJyZW50R3JvdXAgPSBbcHJvY2Vzc0FyZ11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRHcm91cC5wdXNoKHByb2Nlc3NBcmcpXG4gICAgICAgIGV4cGVjdHNPcHRpb25WYWx1ZSA9IENPTU1BTkRfVkFMVUVfT1BUSU9OUy5oYXMocHJvY2Vzc0FyZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgIGdyb3Vwcy5wdXNoKGN1cnJlbnRHcm91cClcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbW1hbmQgYXJndW1lbnRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHsgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbiB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIGN1cnJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbnMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGN1cnJlbnQgYXN5bmMgY29udGV4dCBhbHJlYWR5IGhhcyBkYXRhYmFzZSBjb25uZWN0aW9ucy5cbiAgICovXG4gIGhhc0N1cnJlbnREYXRhYmFzZUNvbm5lY3Rpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q3VycmVudENvbm5lY3Rpb25zKCkpLmxlbmd0aCA+IDBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiTm8gZGF0YWJhc2UgY29uZmlndXJhdGlvbiBmb3IgZW52aXJvbm1lbnQ6XCIpKSByZXR1cm4gZmFsc2VcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdGVzdGluZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0ZXN0aW5nLlxuICAgKi9cbiAgZ2V0VGVzdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hcmdzLnRlc3RpbmcgfHwgZmFsc2VcbiAgfVxufVxuIl19
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLDRCQUE0QixFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUVuSyxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQVk7SUFDL0I7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7UUFFOUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBO1FBRXZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hELElBQUksTUFBTSxDQUFBO1FBRVYsS0FBSyxNQUFNLGtCQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQy9DLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtZQUU1RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxH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UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQTtJQUNuQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgQ09NTUFORF9WQUxVRV9PUFRJT05TID0gbmV3IFNldChbXCItLWdlbmVyYXRpb25cIiwgXCItLWluaXRpYWwtZ2VuZXJhdGlvbi1zdGF0ZVwiLCBcIi0tbGlmZWN5Y2xlLXNvY2tldFwiLCBcIi0tcGhhc2VcIiwgXCItLXJlcXVlc3QtY29udGV4dFwiLCBcIi0tc29ja2V0XCIsIFwiLS10ZW5hbnRcIl0pXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0NsaSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGlyZWN0b3J5XSAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gW2FyZ3MuZW52aXJvbm1lbnRIYW5kbGVyXSAtIEVudmlyb25tZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZD59IFthcmdzLnBhcnNlZFByb2Nlc3NBcmdzXSAtIFBhcnNlZCBwcm9jZXNzIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLnByb2Nlc3NBcmdzXSAtIFByb2Nlc3MgYXJncy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy50ZXN0aW5nXSAtIFdoZXRoZXIgdGVzdGluZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIGlmICghYXJncy5jb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJjb25maWd1cmF0aW9uIGFyZ3VtZW50IGlzIHJlcXVpcmVkXCIpXG5cbiAgICB0aGlzLmFyZ3MgPSBhcmdzXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXJncy5jb25maWd1cmF0aW9uXG5cbiAgICB0aGlzLmVudmlyb25tZW50SGFuZGxlciA9IGFyZ3MuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuICAgIHRoaXMuZW52aXJvbm1lbnRIYW5kbGVyLnNldEFyZ3MoYXJncylcbiAgICB0aGlzLmVudmlyb25tZW50SGFuZGxlci5zZXRDb25maWd1cmF0aW9uKGFyZ3MuY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBmaW5hbCBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgY29tbWFuZEdyb3VwcyA9IGF3YWl0IHRoaXMuY29tbWFuZEdyb3VwcygpXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgZm9yIChjb25zdCBjb21tYW5kUHJvY2Vzc0FyZ3Mgb2YgY29tbWFuZEdyb3Vwcykge1xuICAgICAgY29uc3Qgc2hvdWxkQ2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zID0gIXRoaXMuaGFzQ3VycmVudERhdGFiYXNlQ29ubmVjdGlvbnMoKVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRQcm9jZXNzQXJncylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChzaG91bGRDbG9zZURhdGFiYXNlQ29ubmVjdGlvbnMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5jbG9zZURhdGFiYXNlQ29ubmVjdGlvbnMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhlY3V0ZSBjb21tYW5kLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9jZXNzQXJncyAtIFByb2Nlc3MgYXJncyBmb3IgYSBzaW5nbGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQocHJvY2Vzc0FyZ3MpIHtcbiAgICBpZiAoIXByb2Nlc3NBcmdzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbW1hbmQgYXJndW1lbnRcIilcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kUGFydHMgPSBwcm9jZXNzQXJnc1swXS5zcGxpdChcIjpcIilcbiAgICBjb25zdCBwYXJzZWRDb21tYW5kUGFydHMgPSBbXVxuXG4gICAgZm9yIChsZXQgY29tbWFuZFBhcnQgb2YgY29tbWFuZFBhcnRzKSB7XG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJjXCIpIGNvbW1hbmRQYXJ0ID0gXCJjb25zb2xlXCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImRcIikgY29tbWFuZFBhcnQgPSBcImRlc3Ryb3lcIlxuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwiZ1wiKSBjb21tYW5kUGFydCA9IFwiZ2VuZXJhdGVcIlxuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwic1wiKSBjb21tYW5kUGFydCA9IFwic2VydmVyXCJcblxuICAgICAgcGFyc2VkQ29tbWFuZFBhcnRzLnB1c2goY29tbWFuZFBhcnQpXG4gICAgfVxuXG4gICAgY29uc3QgQ29tbWFuZENsYXNzID0gYXdhaXQgdGhpcy5lbnZpcm9ubWVudEhhbmRsZXIucmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0czogcGFyc2VkQ29tbWFuZFBhcnRzfSlcbiAgICBjb25zdCBjb21tYW5kSW5zdGFuY2UgPSBuZXcgQ29tbWFuZENsYXNzKHtcbiAgICAgIGFyZ3M6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXJncywge3Byb2Nlc3NBcmdzfSksXG4gICAgICBjbGk6IHRoaXNcbiAgICB9KVxuXG4gICAgYXdhaXQgY29tbWFuZEluc3RhbmNlLmluaXRpYWxpemUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNvbW1hbmRJbnN0YW5jZS5leGVjdXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbW1hbmQgZ3JvdXBzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXVtdPn0gLSBDb21tYW5kIGdyb3VwcyB3aXRoIHByb2Nlc3MgYXJncyBmb3IgZWFjaCBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgY29tbWFuZEdyb3VwcygpIHtcbiAgICBjb25zdCBwcm9jZXNzQXJncyA9IHRoaXMuYXJncy5wcm9jZXNzQXJncyB8fCBbXVxuICAgIGNvbnN0IGNvbW1hbmRzID0gYXdhaXQgdGhpcy5lbnZpcm9ubWVudEhhbmRsZXIuZmluZENvbW1hbmRzKClcbiAgICBjb25zdCBjb21tYW5kTmFtZXMgPSBuZXcgU2V0KGNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT4gY29tbWFuZC5uYW1lKSlcbiAgICAvKipcbiAgICAgKiBHcm91cHMuXG4gICAgICogQHR5cGUge3N0cmluZ1tdW119ICovXG4gICAgY29uc3QgZ3JvdXBzID0gW11cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGdyb3VwLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBsZXQgY3VycmVudEdyb3VwID0gW11cbiAgICBsZXQgZXhwZWN0c09wdGlvblZhbHVlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgcHJvY2Vzc0FyZyBvZiBwcm9jZXNzQXJncykge1xuICAgICAgaWYgKGN1cnJlbnRHcm91cC5sZW5ndGggPT0gMCkge1xuICAgICAgICBpZiAocHJvY2Vzc0FyZy5zdGFydHNXaXRoKFwiLVwiKSkgY29udGludWVcblxuICAgICAgICBjdXJyZW50R3JvdXAgPSBbcHJvY2Vzc0FyZ11cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGV4cGVjdHNPcHRpb25WYWx1ZSkge1xuICAgICAgICBjdXJyZW50R3JvdXAucHVzaChwcm9jZXNzQXJnKVxuICAgICAgICBleHBlY3RzT3B0aW9uVmFsdWUgPSBmYWxzZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIXByb2Nlc3NBcmcuc3RhcnRzV2l0aChcIi1cIikgJiYgY29tbWFuZE5hbWVzLmhhcyhwcm9jZXNzQXJnKSkge1xuICAgICAgICBncm91cHMucHVzaChjdXJyZW50R3JvdXApXG4gICAgICAgIGN1cnJlbnRHcm91cCA9IFtwcm9jZXNzQXJnXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEdyb3VwLnB1c2gocHJvY2Vzc0FyZylcbiAgICAgICAgZXhwZWN0c09wdGlvblZhbHVlID0gQ09NTUFORF9WQUxVRV9PUFRJT05TLmhhcyhwcm9jZXNzQXJnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50R3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXBzLnB1c2goY3VycmVudEdyb3VwKVxuICAgIH1cblxuICAgIGlmIChncm91cHMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgY29tbWFuZCBhcmd1bWVudFwiKVxuICAgIH1cblxuICAgIHJldHVybiBncm91cHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBnZXRDb25maWd1cmF0aW9uKCkgeyByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgY3VycmVudCBkYXRhYmFzZSBjb25uZWN0aW9ucy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY3VycmVudCBhc3luYyBjb250ZXh0IGFscmVhZHkgaGFzIGRhdGFiYXNlIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgaGFzQ3VycmVudERhdGFiYXNlQ29ubmVjdGlvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDdXJyZW50Q29ubmVjdGlvbnMoKSkubGVuZ3RoID4gMFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJObyBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGZvciBlbnZpcm9ubWVudDpcIikpIHJldHVybiBmYWxzZVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0ZXN0aW5nLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRlc3RpbmcuXG4gICAqL1xuICBnZXRUZXN0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3MudGVzdGluZyB8fCBmYWxzZVxuICB9XG59XG4iXX0=
|
|
@@ -119,6 +119,10 @@ export type DatabasePoolConfiguration = {
|
|
|
119
119
|
max?: number | null;
|
|
120
120
|
};
|
|
121
121
|
export type DatabaseConfigurationType = {
|
|
122
|
+
/**
|
|
123
|
+
* - Bound (ms) a blocking advisory-lock acquisition waits for a contended lock before reporting failure. Default: `900000` (15 minutes). `null` opts out and restores the driver's indefinite wait. A per-call `timeoutMs` argument always overrides this.
|
|
124
|
+
*/
|
|
125
|
+
advisoryLockAcquireTimeoutMs?: number | null;
|
|
122
126
|
/**
|
|
123
127
|
* - Default character set applied by `db:create` via mysql/mariadb `CREATE DATABASE ... CHARACTER SET`. Distinct from `charset`, which is the client connection charset forwarded to the mysql2 driver.
|
|
124
128
|
*/
|
|
@@ -464,6 +468,10 @@ export type BackgroundJobsConfiguration = {
|
|
|
464
468
|
maxConcurrent?: number;
|
|
465
469
|
priority?: number;
|
|
466
470
|
}>;
|
|
471
|
+
/**
|
|
472
|
+
* - Bounds one scheduled enqueue attempt in the main process. A durable enqueue that never settles (wedged DB connection, contended advisory lock) would otherwise keep its schedule key permanently in flight, so every later tick skipped itself and shutdown could never drain. On timeout the attempt is reported as `background-jobs-scheduled-enqueue-stall` and the key clears for the next tick. Default: 20 minutes — deliberately 5 minutes above `advisoryLockAcquireTimeoutMs` so the precise lock error surfaces first. `null` opts out.
|
|
473
|
+
*/
|
|
474
|
+
scheduledEnqueueTimeoutMs?: number | null;
|
|
467
475
|
/**
|
|
468
476
|
* - How the main process
|
|
469
477
|
* detects new work. Defaults to `"beacon"` (event-driven). Set to `"polling"`
|
|
@@ -1517,6 +1525,16 @@ export type ApiManifestConfiguration = {
|
|
|
1517
1525
|
*/
|
|
1518
1526
|
token?: string;
|
|
1519
1527
|
};
|
|
1528
|
+
export type McpConfiguration = {
|
|
1529
|
+
/**
|
|
1530
|
+
* - HTTP path for the built-in MCP endpoint. Defaults to `/mcp`.
|
|
1531
|
+
*/
|
|
1532
|
+
path?: string;
|
|
1533
|
+
/**
|
|
1534
|
+
* - Bearer token required in the `Authorization` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
1535
|
+
*/
|
|
1536
|
+
token?: string;
|
|
1537
|
+
};
|
|
1520
1538
|
export type DebugEndpointConfiguration = {
|
|
1521
1539
|
/**
|
|
1522
1540
|
* - HTTP path for the built-in debug endpoint. Defaults to `/velocious/debug`.
|
|
@@ -1640,6 +1658,10 @@ export type ConfigurationArgsType = {
|
|
|
1640
1658
|
* - Enable the built-in API manifest endpoint. Defaults to false.
|
|
1641
1659
|
*/
|
|
1642
1660
|
apiManifest?: boolean | ApiManifestConfiguration;
|
|
1661
|
+
/**
|
|
1662
|
+
* - Enable the built-in MCP endpoint on the HTTP server (JSON-RPC over HTTP in addition to the `velocious mcp` stdio server). Defaults to false.
|
|
1663
|
+
*/
|
|
1664
|
+
mcp?: boolean | McpConfiguration;
|
|
1643
1665
|
/**
|
|
1644
1666
|
* - Base directory for the project.
|
|
1645
1667
|
*/
|
|
@@ -1829,6 +1851,7 @@ export type ConfigurationArgsType = {
|
|
|
1829
1851
|
*/
|
|
1830
1852
|
/**
|
|
1831
1853
|
* @typedef {object} DatabaseConfigurationType
|
|
1854
|
+
* @property {number | null} [advisoryLockAcquireTimeoutMs] - Bound (ms) a blocking advisory-lock acquisition waits for a contended lock before reporting failure. Default: `900000` (15 minutes). `null` opts out and restores the driver's indefinite wait. A per-call `timeoutMs` argument always overrides this.
|
|
1832
1855
|
* @property {string} [databaseCharset] - Default character set applied by `db:create` via mysql/mariadb `CREATE DATABASE ... CHARACTER SET`. Distinct from `charset`, which is the client connection charset forwarded to the mysql2 driver.
|
|
1833
1856
|
* @property {string} [databaseCollation] - Default collation applied by `db:create` via mysql/mariadb `CREATE DATABASE ... COLLATE`.
|
|
1834
1857
|
* @property {string} [database] - Database name for this connection.
|
|
@@ -1973,6 +1996,7 @@ export type ConfigurationArgsType = {
|
|
|
1973
1996
|
* Priorities may be any number, including negative to sink a queue below the
|
|
1974
1997
|
* default. Jobs within the same priority keep FIFO (`scheduled_at`, then
|
|
1975
1998
|
* `created_at`) order. Default: `{}` (no queue caps, all queues priority `0`).
|
|
1999
|
+
* @property {number | null} [scheduledEnqueueTimeoutMs] - Bounds one scheduled enqueue attempt in the main process. A durable enqueue that never settles (wedged DB connection, contended advisory lock) would otherwise keep its schedule key permanently in flight, so every later tick skipped itself and shutdown could never drain. On timeout the attempt is reported as `background-jobs-scheduled-enqueue-stall` and the key clears for the next tick. Default: 20 minutes — deliberately 5 minutes above `advisoryLockAcquireTimeoutMs` so the precise lock error surfaces first. `null` opts out.
|
|
1976
2000
|
* @property {BackgroundJobsDispatchStrategy} [dispatchStrategy] - How the main process
|
|
1977
2001
|
* detects new work. Defaults to `"beacon"` (event-driven). Set to `"polling"`
|
|
1978
2002
|
* to restore the legacy fixed-interval poll.
|
|
@@ -2431,6 +2455,11 @@ export type ConfigurationArgsType = {
|
|
|
2431
2455
|
* @property {string} [path] - HTTP path for the built-in API manifest endpoint. Defaults to `/api/manifest`.
|
|
2432
2456
|
* @property {string} [token] - Bearer token required in the `Authorization: Bearer <token>` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
2433
2457
|
*/
|
|
2458
|
+
/**
|
|
2459
|
+
* @typedef {object} McpConfiguration
|
|
2460
|
+
* @property {string} [path] - HTTP path for the built-in MCP endpoint. Defaults to `/mcp`.
|
|
2461
|
+
* @property {string} [token] - Bearer token required in the `Authorization` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
2462
|
+
*/
|
|
2434
2463
|
/**
|
|
2435
2464
|
* @typedef {object} DebugEndpointConfiguration
|
|
2436
2465
|
* @property {string} [path] - HTTP path for the built-in debug endpoint. Defaults to `/velocious/debug`.
|
|
@@ -2460,6 +2489,7 @@ export type ConfigurationArgsType = {
|
|
|
2460
2489
|
* @property {boolean} [debug] - Enable debug logging.
|
|
2461
2490
|
* @property {boolean | DebugEndpointConfiguration} [debugEndpoint] - Enable the built-in debug endpoint. Defaults to false.
|
|
2462
2491
|
* @property {boolean | ApiManifestConfiguration} [apiManifest] - Enable the built-in API manifest endpoint. Defaults to false.
|
|
2492
|
+
* @property {boolean | McpConfiguration} [mcp] - Enable the built-in MCP endpoint on the HTTP server (JSON-RPC over HTTP in addition to the `velocious mcp` stdio server). Defaults to false.
|
|
2463
2493
|
* @property {string} [directory] - Base directory for the project.
|
|
2464
2494
|
* @property {boolean} [enforceTenantDatabaseScopes] - Require tenant-switched model queries to resolve a tenant database identifier. Defaults to true.
|
|
2465
2495
|
* @property {string} [environment] - Current environment name.
|