velocious 1.0.710 → 1.0.711
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/build/configuration-types.js +1 -1
- package/build/configuration.js +14 -0
- package/build/database/advisory-lock-telemetry.js +20 -19
- package/build/src/configuration-types.d.ts +2 -2
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +11 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +14 -1
- package/build/src/database/advisory-lock-telemetry.d.ts +14 -11
- package/build/src/database/advisory-lock-telemetry.d.ts.map +1 -1
- package/build/src/database/advisory-lock-telemetry.js +21 -20
- package/package.json +1 -1
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +14 -0
- package/src/database/advisory-lock-telemetry.js +20 -19
|
@@ -72,10 +72,15 @@ export type AdvisoryLockTelemetryThresholds = {
|
|
|
72
72
|
* - `advisory-lock-slow-hold` — a hold lasted longer than `slowHoldMs`
|
|
73
73
|
* (default 60000), emitted at release.
|
|
74
74
|
*
|
|
75
|
-
* Reports are emitted on `configuration.
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
75
|
+
* Reports are emitted on `configuration.getTelemetryEvents()` as `telemetry`
|
|
76
|
+
* with `{context: "advisory-lock-telemetry", event, lockName, backendTier, ...}`
|
|
77
|
+
* payloads.
|
|
78
|
+
*
|
|
79
|
+
* These are measurements, not failures, so they are deliberately kept off the
|
|
80
|
+
* framework-error channel: a bug reporter subscribed to `framework-error` /
|
|
81
|
+
* `all-error` must be able to assume every payload carries a thrown value, and a
|
|
82
|
+
* contention report delivered there became one bug report (plus its symbolication
|
|
83
|
+
* and notification work) per event.
|
|
79
84
|
*
|
|
80
85
|
* Holder lookups are strictly best-effort *after* the acquisition already
|
|
81
86
|
* settled: a failed lookup never changes the acquisition outcome and never
|
|
@@ -114,14 +119,12 @@ export declare const DEFAULT_ADVISORY_LOCK_SLOW_HOLD_MS: number;
|
|
|
114
119
|
*/
|
|
115
120
|
export declare function advisoryLockTelemetryThresholds(args: import("../configuration-types.js").DatabaseConfigurationType): AdvisoryLockTelemetryThresholds;
|
|
116
121
|
/**
|
|
117
|
-
* Emit one telemetry report on the framework-
|
|
122
|
+
* Emit one telemetry report on the framework-telemetry channel.
|
|
118
123
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* emissions are guarded.
|
|
124
|
-
* @param {import("../configuration.js").default} configuration - Configuration instance owning the error channel.
|
|
124
|
+
* When no `telemetry` listener is attached, a one-line summary goes to `stderr`
|
|
125
|
+
* so a convoy is never completely silent. A listener failure can never break
|
|
126
|
+
* lock handling, so emissions are guarded.
|
|
127
|
+
* @param {import("../configuration.js").default} configuration - Configuration instance owning the telemetry channel.
|
|
125
128
|
* @param {AdvisoryLockTelemetryReport} report - The report payload.
|
|
126
129
|
* @returns {void} - No return value.
|
|
127
130
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-lock-telemetry.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-telemetry.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"advisory-lock-telemetry.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-telemetry.js"],"names":[],"mappings":"AA6CG,YAAkB,2BAA2B,GAC7C;;;;IAAuG,KAAK,EAAjG,4BAA4B,GAAG,+BAA+B,GAAG,yBAAyB,CACrG;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAAmB,WAAW,EAAnB,MAAM,CACjB;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAA0C,OAAO,EAAtC,UAAU,GAAG,SAAS,GAAG,IAAI,CACxC;;;;IAA0B,SAAS,EAAxB,MAAM,GAAG,IAAI,CACxB;;;;IAA0B,QAAQ,EAAvB,MAAM,GAAG,IAAI,CACxB;;;;IAA0B,kBAAkB,EAAjC,MAAM,GAAG,IAAI,CACxB;;;;IAA0B,iBAAiB,EAAhC,MAAM,GAAG,IAAI,CAC1B;CAAA,CAAA;AAIE,YAAkB,+BAA+B,GACjD;;;;IAA0B,aAAa,EAA5B,MAAM,GAAG,IAAI,CACxB;;;;IAA0B,UAAU,EAAzB,MAAM,GAAG,IAAI,CAC1B;CAAA,CAAA;AA5DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;;GAKG;AAEH,iFAAiF;AACjF,eAAO,MAAM,qCAAqC,OAAO,CAAA;AAEzD,sEAAsE;AACtE,eAAO,MAAM,kCAAkC,QAAY,CAAA;AAE3D;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAHzC,OAAO,2BAA2B,EAAE,yBAGK,GAFvC,+BAA+B,CAiB3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAAC,aAAa,EAJlD,OAAO,qBAAqB,EAAE,OAIoB,EAAE,MAAM,EAH1D,2BAG0D,GAFxD,IAAI,CA0BhB"}
|
|
@@ -25,10 +25,15 @@
|
|
|
25
25
|
* - `advisory-lock-slow-hold` — a hold lasted longer than `slowHoldMs`
|
|
26
26
|
* (default 60000), emitted at release.
|
|
27
27
|
*
|
|
28
|
-
* Reports are emitted on `configuration.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
28
|
+
* Reports are emitted on `configuration.getTelemetryEvents()` as `telemetry`
|
|
29
|
+
* with `{context: "advisory-lock-telemetry", event, lockName, backendTier, ...}`
|
|
30
|
+
* payloads.
|
|
31
|
+
*
|
|
32
|
+
* These are measurements, not failures, so they are deliberately kept off the
|
|
33
|
+
* framework-error channel: a bug reporter subscribed to `framework-error` /
|
|
34
|
+
* `all-error` must be able to assume every payload carries a thrown value, and a
|
|
35
|
+
* contention report delivered there became one bug report (plus its symbolication
|
|
36
|
+
* and notification work) per event.
|
|
32
37
|
*
|
|
33
38
|
* Holder lookups are strictly best-effort *after* the acquisition already
|
|
34
39
|
* settled: a failed lookup never changes the acquisition outcome and never
|
|
@@ -83,40 +88,36 @@ export function advisoryLockTelemetryThresholds(args) {
|
|
|
83
88
|
return thresholds;
|
|
84
89
|
}
|
|
85
90
|
/**
|
|
86
|
-
* Emit one telemetry report on the framework-
|
|
91
|
+
* Emit one telemetry report on the framework-telemetry channel.
|
|
87
92
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* emissions are guarded.
|
|
93
|
-
* @param {import("../configuration.js").default} configuration - Configuration instance owning the error channel.
|
|
93
|
+
* When no `telemetry` listener is attached, a one-line summary goes to `stderr`
|
|
94
|
+
* so a convoy is never completely silent. A listener failure can never break
|
|
95
|
+
* lock handling, so emissions are guarded.
|
|
96
|
+
* @param {import("../configuration.js").default} configuration - Configuration instance owning the telemetry channel.
|
|
94
97
|
* @param {AdvisoryLockTelemetryReport} report - The report payload.
|
|
95
98
|
* @returns {void} - No return value.
|
|
96
99
|
*/
|
|
97
100
|
export function emitAdvisoryLockTelemetryReport(configuration, report) {
|
|
98
101
|
/** @type {import("eventemitter3").EventEmitter | undefined} */
|
|
99
|
-
let
|
|
102
|
+
let telemetryEvents;
|
|
100
103
|
try {
|
|
101
|
-
|
|
104
|
+
telemetryEvents = configuration?.getTelemetryEvents();
|
|
102
105
|
}
|
|
103
106
|
catch {
|
|
104
107
|
return; // No configuration to report through — never break lock handling.
|
|
105
108
|
}
|
|
106
|
-
if (!
|
|
109
|
+
if (!telemetryEvents)
|
|
107
110
|
return;
|
|
108
|
-
const hasListener =
|
|
109
|
-
|| errorEvents.listenerCount("all-error") > 0;
|
|
111
|
+
const hasListener = telemetryEvents.listenerCount("telemetry") > 0;
|
|
110
112
|
const payload = { context: "advisory-lock-telemetry", ...report };
|
|
111
113
|
try {
|
|
112
|
-
|
|
113
|
-
errorEvents.emit("all-error", { ...payload, errorType: "framework-error" });
|
|
114
|
+
telemetryEvents.emit("telemetry", payload);
|
|
114
115
|
}
|
|
115
116
|
catch {
|
|
116
117
|
// A broken listener must never surface as a lock failure.
|
|
117
118
|
}
|
|
118
119
|
if (!hasListener) {
|
|
119
|
-
console.error(`[velocious advisory-lock-telemetry ${report.event}] lock=${JSON.stringify(report.lockName)} tier=${report.backendTier} durationMs=${report.durationMs}${report.outcome ? ` outcome=${report.outcome}` : ""}${report.holderConnectionId ? ` holderConnectionId=${report.holderConnectionId}` : ""}${report.holderId ? ` holderId=${report.holderId}` : ""} — subscribe via configuration.
|
|
120
|
+
console.error(`[velocious advisory-lock-telemetry ${report.event}] lock=${JSON.stringify(report.lockName)} tier=${report.backendTier} durationMs=${report.durationMs}${report.outcome ? ` outcome=${report.outcome}` : ""}${report.holderConnectionId ? ` holderConnectionId=${report.holderConnectionId}` : ""}${report.holderId ? ` holderId=${report.holderId}` : ""} — subscribe via configuration.getTelemetryEvents().on("telemetry", …) to route these measurements to your metrics`);
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay10ZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay10ZWxlbWV0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7O0dBS0c7QUFFSCxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsSUFBSSxDQUFBO0FBRXpELHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBRTNEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsSUFBSTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEVBQUUscUJBQXFCLENBQUE7SUFDOUMsOENBQThDO0lBQzlDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLGFBQWEsRUFBRSxxQ0FBcUM7UUFDcEQsVUFBVSxFQUFFLGtDQUFrQztLQUMvQyxDQUFBO0lBRUQsSUFBSSxVQUFVLEVBQUUsYUFBYSxLQUFLLElBQUk7UUFBRSxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtTQUNsRSxJQUFJLE9BQU8sVUFBVSxFQUFFLGFBQWEsS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLGFBQWEsSUFBSSxDQUFDO1FBQUUsVUFBVSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFBO0lBRTVJLElBQUksVUFBVSxFQUFFLFVBQVUsS0FBSyxJQUFJO1FBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7U0FDNUQsSUFBSSxPQUFPLFVBQVUsRUFBRSxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQztRQUFFLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQTtJQUVoSSxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsYUFBYSxFQUFFLE1BQU07SUFDbkUsK0RBQStEO0lBQy9ELElBQUksV0FBVyxDQUFBO0lBRWYsSUFBSSxDQUFDO1FBQ0gsV0FBVyxHQUFHLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTSxDQUFDLGtFQUFrRTtJQUMzRSxDQUFDO0lBRUQsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFNO0lBRXhCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDO1dBQy9ELFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sT0FBTyxHQUFHLEVBQUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLEdBQUcsTUFBTSxFQUFDLENBQUE7SUFFL0QsSUFBSSxDQUFDO1FBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM1QyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDBEQUEwRDtJQUM1RCxDQUFDO0lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsTUFBTSxDQUFDLFdBQVcsZUFBZSxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxzSEFBc0gsQ0FBQyxDQUFBO0lBQ2hlLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRXZlbnQtZHJpdmVuIGFkdmlzb3J5LWxvY2sgZHVyYXRpb24gdGVsZW1ldHJ5IChTVEMtMjYxLCBwYXJlbnQgZXBpYyBTVEMtMjA5KS5cbiAqXG4gKiBBIGxvY2sgY29udm95IGlzIG9ubHkgZml4YWJsZSB3aGVuIGl0IGlzICphdHRyaWJ1dGFibGUqOiB3aGljaCBsb2NrIG5hbWUgd2FzXG4gKiBjb250ZW5kZWQsIG9uIHdoaWNoIGJhY2tlbmQgdGllciwgZm9yIGhvdyBsb25nLCBhbmQgd2hvIGhlbGQgaXQuIFRoZXNlIHJlcG9ydHNcbiAqIGZpcmUgb24gdGhlIGFjcXVpc2l0aW9uL3JlbGVhc2UgZXZlbnRzIHRoZW1zZWx2ZXMg4oCUIG5ldmVyIGZyb20gYSBwZXJpb2RpY1xuICogc2Nhbm5lciDigJQgc28gYSBjb250ZW5kZWQgbG9jayBpbiBwcm9kdWN0aW9uIHN1cmZhY2VzIG9uIHRoZSBmcmFtZXdvcmstZXJyb3JcbiAqIGNoYW5uZWwgd2l0aCB0aGUgaG9sZGVyIGlkZW50aXR5IGF2YWlsYWJsZSBvbiB0aGF0IHRpZXIgYXQgdGhhdCBtb21lbnQsXG4gKiB3aXRob3V0IFNTSCBmb3JlbnNpY3MuXG4gKlxuICogVGhyZWUgZXZlbnRzLCBlYWNoIHdpdGggaXRzIG93biB0aHJlc2hvbGQgKGFsbCBjb25maWd1cmFibGUgcGVyIGRhdGFiYXNlIHZpYVxuICogYGFkdmlzb3J5TG9ja1RlbGVtZXRyeWAsIHNlZSBgZG9jcy9hZHZpc29yeS1sb2Nrcy5tZGApOlxuICpcbiAqIC0gYGFkdmlzb3J5LWxvY2stc2xvdy1hY3F1aXJlYCDigJQgYW4gYWNxdWlyZSB3YWl0IGNvbXBsZXRlZCBzbG93ZXIgdGhhblxuICogICBgc2xvd0FjcXVpcmVNc2AgKGRlZmF1bHQgNTAwMCksIGluY2x1ZGluZyB0aGUgZXZlbnR1YWwgb3V0Y29tZSAoYGFjcXVpcmVkYFxuICogICBvciBgdGltZW91dGApLlxuICogLSBgYWR2aXNvcnktbG9jay1hY3F1aXJlLXRpbWVvdXRgIOKAlCBhIHdhaXQgZXhjZWVkZWQgaXRzIHRpbWVvdXQuIFRoZSByZXBvcnRcbiAqICAgY2FycmllcyB0aGUgaG9sZGVyIGlkZW50aXR5IGF2YWlsYWJsZSBvbiB0aGUgdGllciBhdCB0aGF0IG1vbWVudDogdGhlXG4gKiAgIGRyaXZlci1uYXRpdmUgdGllcnMgYXR0cmlidXRlIHRoZSBob2xkZXIgY29ubmVjdGlvbiAoTWFyaWFEQlxuICogICBgSVNfVVNFRF9MT0NLYCwgUG9zdGdyZVNRTCBgcGdfbG9ja3NgIGpvaW5lZCB0byBgcGdfc3RhdF9hY3Rpdml0eWAsIFNRTFxuICogICBTZXJ2ZXIgYHN5cy5kbV90cmFuX2xvY2tzYCByZXF1ZXN0IHNlc3Npb24sIFNRTGl0ZSBOb2RlIGZpbGUgdGllclxuICogICBgb3duZXIuanNvbmAgcGlkL2hvc3RuYW1lKTsgdGhlIHByb2Nlc3MtbG9jYWwgdGllciByZXBvcnRzIHRoZSBvd25pbmdcbiAqICAgZHJpdmVyJ3MgYGhvbGRlcklkYC5cbiAqIC0gYGFkdmlzb3J5LWxvY2stc2xvdy1ob2xkYCDigJQgYSBob2xkIGxhc3RlZCBsb25nZXIgdGhhbiBgc2xvd0hvbGRNc2BcbiAqICAgKGRlZmF1bHQgNjAwMDApLCBlbWl0dGVkIGF0IHJlbGVhc2UuXG4gKlxuICogUmVwb3J0cyBhcmUgZW1pdHRlZCBvbiBgY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpYCBhcyBgZnJhbWV3b3JrLWVycm9yYFxuICogKHBsdXMgdGhlIG1hdGNoaW5nIGBhbGwtZXJyb3JgKSB3aXRoIGB7Y29udGV4dDogXCJhZHZpc29yeS1sb2NrLXRlbGVtZXRyeVwiLFxuICogZXZlbnQsIGxvY2tOYW1lLCBiYWNrZW5kVGllciwgLi4ufWAgcGF5bG9hZHMsIG1hdGNoaW5nIHRoZSByZXBvJ3MgXCJuZXZlclxuICogc3dhbGxvd1wiIHJ1bGUgc28gcHJvY2Vzcy1sZXZlbCBidWcgcmVwb3J0ZXJzIGNhcHR1cmUgdGhlbS5cbiAqXG4gKiBIb2xkZXIgbG9va3VwcyBhcmUgc3RyaWN0bHkgYmVzdC1lZmZvcnQgKmFmdGVyKiB0aGUgYWNxdWlzaXRpb24gYWxyZWFkeVxuICogc2V0dGxlZDogYSBmYWlsZWQgbG9va3VwIG5ldmVyIGNoYW5nZXMgdGhlIGFjcXVpc2l0aW9uIG91dGNvbWUgYW5kIG5ldmVyXG4gKiB0aHJvd3MgdG8gdGhlIGNhbGxlci5cbiAqL1xuXG4vKipcbiAqIE9uZSBhZHZpc29yeS1sb2NrIHRlbGVtZXRyeSByZXBvcnQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZHZpc29yeUxvY2tUZWxlbWV0cnlSZXBvcnRcbiAqIEBwcm9wZXJ0eSB7XCJhZHZpc29yeS1sb2NrLXNsb3ctYWNxdWlyZVwiIHwgXCJhZHZpc29yeS1sb2NrLWFjcXVpcmUtdGltZW91dFwiIHwgXCJhZHZpc29yeS1sb2NrLXNsb3ctaG9sZFwifSBldmVudCAtIFdoaWNoIGV2ZW50IGZpcmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2tOYW1lIC0gVGhlIGNvbnRlbmRlZCBhZHZpc29yeS1sb2NrIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmFja2VuZFRpZXIgLSBUaWVyIHRoYXQgc2VydmVkIChvciByZWZ1c2VkKSB0aGUgYWNxdWlzaXRpb246IGBkcml2ZXItbmF0aXZlYCwgYHByb2Nlc3MtbG9jYWxgLCBvciBgZmlsZWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZHVyYXRpb25NcyAtIE1lYXN1cmVkIGR1cmF0aW9uIG9mIHRoZSBhY3F1aXJlIHdhaXQgKG9yIHRoZSBob2xkKS5cbiAqIEBwcm9wZXJ0eSB7XCJhY3F1aXJlZFwiIHwgXCJ0aW1lb3V0XCIgfCBudWxsfSBvdXRjb21lIC0gRm9yIGFjcXVpcmUgZXZlbnRzOiB3aGV0aGVyIHRoZSB3YWl0IGV2ZW50dWFsbHkgYWNxdWlyZWQgdGhlIGxvY2suIE51bGwgZm9yIGhvbGQgcmVwb3J0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dE1zIC0gVGhlIGVmZmVjdGl2ZSBhY3F1aXJlIGJvdW5kIGZvciBhY3F1aXJlIGV2ZW50cy4gTnVsbCBmb3IgaG9sZCByZXBvcnRzIG9yIGFuIHVuYm91bmRlZCB3YWl0LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBob2xkZXJJZCAtIFByb2Nlc3MtbG9jYWwgaG9sZGVyIGF0dHJpYnV0aW9uIHdoZW4gdGhlIHRpZXIgY2FuIG5hbWUgaXRzIGxvY2FsIGhvbGRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaG9sZGVyQ29ubmVjdGlvbklkIC0gRHJpdmVyLW5hdGl2ZSBob2xkZXIgYXR0cmlidXRpb24gY2FwdHVyZWQgYXQgdGhlIGV2ZW50IG1vbWVudCAoTWFyaWFEQiBgSVNfVVNFRF9MT0NLYCBjb25uZWN0aW9uIGlkLCBQb3N0Z3JlU1FMIHBpZCwgU1FMIFNlcnZlciBzZXNzaW9uIGlkLCBTUUxpdGUgZmlsZSBgcGlkQGhvc3RuYW1lYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhvbGRlckxvb2t1cEVycm9yIC0gU2V0IHdoZW4gdGhlIGJlc3QtZWZmb3J0IGhvbGRlciBsb29rdXAgaXRzZWxmIGZhaWxlZDsgdGhlIGxvb2t1cCBuZXZlciBhZmZlY3RzIHRoZSBhY3F1aXNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIFJlc29sdmVkIHBlci1kYXRhYmFzZSB0ZWxlbWV0cnkgdGhyZXNob2xkcy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkdmlzb3J5TG9ja1RlbGVtZXRyeVRocmVzaG9sZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2xvd0FjcXVpcmVNcyAtIFJlcG9ydCBhbiBhY3F1aXJlIHdhaXQgc2xvd2VyIHRoYW4gdGhpczsgYG51bGxgIGRpc2FibGVzIHNsb3ctYWNxdWlyZSByZXBvcnRzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBzbG93SG9sZE1zIC0gUmVwb3J0IGEgaG9sZCBsb25nZXIgdGhhbiB0aGlzIGF0IHJlbGVhc2U7IGBudWxsYCBkaXNhYmxlcyBob2xkIHJlcG9ydHMuXG4gKi9cblxuLyoqIEZyYW1ld29yayBkZWZhdWx0OiByZXBvcnQgYW4gYWNxdWlyZSB3YWl0IHRoYXQgY29tcGxldGVkIHNsb3dlciB0aGFuIHRoaXMuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BRFZJU09SWV9MT0NLX1NMT1dfQUNRVUlSRV9NUyA9IDUwMDBcblxuLyoqIEZyYW1ld29yayBkZWZhdWx0OiByZXBvcnQgYSBob2xkIHRoYXQgb3V0bGl2ZXMgdGhpcyBhdCByZWxlYXNlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQURWSVNPUllfTE9DS19TTE9XX0hPTERfTVMgPSA2MCAqIDEwMDBcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB0ZWxlbWV0cnkgdGhyZXNob2xkcyBmb3Igb25lIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gKiBBbiBleHBsaWNpdCBwZXItZGF0YWJhc2UgYGFkdmlzb3J5TG9ja1RlbGVtZXRyeWAgdmFsdWUgd2luczsgYG51bGxgIG9wdHMgb3V0XG4gKiBvZiB0aGF0IHJlcG9ydDsgb25seSB3aGVuIG5laXRoZXIgaXMgY29uZmlndXJlZCBkb2VzIHRoZSBmcmFtZXdvcmsgZGVmYXVsdFxuICogYXBwbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gYXJncyAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHtBZHZpc29yeUxvY2tUZWxlbWV0cnlUaHJlc2hvbGRzfSAtIFJlc29sdmVkIHRocmVzaG9sZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yeUxvY2tUZWxlbWV0cnlUaHJlc2hvbGRzKGFyZ3MpIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IGFyZ3M/LmFkdmlzb3J5TG9ja1RlbGVtZXRyeVxuICAvKiogQHR5cGUge0Fkdmlzb3J5TG9ja1RlbGVtZXRyeVRocmVzaG9sZHN9ICovXG4gIGNvbnN0IHRocmVzaG9sZHMgPSB7XG4gICAgc2xvd0FjcXVpcmVNczogREVGQVVMVF9BRFZJU09SWV9MT0NLX1NMT1dfQUNRVUlSRV9NUyxcbiAgICBzbG93SG9sZE1zOiBERUZBVUxUX0FEVklTT1JZX0xPQ0tfU0xPV19IT0xEX01TXG4gIH1cblxuICBpZiAoY29uZmlndXJlZD8uc2xvd0FjcXVpcmVNcyA9PT0gbnVsbCkgdGhyZXNob2xkcy5zbG93QWNxdWlyZU1zID0gbnVsbFxuICBlbHNlIGlmICh0eXBlb2YgY29uZmlndXJlZD8uc2xvd0FjcXVpcmVNcyA9PT0gXCJudW1iZXJcIiAmJiBjb25maWd1cmVkLnNsb3dBY3F1aXJlTXMgPj0gMCkgdGhyZXNob2xkcy5zbG93QWNxdWlyZU1zID0gY29uZmlndXJlZC5zbG93QWNxdWlyZU1zXG5cbiAgaWYgKGNvbmZpZ3VyZWQ/LnNsb3dIb2xkTXMgPT09IG51bGwpIHRocmVzaG9sZHMuc2xvd0hvbGRNcyA9IG51bGxcbiAgZWxzZSBpZiAodHlwZW9mIGNvbmZpZ3VyZWQ/LnNsb3dIb2xkTXMgPT09IFwibnVtYmVyXCIgJiYgY29uZmlndXJlZC5zbG93SG9sZE1zID49IDApIHRocmVzaG9sZHMuc2xvd0hvbGRNcyA9IGNvbmZpZ3VyZWQuc2xvd0hvbGRNc1xuXG4gIHJldHVybiB0aHJlc2hvbGRzXG59XG5cbi8qKlxuICogRW1pdCBvbmUgdGVsZW1ldHJ5IHJlcG9ydCBvbiB0aGUgZnJhbWV3b3JrLWVycm9yIGNoYW5uZWwuXG4gKlxuICogTWlycm9ycyB0aGUgcmVwbydzIGZyYW1ld29yay1lcnJvciBlbWlzc2lvbiBzaGFwZSAoc2VlIGBjb25maWd1cmF0aW9uLmpzYFxuICogYF9yZXBvcnRCZWFjb25FcnJvcmApOiB3aGVuIG5vIGxpc3RlbmVyIGlzIGF0dGFjaGVkIHRvIGBmcmFtZXdvcmstZXJyb3JgIG9yXG4gKiBgYWxsLWVycm9yYCwgYSBvbmUtbGluZSBzdW1tYXJ5IGdvZXMgdG8gYHN0ZGVycmAgc28gYSBjb252b3kgaXMgbmV2ZXJcbiAqIGNvbXBsZXRlbHkgc2lsZW50LiBBIGxpc3RlbmVyIGZhaWx1cmUgY2FuIG5ldmVyIGJyZWFrIGxvY2sgaGFuZGxpbmcsIHNvXG4gKiBlbWlzc2lvbnMgYXJlIGd1YXJkZWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2Ugb3duaW5nIHRoZSBlcnJvciBjaGFubmVsLlxuICogQHBhcmFtIHtBZHZpc29yeUxvY2tUZWxlbWV0cnlSZXBvcnR9IHJlcG9ydCAtIFRoZSByZXBvcnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtaXRBZHZpc29yeUxvY2tUZWxlbWV0cnlSZXBvcnQoY29uZmlndXJhdGlvbiwgcmVwb3J0KSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiZXZlbnRlbWl0dGVyM1wiKS5FdmVudEVtaXR0ZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCBlcnJvckV2ZW50c1xuXG4gIHRyeSB7XG4gICAgZXJyb3JFdmVudHMgPSBjb25maWd1cmF0aW9uPy5nZXRFcnJvckV2ZW50cygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAvLyBObyBjb25maWd1cmF0aW9uIHRvIHJlcG9ydCB0aHJvdWdoIOKAlCBuZXZlciBicmVhayBsb2NrIGhhbmRsaW5nLlxuICB9XG5cbiAgaWYgKCFlcnJvckV2ZW50cykgcmV0dXJuXG5cbiAgY29uc3QgaGFzTGlzdGVuZXIgPSBlcnJvckV2ZW50cy5saXN0ZW5lckNvdW50KFwiZnJhbWV3b3JrLWVycm9yXCIpID4gMFxuICAgIHx8IGVycm9yRXZlbnRzLmxpc3RlbmVyQ291bnQoXCJhbGwtZXJyb3JcIikgPiAwXG4gIGNvbnN0IHBheWxvYWQgPSB7Y29udGV4dDogXCJhZHZpc29yeS1sb2NrLXRlbGVtZXRyeVwiLCAuLi5yZXBvcnR9XG5cbiAgdHJ5IHtcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIHBheWxvYWQpXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImFsbC1lcnJvclwiLCB7Li4ucGF5bG9hZCwgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwifSlcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBicm9rZW4gbGlzdGVuZXIgbXVzdCBuZXZlciBzdXJmYWNlIGFzIGEgbG9jayBmYWlsdXJlLlxuICB9XG5cbiAgaWYgKCFoYXNMaXN0ZW5lcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFt2ZWxvY2lvdXMgYWR2aXNvcnktbG9jay10ZWxlbWV0cnkgJHtyZXBvcnQuZXZlbnR9XSBsb2NrPSR7SlNPTi5zdHJpbmdpZnkocmVwb3J0LmxvY2tOYW1lKX0gdGllcj0ke3JlcG9ydC5iYWNrZW5kVGllcn0gZHVyYXRpb25Ncz0ke3JlcG9ydC5kdXJhdGlvbk1zfSR7cmVwb3J0Lm91dGNvbWUgPyBgIG91dGNvbWU9JHtyZXBvcnQub3V0Y29tZX1gIDogXCJcIn0ke3JlcG9ydC5ob2xkZXJDb25uZWN0aW9uSWQgPyBgIGhvbGRlckNvbm5lY3Rpb25JZD0ke3JlcG9ydC5ob2xkZXJDb25uZWN0aW9uSWR9YCA6IFwiXCJ9JHtyZXBvcnQuaG9sZGVySWQgPyBgIGhvbGRlcklkPSR7cmVwb3J0LmhvbGRlcklkfWAgOiBcIlwifSDigJQgc3Vic2NyaWJlIHZpYSBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkub24oXCJmcmFtZXdvcmstZXJyb3JcIiwg4oCmKSB0byByb3V0ZSB0aGVzZSByZXBvcnRzIHRvIHlvdXIgYnVnIHJlcG9ydGVyYClcbiAgfVxufVxuIl19
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay10ZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay10ZWxlbWV0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7R0FLRztBQUVILGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRyxJQUFJLENBQUE7QUFFekQsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFFM0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxJQUFJO0lBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksRUFBRSxxQkFBcUIsQ0FBQTtJQUM5Qyw4Q0FBOEM7SUFDOUMsTUFBTSxVQUFVLEdBQUc7UUFDakIsYUFBYSxFQUFFLHFDQUFxQztRQUNwRCxVQUFVLEVBQUUsa0NBQWtDO0tBQy9DLENBQUE7SUFFRCxJQUFJLFVBQVUsRUFBRSxhQUFhLEtBQUssSUFBSTtRQUFFLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1NBQ2xFLElBQUksT0FBTyxVQUFVLEVBQUUsYUFBYSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxJQUFJLENBQUM7UUFBRSxVQUFVLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUE7SUFFNUksSUFBSSxVQUFVLEVBQUUsVUFBVSxLQUFLLElBQUk7UUFBRSxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtTQUM1RCxJQUFJLE9BQU8sVUFBVSxFQUFFLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxDQUFDO1FBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFBO0lBRWhJLE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsYUFBYSxFQUFFLE1BQU07SUFDbkUsK0RBQStEO0lBQy9ELElBQUksZUFBZSxDQUFBO0lBRW5CLElBQUksQ0FBQztRQUNILGVBQWUsR0FBRyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQTtJQUN2RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTSxDQUFDLGtFQUFrRTtJQUMzRSxDQUFDO0lBRUQsSUFBSSxDQUFDLGVBQWU7UUFBRSxPQUFNO0lBRTVCLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEVBQUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLEdBQUcsTUFBTSxFQUFDLENBQUE7SUFFL0QsSUFBSSxDQUFDO1FBQ0gsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDBEQUEwRDtJQUM1RCxDQUFDO0lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsTUFBTSxDQUFDLFdBQVcsZUFBZSxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxvSEFBb0gsQ0FBQyxDQUFBO0lBQzlkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRXZlbnQtZHJpdmVuIGFkdmlzb3J5LWxvY2sgZHVyYXRpb24gdGVsZW1ldHJ5IChTVEMtMjYxLCBwYXJlbnQgZXBpYyBTVEMtMjA5KS5cbiAqXG4gKiBBIGxvY2sgY29udm95IGlzIG9ubHkgZml4YWJsZSB3aGVuIGl0IGlzICphdHRyaWJ1dGFibGUqOiB3aGljaCBsb2NrIG5hbWUgd2FzXG4gKiBjb250ZW5kZWQsIG9uIHdoaWNoIGJhY2tlbmQgdGllciwgZm9yIGhvdyBsb25nLCBhbmQgd2hvIGhlbGQgaXQuIFRoZXNlIHJlcG9ydHNcbiAqIGZpcmUgb24gdGhlIGFjcXVpc2l0aW9uL3JlbGVhc2UgZXZlbnRzIHRoZW1zZWx2ZXMg4oCUIG5ldmVyIGZyb20gYSBwZXJpb2RpY1xuICogc2Nhbm5lciDigJQgc28gYSBjb250ZW5kZWQgbG9jayBpbiBwcm9kdWN0aW9uIHN1cmZhY2VzIG9uIHRoZSBmcmFtZXdvcmstZXJyb3JcbiAqIGNoYW5uZWwgd2l0aCB0aGUgaG9sZGVyIGlkZW50aXR5IGF2YWlsYWJsZSBvbiB0aGF0IHRpZXIgYXQgdGhhdCBtb21lbnQsXG4gKiB3aXRob3V0IFNTSCBmb3JlbnNpY3MuXG4gKlxuICogVGhyZWUgZXZlbnRzLCBlYWNoIHdpdGggaXRzIG93biB0aHJlc2hvbGQgKGFsbCBjb25maWd1cmFibGUgcGVyIGRhdGFiYXNlIHZpYVxuICogYGFkdmlzb3J5TG9ja1RlbGVtZXRyeWAsIHNlZSBgZG9jcy9hZHZpc29yeS1sb2Nrcy5tZGApOlxuICpcbiAqIC0gYGFkdmlzb3J5LWxvY2stc2xvdy1hY3F1aXJlYCDigJQgYW4gYWNxdWlyZSB3YWl0IGNvbXBsZXRlZCBzbG93ZXIgdGhhblxuICogICBgc2xvd0FjcXVpcmVNc2AgKGRlZmF1bHQgNTAwMCksIGluY2x1ZGluZyB0aGUgZXZlbnR1YWwgb3V0Y29tZSAoYGFjcXVpcmVkYFxuICogICBvciBgdGltZW91dGApLlxuICogLSBgYWR2aXNvcnktbG9jay1hY3F1aXJlLXRpbWVvdXRgIOKAlCBhIHdhaXQgZXhjZWVkZWQgaXRzIHRpbWVvdXQuIFRoZSByZXBvcnRcbiAqICAgY2FycmllcyB0aGUgaG9sZGVyIGlkZW50aXR5IGF2YWlsYWJsZSBvbiB0aGUgdGllciBhdCB0aGF0IG1vbWVudDogdGhlXG4gKiAgIGRyaXZlci1uYXRpdmUgdGllcnMgYXR0cmlidXRlIHRoZSBob2xkZXIgY29ubmVjdGlvbiAoTWFyaWFEQlxuICogICBgSVNfVVNFRF9MT0NLYCwgUG9zdGdyZVNRTCBgcGdfbG9ja3NgIGpvaW5lZCB0byBgcGdfc3RhdF9hY3Rpdml0eWAsIFNRTFxuICogICBTZXJ2ZXIgYHN5cy5kbV90cmFuX2xvY2tzYCByZXF1ZXN0IHNlc3Npb24sIFNRTGl0ZSBOb2RlIGZpbGUgdGllclxuICogICBgb3duZXIuanNvbmAgcGlkL2hvc3RuYW1lKTsgdGhlIHByb2Nlc3MtbG9jYWwgdGllciByZXBvcnRzIHRoZSBvd25pbmdcbiAqICAgZHJpdmVyJ3MgYGhvbGRlcklkYC5cbiAqIC0gYGFkdmlzb3J5LWxvY2stc2xvdy1ob2xkYCDigJQgYSBob2xkIGxhc3RlZCBsb25nZXIgdGhhbiBgc2xvd0hvbGRNc2BcbiAqICAgKGRlZmF1bHQgNjAwMDApLCBlbWl0dGVkIGF0IHJlbGVhc2UuXG4gKlxuICogUmVwb3J0cyBhcmUgZW1pdHRlZCBvbiBgY29uZmlndXJhdGlvbi5nZXRUZWxlbWV0cnlFdmVudHMoKWAgYXMgYHRlbGVtZXRyeWBcbiAqIHdpdGggYHtjb250ZXh0OiBcImFkdmlzb3J5LWxvY2stdGVsZW1ldHJ5XCIsIGV2ZW50LCBsb2NrTmFtZSwgYmFja2VuZFRpZXIsIC4uLn1gXG4gKiBwYXlsb2Fkcy5cbiAqXG4gKiBUaGVzZSBhcmUgbWVhc3VyZW1lbnRzLCBub3QgZmFpbHVyZXMsIHNvIHRoZXkgYXJlIGRlbGliZXJhdGVseSBrZXB0IG9mZiB0aGVcbiAqIGZyYW1ld29yay1lcnJvciBjaGFubmVsOiBhIGJ1ZyByZXBvcnRlciBzdWJzY3JpYmVkIHRvIGBmcmFtZXdvcmstZXJyb3JgIC9cbiAqIGBhbGwtZXJyb3JgIG11c3QgYmUgYWJsZSB0byBhc3N1bWUgZXZlcnkgcGF5bG9hZCBjYXJyaWVzIGEgdGhyb3duIHZhbHVlLCBhbmQgYVxuICogY29udGVudGlvbiByZXBvcnQgZGVsaXZlcmVkIHRoZXJlIGJlY2FtZSBvbmUgYnVnIHJlcG9ydCAocGx1cyBpdHMgc3ltYm9saWNhdGlvblxuICogYW5kIG5vdGlmaWNhdGlvbiB3b3JrKSBwZXIgZXZlbnQuXG4gKlxuICogSG9sZGVyIGxvb2t1cHMgYXJlIHN0cmljdGx5IGJlc3QtZWZmb3J0ICphZnRlciogdGhlIGFjcXVpc2l0aW9uIGFscmVhZHlcbiAqIHNldHRsZWQ6IGEgZmFpbGVkIGxvb2t1cCBuZXZlciBjaGFuZ2VzIHRoZSBhY3F1aXNpdGlvbiBvdXRjb21lIGFuZCBuZXZlclxuICogdGhyb3dzIHRvIHRoZSBjYWxsZXIuXG4gKi9cblxuLyoqXG4gKiBPbmUgYWR2aXNvcnktbG9jayB0ZWxlbWV0cnkgcmVwb3J0LlxuICogQHR5cGVkZWYge29iamVjdH0gQWR2aXNvcnlMb2NrVGVsZW1ldHJ5UmVwb3J0XG4gKiBAcHJvcGVydHkge1wiYWR2aXNvcnktbG9jay1zbG93LWFjcXVpcmVcIiB8IFwiYWR2aXNvcnktbG9jay1hY3F1aXJlLXRpbWVvdXRcIiB8IFwiYWR2aXNvcnktbG9jay1zbG93LWhvbGRcIn0gZXZlbnQgLSBXaGljaCBldmVudCBmaXJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2NrTmFtZSAtIFRoZSBjb250ZW5kZWQgYWR2aXNvcnktbG9jayBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJhY2tlbmRUaWVyIC0gVGllciB0aGF0IHNlcnZlZCAob3IgcmVmdXNlZCkgdGhlIGFjcXVpc2l0aW9uOiBgZHJpdmVyLW5hdGl2ZWAsIGBwcm9jZXNzLWxvY2FsYCwgb3IgYGZpbGVgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uTXMgLSBNZWFzdXJlZCBkdXJhdGlvbiBvZiB0aGUgYWNxdWlyZSB3YWl0IChvciB0aGUgaG9sZCkuXG4gKiBAcHJvcGVydHkge1wiYWNxdWlyZWRcIiB8IFwidGltZW91dFwiIHwgbnVsbH0gb3V0Y29tZSAtIEZvciBhY3F1aXJlIGV2ZW50czogd2hldGhlciB0aGUgd2FpdCBldmVudHVhbGx5IGFjcXVpcmVkIHRoZSBsb2NrLiBOdWxsIGZvciBob2xkIHJlcG9ydHMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRNcyAtIFRoZSBlZmZlY3RpdmUgYWNxdWlyZSBib3VuZCBmb3IgYWNxdWlyZSBldmVudHMuIE51bGwgZm9yIGhvbGQgcmVwb3J0cyBvciBhbiB1bmJvdW5kZWQgd2FpdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaG9sZGVySWQgLSBQcm9jZXNzLWxvY2FsIGhvbGRlciBhdHRyaWJ1dGlvbiB3aGVuIHRoZSB0aWVyIGNhbiBuYW1lIGl0cyBsb2NhbCBob2xkZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhvbGRlckNvbm5lY3Rpb25JZCAtIERyaXZlci1uYXRpdmUgaG9sZGVyIGF0dHJpYnV0aW9uIGNhcHR1cmVkIGF0IHRoZSBldmVudCBtb21lbnQgKE1hcmlhREIgYElTX1VTRURfTE9DS2AgY29ubmVjdGlvbiBpZCwgUG9zdGdyZVNRTCBwaWQsIFNRTCBTZXJ2ZXIgc2Vzc2lvbiBpZCwgU1FMaXRlIGZpbGUgYHBpZEBob3N0bmFtZWApLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBob2xkZXJMb29rdXBFcnJvciAtIFNldCB3aGVuIHRoZSBiZXN0LWVmZm9ydCBob2xkZXIgbG9va3VwIGl0c2VsZiBmYWlsZWQ7IHRoZSBsb29rdXAgbmV2ZXIgYWZmZWN0cyB0aGUgYWNxdWlzaXRpb24uXG4gKi9cblxuLyoqXG4gKiBSZXNvbHZlZCBwZXItZGF0YWJhc2UgdGVsZW1ldHJ5IHRocmVzaG9sZHMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZHZpc29yeUxvY2tUZWxlbWV0cnlUaHJlc2hvbGRzXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNsb3dBY3F1aXJlTXMgLSBSZXBvcnQgYW4gYWNxdWlyZSB3YWl0IHNsb3dlciB0aGFuIHRoaXM7IGBudWxsYCBkaXNhYmxlcyBzbG93LWFjcXVpcmUgcmVwb3J0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2xvd0hvbGRNcyAtIFJlcG9ydCBhIGhvbGQgbG9uZ2VyIHRoYW4gdGhpcyBhdCByZWxlYXNlOyBgbnVsbGAgZGlzYWJsZXMgaG9sZCByZXBvcnRzLlxuICovXG5cbi8qKiBGcmFtZXdvcmsgZGVmYXVsdDogcmVwb3J0IGFuIGFjcXVpcmUgd2FpdCB0aGF0IGNvbXBsZXRlZCBzbG93ZXIgdGhhbiB0aGlzLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQURWSVNPUllfTE9DS19TTE9XX0FDUVVJUkVfTVMgPSA1MDAwXG5cbi8qKiBGcmFtZXdvcmsgZGVmYXVsdDogcmVwb3J0IGEgaG9sZCB0aGF0IG91dGxpdmVzIHRoaXMgYXQgcmVsZWFzZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FEVklTT1JZX0xPQ0tfU0xPV19IT0xEX01TID0gNjAgKiAxMDAwXG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgdGVsZW1ldHJ5IHRocmVzaG9sZHMgZm9yIG9uZSBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQW4gZXhwbGljaXQgcGVyLWRhdGFiYXNlIGBhZHZpc29yeUxvY2tUZWxlbWV0cnlgIHZhbHVlIHdpbnM7IGBudWxsYCBvcHRzIG91dFxuICogb2YgdGhhdCByZXBvcnQ7IG9ubHkgd2hlbiBuZWl0aGVyIGlzIGNvbmZpZ3VyZWQgZG9lcyB0aGUgZnJhbWV3b3JrIGRlZmF1bHRcbiAqIGFwcGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGFyZ3MgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7QWR2aXNvcnlMb2NrVGVsZW1ldHJ5VGhyZXNob2xkc30gLSBSZXNvbHZlZCB0aHJlc2hvbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2aXNvcnlMb2NrVGVsZW1ldHJ5VGhyZXNob2xkcyhhcmdzKSB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBhcmdzPy5hZHZpc29yeUxvY2tUZWxlbWV0cnlcbiAgLyoqIEB0eXBlIHtBZHZpc29yeUxvY2tUZWxlbWV0cnlUaHJlc2hvbGRzfSAqL1xuICBjb25zdCB0aHJlc2hvbGRzID0ge1xuICAgIHNsb3dBY3F1aXJlTXM6IERFRkFVTFRfQURWSVNPUllfTE9DS19TTE9XX0FDUVVJUkVfTVMsXG4gICAgc2xvd0hvbGRNczogREVGQVVMVF9BRFZJU09SWV9MT0NLX1NMT1dfSE9MRF9NU1xuICB9XG5cbiAgaWYgKGNvbmZpZ3VyZWQ/LnNsb3dBY3F1aXJlTXMgPT09IG51bGwpIHRocmVzaG9sZHMuc2xvd0FjcXVpcmVNcyA9IG51bGxcbiAgZWxzZSBpZiAodHlwZW9mIGNvbmZpZ3VyZWQ/LnNsb3dBY3F1aXJlTXMgPT09IFwibnVtYmVyXCIgJiYgY29uZmlndXJlZC5zbG93QWNxdWlyZU1zID49IDApIHRocmVzaG9sZHMuc2xvd0FjcXVpcmVNcyA9IGNvbmZpZ3VyZWQuc2xvd0FjcXVpcmVNc1xuXG4gIGlmIChjb25maWd1cmVkPy5zbG93SG9sZE1zID09PSBudWxsKSB0aHJlc2hvbGRzLnNsb3dIb2xkTXMgPSBudWxsXG4gIGVsc2UgaWYgKHR5cGVvZiBjb25maWd1cmVkPy5zbG93SG9sZE1zID09PSBcIm51bWJlclwiICYmIGNvbmZpZ3VyZWQuc2xvd0hvbGRNcyA+PSAwKSB0aHJlc2hvbGRzLnNsb3dIb2xkTXMgPSBjb25maWd1cmVkLnNsb3dIb2xkTXNcblxuICByZXR1cm4gdGhyZXNob2xkc1xufVxuXG4vKipcbiAqIEVtaXQgb25lIHRlbGVtZXRyeSByZXBvcnQgb24gdGhlIGZyYW1ld29yay10ZWxlbWV0cnkgY2hhbm5lbC5cbiAqXG4gKiBXaGVuIG5vIGB0ZWxlbWV0cnlgIGxpc3RlbmVyIGlzIGF0dGFjaGVkLCBhIG9uZS1saW5lIHN1bW1hcnkgZ29lcyB0byBgc3RkZXJyYFxuICogc28gYSBjb252b3kgaXMgbmV2ZXIgY29tcGxldGVseSBzaWxlbnQuIEEgbGlzdGVuZXIgZmFpbHVyZSBjYW4gbmV2ZXIgYnJlYWtcbiAqIGxvY2sgaGFuZGxpbmcsIHNvIGVtaXNzaW9ucyBhcmUgZ3VhcmRlZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZSBvd25pbmcgdGhlIHRlbGVtZXRyeSBjaGFubmVsLlxuICogQHBhcmFtIHtBZHZpc29yeUxvY2tUZWxlbWV0cnlSZXBvcnR9IHJlcG9ydCAtIFRoZSByZXBvcnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtaXRBZHZpc29yeUxvY2tUZWxlbWV0cnlSZXBvcnQoY29uZmlndXJhdGlvbiwgcmVwb3J0KSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiZXZlbnRlbWl0dGVyM1wiKS5FdmVudEVtaXR0ZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCB0ZWxlbWV0cnlFdmVudHNcblxuICB0cnkge1xuICAgIHRlbGVtZXRyeUV2ZW50cyA9IGNvbmZpZ3VyYXRpb24/LmdldFRlbGVtZXRyeUV2ZW50cygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAvLyBObyBjb25maWd1cmF0aW9uIHRvIHJlcG9ydCB0aHJvdWdoIOKAlCBuZXZlciBicmVhayBsb2NrIGhhbmRsaW5nLlxuICB9XG5cbiAgaWYgKCF0ZWxlbWV0cnlFdmVudHMpIHJldHVyblxuXG4gIGNvbnN0IGhhc0xpc3RlbmVyID0gdGVsZW1ldHJ5RXZlbnRzLmxpc3RlbmVyQ291bnQoXCJ0ZWxlbWV0cnlcIikgPiAwXG4gIGNvbnN0IHBheWxvYWQgPSB7Y29udGV4dDogXCJhZHZpc29yeS1sb2NrLXRlbGVtZXRyeVwiLCAuLi5yZXBvcnR9XG5cbiAgdHJ5IHtcbiAgICB0ZWxlbWV0cnlFdmVudHMuZW1pdChcInRlbGVtZXRyeVwiLCBwYXlsb2FkKVxuICB9IGNhdGNoIHtcbiAgICAvLyBBIGJyb2tlbiBsaXN0ZW5lciBtdXN0IG5ldmVyIHN1cmZhY2UgYXMgYSBsb2NrIGZhaWx1cmUuXG4gIH1cblxuICBpZiAoIWhhc0xpc3RlbmVyKSB7XG4gICAgY29uc29sZS5lcnJvcihgW3ZlbG9jaW91cyBhZHZpc29yeS1sb2NrLXRlbGVtZXRyeSAke3JlcG9ydC5ldmVudH1dIGxvY2s9JHtKU09OLnN0cmluZ2lmeShyZXBvcnQubG9ja05hbWUpfSB0aWVyPSR7cmVwb3J0LmJhY2tlbmRUaWVyfSBkdXJhdGlvbk1zPSR7cmVwb3J0LmR1cmF0aW9uTXN9JHtyZXBvcnQub3V0Y29tZSA/IGAgb3V0Y29tZT0ke3JlcG9ydC5vdXRjb21lfWAgOiBcIlwifSR7cmVwb3J0LmhvbGRlckNvbm5lY3Rpb25JZCA/IGAgaG9sZGVyQ29ubmVjdGlvbklkPSR7cmVwb3J0LmhvbGRlckNvbm5lY3Rpb25JZH1gIDogXCJcIn0ke3JlcG9ydC5ob2xkZXJJZCA/IGAgaG9sZGVySWQ9JHtyZXBvcnQuaG9sZGVySWR9YCA6IFwiXCJ9IOKAlCBzdWJzY3JpYmUgdmlhIGNvbmZpZ3VyYXRpb24uZ2V0VGVsZW1ldHJ5RXZlbnRzKCkub24oXCJ0ZWxlbWV0cnlcIiwg4oCmKSB0byByb3V0ZSB0aGVzZSBtZWFzdXJlbWVudHMgdG8geW91ciBtZXRyaWNzYClcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
/**
|
|
86
86
|
* @typedef {object} DatabaseConfigurationType
|
|
87
87
|
* @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.
|
|
88
|
-
* @property {{slowAcquireMs?: number | null, slowHoldMs?: number | null}} [advisoryLockTelemetry] - Event-driven advisory-lock duration telemetry thresholds. `slowAcquireMs` (default `5000`) reports an acquire wait that completed slower than the threshold, including the eventual outcome; `advisory-lock-acquire-timeout` always fires when a wait exceeds its bound and carries the holder identity available on the tier at that moment. `slowHoldMs` (default `60000`) reports a hold that outlives the threshold at release. `null` disables that report. Reports fire on the events themselves — no periodic scanner — on `
|
|
88
|
+
* @property {{slowAcquireMs?: number | null, slowHoldMs?: number | null}} [advisoryLockTelemetry] - Event-driven advisory-lock duration telemetry thresholds. `slowAcquireMs` (default `5000`) reports an acquire wait that completed slower than the threshold, including the eventual outcome; `advisory-lock-acquire-timeout` always fires when a wait exceeds its bound and carries the holder identity available on the tier at that moment. `slowHoldMs` (default `60000`) reports a hold that outlives the threshold at release. `null` disables that report. Reports fire on the events themselves — no periodic scanner — on `getTelemetryEvents()` as `telemetry` with `context: "advisory-lock-telemetry"`. See [docs/advisory-locks.md](../docs/advisory-locks.md).
|
|
89
89
|
* @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.
|
|
90
90
|
* @property {string} [databaseCollation] - Default collation applied by `db:create` via mysql/mariadb `CREATE DATABASE ... COLLATE`.
|
|
91
91
|
* @property {string} [database] - Database name for this connection.
|
package/src/configuration.js
CHANGED
|
@@ -525,6 +525,7 @@ export default class VelociousConfiguration {
|
|
|
525
525
|
* @type {WeakSet<object>} */
|
|
526
526
|
this._appliedRouteMounts = new WeakSet()
|
|
527
527
|
this._errorEvents = new EventEmitter()
|
|
528
|
+
this._telemetryEvents = new EventEmitter()
|
|
528
529
|
|
|
529
530
|
/**
|
|
530
531
|
* Stores the database pools value.
|
|
@@ -3865,6 +3866,19 @@ export default class VelociousConfiguration {
|
|
|
3865
3866
|
return this._errorEvents
|
|
3866
3867
|
}
|
|
3867
3868
|
|
|
3869
|
+
/**
|
|
3870
|
+
* Framework telemetry emitter. Telemetry reports measurements — lock contention,
|
|
3871
|
+
* slow queries, queue depth — that are worth observing but are not failures. It is
|
|
3872
|
+
* deliberately separate from `getErrorEvents()`: a bug reporter subscribes to the
|
|
3873
|
+
* error channel on the promise that every payload there carries a thrown value, and
|
|
3874
|
+
* a contention measurement emitted as `framework-error` turns into a bug report on
|
|
3875
|
+
* every occurrence instead of a metric.
|
|
3876
|
+
* @returns {import("eventemitter3").EventEmitter} - Framework telemetry events emitter.
|
|
3877
|
+
*/
|
|
3878
|
+
getTelemetryEvents() {
|
|
3879
|
+
return this._telemetryEvents
|
|
3880
|
+
}
|
|
3881
|
+
|
|
3868
3882
|
/**
|
|
3869
3883
|
* Registers a reporter that can add client-safe metadata to frontend-model error payloads.
|
|
3870
3884
|
* @param {import("./configuration-types.js").ClientErrorPayloadReporterType} reporter - Reporter callback.
|
|
@@ -26,10 +26,15 @@
|
|
|
26
26
|
* - `advisory-lock-slow-hold` — a hold lasted longer than `slowHoldMs`
|
|
27
27
|
* (default 60000), emitted at release.
|
|
28
28
|
*
|
|
29
|
-
* Reports are emitted on `configuration.
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
29
|
+
* Reports are emitted on `configuration.getTelemetryEvents()` as `telemetry`
|
|
30
|
+
* with `{context: "advisory-lock-telemetry", event, lockName, backendTier, ...}`
|
|
31
|
+
* payloads.
|
|
32
|
+
*
|
|
33
|
+
* These are measurements, not failures, so they are deliberately kept off the
|
|
34
|
+
* framework-error channel: a bug reporter subscribed to `framework-error` /
|
|
35
|
+
* `all-error` must be able to assume every payload carries a thrown value, and a
|
|
36
|
+
* contention report delivered there became one bug report (plus its symbolication
|
|
37
|
+
* and notification work) per event.
|
|
33
38
|
*
|
|
34
39
|
* Holder lookups are strictly best-effort *after* the acquisition already
|
|
35
40
|
* settled: a failed lookup never changes the acquisition outcome and never
|
|
@@ -89,41 +94,37 @@ export function advisoryLockTelemetryThresholds(args) {
|
|
|
89
94
|
}
|
|
90
95
|
|
|
91
96
|
/**
|
|
92
|
-
* Emit one telemetry report on the framework-
|
|
97
|
+
* Emit one telemetry report on the framework-telemetry channel.
|
|
93
98
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* emissions are guarded.
|
|
99
|
-
* @param {import("../configuration.js").default} configuration - Configuration instance owning the error channel.
|
|
99
|
+
* When no `telemetry` listener is attached, a one-line summary goes to `stderr`
|
|
100
|
+
* so a convoy is never completely silent. A listener failure can never break
|
|
101
|
+
* lock handling, so emissions are guarded.
|
|
102
|
+
* @param {import("../configuration.js").default} configuration - Configuration instance owning the telemetry channel.
|
|
100
103
|
* @param {AdvisoryLockTelemetryReport} report - The report payload.
|
|
101
104
|
* @returns {void} - No return value.
|
|
102
105
|
*/
|
|
103
106
|
export function emitAdvisoryLockTelemetryReport(configuration, report) {
|
|
104
107
|
/** @type {import("eventemitter3").EventEmitter | undefined} */
|
|
105
|
-
let
|
|
108
|
+
let telemetryEvents
|
|
106
109
|
|
|
107
110
|
try {
|
|
108
|
-
|
|
111
|
+
telemetryEvents = configuration?.getTelemetryEvents()
|
|
109
112
|
} catch {
|
|
110
113
|
return // No configuration to report through — never break lock handling.
|
|
111
114
|
}
|
|
112
115
|
|
|
113
|
-
if (!
|
|
116
|
+
if (!telemetryEvents) return
|
|
114
117
|
|
|
115
|
-
const hasListener =
|
|
116
|
-
|| errorEvents.listenerCount("all-error") > 0
|
|
118
|
+
const hasListener = telemetryEvents.listenerCount("telemetry") > 0
|
|
117
119
|
const payload = {context: "advisory-lock-telemetry", ...report}
|
|
118
120
|
|
|
119
121
|
try {
|
|
120
|
-
|
|
121
|
-
errorEvents.emit("all-error", {...payload, errorType: "framework-error"})
|
|
122
|
+
telemetryEvents.emit("telemetry", payload)
|
|
122
123
|
} catch {
|
|
123
124
|
// A broken listener must never surface as a lock failure.
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
if (!hasListener) {
|
|
127
|
-
console.error(`[velocious advisory-lock-telemetry ${report.event}] lock=${JSON.stringify(report.lockName)} tier=${report.backendTier} durationMs=${report.durationMs}${report.outcome ? ` outcome=${report.outcome}` : ""}${report.holderConnectionId ? ` holderConnectionId=${report.holderConnectionId}` : ""}${report.holderId ? ` holderId=${report.holderId}` : ""} — subscribe via configuration.
|
|
128
|
+
console.error(`[velocious advisory-lock-telemetry ${report.event}] lock=${JSON.stringify(report.lockName)} tier=${report.backendTier} durationMs=${report.durationMs}${report.outcome ? ` outcome=${report.outcome}` : ""}${report.holderConnectionId ? ` holderConnectionId=${report.holderConnectionId}` : ""}${report.holderId ? ` holderId=${report.holderId}` : ""} — subscribe via configuration.getTelemetryEvents().on("telemetry", …) to route these measurements to your metrics`)
|
|
128
129
|
}
|
|
129
130
|
}
|