@blokjs/trigger-cron 0.2.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CronTrigger.d.ts +2 -2
- package/dist/CronTrigger.js +35 -25
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -8
- package/package.json +4 -4
- package/src/CronTrigger.ts +23 -6
package/dist/CronTrigger.d.ts
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Uses the 'cron' package for cron parsing and scheduling.
|
|
11
11
|
*/
|
|
12
|
-
import type { CronTriggerOpts, HelperResponse } from "@
|
|
13
|
-
import { DefaultLogger, type GlobalOptions,
|
|
12
|
+
import type { CronTriggerOpts, HelperResponse } from "@blokjs/helper";
|
|
13
|
+
import { type BlokService, DefaultLogger, type GlobalOptions, TriggerBase, type TriggerResponse } from "@blokjs/runner";
|
|
14
14
|
import { CronJob } from "cron";
|
|
15
15
|
/**
|
|
16
16
|
* Scheduled job information
|
package/dist/CronTrigger.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* CronTrigger - Scheduled workflow execution based on cron expressions
|
|
4
3
|
*
|
|
@@ -10,19 +9,17 @@
|
|
|
10
9
|
*
|
|
11
10
|
* Uses the 'cron' package for cron parsing and scheduling.
|
|
12
11
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const cron_1 = require("cron");
|
|
18
|
-
const uuid_1 = require("uuid");
|
|
12
|
+
import { DefaultLogger, NodeMap, TriggerBase, } from "@blokjs/runner";
|
|
13
|
+
import { SpanStatusCode, metrics, trace } from "@opentelemetry/api";
|
|
14
|
+
import { CronJob } from "cron";
|
|
15
|
+
import { v4 as uuid } from "uuid";
|
|
19
16
|
/**
|
|
20
17
|
* CronTrigger - Scheduled workflow execution
|
|
21
18
|
*/
|
|
22
|
-
class CronTrigger extends
|
|
19
|
+
export class CronTrigger extends TriggerBase {
|
|
23
20
|
nodeMap = {};
|
|
24
|
-
tracer =
|
|
25
|
-
logger = new
|
|
21
|
+
tracer = trace.getTracer(process.env.PROJECT_NAME || "trigger-cron-workflow", process.env.PROJECT_VERSION || "0.0.1");
|
|
22
|
+
logger = new DefaultLogger();
|
|
26
23
|
jobs = new Map();
|
|
27
24
|
constructor() {
|
|
28
25
|
super();
|
|
@@ -33,7 +30,7 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
33
30
|
* Load nodes into the node map
|
|
34
31
|
*/
|
|
35
32
|
loadNodes() {
|
|
36
|
-
this.nodeMap.nodes = new
|
|
33
|
+
this.nodeMap.nodes = new NodeMap();
|
|
37
34
|
const nodeKeys = Object.keys(this.nodes);
|
|
38
35
|
for (const key of nodeKeys) {
|
|
39
36
|
this.nodeMap.nodes.addNode(key, this.nodes[key]);
|
|
@@ -70,18 +67,23 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
70
67
|
// Create and start cron jobs for each workflow
|
|
71
68
|
for (const workflow of cronWorkflows) {
|
|
72
69
|
const config = workflow.config.trigger?.cron;
|
|
73
|
-
const jobId = `cron-${workflow.path}-${(
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
const jobId = `cron-${workflow.path}-${uuid().slice(0, 8)}`;
|
|
71
|
+
// `CronTriggerOpts` is `z.input<…>` so `timezone` is `string | undefined`
|
|
72
|
+
// even though the schema declares `.default("UTC")`. Apply the
|
|
73
|
+
// default once here so the rest of this method (and the cron lib's
|
|
74
|
+
// constructor) sees a guaranteed string.
|
|
75
|
+
const timezone = config.timezone ?? "UTC";
|
|
76
|
+
this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${timezone})`);
|
|
77
|
+
const job = new CronJob(config.schedule, async () => {
|
|
76
78
|
await this.executeWorkflow(jobId, workflow, config, false);
|
|
77
79
|
}, null, // onComplete
|
|
78
80
|
false, // start
|
|
79
|
-
|
|
81
|
+
timezone);
|
|
80
82
|
const scheduledJob = {
|
|
81
83
|
id: jobId,
|
|
82
84
|
workflowPath: workflow.path,
|
|
83
85
|
schedule: config.schedule,
|
|
84
|
-
timezone
|
|
86
|
+
timezone,
|
|
85
87
|
overlap: config.overlap ?? false,
|
|
86
88
|
running: false,
|
|
87
89
|
nextRun: this.toDate(job.nextDate()),
|
|
@@ -194,11 +196,13 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
194
196
|
this.logger.log(`Skipping ${jobId}: previous execution still running (overlap disabled)`);
|
|
195
197
|
return { ctx: {}, metrics: {} };
|
|
196
198
|
}
|
|
197
|
-
const executionId = (
|
|
199
|
+
const executionId = uuid();
|
|
198
200
|
const lastDate = scheduledJob.job.lastDate();
|
|
199
201
|
const scheduledTime = lastDate ? new Date(lastDate) : new Date();
|
|
200
202
|
const executionTime = new Date();
|
|
201
|
-
|
|
203
|
+
// Apply the schema default — see explanation in `listen()`.
|
|
204
|
+
const timezone = config.timezone ?? "UTC";
|
|
205
|
+
const defaultMeter = metrics.getMeter("default");
|
|
202
206
|
const cronExecutions = defaultMeter.createCounter("cron_executions", {
|
|
203
207
|
description: "Cron job executions",
|
|
204
208
|
});
|
|
@@ -220,7 +224,7 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
220
224
|
scheduledTime,
|
|
221
225
|
executionTime,
|
|
222
226
|
schedule: config.schedule,
|
|
223
|
-
timezone
|
|
227
|
+
timezone,
|
|
224
228
|
manual,
|
|
225
229
|
};
|
|
226
230
|
// Populate request with cron context
|
|
@@ -250,6 +254,13 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
250
254
|
manual: String(manual),
|
|
251
255
|
};
|
|
252
256
|
ctx.logger.log(`Executing cron job: ${jobId} (${manual ? "manual" : "scheduled"})`);
|
|
257
|
+
// v0.6 · apply the merged middleware chain (process-global →
|
|
258
|
+
// workflow-level → trigger-level) before the main workflow
|
|
259
|
+
// body. Lets cron workflows compose auth-check + audit-log
|
|
260
|
+
// chains exactly like HTTP triggers. A throwing middleware
|
|
261
|
+
// propagates to the outer catch and surfaces as a cron job
|
|
262
|
+
// failure.
|
|
263
|
+
await this.applyMiddlewareChain(ctx, this.nodeMap);
|
|
253
264
|
// Execute workflow
|
|
254
265
|
const response = await this.run(ctx);
|
|
255
266
|
const end = performance.now();
|
|
@@ -261,10 +272,10 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
261
272
|
span.setAttribute("job_id", jobId);
|
|
262
273
|
span.setAttribute("workflow_path", workflow.path);
|
|
263
274
|
span.setAttribute("schedule", config.schedule);
|
|
264
|
-
span.setAttribute("timezone",
|
|
275
|
+
span.setAttribute("timezone", timezone);
|
|
265
276
|
span.setAttribute("manual", manual);
|
|
266
277
|
span.setAttribute("elapsed_ms", end - start);
|
|
267
|
-
span.setStatus({ code:
|
|
278
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
268
279
|
// Record metrics
|
|
269
280
|
cronExecutions.add(1, {
|
|
270
281
|
env: process.env.NODE_ENV,
|
|
@@ -281,7 +292,7 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
281
292
|
// Set span error
|
|
282
293
|
span.setAttribute("success", false);
|
|
283
294
|
span.recordException(error);
|
|
284
|
-
span.setStatus({ code:
|
|
295
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
|
|
285
296
|
// Record error metrics
|
|
286
297
|
cronErrors.add(1, {
|
|
287
298
|
env: process.env.NODE_ENV,
|
|
@@ -300,6 +311,5 @@ class CronTrigger extends runner_1.TriggerBase {
|
|
|
300
311
|
});
|
|
301
312
|
}
|
|
302
313
|
}
|
|
303
|
-
|
|
304
|
-
exports.default = CronTrigger;
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvblRyaWdnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ3JvblRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUdILHlDQU9zQjtBQUV0Qiw0Q0FBK0U7QUFDL0UsK0JBQStCO0FBQy9CLCtCQUFrQztBQTREbEM7O0dBRUc7QUFDSCxNQUFzQixXQUFZLFNBQVEsb0JBQVc7SUFDMUMsT0FBTyxHQUFrQixFQUFtQixDQUFDO0lBQ3BDLE1BQU0sR0FBRyxXQUFLLENBQUMsU0FBUyxDQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSx1QkFBdUIsRUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUN0QyxDQUFDO0lBQ2lCLE1BQU0sR0FBRyxJQUFJLHNCQUFhLEVBQUUsQ0FBQztJQUN0QyxJQUFJLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNdEQ7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksZ0JBQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFNB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QUFJLFNBQVM7d0JBQ3BELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUN0QixDQUFDLENBQUM7b0JBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEtBQUssS0FBSyxZQUFZLEVBQUUsRUFBRyxLQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXZGLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFhLEVBQUUsT0FBTyxFQUFFLEVBQWlCLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO3dCQUFTLENBQUM7b0JBQ1YsWUFBWSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRDtBQXRWRCxrQ0FzVkM7QUFFRCxrQkFBZSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyb25UcmlnZ2VyIC0gU2NoZWR1bGVkIHdvcmtmbG93IGV4ZWN1dGlvbiBiYXNlZCBvbiBjcm9uIGV4cHJlc3Npb25zXG4gKlxuICogRXh0ZW5kcyBUcmlnZ2VyQmFzZSB0byBzdXBwb3J0IHNjaGVkdWxlZCB0cmlnZ2VyczpcbiAqIC0gQ3JvbiBleHByZXNzaW9ucyAoZS5nLiwgXCIwICogKiAqICpcIiBmb3IgaG91cmx5KVxuICogLSBUaW1lem9uZS1hd2FyZSBzY2hlZHVsaW5nXG4gKiAtIE92ZXJsYXAgcHJldmVudGlvblxuICogLSBNYW51YWwgdHJpZ2dlciBzdXBwb3J0XG4gKlxuICogVXNlcyB0aGUgJ2Nyb24nIHBhY2thZ2UgZm9yIGNyb24gcGFyc2luZyBhbmQgc2NoZWR1bGluZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENyb25UcmlnZ2VyT3B0cywgSGVscGVyUmVzcG9uc2UgfSBmcm9tIFwiQGJsb2svaGVscGVyXCI7XG5pbXBvcnQge1xuXHREZWZhdWx0TG9nZ2VyLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdHR5cGUgQmxva1NlcnZpY2UsXG5cdE5vZGVNYXAsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcbn0gZnJvbSBcIkBibG9rL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBNZXRyaWNzVHlwZSwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2svc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IENyb25Kb2IgfSBmcm9tIFwiY3JvblwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbi8qKlxuICogU2NoZWR1bGVkIGpvYiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlZEpvYiB7XG5cdC8qKiBVbmlxdWUgam9iIElEICovXG5cdGlkOiBzdHJpbmc7XG5cdC8qKiBXb3JrZmxvdyBwYXRoICovXG5cdHdvcmtmbG93UGF0aDogc3RyaW5nO1xuXHQvKiogQ3JvbiBleHByZXNzaW9uICovXG5cdHNjaGVkdWxlOiBzdHJpbmc7XG5cdC8qKiBUaW1lem9uZSAqL1xuXHR0aW1lem9uZTogc3RyaW5nO1xuXHQvKiogQWxsb3cgb3ZlcmxhcHBpbmcgZXhlY3V0aW9ucyAqL1xuXHRvdmVybGFwOiBib29sZWFuO1xuXHQvKiogV2hldGhlciB0aGUgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nICovXG5cdHJ1bm5pbmc6IGJvb2xlYW47XG5cdC8qKiBMYXN0IGV4ZWN1dGlvbiB0aW1lICovXG5cdGxhc3RSdW4/OiBEYXRlO1xuXHQvKiogTmV4dCBzY2hlZHVsZWQgdGltZSAqL1xuXHRuZXh0UnVuPzogRGF0ZTtcblx0LyoqIEludGVybmFsIENyb25Kb2IgaW5zdGFuY2UgKi9cblx0am9iOiBDcm9uSm9iO1xufVxuXG4vKipcbiAqIEV4ZWN1dGlvbiBjb250ZXh0IHBhc3NlZCB0byB0aGUgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcm9uRXhlY3V0aW9uQ29udGV4dCB7XG5cdC8qKiBKb2IgSUQgKi9cblx0am9iSWQ6IHN0cmluZztcblx0LyoqIFNjaGVkdWxlZCB0aW1lICh3aGVuIGl0IHdhcyBzdXBwb3NlZCB0byBydW4pICovXG5cdHNjaGVkdWxlZFRpbWU6IERhdGU7XG5cdC8qKiBBY3R1YWwgZXhlY3V0aW9uIHRpbWUgKi9cblx0ZXhlY3V0aW9uVGltZTogRGF0ZTtcblx0LyoqIENyb24gZXhwcmVzc2lvbiAqL1xuXHRzY2hlZHVsZTogc3RyaW5nO1xuXHQvKiogVGltZXpvbmUgKi9cblx0dGltZXpvbmU6IHN0cmluZztcblx0LyoqIFdoZXRoZXIgdGhpcyBpcyBhIG1hbnVhbCB0cmlnZ2VyICovXG5cdG1hbnVhbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBtb2RlbCB3aXRoIGNyb24gdHJpZ2dlciBjb25maWd1cmF0aW9uXG4gKi9cbmludGVyZmFjZSBDcm9uV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0Y3Jvbj86IENyb25UcmlnZ2VyT3B0cztcblx0XHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdFx0fTtcblx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHR9O1xufVxuXG4vKipcbiAqIENyb25UcmlnZ2VyIC0gU2NoZWR1bGVkIHdvcmtmbG93IGV4ZWN1dGlvblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3JvblRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyQmFzZSB7XG5cdHByb3RlY3RlZCBub2RlTWFwOiBHbG9iYWxPcHRpb25zID0ge30gYXMgR2xvYmFsT3B0aW9ucztcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNlciA9IHRyYWNlLmdldFRyYWNlcihcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgfHwgXCJ0cmlnZ2VyLWNyb24td29ya2Zsb3dcIixcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX1ZFUlNJT04gfHwgXCIwLjAuMVwiLFxuXHQpO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcblx0cHJvdGVjdGVkIGpvYnM6IE1hcDxzdHJpbmcsIFNjaGVkdWxlZEpvYj4gPSBuZXcgTWFwKCk7XG5cblx0Ly8gU3ViY2xhc3NlcyBwcm92aWRlIHRoZXNlXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBub2RlczogUmVjb3JkPHN0cmluZywgQmxva1NlcnZpY2U8dW5rbm93bj4+O1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBIZWxwZXJSZXNwb25zZT47XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxvYWROb2RlcygpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgbm9kZXMgaW50byB0aGUgbm9kZSBtYXBcblx0ICovXG5cdGxvYWROb2RlcygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAubm9kZXMgPSBuZXcgTm9kZU1hcCgpO1xuXHRcdGNvbnN0IG5vZGVLZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2Ygbm9kZUtleXMpIHtcblx0XHRcdHRoaXMubm9kZU1hcC5ub2Rlcy5hZGROb2RlKGtleSwgdGhpcy5ub2Rlc1trZXldKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB3b3JrZmxvd3MgaW50byB0aGUgd29ya2Zsb3cgbWFwXG5cdCAqL1xuXHRsb2FkV29ya2Zsb3dzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC53b3JrZmxvd3MgPSB0aGlzLndvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGNyb24gRGF0ZVRpbWUgdG8gRGF0ZVxuXHQgKiBUaGUgY3JvbiBwYWNrYWdlIHVzZXMgbHV4b24gRGF0ZVRpbWUgd2hpY2ggaGFzIHRvSlNEYXRlKClcblx0ICovXG5cdHByb3RlY3RlZCB0b0RhdGUoZGF0ZVRpbWU6IHVua25vd24pOiBEYXRlIHtcblx0XHRpZiAoZGF0ZVRpbWUgJiYgdHlwZW9mIGRhdGVUaW1lID09PSBcIm9iamVjdFwiICYmIFwidG9KU0RhdGVcIiBpbiBkYXRlVGltZSkge1xuXHRcdFx0cmV0dXJuIChkYXRlVGltZSBhcyB7IHRvSlNEYXRlOiAoKSA9PiBEYXRlIH0pLnRvSlNEYXRlKCk7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRlVGltZSBpbnN0YW5jZW9mIERhdGUgPyBkYXRlVGltZSA6IG5ldyBEYXRlKGRhdGVUaW1lIGFzIHN0cmluZyB8IG51bWJlcik7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIGNyb24gc2NoZWR1bGVyIC0gbWFpbiBlbnRyeSBwb2ludFxuXHQgKi9cblx0YXN5bmMgbGlzdGVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGhpcy5zdGFydENvdW50ZXIoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBGaW5kIGFsbCB3b3JrZmxvd3Mgd2l0aCBjcm9uIHRyaWdnZXJzXG5cdFx0XHRjb25zdCBjcm9uV29ya2Zsb3dzID0gdGhpcy5nZXRDcm9uV29ya2Zsb3dzKCk7XG5cblx0XHRcdGlmIChjcm9uV29ya2Zsb3dzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXCJObyB3b3JrZmxvd3Mgd2l0aCBjcm9uIHRyaWdnZXJzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBhbmQgc3RhcnQgY3JvbiBqb2JzIGZvciBlYWNoIHdvcmtmbG93XG5cdFx0XHRmb3IgKGNvbnN0IHdvcmtmbG93IG9mIGNyb25Xb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LmNyb24gYXMgQ3JvblRyaWdnZXJPcHRzO1xuXHRcdFx0XHRjb25zdCBqb2JJZCA9IGBjcm9uLSR7d29ya2Zsb3cucGF0aH0tJHt1dWlkKCkuc2xpY2UoMCwgOCl9YDtcblxuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFNjaGVkdWxpbmcgd29ya2Zsb3c6ICR7d29ya2Zsb3cucGF0aH0gd2l0aCBzY2hlZHVsZTogJHtjb25maWcuc2NoZWR1bGV9ICgke2NvbmZpZy50aW1lem9uZX0pYCk7XG5cblx0XHRcdFx0Y29uc3Qgam9iID0gbmV3IENyb25Kb2IoXG5cdFx0XHRcdFx0Y29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVdvcmtmbG93KGpvYklkLCB3b3JrZmxvdywgY29uZmlnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLCAvLyBvbkNvbXBsZXRlXG5cdFx0XHRcdFx0ZmFsc2UsIC8vIHN0YXJ0XG5cdFx0XHRcdFx0Y29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IHNjaGVkdWxlZEpvYjogU2NoZWR1bGVkSm9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2JJZCxcblx0XHRcdFx0XHR3b3JrZmxvd1BhdGg6IHdvcmtmbG93LnBhdGgsXG5cdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHR0aW1lem9uZTogY29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHRcdG92ZXJsYXA6IGNvbmZpZy5vdmVybGFwID8/IGZhbHNlLFxuXHRcdFx0XHRcdHJ1bm5pbmc6IGZhbHNlLFxuXHRcdFx0XHRcdG5leHRSdW46IHRoaXMudG9EYXRlKGpvYi5uZXh0RGF0ZSgpKSxcblx0XHRcdFx0XHRqb2IsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5qb2JzLnNldChqb2JJZCwgc2NoZWR1bGVkSm9iKTtcblxuXHRcdFx0XHQvLyBTdGFydCB0aGUgam9iXG5cdFx0XHRcdGpvYi5zdGFydCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYEpvYiAke2pvYklkfSBzdGFydGVkLiBOZXh0IHJ1bjogJHtzY2hlZHVsZWRKb2IubmV4dFJ1bn1gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDcm9uIHRyaWdnZXIgc3RhcnRlZC4gJHt0aGlzLmpvYnMuc2l6ZX0gam9iKHMpIHNjaGVkdWxlZGApO1xuXG5cdFx0XHQvLyBFbmFibGUgSE1SIGluIGRldmVsb3BtZW50IG1vZGVcblx0XHRcdGlmIChwcm9jZXNzLmVudi5CTE9LX0hNUiA9PT0gXCJ0cnVlXCIgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVuYWJsZUhvdFJlbG9hZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgY3JvbiB0cmlnZ2VyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9wIGFsbCBjcm9uIGpvYnNcblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCBbam9iSWQsIHNjaGVkdWxlZEpvYl0gb2YgdGhpcy5qb2JzKSB7XG5cdFx0XHRzY2hlZHVsZWRKb2Iuam9iLnN0b3AoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgSm9iICR7am9iSWR9IHN0b3BwZWRgKTtcblx0XHR9XG5cdFx0dGhpcy5qb2JzLmNsZWFyKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiQ3JvbiB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBDcm9uIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW51YWxseSB0cmlnZ2VyIGEgc3BlY2lmaWMgam9iXG5cdCAqL1xuXHRhc3luYyB0cmlnZ2VySm9iKGpvYklkOiBzdHJpbmcpOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZSB8IG51bGw+IHtcblx0XHRjb25zdCBzY2hlZHVsZWRKb2IgPSB0aGlzLmpvYnMuZ2V0KGpvYklkKTtcblx0XHRpZiAoIXNjaGVkdWxlZEpvYikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEpvYiBub3QgZm91bmQ6ICR7am9iSWR9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHdvcmtmbG93XG5cdFx0Y29uc3Qgd29ya2Zsb3cgPSB0aGlzLmdldFdvcmtmbG93QnlQYXRoKHNjaGVkdWxlZEpvYi53b3JrZmxvd1BhdGgpO1xuXHRcdGlmICghd29ya2Zsb3cpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBXb3JrZmxvdyBub3QgZm91bmQ6ICR7c2NoZWR1bGVkSm9iLndvcmtmbG93UGF0aH1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbmZpZyA9IHdvcmtmbG93LmNvbmZpZy50cmlnZ2VyPy5jcm9uIGFzIENyb25UcmlnZ2VyT3B0cztcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRlV29ya2Zsb3coam9iSWQsIHdvcmtmbG93LCBjb25maWcsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgc2NoZWR1bGVkIGpvYnNcblx0ICovXG5cdGdldEpvYnMoKTogU2NoZWR1bGVkSm9iW10ge1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuam9icy52YWx1ZXMoKSkubWFwKChqb2IpID0+ICh7XG5cdFx0XHQuLi5qb2IsXG5cdFx0XHRuZXh0UnVuOiB0aGlzLnRvRGF0ZShqb2Iuam9iLm5leHREYXRlKCkpLFxuXHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgY3JvbiB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldENyb25Xb3JrZmxvd3MoKTogQ3JvbldvcmtmbG93TW9kZWxbXSB7XG5cdFx0Y29uc3Qgd29ya2Zsb3dzOiBDcm9uV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdGNvbnN0IHdvcmtmbG93Q29uZmlnID0gKHdvcmtmbG93IGFzIHVua25vd24gYXMgeyBfY29uZmlnOiBDcm9uV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHRpZiAod29ya2Zsb3dDb25maWc/LnRyaWdnZXIpIHtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlclR5cGUgPSBPYmplY3Qua2V5cyh3b3JrZmxvd0NvbmZpZy50cmlnZ2VyKVswXTtcblxuXHRcdFx0XHRpZiAodHJpZ2dlclR5cGUgPT09IFwiY3JvblwiICYmIHdvcmtmbG93Q29uZmlnLnRyaWdnZXIuY3Jvbikge1xuXHRcdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgd29ya2Zsb3cgYnkgcGF0aFxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFdvcmtmbG93QnlQYXRoKHBhdGg6IHN0cmluZyk6IENyb25Xb3JrZmxvd01vZGVsIHwgbnVsbCB7XG5cdFx0Y29uc3Qgd29ya2Zsb3cgPSB0aGlzLm5vZGVNYXAud29ya2Zsb3dzPy5bcGF0aF07XG5cdFx0aWYgKCF3b3JrZmxvdykgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogQ3JvbldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0aCxcblx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgd29ya2Zsb3dcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBleGVjdXRlV29ya2Zsb3coXG5cdFx0am9iSWQ6IHN0cmluZyxcblx0XHR3b3JrZmxvdzogQ3JvbldvcmtmbG93TW9kZWwsXG5cdFx0Y29uZmlnOiBDcm9uVHJpZ2dlck9wdHMsXG5cdFx0bWFudWFsOiBib29sZWFuLFxuXHQpOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4ge1xuXHRcdGNvbnN0IHNjaGVkdWxlZEpvYiA9IHRoaXMuam9icy5nZXQoam9iSWQpO1xuXHRcdGlmICghc2NoZWR1bGVkSm9iKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEpvYiBub3QgZm91bmQ6ICR7am9iSWR9YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIG92ZXJsYXBcblx0XHRpZiAoc2NoZWR1bGVkSm9iLnJ1bm5pbmcgJiYgIXNjaGVkdWxlZEpvYi5vdmVybGFwKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFNraXBwaW5nICR7am9iSWR9OiBwcmV2aW91cyBleGVjdXRpb24gc3RpbGwgcnVubmluZyAob3ZlcmxhcCBkaXNhYmxlZClgKTtcblx0XHRcdHJldHVybiB7IGN0eDoge30gYXMgQ29udGV4dCwgbWV0cmljczoge30gYXMgTWV0cmljc1R5cGUgfTtcblx0XHR9XG5cblx0XHRjb25zdCBleGVjdXRpb25JZCA9IHV1aWQoKTtcblx0XHRjb25zdCBsYXN0RGF0ZSA9IHNjaGVkdWxlZEpvYi5qb2IubGFzdERhdGUoKTtcblx0XHRjb25zdCBzY2hlZHVsZWRUaW1lID0gbGFzdERhdGUgPyBuZXcgRGF0ZShsYXN0RGF0ZSBhcyB1bmtub3duIGFzIHN0cmluZyB8IG51bWJlcikgOiBuZXcgRGF0ZSgpO1xuXHRcdGNvbnN0IGV4ZWN1dGlvblRpbWUgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdE1ldGVyID0gbWV0cmljcy5nZXRNZXRlcihcImRlZmF1bHRcIik7XG5cdFx0Y29uc3QgY3JvbkV4ZWN1dGlvbnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcImNyb25fZXhlY3V0aW9uc1wiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJDcm9uIGpvYiBleGVjdXRpb25zXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3QgY3JvbkVycm9ycyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwiY3Jvbl9lcnJvcnNcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiQ3JvbiBqb2IgZXhlY3V0aW9uIGVycm9yc1wiLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLnRyYWNlci5zdGFydEFjdGl2ZVNwYW4oYGNyb246JHt3b3JrZmxvdy5wYXRofWAsIGFzeW5jIChzcGFuOiBTcGFuKSA9PiB7XG5cdFx0XHRcdHNjaGVkdWxlZEpvYi5ydW5uaW5nID0gdHJ1ZTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2Zsb3dcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHRcblx0XHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBleGVjdXRpb25JZCk7XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHRcblx0XHRcdFx0XHRjb25zdCBjcm9uQ29udGV4dDogQ3JvbkV4ZWN1dGlvbkNvbnRleHQgPSB7XG5cdFx0XHRcdFx0XHRqb2JJZCxcblx0XHRcdFx0XHRcdHNjaGVkdWxlZFRpbWUsXG5cdFx0XHRcdFx0XHRleGVjdXRpb25UaW1lLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdHRpbWV6b25lOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRtYW51YWwsXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIFBvcHVsYXRlIHJlcXVlc3Qgd2l0aCBjcm9uIGNvbnRleHRcblx0XHRcdFx0XHRjdHgucmVxdWVzdCA9IHtcblx0XHRcdFx0XHRcdGJvZHk6IGNyb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi1qb2ItaWRcIjogam9iSWQsXG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLXNjaGVkdWxlXCI6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdFx0XCJ4LWNyb24tdGltZXpvbmVcIjogY29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi1tYW51YWxcIjogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0XHRcdGpvYklkLFxuXHRcdFx0XHRcdFx0XHRzY2hlZHVsZTogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjcm9uIGNvbnRleHQgaW4gdmFyc1xuXHRcdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdFx0Y3R4LnZhcnMuX2Nyb25fY29udGV4dCA9IHtcblx0XHRcdFx0XHRcdGpvYklkLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGVkVGltZTogc2NoZWR1bGVkVGltZS50b0lTT1N0cmluZygpLFxuXHRcdFx0XHRcdFx0ZXhlY3V0aW9uVGltZTogZXhlY3V0aW9uVGltZS50b0lTT1N0cmluZygpLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdHRpbWV6b25lOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgRXhlY3V0aW5nIGNyb24gam9iOiAke2pvYklkfSAoJHttYW51YWwgPyBcIm1hbnVhbFwiIDogXCJzY2hlZHVsZWRcIn0pYCk7XG5cblx0XHRcdFx0XHQvLyBFeGVjdXRlIHdvcmtmbG93XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2U6IFRyaWdnZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKGN0eCk7XG5cdFx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgam9iIHN0YXRlXG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLmxhc3RSdW4gPSBleGVjdXRpb25UaW1lO1xuXHRcdFx0XHRcdHNjaGVkdWxlZEpvYi5uZXh0UnVuID0gdGhpcy50b0RhdGUoc2NoZWR1bGVkSm9iLmpvYi5uZXh0RGF0ZSgpKTtcblxuXHRcdFx0XHRcdC8vIFNldCBzcGFuIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJqb2JfaWRcIiwgam9iSWQpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid29ya2Zsb3dfcGF0aFwiLCB3b3JrZmxvdy5wYXRoKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInNjaGVkdWxlXCIsIGNvbmZpZy5zY2hlZHVsZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ0aW1lem9uZVwiLCBjb25maWcudGltZXpvbmUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwibWFudWFsXCIsIG1hbnVhbCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJlbGFwc2VkX21zXCIsIGVuZCAtIHN0YXJ0KTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuXG5cdFx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0XHRjcm9uRXhlY3V0aW9ucy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdGpvYl9pZDogam9iSWQsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRcdG1hbnVhbDogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBDcm9uIGpvYiBjb21wbGV0ZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7am9iSWR9YCk7XG5cblx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0XHQvLyBTZXQgc3BhbiBlcnJvclxuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSB9KTtcblxuXHRcdFx0XHRcdC8vIFJlY29yZCBlcnJvciBtZXRyaWNzXG5cdFx0XHRcdFx0Y3JvbkVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdGpvYl9pZDogam9iSWQsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENyb24gam9iIGZhaWxlZCAke2pvYklkfTogJHtlcnJvck1lc3NhZ2V9YCwgKGVycm9yIGFzIEVycm9yKS5zdGFjayk7XG5cblx0XHRcdFx0XHRyZXNvbHZlKHsgY3R4OiB7fSBhcyBDb250ZXh0LCBtZXRyaWNzOiB7fSBhcyBNZXRyaWNzVHlwZSB9KTtcblx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRzY2hlZHVsZWRKb2IucnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHNwYW4uZW5kKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb25UcmlnZ2VyO1xuIl19
|
|
314
|
+
export default CronTrigger;
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvblRyaWdnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ3JvblRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUdILE9BQU8sRUFFTixhQUFhLEVBRWIsT0FBTyxFQUNQLFdBQVcsR0FFWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBYSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUE0RGxDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFZLFNBQVEsV0FBVztJQUMxQyxPQUFPLEdBQWtCLEVBQW1CLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHVCQUF1QixFQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQ3RDLENBQUM7SUFDaUIsTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDdEMsSUFBSSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBTXREO1FBQ0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7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QUFDO29CQUNoQixNQUFNLFlBQVksR0FBSSxLQUFlLENBQUMsT0FBTyxDQUFDO29CQUU5QyxpQkFBaUI7b0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQWMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7b0JBRXRFLHVCQUF1QjtvQkFDdkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ2pCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7d0JBQ3pCLE1BQU0sRUFBRSxLQUFLO3dCQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxTQUFTO3dCQUNwRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztxQkFDdEIsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixLQUFLLEtBQUssWUFBWSxFQUFFLEVBQUcsS0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUV2RixPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDN0QsQ0FBQzt3QkFBUyxDQUFDO29CQUNWLFlBQVksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFFRCxlQUFlLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JvblRyaWdnZXIgLSBTY2hlZHVsZWQgd29ya2Zsb3cgZXhlY3V0aW9uIGJhc2VkIG9uIGNyb24gZXhwcmVzc2lvbnNcbiAqXG4gKiBFeHRlbmRzIFRyaWdnZXJCYXNlIHRvIHN1cHBvcnQgc2NoZWR1bGVkIHRyaWdnZXJzOlxuICogLSBDcm9uIGV4cHJlc3Npb25zIChlLmcuLCBcIjAgKiAqICogKlwiIGZvciBob3VybHkpXG4gKiAtIFRpbWV6b25lLWF3YXJlIHNjaGVkdWxpbmdcbiAqIC0gT3ZlcmxhcCBwcmV2ZW50aW9uXG4gKiAtIE1hbnVhbCB0cmlnZ2VyIHN1cHBvcnRcbiAqXG4gKiBVc2VzIHRoZSAnY3JvbicgcGFja2FnZSBmb3IgY3JvbiBwYXJzaW5nIGFuZCBzY2hlZHVsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ3JvblRyaWdnZXJPcHRzLCBIZWxwZXJSZXNwb25zZSB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0dHlwZSBCbG9rU2VydmljZSxcblx0RGVmYXVsdExvZ2dlcixcblx0dHlwZSBHbG9iYWxPcHRpb25zLFxuXHROb2RlTWFwLFxuXHRUcmlnZ2VyQmFzZSxcblx0dHlwZSBUcmlnZ2VyUmVzcG9uc2UsXG59IGZyb20gXCJAYmxva2pzL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBNZXRyaWNzVHlwZSwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2tqcy9zaGFyZWRcIjtcbmltcG9ydCB7IHR5cGUgU3BhbiwgU3BhblN0YXR1c0NvZGUsIG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgQ3JvbkpvYiB9IGZyb20gXCJjcm9uXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcblxuLyoqXG4gKiBTY2hlZHVsZWQgam9iIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVkSm9iIHtcblx0LyoqIFVuaXF1ZSBqb2IgSUQgKi9cblx0aWQ6IHN0cmluZztcblx0LyoqIFdvcmtmbG93IHBhdGggKi9cblx0d29ya2Zsb3dQYXRoOiBzdHJpbmc7XG5cdC8qKiBDcm9uIGV4cHJlc3Npb24gKi9cblx0c2NoZWR1bGU6IHN0cmluZztcblx0LyoqIFRpbWV6b25lICovXG5cdHRpbWV6b25lOiBzdHJpbmc7XG5cdC8qKiBBbGxvdyBvdmVybGFwcGluZyBleGVjdXRpb25zICovXG5cdG92ZXJsYXA6IGJvb2xlYW47XG5cdC8qKiBXaGV0aGVyIHRoZSBqb2IgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi9cblx0cnVubmluZzogYm9vbGVhbjtcblx0LyoqIExhc3QgZXhlY3V0aW9uIHRpbWUgKi9cblx0bGFzdFJ1bj86IERhdGU7XG5cdC8qKiBOZXh0IHNjaGVkdWxlZCB0aW1lICovXG5cdG5leHRSdW4/OiBEYXRlO1xuXHQvKiogSW50ZXJuYWwgQ3JvbkpvYiBpbnN0YW5jZSAqL1xuXHRqb2I6IENyb25Kb2I7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25FeGVjdXRpb25Db250ZXh0IHtcblx0LyoqIEpvYiBJRCAqL1xuXHRqb2JJZDogc3RyaW5nO1xuXHQvKiogU2NoZWR1bGVkIHRpbWUgKHdoZW4gaXQgd2FzIHN1cHBvc2VkIHRvIHJ1bikgKi9cblx0c2NoZWR1bGVkVGltZTogRGF0ZTtcblx0LyoqIEFjdHVhbCBleGVjdXRpb24gdGltZSAqL1xuXHRleGVjdXRpb25UaW1lOiBEYXRlO1xuXHQvKiogQ3JvbiBleHByZXNzaW9uICovXG5cdHNjaGVkdWxlOiBzdHJpbmc7XG5cdC8qKiBUaW1lem9uZSAqL1xuXHR0aW1lem9uZTogc3RyaW5nO1xuXHQvKiogV2hldGhlciB0aGlzIGlzIGEgbWFudWFsIHRyaWdnZXIgKi9cblx0bWFudWFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdvcmtmbG93IG1vZGVsIHdpdGggY3JvbiB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuaW50ZXJmYWNlIENyb25Xb3JrZmxvd01vZGVsIHtcblx0cGF0aDogc3RyaW5nO1xuXHRjb25maWc6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0dmVyc2lvbjogc3RyaW5nO1xuXHRcdHRyaWdnZXI/OiB7XG5cdFx0XHRjcm9uPzogQ3JvblRyaWdnZXJPcHRzO1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdH07XG59XG5cbi8qKlxuICogQ3JvblRyaWdnZXIgLSBTY2hlZHVsZWQgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcm9uVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItY3Jvbi13b3JrZmxvd1wiLFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfVkVSU0lPTiB8fCBcIjAuMC4xXCIsXG5cdCk7XG5cdHByb3RlY3RlZCByZWFkb25seSBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuXHRwcm90ZWN0ZWQgam9iczogTWFwPHN0cmluZywgU2NoZWR1bGVkSm9iPiA9IG5ldyBNYXAoKTtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBub2RlcyBpbnRvIHRoZSBub2RlIG1hcFxuXHQgKi9cblx0bG9hZE5vZGVzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC5ub2RlcyA9IG5ldyBOb2RlTWFwKCk7XG5cdFx0Y29uc3Qgbm9kZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBub2RlS2V5cykge1xuXHRcdFx0dGhpcy5ub2RlTWFwLm5vZGVzLmFkZE5vZGUoa2V5LCB0aGlzLm5vZGVzW2tleV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHdvcmtmbG93cyBpbnRvIHRoZSB3b3JrZmxvdyBtYXBcblx0ICovXG5cdGxvYWRXb3JrZmxvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLndvcmtmbG93cyA9IHRoaXMud29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgY3JvbiBEYXRlVGltZSB0byBEYXRlXG5cdCAqIFRoZSBjcm9uIHBhY2thZ2UgdXNlcyBsdXhvbiBEYXRlVGltZSB3aGljaCBoYXMgdG9KU0RhdGUoKVxuXHQgKi9cblx0cHJvdGVjdGVkIHRvRGF0ZShkYXRlVGltZTogdW5rbm93bik6IERhdGUge1xuXHRcdGlmIChkYXRlVGltZSAmJiB0eXBlb2YgZGF0ZVRpbWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0b0pTRGF0ZVwiIGluIGRhdGVUaW1lKSB7XG5cdFx0XHRyZXR1cm4gKGRhdGVUaW1lIGFzIHsgdG9KU0RhdGU6ICgpID0+IERhdGUgfSkudG9KU0RhdGUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRhdGVUaW1lIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVUaW1lIDogbmV3IERhdGUoZGF0ZVRpbWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgY3JvbiBzY2hlZHVsZXIgLSBtYWluIGVudHJ5IHBvaW50XG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTxudW1iZXI+IHtcblx0XHRjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEZpbmQgYWxsIHdvcmtmbG93cyB3aXRoIGNyb24gdHJpZ2dlcnNcblx0XHRcdGNvbnN0IGNyb25Xb3JrZmxvd3MgPSB0aGlzLmdldENyb25Xb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKGNyb25Xb3JrZmxvd3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcIk5vIHdvcmtmbG93cyB3aXRoIGNyb24gdHJpZ2dlcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3JlYXRlIGFuZCBzdGFydCBjcm9uIGpvYnMgZm9yIGVhY2ggd29ya2Zsb3dcblx0XHRcdGZvciAoY29uc3Qgd29ya2Zsb3cgb2YgY3JvbldvcmtmbG93cykge1xuXHRcdFx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8uY3JvbiBhcyBDcm9uVHJpZ2dlck9wdHM7XG5cdFx0XHRcdGNvbnN0IGpvYklkID0gYGNyb24tJHt3b3JrZmxvdy5wYXRofS0ke3V1aWQoKS5zbGljZSgwLCA4KX1gO1xuXG5cdFx0XHRcdC8vIGBDcm9uVHJpZ2dlck9wdHNgIGlzIGB6LmlucHV0POKApj5gIHNvIGB0aW1lem9uZWAgaXMgYHN0cmluZyB8IHVuZGVmaW5lZGBcblx0XHRcdFx0Ly8gZXZlbiB0aG91Z2ggdGhlIHNjaGVtYSBkZWNsYXJlcyBgLmRlZmF1bHQoXCJVVENcIilgLiBBcHBseSB0aGVcblx0XHRcdFx0Ly8gZGVmYXVsdCBvbmNlIGhlcmUgc28gdGhlIHJlc3Qgb2YgdGhpcyBtZXRob2QgKGFuZCB0aGUgY3JvbiBsaWInc1xuXHRcdFx0XHQvLyBjb25zdHJ1Y3Rvcikgc2VlcyBhIGd1YXJhbnRlZWQgc3RyaW5nLlxuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IGNvbmZpZy50aW1lem9uZSA/PyBcIlVUQ1wiO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgU2NoZWR1bGluZyB3b3JrZmxvdzogJHt3b3JrZmxvdy5wYXRofSB3aXRoIHNjaGVkdWxlOiAke2NvbmZpZy5zY2hlZHVsZX0gKCR7dGltZXpvbmV9KWApO1xuXG5cdFx0XHRcdGNvbnN0IGpvYiA9IG5ldyBDcm9uSm9iKFxuXHRcdFx0XHRcdGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVXb3JrZmxvdyhqb2JJZCwgd29ya2Zsb3csIGNvbmZpZywgZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCwgLy8gb25Db21wbGV0ZVxuXHRcdFx0XHRcdGZhbHNlLCAvLyBzdGFydFxuXHRcdFx0XHRcdHRpbWV6b25lLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IHNjaGVkdWxlZEpvYjogU2NoZWR1bGVkSm9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2JJZCxcblx0XHRcdFx0XHR3b3JrZmxvd1BhdGg6IHdvcmtmbG93LnBhdGgsXG5cdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHR0aW1lem9uZSxcblx0XHRcdFx0XHRvdmVybGFwOiBjb25maWcub3ZlcmxhcCA/PyBmYWxzZSxcblx0XHRcdFx0XHRydW5uaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRuZXh0UnVuOiB0aGlzLnRvRGF0ZShqb2IubmV4dERhdGUoKSksXG5cdFx0XHRcdFx0am9iLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuam9icy5zZXQoam9iSWQsIHNjaGVkdWxlZEpvYik7XG5cblx0XHRcdFx0Ly8gU3RhcnQgdGhlIGpvYlxuXHRcdFx0XHRqb2Iuc3RhcnQoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBKb2IgJHtqb2JJZH0gc3RhcnRlZC4gTmV4dCBydW46ICR7c2NoZWR1bGVkSm9iLm5leHRSdW59YCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ3JvbiB0cmlnZ2VyIHN0YXJ0ZWQuICR7dGhpcy5qb2JzLnNpemV9IGpvYihzKSBzY2hlZHVsZWRgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IGNyb24gdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBhbGwgY3JvbiBqb2JzXG5cdCAqL1xuXHRhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGZvciAoY29uc3QgW2pvYklkLCBzY2hlZHVsZWRKb2JdIG9mIHRoaXMuam9icykge1xuXHRcdFx0c2NoZWR1bGVkSm9iLmpvYi5zdG9wKCk7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYEpvYiAke2pvYklkfSBzdG9wcGVkYCk7XG5cdFx0fVxuXHRcdHRoaXMuam9icy5jbGVhcigpO1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIkNyb24gdHJpZ2dlciBzdG9wcGVkXCIpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSG1yV29ya2Zsb3dDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiW0hNUl0gQ3JvbiB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFudWFsbHkgdHJpZ2dlciBhIHNwZWNpZmljIGpvYlxuXHQgKi9cblx0YXN5bmMgdHJpZ2dlckpvYihqb2JJZDogc3RyaW5nKTogUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2UgfCBudWxsPiB7XG5cdFx0Y29uc3Qgc2NoZWR1bGVkSm9iID0gdGhpcy5qb2JzLmdldChqb2JJZCk7XG5cdFx0aWYgKCFzY2hlZHVsZWRKb2IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBKb2Igbm90IGZvdW5kOiAke2pvYklkfWApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRoZSB3b3JrZmxvd1xuXHRcdGNvbnN0IHdvcmtmbG93ID0gdGhpcy5nZXRXb3JrZmxvd0J5UGF0aChzY2hlZHVsZWRKb2Iud29ya2Zsb3dQYXRoKTtcblx0XHRpZiAoIXdvcmtmbG93KSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgV29ya2Zsb3cgbm90IGZvdW5kOiAke3NjaGVkdWxlZEpvYi53b3JrZmxvd1BhdGh9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8uY3JvbiBhcyBDcm9uVHJpZ2dlck9wdHM7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZVdvcmtmbG93KGpvYklkLCB3b3JrZmxvdywgY29uZmlnLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHNjaGVkdWxlZCBqb2JzXG5cdCAqL1xuXHRnZXRKb2JzKCk6IFNjaGVkdWxlZEpvYltdIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmpvYnMudmFsdWVzKCkpLm1hcCgoam9iKSA9PiAoe1xuXHRcdFx0Li4uam9iLFxuXHRcdFx0bmV4dFJ1bjogdGhpcy50b0RhdGUoam9iLmpvYi5uZXh0RGF0ZSgpKSxcblx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIGNyb24gdHJpZ2dlcnNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRDcm9uV29ya2Zsb3dzKCk6IENyb25Xb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogQ3JvbldvcmtmbG93TW9kZWxbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBbcGF0aCwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubm9kZU1hcC53b3JrZmxvd3MgfHwge30pKSB7XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogQ3JvbldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblxuXHRcdFx0aWYgKHdvcmtmbG93Q29uZmlnPy50cmlnZ2VyKSB7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJUeXBlID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcudHJpZ2dlcilbMF07XG5cblx0XHRcdFx0aWYgKHRyaWdnZXJUeXBlID09PSBcImNyb25cIiAmJiB3b3JrZmxvd0NvbmZpZy50cmlnZ2VyLmNyb24pIHtcblx0XHRcdFx0XHR3b3JrZmxvd3MucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiB3b3JrZmxvd0NvbmZpZyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHdvcmtmbG93IGJ5IHBhdGhcblx0ICovXG5cdHByb3RlY3RlZCBnZXRXb3JrZmxvd0J5UGF0aChwYXRoOiBzdHJpbmcpOiBDcm9uV29ya2Zsb3dNb2RlbCB8IG51bGwge1xuXHRcdGNvbnN0IHdvcmtmbG93ID0gdGhpcy5ub2RlTWFwLndvcmtmbG93cz8uW3BhdGhdO1xuXHRcdGlmICghd29ya2Zsb3cpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3Qgd29ya2Zsb3dDb25maWcgPSAod29ya2Zsb3cgYXMgdW5rbm93biBhcyB7IF9jb25maWc6IENyb25Xb3JrZmxvd01vZGVsW1wiY29uZmlnXCJdIH0pLl9jb25maWc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdGgsXG5cdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHdvcmtmbG93XG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgZXhlY3V0ZVdvcmtmbG93KFxuXHRcdGpvYklkOiBzdHJpbmcsXG5cdFx0d29ya2Zsb3c6IENyb25Xb3JrZmxvd01vZGVsLFxuXHRcdGNvbmZpZzogQ3JvblRyaWdnZXJPcHRzLFxuXHRcdG1hbnVhbDogYm9vbGVhbixcblx0KTogUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2U+IHtcblx0XHRjb25zdCBzY2hlZHVsZWRKb2IgPSB0aGlzLmpvYnMuZ2V0KGpvYklkKTtcblx0XHRpZiAoIXNjaGVkdWxlZEpvYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBKb2Igbm90IGZvdW5kOiAke2pvYklkfWApO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBvdmVybGFwXG5cdFx0aWYgKHNjaGVkdWxlZEpvYi5ydW5uaW5nICYmICFzY2hlZHVsZWRKb2Iub3ZlcmxhcCkge1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBTa2lwcGluZyAke2pvYklkfTogcHJldmlvdXMgZXhlY3V0aW9uIHN0aWxsIHJ1bm5pbmcgKG92ZXJsYXAgZGlzYWJsZWQpYCk7XG5cdFx0XHRyZXR1cm4geyBjdHg6IHt9IGFzIENvbnRleHQsIG1ldHJpY3M6IHt9IGFzIE1ldHJpY3NUeXBlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXhlY3V0aW9uSWQgPSB1dWlkKCk7XG5cdFx0Y29uc3QgbGFzdERhdGUgPSBzY2hlZHVsZWRKb2Iuam9iLmxhc3REYXRlKCk7XG5cdFx0Y29uc3Qgc2NoZWR1bGVkVGltZSA9IGxhc3REYXRlID8gbmV3IERhdGUobGFzdERhdGUgYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXIpIDogbmV3IERhdGUoKTtcblx0XHRjb25zdCBleGVjdXRpb25UaW1lID0gbmV3IERhdGUoKTtcblxuXHRcdC8vIEFwcGx5IHRoZSBzY2hlbWEgZGVmYXVsdCDigJQgc2VlIGV4cGxhbmF0aW9uIGluIGBsaXN0ZW4oKWAuXG5cdFx0Y29uc3QgdGltZXpvbmUgPSBjb25maWcudGltZXpvbmUgPz8gXCJVVENcIjtcblxuXHRcdGNvbnN0IGRlZmF1bHRNZXRlciA9IG1ldHJpY3MuZ2V0TWV0ZXIoXCJkZWZhdWx0XCIpO1xuXHRcdGNvbnN0IGNyb25FeGVjdXRpb25zID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJjcm9uX2V4ZWN1dGlvbnNcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiQ3JvbiBqb2IgZXhlY3V0aW9uc1wiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IGNyb25FcnJvcnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcImNyb25fZXJyb3JzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIkNyb24gam9iIGV4ZWN1dGlvbiBlcnJvcnNcIixcblx0XHR9KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGBjcm9uOiR7d29ya2Zsb3cucGF0aH1gLCBhc3luYyAoc3BhbjogU3BhbikgPT4ge1xuXHRcdFx0XHRzY2hlZHVsZWRKb2IucnVubmluZyA9IHRydWU7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHdvcmtmbG93XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmluaXQod29ya2Zsb3cucGF0aCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHRcdC8vIENyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdFx0Y29uc3QgY3R4OiBDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCwgd29ya2Zsb3cucGF0aCwgZXhlY3V0aW9uSWQpO1xuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0XG5cdFx0XHRcdFx0Y29uc3QgY3JvbkNvbnRleHQ6IENyb25FeGVjdXRpb25Db250ZXh0ID0ge1xuXHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRzY2hlZHVsZWRUaW1lLFxuXHRcdFx0XHRcdFx0ZXhlY3V0aW9uVGltZSxcblx0XHRcdFx0XHRcdHNjaGVkdWxlOiBjb25maWcuc2NoZWR1bGUsXG5cdFx0XHRcdFx0XHR0aW1lem9uZSxcblx0XHRcdFx0XHRcdG1hbnVhbCxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gUG9wdWxhdGUgcmVxdWVzdCB3aXRoIGNyb24gY29udGV4dFxuXHRcdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdFx0Ym9keTogY3JvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLWpvYi1pZFwiOiBqb2JJZCxcblx0XHRcdFx0XHRcdFx0XCJ4LWNyb24tc2NoZWR1bGVcIjogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi10aW1lem9uZVwiOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLW1hbnVhbFwiOiBTdHJpbmcobWFudWFsKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRxdWVyeToge30sXG5cdFx0XHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRcdHNjaGVkdWxlOiBjb25maWcuc2NoZWR1bGUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0gYXMgdW5rbm93biBhcyBSZXF1ZXN0Q29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNyb24gY29udGV4dCBpbiB2YXJzXG5cdFx0XHRcdFx0aWYgKCFjdHgudmFycykgY3R4LnZhcnMgPSB7fTtcblx0XHRcdFx0XHRjdHgudmFycy5fY3Jvbl9jb250ZXh0ID0ge1xuXHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRzY2hlZHVsZWRUaW1lOiBzY2hlZHVsZWRUaW1lLnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRleGVjdXRpb25UaW1lOiBleGVjdXRpb25UaW1lLnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRzY2hlZHVsZTogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0dGltZXpvbmU6IGNvbmZpZy50aW1lem9uZSxcblx0XHRcdFx0XHRcdG1hbnVhbDogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBFeGVjdXRpbmcgY3JvbiBqb2I6ICR7am9iSWR9ICgke21hbnVhbCA/IFwibWFudWFsXCIgOiBcInNjaGVkdWxlZFwifSlgKTtcblxuXHRcdFx0XHRcdC8vIHYwLjYgwrcgYXBwbHkgdGhlIG1lcmdlZCBtaWRkbGV3YXJlIGNoYWluIChwcm9jZXNzLWdsb2JhbCDihpJcblx0XHRcdFx0XHQvLyB3b3JrZmxvdy1sZXZlbCDihpIgdHJpZ2dlci1sZXZlbCkgYmVmb3JlIHRoZSBtYWluIHdvcmtmbG93XG5cdFx0XHRcdFx0Ly8gYm9keS4gTGV0cyBjcm9uIHdvcmtmbG93cyBjb21wb3NlIGF1dGgtY2hlY2sgKyBhdWRpdC1sb2dcblx0XHRcdFx0XHQvLyBjaGFpbnMgZXhhY3RseSBsaWtlIEhUVFAgdHJpZ2dlcnMuIEEgdGhyb3dpbmcgbWlkZGxld2FyZVxuXHRcdFx0XHRcdC8vIHByb3BhZ2F0ZXMgdG8gdGhlIG91dGVyIGNhdGNoIGFuZCBzdXJmYWNlcyBhcyBhIGNyb24gam9iXG5cdFx0XHRcdFx0Ly8gZmFpbHVyZS5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5TWlkZGxld2FyZUNoYWluKGN0eCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHRcdC8vIEV4ZWN1dGUgd29ya2Zsb3dcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0XHRjb25zdCBlbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBqb2Igc3RhdGVcblx0XHRcdFx0XHRzY2hlZHVsZWRKb2IubGFzdFJ1biA9IGV4ZWN1dGlvblRpbWU7XG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLm5leHRSdW4gPSB0aGlzLnRvRGF0ZShzY2hlZHVsZWRKb2Iuam9iLm5leHREYXRlKCkpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImpvYl9pZFwiLCBqb2JJZCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3b3JrZmxvd19wYXRoXCIsIHdvcmtmbG93LnBhdGgpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic2NoZWR1bGVcIiwgY29uZmlnLnNjaGVkdWxlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRpbWV6b25lXCIsIHRpbWV6b25lKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcIm1hbnVhbFwiLCBtYW51YWwpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcblxuXHRcdFx0XHRcdC8vIFJlY29yZCBtZXRyaWNzXG5cdFx0XHRcdFx0Y3JvbkV4ZWN1dGlvbnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IGpvYklkLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uLm5hbWUsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdFx0c3VjY2VzczogXCJ0cnVlXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgQ3JvbiBqb2IgY29tcGxldGVkIGluICR7KGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zOiAke2pvYklkfWApO1xuXG5cdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0XHQvLyBSZWNvcmQgZXJyb3IgbWV0cmljc1xuXHRcdFx0XHRcdGNyb25FcnJvcnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IGpvYklkLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0bWFudWFsOiBTdHJpbmcobWFudWFsKSxcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDcm9uIGpvYiBmYWlsZWQgJHtqb2JJZH06ICR7ZXJyb3JNZXNzYWdlfWAsIChlcnJvciBhcyBFcnJvcikuc3RhY2spO1xuXG5cdFx0XHRcdFx0cmVzb2x2ZSh7IGN0eDoge30gYXMgQ29udGV4dCwgbWV0cmljczoge30gYXMgTWV0cmljc1R5cGUgfSk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRzcGFuLmVuZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBDcm9uVHJpZ2dlcjtcbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
2
|
+
* @blokjs/trigger-cron
|
|
3
3
|
*
|
|
4
4
|
* Cron/scheduled trigger for Blok workflows.
|
|
5
5
|
* Execute workflows on a schedule using cron expressions.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
15
|
* ```typescript
|
|
16
|
-
* import { CronTrigger } from "@
|
|
16
|
+
* import { CronTrigger } from "@blokjs/trigger-cron";
|
|
17
17
|
*
|
|
18
18
|
* class MyCronTrigger extends CronTrigger {
|
|
19
19
|
* protected nodes = myNodes;
|
|
@@ -61,4 +61,4 @@
|
|
|
61
61
|
* - "0 0 1 * *" - First day of every month
|
|
62
62
|
*/
|
|
63
63
|
export { CronTrigger, type ScheduledJob, type CronExecutionContext, } from "./CronTrigger";
|
|
64
|
-
export type { CronTriggerOpts } from "@
|
|
64
|
+
export type { CronTriggerOpts } from "@blokjs/helper";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
|
-
* @
|
|
2
|
+
* @blokjs/trigger-cron
|
|
4
3
|
*
|
|
5
4
|
* Cron/scheduled trigger for Blok workflows.
|
|
6
5
|
* Execute workflows on a schedule using cron expressions.
|
|
@@ -14,7 +13,7 @@
|
|
|
14
13
|
*
|
|
15
14
|
* @example
|
|
16
15
|
* ```typescript
|
|
17
|
-
* import { CronTrigger } from "@
|
|
16
|
+
* import { CronTrigger } from "@blokjs/trigger-cron";
|
|
18
17
|
*
|
|
19
18
|
* class MyCronTrigger extends CronTrigger {
|
|
20
19
|
* protected nodes = myNodes;
|
|
@@ -61,9 +60,6 @@
|
|
|
61
60
|
* - "0 0 * * 0" - Every Sunday at midnight
|
|
62
61
|
* - "0 0 1 * *" - First day of every month
|
|
63
62
|
*/
|
|
64
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.CronTrigger = void 0;
|
|
66
63
|
// Core exports
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHOzs7QUFFSCxlQUFlO0FBQ2YsNkNBSXVCO0FBSHRCLDBHQUFBLFdBQVcsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGJsb2svdHJpZ2dlci1jcm9uXG4gKlxuICogQ3Jvbi9zY2hlZHVsZWQgdHJpZ2dlciBmb3IgQmxvayB3b3JrZmxvd3MuXG4gKiBFeGVjdXRlIHdvcmtmbG93cyBvbiBhIHNjaGVkdWxlIHVzaW5nIGNyb24gZXhwcmVzc2lvbnMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFN0YW5kYXJkIGNyb24gZXhwcmVzc2lvbiBzeW50YXhcbiAqIC0gVGltZXpvbmUtYXdhcmUgc2NoZWR1bGluZ1xuICogLSBPdmVybGFwIHByZXZlbnRpb25cbiAqIC0gTWFudWFsIHRyaWdnZXIgc3VwcG9ydFxuICogLSBKb2IgbWFuYWdlbWVudCBBUElcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ3JvblRyaWdnZXIgfSBmcm9tIFwiQGJsb2svdHJpZ2dlci1jcm9uXCI7XG4gKlxuICogY2xhc3MgTXlDcm9uVHJpZ2dlciBleHRlbmRzIENyb25UcmlnZ2VyIHtcbiAqICAgcHJvdGVjdGVkIG5vZGVzID0gbXlOb2RlcztcbiAqICAgcHJvdGVjdGVkIHdvcmtmbG93cyA9IG15V29ya2Zsb3dzO1xuICogfVxuICpcbiAqIGNvbnN0IHRyaWdnZXIgPSBuZXcgTXlDcm9uVHJpZ2dlcigpO1xuICogYXdhaXQgdHJpZ2dlci5saXN0ZW4oKTtcbiAqXG4gKiAvLyBMaXN0IGFsbCBzY2hlZHVsZWQgam9ic1xuICogY29uc3Qgam9icyA9IHRyaWdnZXIuZ2V0Sm9icygpO1xuICpcbiAqIC8vIE1hbnVhbGx5IHRyaWdnZXIgYSBqb2JcbiAqIGF3YWl0IHRyaWdnZXIudHJpZ2dlckpvYihcImNyb24tbXktd29ya2Zsb3ctYWJjMTIzXCIpO1xuICogYGBgXG4gKlxuICogV29ya2Zsb3cgRGVmaW5pdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIFdvcmtmbG93KHsgbmFtZTogXCJkYWlseS1jbGVhbnVwXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9KVxuICogICAuYWRkVHJpZ2dlcihcImNyb25cIiwge1xuICogICAgIHNjaGVkdWxlOiBcIjAgMiAqICogKlwiLCAgLy8gUnVuIGF0IDIgQU0gZGFpbHlcbiAqICAgICB0aW1lem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIsXG4gKiAgICAgb3ZlcmxhcDogZmFsc2UsXG4gKiAgIH0pXG4gKiAgIC5hZGRTdGVwKHsgLi4uIH0pO1xuICogYGBgXG4gKlxuICogQ3JvbiBFeHByZXNzaW9uIEZvcm1hdDpcbiAqIGBgYFxuICogKiAqICogKiAqICpcbiAqIOKUgiDilIIg4pSCIOKUgiDilIIg4pSCXG4gKiDilIIg4pSCIOKUgiDilIIg4pSCIOKUlOKUgOKUgCBEYXkgb2Ygd2VlayAoMC03LCBTdW49MCw3KVxuICog4pSCIOKUgiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgCBNb250aCAoMS0xMilcbiAqIOKUgiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgCBEYXkgb2YgbW9udGggKDEtMzEpXG4gKiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBIb3VyICgwLTIzKVxuICog4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBNaW51dGUgKDAtNTkpXG4gKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgU2Vjb25kICgwLTU5LCBvcHRpb25hbClcbiAqIGBgYFxuICpcbiAqIENvbW1vbiBzY2hlZHVsZXM6XG4gKiAtIFwiKiAqICogKiAqXCIgLSBFdmVyeSBtaW51dGVcbiAqIC0gXCIwICogKiAqICpcIiAtIEV2ZXJ5IGhvdXJcbiAqIC0gXCIwIDAgKiAqICpcIiAtIEV2ZXJ5IGRheSBhdCBtaWRuaWdodFxuICogLSBcIjAgMCAqICogMFwiIC0gRXZlcnkgU3VuZGF5IGF0IG1pZG5pZ2h0XG4gKiAtIFwiMCAwIDEgKiAqXCIgLSBGaXJzdCBkYXkgb2YgZXZlcnkgbW9udGhcbiAqL1xuXG4vLyBDb3JlIGV4cG9ydHNcbmV4cG9ydCB7XG5cdENyb25UcmlnZ2VyLFxuXHR0eXBlIFNjaGVkdWxlZEpvYixcblx0dHlwZSBDcm9uRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vQ3JvblRyaWdnZXJcIjtcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gaGVscGVyIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBDcm9uVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2svaGVscGVyXCI7XG4iXX0=
|
|
64
|
+
export { CronTrigger, } from "./CronTrigger";
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2REc7QUFFSCxlQUFlO0FBQ2YsT0FBTyxFQUNOLFdBQVcsR0FHWCxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGJsb2tqcy90cmlnZ2VyLWNyb25cbiAqXG4gKiBDcm9uL3NjaGVkdWxlZCB0cmlnZ2VyIGZvciBCbG9rIHdvcmtmbG93cy5cbiAqIEV4ZWN1dGUgd29ya2Zsb3dzIG9uIGEgc2NoZWR1bGUgdXNpbmcgY3JvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gU3RhbmRhcmQgY3JvbiBleHByZXNzaW9uIHN5bnRheFxuICogLSBUaW1lem9uZS1hd2FyZSBzY2hlZHVsaW5nXG4gKiAtIE92ZXJsYXAgcHJldmVudGlvblxuICogLSBNYW51YWwgdHJpZ2dlciBzdXBwb3J0XG4gKiAtIEpvYiBtYW5hZ2VtZW50IEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDcm9uVHJpZ2dlciB9IGZyb20gXCJAYmxva2pzL3RyaWdnZXItY3JvblwiO1xuICpcbiAqIGNsYXNzIE15Q3JvblRyaWdnZXIgZXh0ZW5kcyBDcm9uVHJpZ2dlciB7XG4gKiAgIHByb3RlY3RlZCBub2RlcyA9IG15Tm9kZXM7XG4gKiAgIHByb3RlY3RlZCB3b3JrZmxvd3MgPSBteVdvcmtmbG93cztcbiAqIH1cbiAqXG4gKiBjb25zdCB0cmlnZ2VyID0gbmV3IE15Q3JvblRyaWdnZXIoKTtcbiAqIGF3YWl0IHRyaWdnZXIubGlzdGVuKCk7XG4gKlxuICogLy8gTGlzdCBhbGwgc2NoZWR1bGVkIGpvYnNcbiAqIGNvbnN0IGpvYnMgPSB0cmlnZ2VyLmdldEpvYnMoKTtcbiAqXG4gKiAvLyBNYW51YWxseSB0cmlnZ2VyIGEgam9iXG4gKiBhd2FpdCB0cmlnZ2VyLnRyaWdnZXJKb2IoXCJjcm9uLW15LXdvcmtmbG93LWFiYzEyM1wiKTtcbiAqIGBgYFxuICpcbiAqIFdvcmtmbG93IERlZmluaXRpb246XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBXb3JrZmxvdyh7IG5hbWU6IFwiZGFpbHktY2xlYW51cFwiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSlcbiAqICAgLmFkZFRyaWdnZXIoXCJjcm9uXCIsIHtcbiAqICAgICBzY2hlZHVsZTogXCIwIDIgKiAqICpcIiwgIC8vIFJ1biBhdCAyIEFNIGRhaWx5XG4gKiAgICAgdGltZXpvbmU6IFwiQW1lcmljYS9OZXdfWW9ya1wiLFxuICogICAgIG92ZXJsYXA6IGZhbHNlLFxuICogICB9KVxuICogICAuYWRkU3RlcCh7IC4uLiB9KTtcbiAqIGBgYFxuICpcbiAqIENyb24gRXhwcmVzc2lvbiBGb3JtYXQ6XG4gKiBgYGBcbiAqICogKiAqICogKiAqXG4gKiDilIIg4pSCIOKUgiDilIIg4pSCIOKUglxuICog4pSCIOKUgiDilIIg4pSCIOKUgiDilJTilIDilIAgRGF5IG9mIHdlZWsgKDAtNywgU3VuPTAsNylcbiAqIOKUgiDilIIg4pSCIOKUgiDilJTilIDilIDilIDilIAgTW9udGggKDEtMTIpXG4gKiDilIIg4pSCIOKUgiDilJTilIDilIDilIDilIDilIDilIAgRGF5IG9mIG1vbnRoICgxLTMxKVxuICog4pSCIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIAgSG91ciAoMC0yMylcbiAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgTWludXRlICgwLTU5KVxuICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFNlY29uZCAoMC01OSwgb3B0aW9uYWwpXG4gKiBgYGBcbiAqXG4gKiBDb21tb24gc2NoZWR1bGVzOlxuICogLSBcIiogKiAqICogKlwiIC0gRXZlcnkgbWludXRlXG4gKiAtIFwiMCAqICogKiAqXCIgLSBFdmVyeSBob3VyXG4gKiAtIFwiMCAwICogKiAqXCIgLSBFdmVyeSBkYXkgYXQgbWlkbmlnaHRcbiAqIC0gXCIwIDAgKiAqIDBcIiAtIEV2ZXJ5IFN1bmRheSBhdCBtaWRuaWdodFxuICogLSBcIjAgMCAxICogKlwiIC0gRmlyc3QgZGF5IG9mIGV2ZXJ5IG1vbnRoXG4gKi9cblxuLy8gQ29yZSBleHBvcnRzXG5leHBvcnQge1xuXHRDcm9uVHJpZ2dlcixcblx0dHlwZSBTY2hlZHVsZWRKb2IsXG5cdHR5cGUgQ3JvbkV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gXCIuL0Nyb25UcmlnZ2VyXCI7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGhlbHBlciBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgQ3JvblRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blokjs/trigger-cron",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Cron/scheduled trigger for Blok workflows - supports cron expressions and interval-based scheduling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"author": "Deskree Technologies Inc.",
|
|
15
15
|
"license": "Apache-2.0",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@blokjs/helper": "
|
|
18
|
-
"@blokjs/runner": "
|
|
19
|
-
"@blokjs/shared": "
|
|
17
|
+
"@blokjs/helper": "^0.6.1",
|
|
18
|
+
"@blokjs/runner": "^0.6.1",
|
|
19
|
+
"@blokjs/shared": "^0.6.1",
|
|
20
20
|
"@opentelemetry/api": "^1.9.0",
|
|
21
21
|
"cron": "^4.4.0",
|
|
22
22
|
"uuid": "^11.1.0"
|
package/src/CronTrigger.ts
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
import type { CronTriggerOpts, HelperResponse } from "@blokjs/helper";
|
|
14
14
|
import {
|
|
15
|
+
type BlokService,
|
|
15
16
|
DefaultLogger,
|
|
16
17
|
type GlobalOptions,
|
|
17
|
-
type BlokService,
|
|
18
18
|
NodeMap,
|
|
19
19
|
TriggerBase,
|
|
20
20
|
type TriggerResponse,
|
|
@@ -153,7 +153,13 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
153
153
|
const config = workflow.config.trigger?.cron as CronTriggerOpts;
|
|
154
154
|
const jobId = `cron-${workflow.path}-${uuid().slice(0, 8)}`;
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
// `CronTriggerOpts` is `z.input<…>` so `timezone` is `string | undefined`
|
|
157
|
+
// even though the schema declares `.default("UTC")`. Apply the
|
|
158
|
+
// default once here so the rest of this method (and the cron lib's
|
|
159
|
+
// constructor) sees a guaranteed string.
|
|
160
|
+
const timezone = config.timezone ?? "UTC";
|
|
161
|
+
|
|
162
|
+
this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${timezone})`);
|
|
157
163
|
|
|
158
164
|
const job = new CronJob(
|
|
159
165
|
config.schedule,
|
|
@@ -162,14 +168,14 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
162
168
|
},
|
|
163
169
|
null, // onComplete
|
|
164
170
|
false, // start
|
|
165
|
-
|
|
171
|
+
timezone,
|
|
166
172
|
);
|
|
167
173
|
|
|
168
174
|
const scheduledJob: ScheduledJob = {
|
|
169
175
|
id: jobId,
|
|
170
176
|
workflowPath: workflow.path,
|
|
171
177
|
schedule: config.schedule,
|
|
172
|
-
timezone
|
|
178
|
+
timezone,
|
|
173
179
|
overlap: config.overlap ?? false,
|
|
174
180
|
running: false,
|
|
175
181
|
nextRun: this.toDate(job.nextDate()),
|
|
@@ -311,6 +317,9 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
311
317
|
const scheduledTime = lastDate ? new Date(lastDate as unknown as string | number) : new Date();
|
|
312
318
|
const executionTime = new Date();
|
|
313
319
|
|
|
320
|
+
// Apply the schema default — see explanation in `listen()`.
|
|
321
|
+
const timezone = config.timezone ?? "UTC";
|
|
322
|
+
|
|
314
323
|
const defaultMeter = metrics.getMeter("default");
|
|
315
324
|
const cronExecutions = defaultMeter.createCounter("cron_executions", {
|
|
316
325
|
description: "Cron job executions",
|
|
@@ -338,7 +347,7 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
338
347
|
scheduledTime,
|
|
339
348
|
executionTime,
|
|
340
349
|
schedule: config.schedule,
|
|
341
|
-
timezone
|
|
350
|
+
timezone,
|
|
342
351
|
manual,
|
|
343
352
|
};
|
|
344
353
|
|
|
@@ -371,6 +380,14 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
371
380
|
|
|
372
381
|
ctx.logger.log(`Executing cron job: ${jobId} (${manual ? "manual" : "scheduled"})`);
|
|
373
382
|
|
|
383
|
+
// v0.6 · apply the merged middleware chain (process-global →
|
|
384
|
+
// workflow-level → trigger-level) before the main workflow
|
|
385
|
+
// body. Lets cron workflows compose auth-check + audit-log
|
|
386
|
+
// chains exactly like HTTP triggers. A throwing middleware
|
|
387
|
+
// propagates to the outer catch and surfaces as a cron job
|
|
388
|
+
// failure.
|
|
389
|
+
await this.applyMiddlewareChain(ctx, this.nodeMap);
|
|
390
|
+
|
|
374
391
|
// Execute workflow
|
|
375
392
|
const response: TriggerResponse = await this.run(ctx);
|
|
376
393
|
const end = performance.now();
|
|
@@ -384,7 +401,7 @@ export abstract class CronTrigger extends TriggerBase {
|
|
|
384
401
|
span.setAttribute("job_id", jobId);
|
|
385
402
|
span.setAttribute("workflow_path", workflow.path);
|
|
386
403
|
span.setAttribute("schedule", config.schedule);
|
|
387
|
-
span.setAttribute("timezone",
|
|
404
|
+
span.setAttribute("timezone", timezone);
|
|
388
405
|
span.setAttribute("manual", manual);
|
|
389
406
|
span.setAttribute("elapsed_ms", end - start);
|
|
390
407
|
span.setStatus({ code: SpanStatusCode.OK });
|