@pipeline-builder/api-core 5.0.21 → 5.0.22
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/lib/utils/env.d.ts +26 -0
- package/lib/utils/env.js +31 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/metric-emitter.d.ts +19 -0
- package/lib/utils/metric-emitter.js +26 -1
- package/package.json +1 -1
package/lib/utils/env.d.ts
CHANGED
|
@@ -27,3 +27,29 @@ export declare function envInt(name: string, def: number, opts?: {
|
|
|
27
27
|
export declare function envBool(name: string, def: boolean): boolean;
|
|
28
28
|
/** Read a string env var; unset / blank → `def`. */
|
|
29
29
|
export declare function envStr(name: string, def: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Is a Postgres read replica configured AND switched on?
|
|
32
|
+
*
|
|
33
|
+
* Lives in api-core, not pipeline-data, even though the read POOL does. It is
|
|
34
|
+
* pure env logic with no database dependency, and BOTH packages need it:
|
|
35
|
+
* pipeline-data to decide whether to build the pool, and api-server's
|
|
36
|
+
* tenant-context middleware to decide whether the cross-request write pin is in
|
|
37
|
+
* play at all.
|
|
38
|
+
*
|
|
39
|
+
* WHY THAT PLACEMENT IS LOAD-BEARING, not taste. api-server's middleware runs in
|
|
40
|
+
* EVERY service, and 91 test suites stub `@pipeline-builder/pipeline-data` with
|
|
41
|
+
* `stubModule`, which THROWS on access to an export the suite did not override —
|
|
42
|
+
* deliberately, to force explicitness. So reaching into pipeline-data from the
|
|
43
|
+
* middleware turned every one of those suites into a 500, and patching 91 stubs
|
|
44
|
+
* would only defer the next one. api-core's mocks spread `requireActual`, so a
|
|
45
|
+
* symbol here is available to all of them without a single stub edit.
|
|
46
|
+
*
|
|
47
|
+
* `DB_READ_ENABLED=false` is the KILL SWITCH: it forces every read back to the
|
|
48
|
+
* primary without a redeploy or a manifest change, which the unset-host fallback
|
|
49
|
+
* does not cover. Unset host answers "there is no replica"; the kill switch
|
|
50
|
+
* answers "there is one and I do not trust it".
|
|
51
|
+
*
|
|
52
|
+
* `.trim()` matters: `DB_READ_HOST=" "` from a stray space must not read as
|
|
53
|
+
* "a replica exists".
|
|
54
|
+
*/
|
|
55
|
+
export declare function isReadReplicaConfigured(): boolean;
|
package/lib/utils/env.js
CHANGED
|
@@ -50,4 +50,34 @@ export function envStr(name, def) {
|
|
|
50
50
|
const raw = process.env[name];
|
|
51
51
|
return raw === undefined || raw.trim() === '' ? def : raw;
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Is a Postgres read replica configured AND switched on?
|
|
55
|
+
*
|
|
56
|
+
* Lives in api-core, not pipeline-data, even though the read POOL does. It is
|
|
57
|
+
* pure env logic with no database dependency, and BOTH packages need it:
|
|
58
|
+
* pipeline-data to decide whether to build the pool, and api-server's
|
|
59
|
+
* tenant-context middleware to decide whether the cross-request write pin is in
|
|
60
|
+
* play at all.
|
|
61
|
+
*
|
|
62
|
+
* WHY THAT PLACEMENT IS LOAD-BEARING, not taste. api-server's middleware runs in
|
|
63
|
+
* EVERY service, and 91 test suites stub `@pipeline-builder/pipeline-data` with
|
|
64
|
+
* `stubModule`, which THROWS on access to an export the suite did not override —
|
|
65
|
+
* deliberately, to force explicitness. So reaching into pipeline-data from the
|
|
66
|
+
* middleware turned every one of those suites into a 500, and patching 91 stubs
|
|
67
|
+
* would only defer the next one. api-core's mocks spread `requireActual`, so a
|
|
68
|
+
* symbol here is available to all of them without a single stub edit.
|
|
69
|
+
*
|
|
70
|
+
* `DB_READ_ENABLED=false` is the KILL SWITCH: it forces every read back to the
|
|
71
|
+
* primary without a redeploy or a manifest change, which the unset-host fallback
|
|
72
|
+
* does not cover. Unset host answers "there is no replica"; the kill switch
|
|
73
|
+
* answers "there is one and I do not trust it".
|
|
74
|
+
*
|
|
75
|
+
* `.trim()` matters: `DB_READ_HOST=" "` from a stray space must not read as
|
|
76
|
+
* "a replica exists".
|
|
77
|
+
*/
|
|
78
|
+
export function isReadReplicaConfigured() {
|
|
79
|
+
if (!envBool('DB_READ_ENABLED', true))
|
|
80
|
+
return false;
|
|
81
|
+
return envStr('DB_READ_HOST', '').trim().length > 0;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQVksRUFBRSxHQUFXLEVBQUUsSUFBcUM7SUFDckYsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxTQUFTO1FBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssU0FBUztRQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFZLEVBQUUsR0FBWTtJQUNoRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzFELElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxNQUFNLENBQUMsSUFBWSxFQUFFLEdBQVc7SUFDOUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFR5cGVkIGVudmlyb25tZW50LXZhcmlhYmxlIHJlYWRlcnMgd2l0aCBjb25zaXN0ZW50IHBhcnNpbmcgKyBkZWZhdWx0cy5cbiAqXG4gKiBIYW5kLXJvbGxlZCBgcGFyc2VJbnQocHJvY2Vzcy5lbnYuWCB8fCAn4oCmJywgMTApYCAvIGBwcm9jZXNzLmVudi5YID09PSAndHJ1ZSdgXG4gKiBkcmlmdHMgKHRoZSBzYW1lIHZhciBwYXJzZWQgd2l0aCBkaWZmZXJlbnQgZGVmYXVsdHMgaW4gZGlmZmVyZW50IHBhY2thZ2VzKVxuICogYW5kIHNpbGVudGx5IHJldHVybnMgdGhlIGRlZmF1bHQgb24gYSB0eXBvJ2QgbmFtZS4gVGhlc2UgaGVscGVycyBjZW50cmFsaXplIHRoZSBwYXJzaW5nIHNvIGEgdmFsdWVcbiAqIGlzIHJlYWQgdGhlIHNhbWUgd2F5IGV2ZXJ5d2hlcmUsIGFuZCBtYWtlIHNoYXJlZCBjb25zdGFudHMgaW1wb3J0YWJsZSByYXRoZXJcbiAqIHRoYW4gcmUtZGVyaXZlZCAoc2VlIGBNQVhfUEFHRV9MSU1JVGAgLyBgREVGQVVMVF9QQUdFX0xJTUlUYCBpblxuICogYHZhbGlkYXRpb24vY29tbW9uLXNjaGVtYXMudHNgKS5cbiAqL1xuXG4vKipcbiAqIFBhcnNlIGFuIGludGVnZXIgZW52IHZhci4gVW5zZXQgLyBibGFuayAvIG5vdCBhIGNsZWFuIGludGVnZXIgc3RyaW5nIOKGkiBgZGVmYC5cbiAqIE9wdGlvbmFsIGBtaW5gL2BtYXhgIGNsYW1wIHRoZSByZXN1bHQgKGFwcGxpZWQgYWZ0ZXIgdGhlIGRlZmF1bHQpLlxuICpcbiAqIFNUUklDVCBvbiBwdXJwb3NlOiBgcGFyc2VJbnRgIGFjY2VwdHMgYDUwLjVgICjihpIgNTApIGFuZCBgMTJhYmNgICjihpIgMTIpLCB3aGljaFxuICogaXMgaG93IGEgdHlwbydkIHF1b3RhIGxpbWl0IG9yIHRpbWVvdXQgc2lsZW50bHkgc2hpcHMgYSB2YWx1ZSBub2JvZHkgd3JvdGUuXG4gKiBBbnl0aGluZyB0aGF0IGlzbid0IGAtP1xcZCtgIGZhbGxzIGJhY2sgdG8gdGhlIGNvZGUgZGVmYXVsdCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52SW50KG5hbWU6IHN0cmluZywgZGVmOiBudW1iZXIsIG9wdHM/OiB7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0pOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdz8udHJpbSgpID8/ICcnO1xuICBsZXQgbiA9IHRyaW1tZWQgIT09ICcnICYmIC9eWystXT9cXGQrJC8udGVzdCh0cmltbWVkKSA/IE51bWJlci5wYXJzZUludCh0cmltbWVkLCAxMCkgOiBkZWY7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSBuID0gZGVmO1xuICBpZiAob3B0cz8ubWluICE9PSB1bmRlZmluZWQpIG4gPSBNYXRoLm1heChvcHRzLm1pbiwgbik7XG4gIGlmIChvcHRzPy5tYXggIT09IHVuZGVmaW5lZCkgbiA9IE1hdGgubWluKG9wdHMubWF4LCBuKTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogUGFyc2UgYSBib29sZWFuIGVudiB2YXIuIGB0cnVlYC9gMWAvYHllc2Ag4oaSIHRydWUsIGBmYWxzZWAvYDBgL2Bub2Ag4oaSIGZhbHNlXG4gKiAoY2FzZS1pbnNlbnNpdGl2ZSk7IHVuc2V0IC8gYmxhbmsgLyB1bnJlY29nbml6ZWQg4oaSIGBkZWZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52Qm9vbChuYW1lOiBzdHJpbmcsIGRlZjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdy50cmltKCkgPT09ICcnKSByZXR1cm4gZGVmO1xuICBjb25zdCB2ID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodiA9PT0gJ3RydWUnIHx8IHYgPT09ICcxJyB8fCB2ID09PSAneWVzJykgcmV0dXJuIHRydWU7XG4gIGlmICh2ID09PSAnZmFsc2UnIHx8IHYgPT09ICcwJyB8fCB2ID09PSAnbm8nKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBkZWY7XG59XG5cbi8qKiBSZWFkIGEgc3RyaW5nIGVudiB2YXI7IHVuc2V0IC8gYmxhbmsg4oaSIGBkZWZgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudlN0cihuYW1lOiBzdHJpbmcsIGRlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIHJldHVybiByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcudHJpbSgpID09PSAnJyA/IGRlZiA6IHJhdztcbn1cblxuLyoqXG4gKiBJcyBhIFBvc3RncmVzIHJlYWQgcmVwbGljYSBjb25maWd1cmVkIEFORCBzd2l0Y2hlZCBvbj9cbiAqXG4gKiBMaXZlcyBpbiBhcGktY29yZSwgbm90IHBpcGVsaW5lLWRhdGEsIGV2ZW4gdGhvdWdoIHRoZSByZWFkIFBPT0wgZG9lcy4gSXQgaXNcbiAqIHB1cmUgZW52IGxvZ2ljIHdpdGggbm8gZGF0YWJhc2UgZGVwZW5kZW5jeSwgYW5kIEJPVEggcGFja2FnZXMgbmVlZCBpdDpcbiAqIHBpcGVsaW5lLWRhdGEgdG8gZGVjaWRlIHdoZXRoZXIgdG8gYnVpbGQgdGhlIHBvb2wsIGFuZCBhcGktc2VydmVyJ3NcbiAqIHRlbmFudC1jb250ZXh0IG1pZGRsZXdhcmUgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGNyb3NzLXJlcXVlc3Qgd3JpdGUgcGluIGlzIGluXG4gKiBwbGF5IGF0IGFsbC5cbiAqXG4gKiBXSFkgVEhBVCBQTEFDRU1FTlQgSVMgTE9BRC1CRUFSSU5HLCBub3QgdGFzdGUuIGFwaS1zZXJ2ZXIncyBtaWRkbGV3YXJlIHJ1bnMgaW5cbiAqIEVWRVJZIHNlcnZpY2UsIGFuZCA5MSB0ZXN0IHN1aXRlcyBzdHViIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhYCB3aXRoXG4gKiBgc3R1Yk1vZHVsZWAsIHdoaWNoIFRIUk9XUyBvbiBhY2Nlc3MgdG8gYW4gZXhwb3J0IHRoZSBzdWl0ZSBkaWQgbm90IG92ZXJyaWRlIOKAlFxuICogZGVsaWJlcmF0ZWx5LCB0byBmb3JjZSBleHBsaWNpdG5lc3MuIFNvIHJlYWNoaW5nIGludG8gcGlwZWxpbmUtZGF0YSBmcm9tIHRoZVxuICogbWlkZGxld2FyZSB0dXJuZWQgZXZlcnkgb25lIG9mIHRob3NlIHN1aXRlcyBpbnRvIGEgNTAwLCBhbmQgcGF0Y2hpbmcgOTEgc3R1YnNcbiAqIHdvdWxkIG9ubHkgZGVmZXIgdGhlIG5leHQgb25lLiBhcGktY29yZSdzIG1vY2tzIHNwcmVhZCBgcmVxdWlyZUFjdHVhbGAsIHNvIGFcbiAqIHN5bWJvbCBoZXJlIGlzIGF2YWlsYWJsZSB0byBhbGwgb2YgdGhlbSB3aXRob3V0IGEgc2luZ2xlIHN0dWIgZWRpdC5cbiAqXG4gKiBgREJfUkVBRF9FTkFCTEVEPWZhbHNlYCBpcyB0aGUgS0lMTCBTV0lUQ0g6IGl0IGZvcmNlcyBldmVyeSByZWFkIGJhY2sgdG8gdGhlXG4gKiBwcmltYXJ5IHdpdGhvdXQgYSByZWRlcGxveSBvciBhIG1hbmlmZXN0IGNoYW5nZSwgd2hpY2ggdGhlIHVuc2V0LWhvc3QgZmFsbGJhY2tcbiAqIGRvZXMgbm90IGNvdmVyLiBVbnNldCBob3N0IGFuc3dlcnMgXCJ0aGVyZSBpcyBubyByZXBsaWNhXCI7IHRoZSBraWxsIHN3aXRjaFxuICogYW5zd2VycyBcInRoZXJlIGlzIG9uZSBhbmQgSSBkbyBub3QgdHJ1c3QgaXRcIi5cbiAqXG4gKiBgLnRyaW0oKWAgbWF0dGVyczogYERCX1JFQURfSE9TVD1cIiBcImAgZnJvbSBhIHN0cmF5IHNwYWNlIG11c3Qgbm90IHJlYWQgYXNcbiAqIFwiYSByZXBsaWNhIGV4aXN0c1wiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkUmVwbGljYUNvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gIGlmICghZW52Qm9vbCgnREJfUkVBRF9FTkFCTEVEJywgdHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVudlN0cignREJfUkVBRF9IT1NUJywgJycpLnRyaW0oKS5sZW5ndGggPiAwO1xufVxuIl19
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export * from './concurrency.js';
|
|
|
16
16
|
export * from './audit.js';
|
|
17
17
|
export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, type EncryptedBlob, type KeyProvider, EnvKeyProvider, KmsKeyProvider, createBaseKeyProvider, initSecretEncryption, type PerOrgKmsConfig, type PerOrgKmsResolver, PerOrgKmsKeyProvider, } from './secret-encryption.js';
|
|
18
18
|
export * from './secret-rotation.js';
|
|
19
|
-
export { setCounterEmitter, resetCounterEmitter, emitCounter, } from './metric-emitter.js';
|
|
19
|
+
export { setCounterEmitter, resetCounterEmitter, setGaugeEmitter, resetGaugeEmitter, emitGauge, emitCounter, } from './metric-emitter.js';
|
|
20
20
|
export * from './aws-scrub.js';
|
|
21
21
|
export { extractPredicate, SPDX_PREDICATE_TYPE, } from './dsse.js';
|
|
22
22
|
export { maskLine, looksSensitive, REDACTED, SENSITIVE_VALUE_PATTERNS, } from './sensitive-patterns.js';
|
package/lib/utils/index.js
CHANGED
|
@@ -22,7 +22,7 @@ export * from './concurrency.js';
|
|
|
22
22
|
export * from './audit.js';
|
|
23
23
|
export { getDefaultKeyProvider, resetDefaultKeyProvider, setKeyProvider, encryptSecret, decryptSecret, isEncryptedBlob, EnvKeyProvider, KmsKeyProvider, createBaseKeyProvider, initSecretEncryption, PerOrgKmsKeyProvider, } from './secret-encryption.js';
|
|
24
24
|
export * from './secret-rotation.js';
|
|
25
|
-
export { setCounterEmitter, resetCounterEmitter, emitCounter, } from './metric-emitter.js';
|
|
25
|
+
export { setCounterEmitter, resetCounterEmitter, setGaugeEmitter, resetGaugeEmitter, emitGauge, emitCounter, } from './metric-emitter.js';
|
|
26
26
|
export * from './aws-scrub.js';
|
|
27
27
|
export { extractPredicate, SPDX_PREDICATE_TYPE, } from './dsse.js';
|
|
28
28
|
export { maskLine, looksSensitive, REDACTED, SENSITIVE_VALUE_PATTERNS, } from './sensitive-patterns.js';
|
|
@@ -32,4 +32,4 @@ export * from './service-registry.js';
|
|
|
32
32
|
export * from './retention.js';
|
|
33
33
|
export * from './compliance-attributes.js';
|
|
34
34
|
export { leadingZeroBits, proofOfWorkHash, challengeKey, clampDifficulty, createProofOfWorkChallenge, parseProofOfWorkChallenge, verifyProofOfWork, solveProofOfWork, POW_DEFAULT_DIFFICULTY, POW_MAX_DIFFICULTY, POW_CHALLENGE_TTL_MS, } from './proof-of-work.js';
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixZQUFZLEVBRVosTUFBTSxFQUNOLE9BQU8sR0FDUixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGNBQWMsRUFFZCxjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIscUJBQXFCLEdBR3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGVBQWUsRUFDZixjQUFjLEVBSWQsZ0JBQWdCLEVBQ2hCLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGVBQWUsQ0FBQztBQUM5Qix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLFVBQVUsR0FDWCxNQUFNLFVBQVUsQ0FBQztBQUtsQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFdBQVcsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxFQUdmLGNBQWMsRUFDZCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUdwQixvQkFBb0IsR0FDckIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsR0FDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsR0FDcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLHdCQUF3QixHQUN6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFNBQVMsR0FFVixNQUFNLFdBQVcsQ0FBQztBQUNuQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixZQUFZLEVBQ1osZUFBZSxFQUNmLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUdyQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHNldExvZ0NvbnRleHRQcm92aWRlcixcbiAgcmVkYWN0U2Vuc2l0aXZlLFxuICBjcmVhdGVMb2dnZXIsXG4gIHR5cGUgTG9nZ2VyLFxuICBsb2dnZXIsXG4gIGRlZmF1bHQsXG59IGZyb20gJy4vbG9nZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpLWtleS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmUtcmVxdWlyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyZS1jb21wYXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY3Jhc2gtaGFuZGxlcnMuanMnO1xuZXhwb3J0IHtcbiAgc2VuZFN1Y2Nlc3MsXG4gIHNlbmRFcnJvcixcbiAgc2VuZFF1b3RhRXhjZWVkZWQsXG4gIHNlbmRQYWdpbmF0ZWROZXN0ZWQsXG4gIHBhZ2luYXRpb25NZXRhLFxuICB0eXBlIFBhZ2luYXRpb25NZXRhLFxuICBleHRyYWN0RGJFcnJvcixcbiAgZXJyb3JNZXNzYWdlLFxuICBzZW5kQmFkUmVxdWVzdCxcbiAgc2VuZEludGVybmFsRXJyb3IsXG4gIHBhcnNlUGFnaW5hdGlvblBhcmFtcyxcbiAgdHlwZSBQYWdpbmF0aW9uUGFyYW1zLFxuICB0eXBlIFNvcnRQYXJhbXMsXG59IGZyb20gJy4vcmVzcG9uc2UuanMnO1xuZXhwb3J0IHtcbiAgZ2V0UGFyYW0sXG4gIHBhcnNlUXVlcnlJbnQsXG4gIHBhcnNlUXVlcnlTdHJpbmcsXG4gIHBhcnNlT3B0aW9uYWxEYXRlLFxuICBwYXJzZVBvc2l0aXZlSW50LFxuICBwYXJzZVF1ZXJ5SW50Q2xhbXBlZCxcbiAgcGFyc2VQYWdlLFxuICB2YWxpZGF0ZUJ1bGtBcnJheSxcbiAgcGFyc2VSZXBvcnRJbnRlcnZhbCxcbiAgcGFyc2VSZXBvcnRUaW1lem9uZSxcbiAgcGFyc2VXZWVrU3RhcnQsXG4gIGlzVmFsaWRUaW1lem9uZSxcbiAgcGFyc2VEYXRlUmFuZ2UsXG4gIHR5cGUgUGFnZSxcbiAgdHlwZSBSZXBvcnRJbnRlcnZhbCxcbiAgdHlwZSBXZWVrU3RhcnQsXG4gIFJFUE9SVF9JTlRFUlZBTFMsXG4gIFdFRUtfU1RBUlRTLFxufSBmcm9tICcuL3BhcmFtcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hlYWRlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pZGVudGl0eS5qcyc7XG4vLyBKV0sgcHJpbWl0aXZlcy4gUGxhdGZvcm0gSVMgdGhlIHRva2VuIHNpZ25lciwgc28gaXQgbGVnaXRpbWF0ZWx5IG5lZWRzXG4vLyBgcHVibGljSndrRnJvbWAgKyBgZGVyVG9Kb3NlU2lnbmF0dXJlYCBmcm9tIHRoZSBwYWNrYWdlIHN1cmZhY2UuXG4vLyBgandrVGh1bWJwcmludGAgYW5kIGBwdWJsaWNLZXlGcm9tSndrYCBhcmUga2lkLWRlcml2YXRpb24vdmVyaWZpY2F0aW9uXG4vLyBwbHVtYmluZyB1c2VkIG9ubHkgaW5zaWRlIGFwaS1jb3JlIOKAlCBkZWVwLWltcG9ydCB0aGVtIGZyb20gdGhlcmUgaW5zdGVhZCBvZlxuLy8gbGVha2luZyB0aGVtIHRvIGV2ZXJ5IHNlcnZpY2UuXG5leHBvcnQge1xuICBVU0VSX1RPS0VOX0FMR09SSVRITSxcbiAgVVNFUl9UT0tFTl9DVVJWRSxcbiAgSldLU19QQVRILFxuICBkZWNvZGVKd3RIZWFkZXIsXG4gIGlzSndrc0RvY3VtZW50LFxuICBwdWJsaWNKd2tGcm9tLFxuICBkZXJUb0pvc2VTaWduYXR1cmUsXG4gIGVuY29kZUp3c1NpZ25pbmdJbnB1dCxcbiAgY29tcGFjdEp3cyxcbn0gZnJvbSAnLi9qd2suanMnO1xuZXhwb3J0IHR5cGUge1xuICBQdWJsaWNKd2ssXG4gIEp3a3NEb2N1bWVudCxcbn0gZnJvbSAnLi9qd2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vYmplY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRlLmpzJztcbmV4cG9ydCB7XG4gIHJlc2V0U3VwcG9ydEFsaWFzZXNDYWNoZSxcbiAgZ2V0UHJpbWFyeVN1cHBvcnRBbGlhcyxcbiAgZ2V0QWxsU3VwcG9ydEFsaWFzZXMsXG4gIHJlc29sdmVSZWNpcGllbnRBbGlhcyxcbiAgREVGQVVMVF9TVVBQT1JUX0FMSUFTLFxufSBmcm9tICcuL2FsaWFzLXJlc29sdmVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uY3VycmVuY3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hdWRpdC5qcyc7XG5leHBvcnQge1xuICBnZXREZWZhdWx0S2V5UHJvdmlkZXIsXG4gIHJlc2V0RGVmYXVsdEtleVByb3ZpZGVyLFxuICBzZXRLZXlQcm92aWRlcixcbiAgZW5jcnlwdFNlY3JldCxcbiAgZGVjcnlwdFNlY3JldCxcbiAgaXNFbmNyeXB0ZWRCbG9iLFxuICB0eXBlIEVuY3J5cHRlZEJsb2IsXG4gIHR5cGUgS2V5UHJvdmlkZXIsXG4gIEVudktleVByb3ZpZGVyLFxuICBLbXNLZXlQcm92aWRlcixcbiAgY3JlYXRlQmFzZUtleVByb3ZpZGVyLFxuICBpbml0U2VjcmV0RW5jcnlwdGlvbixcbiAgdHlwZSBQZXJPcmdLbXNDb25maWcsXG4gIHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIsXG4gIFBlck9yZ0ttc0tleVByb3ZpZGVyLFxufSBmcm9tICcuL3NlY3JldC1lbmNyeXB0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VjcmV0LXJvdGF0aW9uLmpzJztcbmV4cG9ydCB7XG4gIHNldENvdW50ZXJFbWl0dGVyLFxuICByZXNldENvdW50ZXJFbWl0dGVyLFxuICBzZXRHYXVnZUVtaXR0ZXIsXG4gIHJlc2V0R2F1Z2VFbWl0dGVyLFxuICBlbWl0R2F1Z2UsXG4gIGVtaXRDb3VudGVyLFxufSBmcm9tICcuL21ldHJpYy1lbWl0dGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXdzLXNjcnViLmpzJztcbmV4cG9ydCB7XG4gIGV4dHJhY3RQcmVkaWNhdGUsXG4gIFNQRFhfUFJFRElDQVRFX1RZUEUsXG59IGZyb20gJy4vZHNzZS5qcyc7XG5leHBvcnQge1xuICBtYXNrTGluZSxcbiAgbG9va3NTZW5zaXRpdmUsXG4gIFJFREFDVEVELFxuICBTRU5TSVRJVkVfVkFMVUVfUEFUVEVSTlMsXG59IGZyb20gJy4vc2Vuc2l0aXZlLXBhdHRlcm5zLmpzJztcbmV4cG9ydCB7XG4gIGlzUHJpdmF0ZUFkZHJlc3MsXG4gIGFzc2VydFNhZmVVcmwsXG4gIHNhZmVGZXRjaCxcbiAgdHlwZSBTYWZlRmV0Y2hSZXNwb25zZSxcbn0gZnJvbSAnLi9zc3JmLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW52LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZS1yZWdpc3RyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldGVudGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtYXR0cmlidXRlcy5qcyc7XG5leHBvcnQge1xuICBsZWFkaW5nWmVyb0JpdHMsXG4gIHByb29mT2ZXb3JrSGFzaCxcbiAgY2hhbGxlbmdlS2V5LFxuICBjbGFtcERpZmZpY3VsdHksXG4gIGNyZWF0ZVByb29mT2ZXb3JrQ2hhbGxlbmdlLFxuICBwYXJzZVByb29mT2ZXb3JrQ2hhbGxlbmdlLFxuICB2ZXJpZnlQcm9vZk9mV29yayxcbiAgc29sdmVQcm9vZk9mV29yayxcbiAgUE9XX0RFRkFVTFRfRElGRklDVUxUWSxcbiAgUE9XX01BWF9ESUZGSUNVTFRZLFxuICBQT1dfQ0hBTExFTkdFX1RUTF9NUyxcbiAgdHlwZSBQcm9vZk9mV29ya0NoYWxsZW5nZSxcbiAgdHlwZSBQcm9vZk9mV29ya1NvbHV0aW9uLFxufSBmcm9tICcuL3Byb29mLW9mLXdvcmsuanMnO1xuIl19
|
|
@@ -34,3 +34,22 @@ export declare function resetCounterEmitter(): void;
|
|
|
34
34
|
* emitter is wired, this is a no-op.
|
|
35
35
|
*/
|
|
36
36
|
export declare function emitCounter(name: string, labels?: Record<string, string>, value?: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Callable signature mirroring api-server's `setGauge`.
|
|
39
|
+
*
|
|
40
|
+
* A gauge rather than a counter because the things that need this seam are
|
|
41
|
+
* SAMPLED point-in-time values, not events: replica replay lag, whether a
|
|
42
|
+
* fallback circuit is currently open. Emitting those as counters would make
|
|
43
|
+
* every query over them wrong — `rate()` of a lag reading is meaningless.
|
|
44
|
+
*/
|
|
45
|
+
export type GaugeEmitter = (name: string, labels: Record<string, string>, value: number) => void;
|
|
46
|
+
/** Register the real gauge implementation. Idempotent; the last call wins. */
|
|
47
|
+
export declare function setGaugeEmitter(fn: GaugeEmitter): void;
|
|
48
|
+
/** Reset to the no-op emitter. For tests that want to clear any wiring. */
|
|
49
|
+
export declare function resetGaugeEmitter(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Set a gauge. Safe to call from any api-core or pipeline-data module — with no
|
|
52
|
+
* emitter wired this is a no-op, which is the state in tests, CLIs and any
|
|
53
|
+
* process that does not serve /metrics.
|
|
54
|
+
*/
|
|
55
|
+
export declare function emitGauge(name: string, labels?: Record<string, string>, value?: number): void;
|
|
@@ -29,4 +29,29 @@ export function emitCounter(name, labels = {}, value = 1) {
|
|
|
29
29
|
// emitter shouldn't be able to take down quota checks (or anything else).
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
let gaugeEmitter = () => {
|
|
33
|
+
// Default no-op, same reasoning as the counter emitter above.
|
|
34
|
+
};
|
|
35
|
+
/** Register the real gauge implementation. Idempotent; the last call wins. */
|
|
36
|
+
export function setGaugeEmitter(fn) {
|
|
37
|
+
gaugeEmitter = fn;
|
|
38
|
+
}
|
|
39
|
+
/** Reset to the no-op emitter. For tests that want to clear any wiring. */
|
|
40
|
+
export function resetGaugeEmitter() {
|
|
41
|
+
gaugeEmitter = () => undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Set a gauge. Safe to call from any api-core or pipeline-data module — with no
|
|
45
|
+
* emitter wired this is a no-op, which is the state in tests, CLIs and any
|
|
46
|
+
* process that does not serve /metrics.
|
|
47
|
+
*/
|
|
48
|
+
export function emitGauge(name, labels = {}, value = 0) {
|
|
49
|
+
try {
|
|
50
|
+
gaugeEmitter(name, labels, value);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Never let metric emission break the calling path. For the read-routing
|
|
54
|
+
// caller in particular this must not be able to fail a database read.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljLWVtaXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvbWV0cmljLWVtaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTRCdEMsSUFBSSxPQUFPLEdBQW1CLEdBQUcsRUFBRTtJQUNqQyx1RUFBdUU7SUFDdkUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtBQUM1RSxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBa0I7SUFDbEQsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNmLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVksRUFBRSxNQUFNLEdBQTJCLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUN0RixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asa0VBQWtFO1FBQ2xFLDBFQUEwRTtJQUM1RSxDQUFDO0FBQ0gsQ0FBQztBQVlELElBQUksWUFBWSxHQUFpQixHQUFHLEVBQUU7SUFDcEMsOERBQThEO0FBQ2hFLENBQUMsQ0FBQztBQUVGLDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQWdCO0lBQzlDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVksRUFBRSxNQUFNLEdBQTJCLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUNwRixJQUFJLENBQUM7UUFDSCxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AseUVBQXlFO1FBQ3pFLHNFQUFzRTtJQUN4RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBsdWdnYWJsZSBjb3VudGVyLWVtaXQgc2hpbS5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBzZXZlcmFsIGFwaS1jb3JlIHByaW1pdGl2ZXMgKHF1b3RhIGNsaWVudCBmYWlsLW9wZW4sIGZ1dHVyZVxuICogc2VjdXJpdHktZXZlbnQgaG9va3MpIHdhbnQgdG8gcmVjb3JkIFByb21ldGhldXMgY291bnRlcnMgd2hlbiBzb21ldGhpbmdcbiAqIG5vdGFibGUgaGFwcGVucy4gVGhlIGFjdHVhbCBgcHJvbS1jbGllbnRgIENvdW50ZXIgcmVnaXN0cmF0aW9uIGxpdmVzIGluXG4gKiBhcGktc2VydmVyLCBhbmQgYXBpLWNvcmUgbXVzdCBub3QgZGVwZW5kIG9uIGFwaS1zZXJ2ZXIgKGFwaS1jb3JlIGlzXG4gKiB1cHN0cmVhbSDigJQgRXhwcmVzcyBpbmZyYXN0cnVjdHVyZSBpbXBvcnRzIGl0LCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQpLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSBzZWFtLiBhcGktY29yZSBjb2RlIGNhbGxzIGBlbWl0Q291bnRlcihuYW1lLCBsYWJlbHMpYDtcbiAqIGJ5IGRlZmF1bHQgaXQncyBhIG5vLW9wICh0ZXN0cywgQ0xJcywgZW52aXJvbm1lbnRzIHdpdGhvdXQgUHJvbWV0aGV1cykuXG4gKiBhcGktc2VydmVyJ3MgYXBwLWZhY3RvcnkgY2FsbHMgYHNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpYCBhdCBzdGFydHVwXG4gKiBzbyBwcm9kdWN0aW9uIHByb2Nlc3NlcyBzdGFydCBpbmNyZW1lbnRpbmcgdGhlIHJlYWwgY291bnRlciBvbiB0aGVcbiAqIHNoYXJlZCByZWdpc3RyeS5cbiAqXG4gKiBXaHkgYSBjYWxsYmFjayBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZSByZWdpc3RlcmVkIHZpYSBEST8gVGhlIGNhbGwgc2l0ZXNcbiAqIChxdW90YSBmYWlsLW9wZW4sIGV0Yy4pIHNpdCBpbiBkZWVwIGhlbHBlcnMgdGhhdCBuZXZlciB0b3VjaCB0aGUgRXhwcmVzc1xuICogY29udGV4dCwgc28gcmVxdWlyaW5nIGEgYG1ldHJpY3NgIHBhcmFtZXRlciBvbiBldmVyeSBjYWxsIHdvdWxkIG1lYW5cbiAqIHRocmVhZGluZyBpdCB0aHJvdWdoIGRvemVucyBvZiB1bnJlbGF0ZWQgZnVuY3Rpb25zLiBBIHByb2Nlc3Mtc2luZ2xldG9uXG4gKiBjYWxsYmFjayBpcyB0aGUgc2ltcGxlc3Qgbm9uLWludmFzaXZlIG9wdGlvbjsgdGhlIHRyYWRlLW9mZiBpcyBvbmVcbiAqIHNoYXJlZCBnbG9iYWwsIHdoaWNoIGlzIGFjY2VwdGFibGUgZm9yIGEgc2luayB0aGF0J3Mgc3RyaWN0bHkgd3JpdGUtb25seS5cbiAqL1xuXG4vKiogQ2FsbGFibGUgc2lnbmF0dXJlIG1pcnJvcmluZyBhcGktc2VydmVyJ3MgYGluY0NvdW50ZXJgLiAqL1xuZXhwb3J0IHR5cGUgQ291bnRlckVtaXR0ZXIgPSAobmFtZTogc3RyaW5nLCBsYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZT86IG51bWJlcikgPT4gdm9pZDtcblxubGV0IGVtaXR0ZXI6IENvdW50ZXJFbWl0dGVyID0gKCkgPT4ge1xuICAvLyBEZWZhdWx0IG5vLW9wLiBhcGktc2VydmVyIHdpcmVzIHRoaXMgdG8gYSByZWFsIFByb21ldGhldXMgY291bnRlciBhdFxuICAvLyBzdGFydHVwOyB1bnRpbCB0aGVuLCBjYWxscyBmcm9tIGFwaS1jb3JlIGhlbHBlcnMgYXJlIHNpbGVudGx5IGRyb3BwZWRcbiAgLy8gKHdoaWNoIGlzIHdoYXQgd2Ugd2FudCBpbiB0ZXN0cyBhbmQgQ0xJcyB0aGF0IGRvbid0IHJ1biBhIFByb20gc2VydmVyKS5cbn07XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHJlYWwgY291bnRlciBpbXBsZW1lbnRhdGlvbi4gSWRlbXBvdGVudCDigJQgdGhlIGxhc3QgY2FsbCB3aW5zO1xuICogdHlwaWNhbGx5IGNhbGxlZCBvbmNlIGF0IHNlcnZpY2Ugc3RhcnR1cCBmcm9tIGFwaS1zZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb3VudGVyRW1pdHRlcihmbjogQ291bnRlckVtaXR0ZXIpOiB2b2lkIHtcbiAgZW1pdHRlciA9IGZuO1xufVxuXG4vKiogUmVzZXQgdG8gdGhlIG5vLW9wIGVtaXR0ZXIuIEZvciB0ZXN0cyB0aGF0IHdhbnQgdG8gY2xlYXIgYW55IHdpcmluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldENvdW50ZXJFbWl0dGVyKCk6IHZvaWQge1xuICBlbWl0dGVyID0gKCkgPT4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlY29yZCBhIGNvdW50ZXIgZXZlbnQuIFNhZmUgdG8gY2FsbCBmcm9tIGFueSBhcGktY29yZSBtb2R1bGUg4oCUIGlmIG5vXG4gKiBlbWl0dGVyIGlzIHdpcmVkLCB0aGlzIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWl0Q291bnRlcihuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LCB2YWx1ZSA9IDEpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBlbWl0dGVyKG5hbWUsIGxhYmVscywgdmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXZlciBsZXQgbWV0cmljIGVtaXNzaW9uIGJyZWFrIHRoZSBjYWxsaW5nIHBhdGguIEEgbWlzYmVoYXZpbmdcbiAgICAvLyBlbWl0dGVyIHNob3VsZG4ndCBiZSBhYmxlIHRvIHRha2UgZG93biBxdW90YSBjaGVja3MgKG9yIGFueXRoaW5nIGVsc2UpLlxuICB9XG59XG5cbi8qKlxuICogQ2FsbGFibGUgc2lnbmF0dXJlIG1pcnJvcmluZyBhcGktc2VydmVyJ3MgYHNldEdhdWdlYC5cbiAqXG4gKiBBIGdhdWdlIHJhdGhlciB0aGFuIGEgY291bnRlciBiZWNhdXNlIHRoZSB0aGluZ3MgdGhhdCBuZWVkIHRoaXMgc2VhbSBhcmVcbiAqIFNBTVBMRUQgcG9pbnQtaW4tdGltZSB2YWx1ZXMsIG5vdCBldmVudHM6IHJlcGxpY2EgcmVwbGF5IGxhZywgd2hldGhlciBhXG4gKiBmYWxsYmFjayBjaXJjdWl0IGlzIGN1cnJlbnRseSBvcGVuLiBFbWl0dGluZyB0aG9zZSBhcyBjb3VudGVycyB3b3VsZCBtYWtlXG4gKiBldmVyeSBxdWVyeSBvdmVyIHRoZW0gd3Jvbmcg4oCUIGByYXRlKClgIG9mIGEgbGFnIHJlYWRpbmcgaXMgbWVhbmluZ2xlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIEdhdWdlRW1pdHRlciA9IChuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcikgPT4gdm9pZDtcblxubGV0IGdhdWdlRW1pdHRlcjogR2F1Z2VFbWl0dGVyID0gKCkgPT4ge1xuICAvLyBEZWZhdWx0IG5vLW9wLCBzYW1lIHJlYXNvbmluZyBhcyB0aGUgY291bnRlciBlbWl0dGVyIGFib3ZlLlxufTtcblxuLyoqIFJlZ2lzdGVyIHRoZSByZWFsIGdhdWdlIGltcGxlbWVudGF0aW9uLiBJZGVtcG90ZW50OyB0aGUgbGFzdCBjYWxsIHdpbnMuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2F1Z2VFbWl0dGVyKGZuOiBHYXVnZUVtaXR0ZXIpOiB2b2lkIHtcbiAgZ2F1Z2VFbWl0dGVyID0gZm47XG59XG5cbi8qKiBSZXNldCB0byB0aGUgbm8tb3AgZW1pdHRlci4gRm9yIHRlc3RzIHRoYXQgd2FudCB0byBjbGVhciBhbnkgd2lyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0R2F1Z2VFbWl0dGVyKCk6IHZvaWQge1xuICBnYXVnZUVtaXR0ZXIgPSAoKSA9PiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2V0IGEgZ2F1Z2UuIFNhZmUgdG8gY2FsbCBmcm9tIGFueSBhcGktY29yZSBvciBwaXBlbGluZS1kYXRhIG1vZHVsZSDigJQgd2l0aCBub1xuICogZW1pdHRlciB3aXJlZCB0aGlzIGlzIGEgbm8tb3AsIHdoaWNoIGlzIHRoZSBzdGF0ZSBpbiB0ZXN0cywgQ0xJcyBhbmQgYW55XG4gKiBwcm9jZXNzIHRoYXQgZG9lcyBub3Qgc2VydmUgL21ldHJpY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWl0R2F1Z2UobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAwKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgZ2F1Z2VFbWl0dGVyKG5hbWUsIGxhYmVscywgdmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXZlciBsZXQgbWV0cmljIGVtaXNzaW9uIGJyZWFrIHRoZSBjYWxsaW5nIHBhdGguIEZvciB0aGUgcmVhZC1yb3V0aW5nXG4gICAgLy8gY2FsbGVyIGluIHBhcnRpY3VsYXIgdGhpcyBtdXN0IG5vdCBiZSBhYmxlIHRvIGZhaWwgYSBkYXRhYmFzZSByZWFkLlxuICB9XG59XG4iXX0=
|