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.
@@ -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.getErrorEvents()` as `framework-error`
76
- * (plus the matching `all-error`) with `{context: "advisory-lock-telemetry",
77
- * event, lockName, backendTier, ...}` payloads, matching the repo's "never
78
- * swallow" rule so process-level bug reporters capture them.
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-error channel.
122
+ * Emit one telemetry report on the framework-telemetry channel.
118
123
  *
119
- * Mirrors the repo's framework-error emission shape (see `configuration.js`
120
- * `_reportBeaconError`): when no listener is attached to `framework-error` or
121
- * `all-error`, a one-line summary goes to `stderr` so a convoy is never
122
- * completely silent. A listener failure can never break lock handling, so
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":"AAwCG,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;AAvDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;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;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAAC,aAAa,EAJlD,OAAO,qBAAqB,EAAE,OAIoB,EAAE,MAAM,EAH1D,2BAG0D,GAFxD,IAAI,CA4BhB"}
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.getErrorEvents()` as `framework-error`
29
- * (plus the matching `all-error`) with `{context: "advisory-lock-telemetry",
30
- * event, lockName, backendTier, ...}` payloads, matching the repo's "never
31
- * swallow" rule so process-level bug reporters capture them.
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-error channel.
91
+ * Emit one telemetry report on the framework-telemetry channel.
87
92
  *
88
- * Mirrors the repo's framework-error emission shape (see `configuration.js`
89
- * `_reportBeaconError`): when no listener is attached to `framework-error` or
90
- * `all-error`, a one-line summary goes to `stderr` so a convoy is never
91
- * completely silent. A listener failure can never break lock handling, so
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 errorEvents;
102
+ let telemetryEvents;
100
103
  try {
101
- errorEvents = configuration?.getErrorEvents();
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 (!errorEvents)
109
+ if (!telemetryEvents)
107
110
  return;
108
- const hasListener = errorEvents.listenerCount("framework-error") > 0
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
- errorEvents.emit("framework-error", payload);
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.getErrorEvents().on("framework-error", …) to route these reports to your bug reporter`);
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
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.710",
6
+ "version": "1.0.711",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -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 `getErrorEvents()` as `framework-error` with `context: "advisory-lock-telemetry"`. See [docs/advisory-locks.md](../docs/advisory-locks.md).
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.
@@ -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.getErrorEvents()` as `framework-error`
30
- * (plus the matching `all-error`) with `{context: "advisory-lock-telemetry",
31
- * event, lockName, backendTier, ...}` payloads, matching the repo's "never
32
- * swallow" rule so process-level bug reporters capture them.
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-error channel.
97
+ * Emit one telemetry report on the framework-telemetry channel.
93
98
  *
94
- * Mirrors the repo's framework-error emission shape (see `configuration.js`
95
- * `_reportBeaconError`): when no listener is attached to `framework-error` or
96
- * `all-error`, a one-line summary goes to `stderr` so a convoy is never
97
- * completely silent. A listener failure can never break lock handling, so
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 errorEvents
108
+ let telemetryEvents
106
109
 
107
110
  try {
108
- errorEvents = configuration?.getErrorEvents()
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 (!errorEvents) return
116
+ if (!telemetryEvents) return
114
117
 
115
- const hasListener = errorEvents.listenerCount("framework-error") > 0
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
- errorEvents.emit("framework-error", payload)
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.getErrorEvents().on("framework-error", …) to route these reports to your bug reporter`)
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
  }