@pipeline-builder/api-core 4.1.3 → 4.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/errors/app-errors.d.ts +0 -4
- package/lib/errors/app-errors.js +1 -8
- package/lib/helpers/restore-helpers.d.ts +3 -3
- package/lib/helpers/restore-helpers.js +4 -4
- package/lib/helpers/sse-helpers.d.ts +8 -1
- package/lib/helpers/sse-helpers.js +11 -3
- package/lib/middleware/auth.d.ts +174 -43
- package/lib/middleware/auth.js +384 -179
- package/lib/middleware/index.d.ts +1 -0
- package/lib/middleware/index.js +2 -1
- package/lib/middleware/route-table.d.ts +104 -0
- package/lib/middleware/route-table.js +230 -0
- package/lib/middleware/step-up.d.ts +48 -16
- package/lib/middleware/step-up.js +74 -36
- package/lib/services/api-key-exchange.d.ts +25 -0
- package/lib/services/api-key-exchange.js +219 -0
- package/lib/services/cache-service.d.ts +11 -26
- package/lib/services/cache-service.js +20 -74
- package/lib/services/compliance-event-subscriber.d.ts +5 -4
- package/lib/services/compliance-event-subscriber.js +8 -6
- package/lib/services/durable-event-bus.d.ts +22 -39
- package/lib/services/durable-event-bus.js +95 -43
- package/lib/services/env-redis.d.ts +27 -0
- package/lib/services/env-redis.js +63 -1
- package/lib/services/http-client.d.ts +10 -15
- package/lib/services/http-client.js +32 -27
- package/lib/services/index.d.ts +3 -0
- package/lib/services/index.js +4 -1
- package/lib/services/jwks-cache.d.ts +102 -0
- package/lib/services/jwks-cache.js +222 -0
- package/lib/services/quota.js +12 -4
- package/lib/services/remote-audit-client.d.ts +1 -1
- package/lib/services/remote-audit-client.js +32 -1
- package/lib/services/scheduler.d.ts +2 -3
- package/lib/services/scheduler.js +2 -2
- package/lib/services/service-boot.d.ts +4 -2
- package/lib/services/service-boot.js +7 -3
- package/lib/services/service-keys.d.ts +83 -0
- package/lib/services/service-keys.js +354 -0
- package/lib/services/sse-ticket-store.d.ts +55 -22
- package/lib/services/sse-ticket-store.js +122 -79
- package/lib/services/token-revocation.js +30 -18
- package/lib/testing/route-coverage.d.ts +64 -0
- package/lib/testing/route-coverage.js +183 -0
- package/lib/testing/service-tokens.d.ts +66 -0
- package/lib/testing/service-tokens.js +137 -0
- package/lib/testing/tier-mock.d.ts +2 -2
- package/lib/testing/tier-mock.js +3 -3
- package/lib/testing/user-tokens.d.ts +75 -0
- package/lib/testing/user-tokens.js +115 -0
- package/lib/types/catalog-metadata.d.ts +0 -2
- package/lib/types/catalog-metadata.js +1 -3
- package/lib/types/common.d.ts +103 -4
- package/lib/types/common.js +11 -1
- package/lib/types/error-codes.d.ts +15 -0
- package/lib/types/error-codes.js +22 -1
- package/lib/types/permissions.d.ts +35 -1
- package/lib/types/permissions.js +72 -2
- package/lib/utils/api-key.d.ts +34 -0
- package/lib/utils/api-key.js +75 -0
- package/lib/utils/env.d.ts +0 -2
- package/lib/utils/env.js +1 -6
- package/lib/utils/index.d.ts +4 -0
- package/lib/utils/index.js +5 -1
- package/lib/utils/jwk.d.ts +98 -0
- package/lib/utils/jwk.js +139 -0
- package/lib/utils/logger.d.ts +30 -1
- package/lib/utils/logger.js +74 -27
- package/lib/utils/secret-encryption.d.ts +7 -2
- package/lib/utils/secret-encryption.js +47 -4
- package/lib/utils/secret-rotation.d.ts +17 -0
- package/lib/utils/secret-rotation.js +54 -0
- package/lib/utils/sensitive-patterns.d.ts +49 -0
- package/lib/utils/sensitive-patterns.js +149 -0
- package/lib/validation/common-schemas.js +5 -4
- package/package.json +20 -1
|
@@ -171,4 +171,66 @@ export function whenRedisReady(client, timeoutMs = 30_000) {
|
|
|
171
171
|
client.once('ready', onReady);
|
|
172
172
|
});
|
|
173
173
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsS0FBSztJQUN6QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFpQkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBdUI7SUFDcEQsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDdkUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sSUFBSSxHQUFHLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQywwQkFBMEIsS0FBSyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFHLEdBQXNCLE9BQU8sQ0FBQyxHQUFHO0lBQ3pFLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxnQkFBZ0IsQ0FDeEIsZ0lBQWdJLENBQ2pJLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN0RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDO0lBRWpELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUztZQUNULFVBQVUsRUFBRSxHQUFHLENBQUMscUJBQXFCLElBQUksVUFBVTtZQUNuRCxRQUFRO1lBQ1IsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLHVCQUF1QixJQUFJLFNBQVM7U0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsSUFBSSxNQUFXLENBQUM7UUFDaEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLElBQUksZ0JBQWdCLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxpREFBaUQsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxJQUFxQjtJQUMzRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDN0IsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7QUFDbEcsQ0FBQztBQUlELFNBQVMsV0FBVztJQUNsQixNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBcUQsQ0FBQztJQUMvRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBaUIsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLElBQXFCLEVBQ3JCLEtBQWEsRUFDYixPQUFPLEdBQTRCLEVBQUU7SUFFckMsTUFBTSxJQUFJLEdBQUcsV0FBVyxFQUFLLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVO1FBQ25DLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUNULFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLEdBQUcsSUFBSTtZQUNQLEdBQUcsT0FBTztTQUNYLENBQUM7UUFDRixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvQyxJQUEyRTtTQUN6RSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQWMsS0FBYTtJQUM3RCxNQUFNLElBQUksR0FBRyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUksSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBU0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQXVCLEVBQUUsU0FBUyxHQUFHLE1BQU07SUFDeEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHlCQUF5QixTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLElBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdtb2R1bGUnO1xuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2Vudi1yZWRpcycpO1xuXG4vKipcbiAqIFRoZSBPTkUgcGxhY2UgUmVkaXMgY29ubmVjdGlvbiBzZXR0aW5ncyBhcmUgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUd28gc2hhcGVzLCBleGFjdGx5IG9uZSBvZiB3aGljaCBtYXkgYmUgc2V0OlxuICpcbiAqIC0gKipTdGFuZGFsb25lKiog4oCUIGBSRURJU19VUkxgIChgcmVkaXM6Ly9ob3N0OjYzNzlbL2RiXWAsIG9yIGByZWRpc3M6Ly9gIGZvclxuICogICBUTFMpLiBDcmVkZW50aWFscyBtYXkgc2l0IGluIHRoZSBVUkwgb3IgaW4gYFJFRElTX1BBU1NXT1JEYC5cbiAqIC0gKipIQSAoU2VudGluZWwpKiog4oCUIGBSRURJU19TRU5USU5FTFNgIChjb21tYS1zZXBhcmF0ZWQgYGhvc3Q6cG9ydGApIHBsdXNcbiAqICAgYFJFRElTX1NFTlRJTkVMX01BU1RFUmAgKGRlZmF1bHQgYG15bWFzdGVyYCkgYW5kIG9wdGlvbmFsXG4gKiAgIGBSRURJU19TRU5USU5FTF9QQVNTV09SRGAuIGBSRURJU19QQVNTV09SRGAgYXV0aGVudGljYXRlcyB0byB0aGUgZGF0YSBub2Rlcy5cbiAqICAgaW9yZWRpcyBmb2xsb3dzIHRoZSBtYXN0ZXIgYWNyb3NzIGEgZmFpbG92ZXIuXG4gKlxuICogTmVpdGhlciBzZXQg4oaSIFJlZGlzIGlzIG9mZiwgYW5kIGVhY2ggY2FsbGVyIGRlZ3JhZGVzIHRvIGl0cyBkb2N1bWVudGVkXG4gKiBuby1SZWRpcyBiZWhhdmlvci5cbiAqXG4gKiBgUkVESVNfSE9TVGAgLyBgUkVESVNfUE9SVGAgYXJlIG5vdCByZWFkLiBgUkVESVNfSE9TVGAgaXMgcmVmdXNlZCBvdXRyaWdodCBzbyBhXG4gKiBzdGFsZSBjb25maWcgZmFpbHMgYXQgc3RhcnR1cCBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgd2l0aG91dCBSZWRpcy5cbiAqIGBSRURJU19QT1JUYCBjYW4ndCBiZSByZWZ1c2VkOiBLdWJlcm5ldGVzIGluamVjdHMgYFJFRElTX1BPUlQ9dGNwOi8vPGlwPjo2Mzc5YFxuICogaW50byBldmVyeSBwb2QgaW4gYSBuYW1lc3BhY2Ugd2l0aCBhIFNlcnZpY2UgbmFtZWQgYHJlZGlzYCwgd2hpY2ggaXMgZXhhY3RseVxuICogd2h5IGEgaG9zdC9wb3J0IHBhaXIgd2FzIHVuc2FmZSB0byBwYXJzZS5cbiAqXG4gKiBNaXNjb25maWd1cmF0aW9uIHRocm93cyB7QGxpbmsgUmVkaXNDb25maWdFcnJvcn0uIFdyaXRlcnMgYW5kIHJlYWRlcnMgb2YgdGhlXG4gKiBzYW1lIGtleXMgKHJldm9jYXRpb24sIHN0ZXAtdXAsIGxlYWRlciBsb2NrcykgbXVzdCByZXNvbHZlIFJlZGlzIGlkZW50aWNhbGx5O1xuICogYSBjb25maWcgdGhhdCBxdWlldGx5IHJlc29sdmVkIHRvIFwibm8gUmVkaXNcIiBvbiBvbmUgc2lkZSBpcyBob3cgcmV2b2NhdGlvblxuICogb25jZSBkaWQgbm90aGluZyBhdCBhbGwuXG4gKi9cblxuLyoqIFRocm93biBmb3IgYSBSZWRpcyBlbnZpcm9ubWVudCB0aGF0IGNhbid0IGJlIHVzZWQgYXMgd3JpdHRlbi4gKi9cbmV4cG9ydCBjbGFzcyBSZWRpc0NvbmZpZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVkaXNDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqIFJlc29sdmVkIGNvbm5lY3Rpb24sIGluZGVwZW5kZW50IG9mIGFueSBjbGllbnQgbGlicmFyeS4gKi9cbmV4cG9ydCB0eXBlIFJlZGlzQ29ubmVjdGlvbiA9XG4gIHwge1xuICAgIG1vZGU6ICdzZW50aW5lbCc7XG4gICAgc2VudGluZWxzOiBBcnJheTx7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0+O1xuICAgIG1hc3Rlck5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBzZW50aW5lbFBhc3N3b3JkPzogc3RyaW5nO1xuICB9XG4gIHwge1xuICAgIG1vZGU6ICd1cmwnO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIGBSRURJU19TRU5USU5FTFNgIGludG8gYHsgaG9zdCwgcG9ydCB9W11gLiBCbGFuayBlbnRyaWVzIGFyZSBza2lwcGVkIGFuZFxuICogYSBtaXNzaW5nIHBvcnQgbWVhbnMgdGhlIFNlbnRpbmVsIGRlZmF1bHQgMjYzNzk7IGEgcG9ydCB0aGF0IGlzbid0IGEgdmFsaWRcbiAqIFRDUCBwb3J0IGlzIGEgY29uZmlndXJhdGlvbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VudGluZWxzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogQXJyYXk8eyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9PiB7XG4gIGlmICghcmF3KSByZXR1cm4gW107XG4gIHJldHVybiByYXcuc3BsaXQoJywnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikubWFwKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGVudHJ5Lmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgaG9zdCA9IGlkeCA9PT0gLTEgPyBlbnRyeSA6IGVudHJ5LnNsaWNlKDAsIGlkeCk7XG4gICAgY29uc3QgcG9ydFRleHQgPSBpZHggPT09IC0xID8gJycgOiBlbnRyeS5zbGljZShpZHggKyAxKTtcbiAgICBjb25zdCBwb3J0ID0gcG9ydFRleHQgPT09ICcnID8gMjYzNzkgOiBOdW1iZXIocG9ydFRleHQpO1xuICAgIGlmICghaG9zdCB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUpIHtcbiAgICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKGBSRURJU19TRU5USU5FTFMgZW50cnkgXCIke2VudHJ5fVwiIGlzIG5vdCBob3N0OnBvcnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydCB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBSZWRpcyBjb25uZWN0aW9uIGZyb20gYGVudmAsIG9yIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0XG4gKiBjb25maWd1cmVkLiBUaHJvd3Mge0BsaW5rIFJlZGlzQ29uZmlnRXJyb3J9IGZvciBhbiB1bnVzYWJsZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlZGlzQ29ubmVjdGlvbihlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYpOiBSZWRpc0Nvbm5lY3Rpb24gfCBudWxsIHtcbiAgaWYgKGVudi5SRURJU19IT1NUKSB7XG4gICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoXG4gICAgICAnUkVESVNfSE9TVCBpcyBub3Qgc3VwcG9ydGVkLiBTZXQgUkVESVNfVVJMPXJlZGlzOi8vPGhvc3Q+Ojxwb3J0PiAob3IgUkVESVNfU0VOVElORUxTIGZvciBIQSkgYW5kIHJlbW92ZSBSRURJU19IT1NUL1JFRElTX1BPUlQuJyxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc2VudGluZWxzID0gcGFyc2VTZW50aW5lbHMoZW52LlJFRElTX1NFTlRJTkVMUyk7XG4gIGNvbnN0IHVybCA9IGVudi5SRURJU19VUkw/LnRyaW0oKTtcbiAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUkVESVNfUEFTU1dPUkQgfHwgdW5kZWZpbmVkO1xuXG4gIGlmIChzZW50aW5lbHMubGVuZ3RoID4gMCAmJiB1cmwpIHtcbiAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcignU2V0IFJFRElTX1VSTCBvciBSRURJU19TRU5USU5FTFMsIG5vdCBib3RoLicpO1xuICB9XG5cbiAgaWYgKHNlbnRpbmVscy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6ICdzZW50aW5lbCcsXG4gICAgICBzZW50aW5lbHMsXG4gICAgICBtYXN0ZXJOYW1lOiBlbnYuUkVESVNfU0VOVElORUxfTUFTVEVSIHx8ICdteW1hc3RlcicsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHNlbnRpbmVsUGFzc3dvcmQ6IGVudi5SRURJU19TRU5USU5FTF9QQVNTV09SRCB8fCB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh1cmwpIHtcbiAgICBsZXQgcGFyc2VkOiBVUkw7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKCdSRURJU19VUkwgaXMgbm90IGEgdmFsaWQgVVJMIChleHBlY3RlZCByZWRpczovLzxob3N0Pjo8cG9ydD4pLicpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAncmVkaXM6JyAmJiBwYXJzZWQucHJvdG9jb2wgIT09ICdyZWRpc3M6Jykge1xuICAgICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoYFJFRElTX1VSTCBtdXN0IHVzZSByZWRpczovLyBvciByZWRpc3M6Ly8sIGdvdCAke3BhcnNlZC5wcm90b2NvbH0vL2ApO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZC5ob3N0bmFtZSkgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoJ1JFRElTX1VSTCBoYXMgbm8gaG9zdC4nKTtcbiAgICByZXR1cm4geyBtb2RlOiAndXJsJywgdXJsLCBwYXNzd29yZCB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBBIGxvZy1zYWZlIGRlc2NyaXB0aW9uIG9mIGEgY29ubmVjdGlvbiAobmV2ZXIgaW5jbHVkZXMgY3JlZGVudGlhbHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlUmVkaXNDb25uZWN0aW9uKGNvbm46IFJlZGlzQ29ubmVjdGlvbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKGNvbm4ubW9kZSA9PT0gJ3NlbnRpbmVsJykge1xuICAgIHJldHVybiB7IG1vZGU6ICdzZW50aW5lbCcsIG1hc3RlcjogY29ubi5tYXN0ZXJOYW1lLCBzZW50aW5lbHM6IGNvbm4uc2VudGluZWxzLmxlbmd0aCB9O1xuICB9XG4gIGNvbnN0IHUgPSBuZXcgVVJMKGNvbm4udXJsKTtcbiAgcmV0dXJuIHsgbW9kZTogJ3VybCcsIGhvc3Q6IHUuaG9zdG5hbWUsIHBvcnQ6IHUucG9ydCB8fCAnNjM3OScsIHRsczogdS5wcm90b2NvbCA9PT0gJ3JlZGlzczonIH07XG59XG5cbnR5cGUgUmVkaXNDdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQ7XG5cbmZ1bmN0aW9uIGxvYWRJb3JlZGlzPFQ+KCk6IFJlZGlzQ3RvcjxUPiB7XG4gIGNvbnN0IHJlcSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgbW9kID0gcmVxKCdpb3JlZGlzJykgYXMgeyBSZWRpcz86IFJlZGlzQ3RvcjxUPjsgZGVmYXVsdD86IFJlZGlzQ3RvcjxUPiB9O1xuICByZXR1cm4gKG1vZC5SZWRpcyA/PyBtb2QuZGVmYXVsdCA/PyBtb2QpIGFzIFJlZGlzQ3RvcjxUPjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYW4gaW9yZWRpcyBjbGllbnQgZm9yIGEgcmVzb2x2ZWQgY29ubmVjdGlvbi4gYG9wdGlvbnNgIGFyZSBtZXJnZWRcbiAqIGludG8gdGhlIGNsaWVudCBvcHRpb25zIChlLmcuIGB7IGRiLCBtYXhSZXRyaWVzUGVyUmVxdWVzdDogbnVsbCB9YCBmb3IgQnVsbE1RKS5cbiAqIEFuIGBlcnJvcmAgbGlzdGVuZXIgaXMgYWx3YXlzIGF0dGFjaGVkIHNvIGEgZHJvcHBlZCBjb25uZWN0aW9uIGlzIGxvZ2dlZFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIGFuIHVuaGFuZGxlZCBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBjcmFzaGVzIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0NsaWVudDxUID0gdW5rbm93bj4oXG4gIGNvbm46IFJlZGlzQ29ubmVjdGlvbixcbiAgbGFiZWw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbik6IFQge1xuICBjb25zdCBDdG9yID0gbG9hZElvcmVkaXM8VD4oKTtcbiAgY29uc3QgYXV0aCA9IGNvbm4ucGFzc3dvcmQgPyB7IHBhc3N3b3JkOiBjb25uLnBhc3N3b3JkIH0gOiB7fTtcbiAgY29uc3QgaW5zdCA9IGNvbm4ubW9kZSA9PT0gJ3NlbnRpbmVsJ1xuICAgID8gbmV3IEN0b3Ioe1xuICAgICAgc2VudGluZWxzOiBjb25uLnNlbnRpbmVscyxcbiAgICAgIG5hbWU6IGNvbm4ubWFzdGVyTmFtZSxcbiAgICAgIC4uLihjb25uLnNlbnRpbmVsUGFzc3dvcmQgPyB7IHNlbnRpbmVsUGFzc3dvcmQ6IGNvbm4uc2VudGluZWxQYXNzd29yZCB9IDoge30pLFxuICAgICAgLi4uYXV0aCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSlcbiAgICA6IG5ldyBDdG9yKGNvbm4udXJsLCB7IC4uLmF1dGgsIC4uLm9wdGlvbnMgfSk7XG4gIChpbnN0IGFzIHVua25vd24gYXMgeyBvbjogKGV2dDogc3RyaW5nLCBjYjogKGU6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQgfSlcbiAgICAub24oJ2Vycm9yJywgKGUpID0+IGxvZ2dlci53YXJuKGBSZWRpcyAke2xhYmVsfSBjbGllbnQgZXJyb3JgLCB7IGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkgfSkpO1xuICByZXR1cm4gaW5zdDtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIGFwcGxpY2F0aW9uIFJlZGlzIGNsaWVudDogYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc29cbiAqIHRoZSBjYWxsZXIgZGVncmFkZXMgdG8gaXRzIG5vLVJlZGlzIGJlaGF2aW9yLlxuICpcbiAqIENvbW1hbmRzIGZhaWwgZmFzdCAoYG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxYCwgbm8gb2ZmbGluZSBxdWV1ZSkgYmVjYXVzZSB0aGVcbiAqIHJlcXVlc3QtcGF0aCBjYWxsZXJzIGFyZSBiZXN0LWVmZm9ydCBvciBmYWlsIGNsb3NlZCBvbiB0aGVpciBvd24gdGVybXMg4oCUIGFcbiAqIHJlcXVlc3QgbXVzdCBub3QgaGFuZyBiZWhpbmQgYSBSZWRpcyBvdXRhZ2UuIFRoYXQgaW5jbHVkZXMgdGhlIG1vbWVudHMgYmVmb3JlXG4gKiB0aGUgZmlyc3QgY29ubmVjdGlvbiBjb21wbGV0ZXM6IGEgYmFja2dyb3VuZCBjYWxsZXIgdGhhdCBydW5zIGF0IHN0YXJ0dXAgbXVzdFxuICogZWl0aGVyIHRvbGVyYXRlIGEgcmVqZWN0ZWQgY29tbWFuZCBvciB3YWl0IHdpdGgge0BsaW5rIHdoZW5SZWRpc1JlYWR5fS5cbiAqXG4gKiBUaHJvd3Mge0BsaW5rIFJlZGlzQ29uZmlnRXJyb3J9IGZvciBhIGJhZCBjb25maWd1cmF0aW9uLCBhbmQgaWYgUmVkaXMgaXNcbiAqIGNvbmZpZ3VyZWQgYnV0IGBpb3JlZGlzYCBjYW4ndCBiZSBsb2FkZWQg4oCUIGJvdGggYXJlIGRlcGxveW1lbnQgZXJyb3JzIHRoYXRcbiAqIG11c3Qgbm90IHF1aWV0bHkgdHVybiBSZWRpcy1iYWNrZWQgZ3VhcmFudGVlcyBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0NsaWVudDxUID0gdW5rbm93bj4obGFiZWw6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgY29uc3QgY29ubiA9IHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oKTtcbiAgaWYgKCFjb25uKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZVJlZGlzQ2xpZW50PFQ+KGNvbm4sIGxhYmVsLCB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH0pO1xuICBsb2dnZXIuaW5mbyhgUmVkaXMgJHtsYWJlbH0gY2xpZW50IGNyZWF0ZWRgLCBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbihjb25uKSk7XG4gIHJldHVybiBpbnN0O1xufVxuXG4vKiogVGhlIHN1YnNldCBvZiBpb3JlZGlzIG5lZWRlZCB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWR5QXdhcmVSZWRpcyB7XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uY2UgYGNsaWVudGAgaXMgY29ubmVjdGVkIGFuZCByZWFkeSBmb3IgY29tbWFuZHMsIG9yIHJlamVjdCBhZnRlclxuICogYHRpbWVvdXRNc2AuIEZvciBzdGFydHVwIHdvcmsgKGNyZWF0aW5nIGEgY29uc3VtZXIgZ3JvdXAsIHN1YnNjcmliaW5nKSB0aGF0XG4gKiBvdGhlcndpc2UgcmFjZXMgdGhlIGZpcnN0IGNvbm5lY3Rpb24uIEEgY2xpZW50IHdpdGhvdXQgaW9yZWRpcycgYHN0YXR1c2BcbiAqIChlLmcuIGEgdGVzdCBkb3VibGUpIGNvdW50cyBhcyByZWFkeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW5SZWRpc1JlYWR5KGNsaWVudDogUmVhZHlBd2FyZVJlZGlzLCB0aW1lb3V0TXMgPSAzMF8wMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNsaWVudC5zdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBjbGllbnQuc3RhdHVzID09PSAncmVhZHknIHx8ICFjbGllbnQub25jZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uUmVhZHkgPSAoKSA9PiB7IGNsZWFyVGltZW91dCh0aW1lcik7IHJlc29sdmUoKTsgfTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xpZW50Lm9mZj8uKCdyZWFkeScsIG9uUmVhZHkpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUmVkaXMgbm90IHJlYWR5IGFmdGVyICR7dGltZW91dE1zfW1zYCkpO1xuICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgdGltZXIudW5yZWY/LigpO1xuICAgIGNsaWVudC5vbmNlISgncmVhZHknLCBvblJlYWR5KTtcbiAgfSk7XG59XG4iXX0=
|
|
174
|
+
/** Default bound for {@link createRedisReadyGate}: short enough for a request path. */
|
|
175
|
+
export const REQUEST_PATH_REDIS_READY_TIMEOUT_MS = 2_000;
|
|
176
|
+
/**
|
|
177
|
+
* A request-path readiness gate for a lazily built env Redis client.
|
|
178
|
+
*
|
|
179
|
+
* The env client has no offline queue, so a command issued before the first
|
|
180
|
+
* connection completes is rejected outright — the first request after a lazy
|
|
181
|
+
* construction would otherwise hit that rejection (e.g. the first step-up per
|
|
182
|
+
* pod failing, or the first impersonation check reading "unavailable").
|
|
183
|
+
*
|
|
184
|
+
* The returned function resolves once the client is ready, or after
|
|
185
|
+
* `timeoutMs` — it NEVER rejects: the caller then runs its command and keeps its
|
|
186
|
+
* own fail-open / fail-closed semantics. Concurrent callers share one wait. After
|
|
187
|
+
* a wait times out (Redis genuinely down) later calls stop waiting until the
|
|
188
|
+
* client reports `ready` again, so an outage costs one bounded wait instead of
|
|
189
|
+
* adding `timeoutMs` to every request.
|
|
190
|
+
*/
|
|
191
|
+
export function createRedisReadyGate(client, timeoutMs = REQUEST_PATH_REDIS_READY_TIMEOUT_MS) {
|
|
192
|
+
let inflight = null;
|
|
193
|
+
let gaveUp = false;
|
|
194
|
+
return () => {
|
|
195
|
+
if (client.status === undefined || client.status === 'ready' || !client.once) {
|
|
196
|
+
gaveUp = false;
|
|
197
|
+
return Promise.resolve();
|
|
198
|
+
}
|
|
199
|
+
if (gaveUp)
|
|
200
|
+
return Promise.resolve();
|
|
201
|
+
if (!inflight) {
|
|
202
|
+
inflight = whenRedisReady(client, timeoutMs)
|
|
203
|
+
.catch(() => {
|
|
204
|
+
gaveUp = true;
|
|
205
|
+
// Re-arm the wait once the connection comes back.
|
|
206
|
+
client.once('ready', () => { gaveUp = false; });
|
|
207
|
+
})
|
|
208
|
+
.finally(() => { inflight = null; });
|
|
209
|
+
}
|
|
210
|
+
return inflight;
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* INCR a fixed-window counter and make sure it carries a TTL, atomically.
|
|
215
|
+
*
|
|
216
|
+
* A separate `INCR` then `EXPIRE` is not atomic: if the EXPIRE is lost (a
|
|
217
|
+
* connection drop, a failover between the two commands) the key never expires
|
|
218
|
+
* and the counter stays over its limit forever. The script also heals a key
|
|
219
|
+
* that somehow lacks a TTL (`PTTL` = -1) rather than only setting it on the
|
|
220
|
+
* first hit.
|
|
221
|
+
*/
|
|
222
|
+
const INCR_WINDOW_SCRIPT = `
|
|
223
|
+
local n = redis.call('INCR', KEYS[1])
|
|
224
|
+
if n == 1 or redis.call('PTTL', KEYS[1]) < 0 then
|
|
225
|
+
redis.call('PEXPIRE', KEYS[1], ARGV[1])
|
|
226
|
+
end
|
|
227
|
+
return n`;
|
|
228
|
+
/**
|
|
229
|
+
* Increment `key` within a window of `windowMs` and return the new count.
|
|
230
|
+
* Throws when Redis errors — callers choose their own failure policy.
|
|
231
|
+
*/
|
|
232
|
+
export async function incrWindow(redis, key, windowMs) {
|
|
233
|
+
const n = await redis.eval(INCR_WINDOW_SCRIPT, 1, key, Math.max(1, Math.ceil(windowMs)));
|
|
234
|
+
return Number(n);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsS0FBSztJQUN6QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFpQkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBdUI7SUFDcEQsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDdkUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFR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LENBQUM7UUFDRCxJQUFJLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7aUJBQ3pDLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxrREFBa0Q7Z0JBQ2xELE1BQU0sQ0FBQyxJQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUM7aUJBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQU9EOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRzs7Ozs7U0FLbEIsQ0FBQztBQUVWOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUFDLEtBQXNCLEVBQUUsR0FBVyxFQUFFLFFBQWdCO0lBQ3BGLE1BQU0sQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7XG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZW52LXJlZGlzJyk7XG5cbi8qKlxuICogVGhlIE9ORSBwbGFjZSBSZWRpcyBjb25uZWN0aW9uIHNldHRpbmdzIGFyZSByZWFkIGZyb20gdGhlIGVudmlyb25tZW50LlxuICpcbiAqIFR3byBzaGFwZXMsIGV4YWN0bHkgb25lIG9mIHdoaWNoIG1heSBiZSBzZXQ6XG4gKlxuICogLSAqKlN0YW5kYWxvbmUqKiDigJQgYFJFRElTX1VSTGAgKGByZWRpczovL2hvc3Q6NjM3OVsvZGJdYCwgb3IgYHJlZGlzczovL2AgZm9yXG4gKiAgIFRMUykuIENyZWRlbnRpYWxzIG1heSBzaXQgaW4gdGhlIFVSTCBvciBpbiBgUkVESVNfUEFTU1dPUkRgLlxuICogLSAqKkhBIChTZW50aW5lbCkqKiDigJQgYFJFRElTX1NFTlRJTkVMU2AgKGNvbW1hLXNlcGFyYXRlZCBgaG9zdDpwb3J0YCkgcGx1c1xuICogICBgUkVESVNfU0VOVElORUxfTUFTVEVSYCAoZGVmYXVsdCBgbXltYXN0ZXJgKSBhbmQgb3B0aW9uYWxcbiAqICAgYFJFRElTX1NFTlRJTkVMX1BBU1NXT1JEYC4gYFJFRElTX1BBU1NXT1JEYCBhdXRoZW50aWNhdGVzIHRvIHRoZSBkYXRhIG5vZGVzLlxuICogICBpb3JlZGlzIGZvbGxvd3MgdGhlIG1hc3RlciBhY3Jvc3MgYSBmYWlsb3Zlci5cbiAqXG4gKiBOZWl0aGVyIHNldCDihpIgUmVkaXMgaXMgb2ZmLCBhbmQgZWFjaCBjYWxsZXIgZGVncmFkZXMgdG8gaXRzIGRvY3VtZW50ZWRcbiAqIG5vLVJlZGlzIGJlaGF2aW9yLlxuICpcbiAqIGBSRURJU19IT1NUYCAvIGBSRURJU19QT1JUYCBhcmUgbm90IHJlYWQuIGBSRURJU19IT1NUYCBpcyByZWZ1c2VkIG91dHJpZ2h0IHNvIGFcbiAqIHN0YWxlIGNvbmZpZyBmYWlscyBhdCBzdGFydHVwIGluc3RlYWQgb2Ygc2lsZW50bHkgcnVubmluZyB3aXRob3V0IFJlZGlzLlxuICogYFJFRElTX1BPUlRgIGNhbid0IGJlIHJlZnVzZWQ6IEt1YmVybmV0ZXMgaW5qZWN0cyBgUkVESVNfUE9SVD10Y3A6Ly88aXA+OjYzNzlgXG4gKiBpbnRvIGV2ZXJ5IHBvZCBpbiBhIG5hbWVzcGFjZSB3aXRoIGEgU2VydmljZSBuYW1lZCBgcmVkaXNgLCB3aGljaCBpcyBleGFjdGx5XG4gKiB3aHkgYSBob3N0L3BvcnQgcGFpciB3YXMgdW5zYWZlIHRvIHBhcnNlLlxuICpcbiAqIE1pc2NvbmZpZ3VyYXRpb24gdGhyb3dzIHtAbGluayBSZWRpc0NvbmZpZ0Vycm9yfS4gV3JpdGVycyBhbmQgcmVhZGVycyBvZiB0aGVcbiAqIHNhbWUga2V5cyAocmV2b2NhdGlvbiwgc3RlcC11cCwgbGVhZGVyIGxvY2tzKSBtdXN0IHJlc29sdmUgUmVkaXMgaWRlbnRpY2FsbHk7XG4gKiBhIGNvbmZpZyB0aGF0IHF1aWV0bHkgcmVzb2x2ZWQgdG8gXCJubyBSZWRpc1wiIG9uIG9uZSBzaWRlIGlzIGhvdyByZXZvY2F0aW9uXG4gKiBvbmNlIGRpZCBub3RoaW5nIGF0IGFsbC5cbiAqL1xuXG4vKiogVGhyb3duIGZvciBhIFJlZGlzIGVudmlyb25tZW50IHRoYXQgY2FuJ3QgYmUgdXNlZCBhcyB3cml0dGVuLiAqL1xuZXhwb3J0IGNsYXNzIFJlZGlzQ29uZmlnRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdSZWRpc0NvbmZpZ0Vycm9yJztcbiAgfVxufVxuXG4vKiogUmVzb2x2ZWQgY29ubmVjdGlvbiwgaW5kZXBlbmRlbnQgb2YgYW55IGNsaWVudCBsaWJyYXJ5LiAqL1xuZXhwb3J0IHR5cGUgUmVkaXNDb25uZWN0aW9uID1cbiAgfCB7XG4gICAgbW9kZTogJ3NlbnRpbmVsJztcbiAgICBzZW50aW5lbHM6IEFycmF5PHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXIgfT47XG4gICAgbWFzdGVyTmFtZTogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIHNlbnRpbmVsUGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH1cbiAgfCB7XG4gICAgbW9kZTogJ3VybCc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgYFJFRElTX1NFTlRJTkVMU2AgaW50byBgeyBob3N0LCBwb3J0IH1bXWAuIEJsYW5rIGVudHJpZXMgYXJlIHNraXBwZWQgYW5kXG4gKiBhIG1pc3NpbmcgcG9ydCBtZWFucyB0aGUgU2VudGluZWwgZGVmYXVsdCAyNjM3OTsgYSBwb3J0IHRoYXQgaXNuJ3QgYSB2YWxpZFxuICogVENQIHBvcnQgaXMgYSBjb25maWd1cmF0aW9uIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZW50aW5lbHMocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBBcnJheTx7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0+IHtcbiAgaWYgKCFyYXcpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhdy5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgaWR4ID0gZW50cnkubGFzdEluZGV4T2YoJzonKTtcbiAgICBjb25zdCBob3N0ID0gaWR4ID09PSAtMSA/IGVudHJ5IDogZW50cnkuc2xpY2UoMCwgaWR4KTtcbiAgICBjb25zdCBwb3J0VGV4dCA9IGlkeCA9PT0gLTEgPyAnJyA6IGVudHJ5LnNsaWNlKGlkeCArIDEpO1xuICAgIGNvbnN0IHBvcnQgPSBwb3J0VGV4dCA9PT0gJycgPyAyNjM3OSA6IE51bWJlcihwb3J0VGV4dCk7XG4gICAgaWYgKCFob3N0IHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPCAxIHx8IHBvcnQgPiA2NTUzNSkge1xuICAgICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoYFJFRElTX1NFTlRJTkVMUyBlbnRyeSBcIiR7ZW50cnl9XCIgaXMgbm90IGhvc3Q6cG9ydGApO1xuICAgIH1cbiAgICByZXR1cm4geyBob3N0LCBwb3J0IH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIFJlZGlzIGNvbm5lY3Rpb24gZnJvbSBgZW52YCwgb3IgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3RcbiAqIGNvbmZpZ3VyZWQuIFRocm93cyB7QGxpbmsgUmVkaXNDb25maWdFcnJvcn0gZm9yIGFuIHVudXNhYmxlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVkaXNDb25uZWN0aW9uKGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IFJlZGlzQ29ubmVjdGlvbiB8IG51bGwge1xuICBpZiAoZW52LlJFRElTX0hPU1QpIHtcbiAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcihcbiAgICAgICdSRURJU19IT1NUIGlzIG5vdCBzdXBwb3J0ZWQuIFNldCBSRURJU19VUkw9cmVkaXM6Ly88aG9zdD46PHBvcnQ+IChvciBSRURJU19TRU5USU5FTFMgZm9yIEhBKSBhbmQgcmVtb3ZlIFJFRElTX0hPU1QvUkVESVNfUE9SVC4nLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZW50aW5lbHMgPSBwYXJzZVNlbnRpbmVscyhlbnYuUkVESVNfU0VOVElORUxTKTtcbiAgY29uc3QgdXJsID0gZW52LlJFRElTX1VSTD8udHJpbSgpO1xuICBjb25zdCBwYXNzd29yZCA9IGVudi5SRURJU19QQVNTV09SRCB8fCB1bmRlZmluZWQ7XG5cbiAgaWYgKHNlbnRpbmVscy5sZW5ndGggPiAwICYmIHVybCkge1xuICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKCdTZXQgUkVESVNfVVJMIG9yIFJFRElTX1NFTlRJTkVMUywgbm90IGJvdGguJyk7XG4gIH1cblxuICBpZiAoc2VudGluZWxzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogJ3NlbnRpbmVsJyxcbiAgICAgIHNlbnRpbmVscyxcbiAgICAgIG1hc3Rlck5hbWU6IGVudi5SRURJU19TRU5USU5FTF9NQVNURVIgfHwgJ215bWFzdGVyJyxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgc2VudGluZWxQYXNzd29yZDogZW52LlJFRElTX1NFTlRJTkVMX1BBU1NXT1JEIHx8IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHVybCkge1xuICAgIGxldCBwYXJzZWQ6IFVSTDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoJ1JFRElTX1VSTCBpcyBub3QgYSB2YWxpZCBVUkwgKGV4cGVjdGVkIHJlZGlzOi8vPGhvc3Q+Ojxwb3J0PikuJyk7XG4gICAgfVxuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdyZWRpczonICYmIHBhcnNlZC5wcm90b2NvbCAhPT0gJ3JlZGlzczonKSB7XG4gICAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcihgUkVESVNfVVJMIG11c3QgdXNlIHJlZGlzOi8vIG9yIHJlZGlzczovLywgZ290ICR7cGFyc2VkLnByb3RvY29sfS8vYCk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkLmhvc3RuYW1lKSB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcignUkVESVNfVVJMIGhhcyBubyBob3N0LicpO1xuICAgIHJldHVybiB7IG1vZGU6ICd1cmwnLCB1cmwsIHBhc3N3b3JkIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEEgbG9nLXNhZmUgZGVzY3JpcHRpb24gb2YgYSBjb25uZWN0aW9uIChuZXZlciBpbmNsdWRlcyBjcmVkZW50aWFscykuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVSZWRpc0Nvbm5lY3Rpb24oY29ubjogUmVkaXNDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoY29ubi5tb2RlID09PSAnc2VudGluZWwnKSB7XG4gICAgcmV0dXJuIHsgbW9kZTogJ3NlbnRpbmVsJywgbWFzdGVyOiBjb25uLm1hc3Rlck5hbWUsIHNlbnRpbmVsczogY29ubi5zZW50aW5lbHMubGVuZ3RoIH07XG4gIH1cbiAgY29uc3QgdSA9IG5ldyBVUkwoY29ubi51cmwpO1xuICByZXR1cm4geyBtb2RlOiAndXJsJywgaG9zdDogdS5ob3N0bmFtZSwgcG9ydDogdS5wb3J0IHx8ICc2Mzc5JywgdGxzOiB1LnByb3RvY29sID09PSAncmVkaXNzOicgfTtcbn1cblxudHlwZSBSZWRpc0N0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gVDtcblxuZnVuY3Rpb24gbG9hZElvcmVkaXM8VD4oKTogUmVkaXNDdG9yPFQ+IHtcbiAgY29uc3QgcmVxID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBtb2QgPSByZXEoJ2lvcmVkaXMnKSBhcyB7IFJlZGlzPzogUmVkaXNDdG9yPFQ+OyBkZWZhdWx0PzogUmVkaXNDdG9yPFQ+IH07XG4gIHJldHVybiAobW9kLlJlZGlzID8/IG1vZC5kZWZhdWx0ID8/IG1vZCkgYXMgUmVkaXNDdG9yPFQ+O1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBpb3JlZGlzIGNsaWVudCBmb3IgYSByZXNvbHZlZCBjb25uZWN0aW9uLiBgb3B0aW9uc2AgYXJlIG1lcmdlZFxuICogaW50byB0aGUgY2xpZW50IG9wdGlvbnMgKGUuZy4gYHsgZGIsIG1heFJldHJpZXNQZXJSZXF1ZXN0OiBudWxsIH1gIGZvciBCdWxsTVEpLlxuICogQW4gYGVycm9yYCBsaXN0ZW5lciBpcyBhbHdheXMgYXR0YWNoZWQgc28gYSBkcm9wcGVkIGNvbm5lY3Rpb24gaXMgbG9nZ2VkXG4gKiByYXRoZXIgdGhhbiBzdXJmYWNpbmcgYXMgYW4gdW5oYW5kbGVkIGAnZXJyb3InYCBldmVudCB0aGF0IGNyYXNoZXMgTm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzQ2xpZW50PFQgPSB1bmtub3duPihcbiAgY29ubjogUmVkaXNDb25uZWN0aW9uLFxuICBsYWJlbDogc3RyaW5nLFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKTogVCB7XG4gIGNvbnN0IEN0b3IgPSBsb2FkSW9yZWRpczxUPigpO1xuICBjb25zdCBhdXRoID0gY29ubi5wYXNzd29yZCA/IHsgcGFzc3dvcmQ6IGNvbm4ucGFzc3dvcmQgfSA6IHt9O1xuICBjb25zdCBpbnN0ID0gY29ubi5tb2RlID09PSAnc2VudGluZWwnXG4gICAgPyBuZXcgQ3Rvcih7XG4gICAgICBzZW50aW5lbHM6IGNvbm4uc2VudGluZWxzLFxuICAgICAgbmFtZTogY29ubi5tYXN0ZXJOYW1lLFxuICAgICAgLi4uKGNvbm4uc2VudGluZWxQYXNzd29yZCA/IHsgc2VudGluZWxQYXNzd29yZDogY29ubi5zZW50aW5lbFBhc3N3b3JkIH0gOiB7fSksXG4gICAgICAuLi5hdXRoLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KVxuICAgIDogbmV3IEN0b3IoY29ubi51cmwsIHsgLi4uYXV0aCwgLi4ub3B0aW9ucyB9KTtcbiAgKGluc3QgYXMgdW5rbm93biBhcyB7IG9uOiAoZXZ0OiBzdHJpbmcsIGNiOiAoZTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZCB9KVxuICAgIC5vbignZXJyb3InLCAoZSkgPT4gbG9nZ2VyLndhcm4oYFJlZGlzICR7bGFiZWx9IGNsaWVudCBlcnJvcmAsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gIHJldHVybiBpbnN0O1xufVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgYXBwbGljYXRpb24gUmVkaXMgY2xpZW50OiBgbnVsbGAgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLCBzb1xuICogdGhlIGNhbGxlciBkZWdyYWRlcyB0byBpdHMgbm8tUmVkaXMgYmVoYXZpb3IuXG4gKlxuICogQ29tbWFuZHMgZmFpbCBmYXN0IChgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDFgLCBubyBvZmZsaW5lIHF1ZXVlKSBiZWNhdXNlIHRoZVxuICogcmVxdWVzdC1wYXRoIGNhbGxlcnMgYXJlIGJlc3QtZWZmb3J0IG9yIGZhaWwgY2xvc2VkIG9uIHRoZWlyIG93biB0ZXJtcyDigJQgYVxuICogcmVxdWVzdCBtdXN0IG5vdCBoYW5nIGJlaGluZCBhIFJlZGlzIG91dGFnZS4gVGhhdCBpbmNsdWRlcyB0aGUgbW9tZW50cyBiZWZvcmVcbiAqIHRoZSBmaXJzdCBjb25uZWN0aW9uIGNvbXBsZXRlczogYSBiYWNrZ3JvdW5kIGNhbGxlciB0aGF0IHJ1bnMgYXQgc3RhcnR1cCBtdXN0XG4gKiBlaXRoZXIgdG9sZXJhdGUgYSByZWplY3RlZCBjb21tYW5kIG9yIHdhaXQgd2l0aCB7QGxpbmsgd2hlblJlZGlzUmVhZHl9LlxuICpcbiAqIFRocm93cyB7QGxpbmsgUmVkaXNDb25maWdFcnJvcn0gZm9yIGEgYmFkIGNvbmZpZ3VyYXRpb24sIGFuZCBpZiBSZWRpcyBpc1xuICogY29uZmlndXJlZCBidXQgYGlvcmVkaXNgIGNhbid0IGJlIGxvYWRlZCDigJQgYm90aCBhcmUgZGVwbG95bWVudCBlcnJvcnMgdGhhdFxuICogbXVzdCBub3QgcXVpZXRseSB0dXJuIFJlZGlzLWJhY2tlZCBndWFyYW50ZWVzIG9mZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzQ2xpZW50PFQgPSB1bmtub3duPihsYWJlbDogc3RyaW5nKTogVCB8IG51bGwge1xuICBjb25zdCBjb25uID0gcmVzb2x2ZVJlZGlzQ29ubmVjdGlvbigpO1xuICBpZiAoIWNvbm4pIHJldHVybiBudWxsO1xuICBjb25zdCBpbnN0ID0gY3JlYXRlUmVkaXNDbGllbnQ8VD4oY29ubiwgbGFiZWwsIHsgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDEsIGVuYWJsZU9mZmxpbmVRdWV1ZTogZmFsc2UgfSk7XG4gIGxvZ2dlci5pbmZvKGBSZWRpcyAke2xhYmVsfSBjbGllbnQgY3JlYXRlZGAsIGRlc2NyaWJlUmVkaXNDb25uZWN0aW9uKGNvbm4pKTtcbiAgcmV0dXJuIGluc3Q7XG59XG5cbi8qKiBUaGUgc3Vic2V0IG9mIGlvcmVkaXMgbmVlZGVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHlBd2FyZVJlZGlzIHtcbiAgc3RhdHVzPzogc3RyaW5nO1xuICBvbmNlPyhldmVudDogc3RyaW5nLCBjYjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHVua25vd247XG4gIG9mZj8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25jZSBgY2xpZW50YCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IGZvciBjb21tYW5kcywgb3IgcmVqZWN0IGFmdGVyXG4gKiBgdGltZW91dE1zYC4gRm9yIHN0YXJ0dXAgd29yayAoY3JlYXRpbmcgYSBjb25zdW1lciBncm91cCwgc3Vic2NyaWJpbmcpIHRoYXRcbiAqIG90aGVyd2lzZSByYWNlcyB0aGUgZmlyc3QgY29ubmVjdGlvbi4gQSBjbGllbnQgd2l0aG91dCBpb3JlZGlzJyBgc3RhdHVzYFxuICogKGUuZy4gYSB0ZXN0IGRvdWJsZSkgY291bnRzIGFzIHJlYWR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlZGlzUmVhZHkoY2xpZW50OiBSZWFkeUF3YXJlUmVkaXMsIHRpbWVvdXRNcyA9IDMwXzAwMCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY2xpZW50LnN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IGNsaWVudC5zdGF0dXMgPT09ICdyZWFkeScgfHwgIWNsaWVudC5vbmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25SZWFkeSA9ICgpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZSgpOyB9O1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGllbnQub2ZmPy4oJ3JlYWR5Jywgb25SZWFkeSk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBSZWRpcyBub3QgcmVhZHkgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKSk7XG4gICAgfSwgdGltZW91dE1zKTtcbiAgICB0aW1lci51bnJlZj8uKCk7XG4gICAgY2xpZW50Lm9uY2UhKCdyZWFkeScsIG9uUmVhZHkpO1xuICB9KTtcbn1cblxuLyoqIERlZmF1bHQgYm91bmQgZm9yIHtAbGluayBjcmVhdGVSZWRpc1JlYWR5R2F0ZX06IHNob3J0IGVub3VnaCBmb3IgYSByZXF1ZXN0IHBhdGguICovXG5leHBvcnQgY29uc3QgUkVRVUVTVF9QQVRIX1JFRElTX1JFQURZX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqXG4gKiBBIHJlcXVlc3QtcGF0aCByZWFkaW5lc3MgZ2F0ZSBmb3IgYSBsYXppbHkgYnVpbHQgZW52IFJlZGlzIGNsaWVudC5cbiAqXG4gKiBUaGUgZW52IGNsaWVudCBoYXMgbm8gb2ZmbGluZSBxdWV1ZSwgc28gYSBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0XG4gKiBjb25uZWN0aW9uIGNvbXBsZXRlcyBpcyByZWplY3RlZCBvdXRyaWdodCDigJQgdGhlIGZpcnN0IHJlcXVlc3QgYWZ0ZXIgYSBsYXp5XG4gKiBjb25zdHJ1Y3Rpb24gd291bGQgb3RoZXJ3aXNlIGhpdCB0aGF0IHJlamVjdGlvbiAoZS5nLiB0aGUgZmlyc3Qgc3RlcC11cCBwZXJcbiAqIHBvZCBmYWlsaW5nLCBvciB0aGUgZmlyc3QgaW1wZXJzb25hdGlvbiBjaGVjayByZWFkaW5nIFwidW5hdmFpbGFibGVcIikuXG4gKlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlc29sdmVzIG9uY2UgdGhlIGNsaWVudCBpcyByZWFkeSwgb3IgYWZ0ZXJcbiAqIGB0aW1lb3V0TXNgIOKAlCBpdCBORVZFUiByZWplY3RzOiB0aGUgY2FsbGVyIHRoZW4gcnVucyBpdHMgY29tbWFuZCBhbmQga2VlcHMgaXRzXG4gKiBvd24gZmFpbC1vcGVuIC8gZmFpbC1jbG9zZWQgc2VtYW50aWNzLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHdhaXQuIEFmdGVyXG4gKiBhIHdhaXQgdGltZXMgb3V0IChSZWRpcyBnZW51aW5lbHkgZG93bikgbGF0ZXIgY2FsbHMgc3RvcCB3YWl0aW5nIHVudGlsIHRoZVxuICogY2xpZW50IHJlcG9ydHMgYHJlYWR5YCBhZ2Fpbiwgc28gYW4gb3V0YWdlIGNvc3RzIG9uZSBib3VuZGVkIHdhaXQgaW5zdGVhZCBvZlxuICogYWRkaW5nIGB0aW1lb3V0TXNgIHRvIGV2ZXJ5IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1JlYWR5R2F0ZShcbiAgY2xpZW50OiBSZWFkeUF3YXJlUmVkaXMsXG4gIHRpbWVvdXRNcyA9IFJFUVVFU1RfUEFUSF9SRURJU19SRUFEWV9USU1FT1VUX01TLFxuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbmZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBsZXQgZ2F2ZVVwID0gZmFsc2U7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKGNsaWVudC5zdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBjbGllbnQuc3RhdHVzID09PSAncmVhZHknIHx8ICFjbGllbnQub25jZSkge1xuICAgICAgZ2F2ZVVwID0gZmFsc2U7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGlmIChnYXZlVXApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoIWluZmxpZ2h0KSB7XG4gICAgICBpbmZsaWdodCA9IHdoZW5SZWRpc1JlYWR5KGNsaWVudCwgdGltZW91dE1zKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGdhdmVVcCA9IHRydWU7XG4gICAgICAgICAgLy8gUmUtYXJtIHRoZSB3YWl0IG9uY2UgdGhlIGNvbm5lY3Rpb24gY29tZXMgYmFjay5cbiAgICAgICAgICBjbGllbnQub25jZSEoJ3JlYWR5JywgKCkgPT4geyBnYXZlVXAgPSBmYWxzZTsgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHsgaW5mbGlnaHQgPSBudWxsOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZmxpZ2h0O1xuICB9O1xufVxuXG4vKiogVGhlIHN1YnNldCBvZiBpb3JlZGlzIG5lZWRlZCBieSB7QGxpbmsgaW5jcldpbmRvd30uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzRXZhbENsaWVudCB7XG4gIGV2YWwoc2NyaXB0OiBzdHJpbmcsIG51bUtleXM6IG51bWJlciwgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSU5DUiBhIGZpeGVkLXdpbmRvdyBjb3VudGVyIGFuZCBtYWtlIHN1cmUgaXQgY2FycmllcyBhIFRUTCwgYXRvbWljYWxseS5cbiAqXG4gKiBBIHNlcGFyYXRlIGBJTkNSYCB0aGVuIGBFWFBJUkVgIGlzIG5vdCBhdG9taWM6IGlmIHRoZSBFWFBJUkUgaXMgbG9zdCAoYVxuICogY29ubmVjdGlvbiBkcm9wLCBhIGZhaWxvdmVyIGJldHdlZW4gdGhlIHR3byBjb21tYW5kcykgdGhlIGtleSBuZXZlciBleHBpcmVzXG4gKiBhbmQgdGhlIGNvdW50ZXIgc3RheXMgb3ZlciBpdHMgbGltaXQgZm9yZXZlci4gVGhlIHNjcmlwdCBhbHNvIGhlYWxzIGEga2V5XG4gKiB0aGF0IHNvbWVob3cgbGFja3MgYSBUVEwgKGBQVFRMYCA9IC0xKSByYXRoZXIgdGhhbiBvbmx5IHNldHRpbmcgaXQgb24gdGhlXG4gKiBmaXJzdCBoaXQuXG4gKi9cbmNvbnN0IElOQ1JfV0lORE9XX1NDUklQVCA9IGBcbmxvY2FsIG4gPSByZWRpcy5jYWxsKCdJTkNSJywgS0VZU1sxXSlcbmlmIG4gPT0gMSBvciByZWRpcy5jYWxsKCdQVFRMJywgS0VZU1sxXSkgPCAwIHRoZW5cbiAgcmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIEFSR1ZbMV0pXG5lbmRcbnJldHVybiBuYDtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYGtleWAgd2l0aGluIGEgd2luZG93IG9mIGB3aW5kb3dNc2AgYW5kIHJldHVybiB0aGUgbmV3IGNvdW50LlxuICogVGhyb3dzIHdoZW4gUmVkaXMgZXJyb3JzIOKAlCBjYWxsZXJzIGNob29zZSB0aGVpciBvd24gZmFpbHVyZSBwb2xpY3kuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmNyV2luZG93KHJlZGlzOiBSZWRpc0V2YWxDbGllbnQsIGtleTogc3RyaW5nLCB3aW5kb3dNczogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgbiA9IGF3YWl0IHJlZGlzLmV2YWwoSU5DUl9XSU5ET1dfU0NSSVBULCAxLCBrZXksIE1hdGgubWF4KDEsIE1hdGguY2VpbCh3aW5kb3dNcykpKTtcbiAgcmV0dXJuIE51bWJlcihuKTtcbn1cbiJdfQ==
|
|
@@ -55,32 +55,29 @@ export interface HttpClientResponse<T = unknown> {
|
|
|
55
55
|
*/
|
|
56
56
|
export interface HttpClientOptions {
|
|
57
57
|
/**
|
|
58
|
-
* A
|
|
59
|
-
*
|
|
60
|
-
* leaves a borrowed agent untouched so other clients keep working.
|
|
58
|
+
* A caller-owned `http.Agent` to use instead of the process-wide shared one.
|
|
59
|
+
* The client never destroys it.
|
|
61
60
|
*/
|
|
62
61
|
agent?: http.Agent;
|
|
63
|
-
/** Cap on concurrent keep-alive sockets
|
|
62
|
+
/** Cap on concurrent keep-alive sockets for the shared agent (default 64). */
|
|
64
63
|
maxSockets?: number;
|
|
65
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Close every shared keep-alive agent (idle sockets are released; in-flight
|
|
67
|
+
* requests finish). For process shutdown and tests — a later request simply
|
|
68
|
+
* builds a fresh agent.
|
|
69
|
+
*/
|
|
70
|
+
export declare function destroySharedHttpAgents(): void;
|
|
66
71
|
export declare class InternalHttpClient {
|
|
67
72
|
private config;
|
|
68
73
|
private agent;
|
|
69
|
-
/** True only when this client MINTED its agent (so destroy() may tear it down). */
|
|
70
|
-
private readonly ownsAgent;
|
|
71
74
|
/**
|
|
72
75
|
* Create a new HTTP client instance.
|
|
73
76
|
*
|
|
74
77
|
* @param config - Service configuration
|
|
75
|
-
* @param options - Optional connection-pool controls (
|
|
78
|
+
* @param options - Optional connection-pool controls (own agent / socket cap)
|
|
76
79
|
*/
|
|
77
80
|
constructor(config: ServiceConfig, options?: HttpClientOptions);
|
|
78
|
-
/**
|
|
79
|
-
* Release the keep-alive socket pool. Idempotent and safe to call on shutdown.
|
|
80
|
-
* A borrowed (caller-supplied) agent is left intact — only an agent this client
|
|
81
|
-
* created is destroyed, so tearing down one client can't sever another's pool.
|
|
82
|
-
*/
|
|
83
|
-
destroy(): void;
|
|
84
81
|
/**
|
|
85
82
|
* Make a GET request.
|
|
86
83
|
*/
|
|
@@ -121,8 +118,6 @@ export declare class InternalHttpClient {
|
|
|
121
118
|
* @returns Client wrapper with safe methods
|
|
122
119
|
*/
|
|
123
120
|
export declare function createSafeClient(config: ServiceConfig, options?: HttpClientOptions): {
|
|
124
|
-
/** Release the underlying keep-alive socket pool (no-op on a borrowed agent). */
|
|
125
|
-
destroy(): void;
|
|
126
121
|
/**
|
|
127
122
|
* Safe GET request - returns null on error.
|
|
128
123
|
*/
|
|
@@ -22,16 +22,42 @@ const DEFAULT_MAX_SOCKETS = parseInt(process.env.HTTP_CLIENT_MAX_SOCKETS || '64'
|
|
|
22
22
|
// HTTP methods that are idempotent by definition — safe to auto-retry on a
|
|
23
23
|
// 5xx/connection/timeout without risking a duplicate side effect.
|
|
24
24
|
const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
|
|
25
|
+
/**
|
|
26
|
+
* Process-wide keep-alive agents, one per `host:port` (and socket cap) —
|
|
27
|
+
* mirroring the per-target circuit-breaker registry. Clients are cheap and often
|
|
28
|
+
* built per call (an org-hierarchy walk builds one per hop), so a per-client
|
|
29
|
+
* agent threw away its pooled sockets every time and the socket cap bounded
|
|
30
|
+
* nothing. Sharing the agent pools connections to a downstream across every
|
|
31
|
+
* client that targets it.
|
|
32
|
+
*/
|
|
33
|
+
const sharedAgents = new Map();
|
|
34
|
+
function getSharedAgent(host, port, maxSockets) {
|
|
35
|
+
const key = `${host}:${port}:${maxSockets}`;
|
|
36
|
+
let agent = sharedAgents.get(key);
|
|
37
|
+
if (!agent) {
|
|
38
|
+
agent = new http.Agent({ keepAlive: true, maxSockets });
|
|
39
|
+
sharedAgents.set(key, agent);
|
|
40
|
+
}
|
|
41
|
+
return agent;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Close every shared keep-alive agent (idle sockets are released; in-flight
|
|
45
|
+
* requests finish). For process shutdown and tests — a later request simply
|
|
46
|
+
* builds a fresh agent.
|
|
47
|
+
*/
|
|
48
|
+
export function destroySharedHttpAgents() {
|
|
49
|
+
for (const agent of sharedAgents.values())
|
|
50
|
+
agent.destroy();
|
|
51
|
+
sharedAgents.clear();
|
|
52
|
+
}
|
|
25
53
|
export class InternalHttpClient {
|
|
26
54
|
config;
|
|
27
55
|
agent;
|
|
28
|
-
/** True only when this client MINTED its agent (so destroy() may tear it down). */
|
|
29
|
-
ownsAgent;
|
|
30
56
|
/**
|
|
31
57
|
* Create a new HTTP client instance.
|
|
32
58
|
*
|
|
33
59
|
* @param config - Service configuration
|
|
34
|
-
* @param options - Optional connection-pool controls (
|
|
60
|
+
* @param options - Optional connection-pool controls (own agent / socket cap)
|
|
35
61
|
*/
|
|
36
62
|
constructor(config, options) {
|
|
37
63
|
this.config = {
|
|
@@ -39,25 +65,8 @@ export class InternalHttpClient {
|
|
|
39
65
|
port: config.port,
|
|
40
66
|
timeout: config.timeout ?? DEFAULT_TIMEOUT,
|
|
41
67
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.agent = options.agent;
|
|
45
|
-
this.ownsAgent = false;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
// Own a keep-alive agent with a BOUNDED socket pool (no more Infinity).
|
|
49
|
-
this.agent = new http.Agent({ keepAlive: true, maxSockets: options?.maxSockets ?? DEFAULT_MAX_SOCKETS });
|
|
50
|
-
this.ownsAgent = true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Release the keep-alive socket pool. Idempotent and safe to call on shutdown.
|
|
55
|
-
* A borrowed (caller-supplied) agent is left intact — only an agent this client
|
|
56
|
-
* created is destroyed, so tearing down one client can't sever another's pool.
|
|
57
|
-
*/
|
|
58
|
-
destroy() {
|
|
59
|
-
if (this.ownsAgent)
|
|
60
|
-
this.agent.destroy();
|
|
68
|
+
this.agent = options?.agent
|
|
69
|
+
?? getSharedAgent(this.config.host, this.config.port, options?.maxSockets ?? DEFAULT_MAX_SOCKETS);
|
|
61
70
|
}
|
|
62
71
|
/**
|
|
63
72
|
* Make a GET request.
|
|
@@ -277,10 +286,6 @@ export class InternalHttpClient {
|
|
|
277
286
|
export function createSafeClient(config, options) {
|
|
278
287
|
const client = new InternalHttpClient(config, options);
|
|
279
288
|
return {
|
|
280
|
-
/** Release the underlying keep-alive socket pool (no-op on a borrowed agent). */
|
|
281
|
-
destroy() {
|
|
282
|
-
client.destroy();
|
|
283
|
-
},
|
|
284
289
|
/**
|
|
285
290
|
* Safe GET request - returns null on error.
|
|
286
291
|
*/
|
|
@@ -332,4 +337,4 @@ export function createSafeClient(config, options) {
|
|
|
332
337
|
},
|
|
333
338
|
};
|
|
334
339
|
}
|
|
335
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVoRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV0RiwyRUFBMkU7QUFDM0Usa0VBQWtFO0FBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFvRS9ELE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsTUFBTSxDQUEwQjtJQUNoQyxLQUFLLENBQWE7SUFDMUIsbUZBQW1GO0lB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QUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0SCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IGdldENpcmN1aXRCcmVha2VyLCBDaXJjdWl0T3BlbkVycm9yIH0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG4gIHR5cGUgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2h0dHAtY2xpZW50Jyk7XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChlbnY6IGBIVFRQX0NMSUVOVF9USU1FT1VUYCkuXG4gKi9cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX1RJTUVPVVQgfHwgJzUwMDAnLCAxMCk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgcGVyIGNsaWVudCBhZ2VudFxuICogKGVudjogYEhUVFBfQ0xJRU5UX01BWF9TT0NLRVRTYCkuIE5vZGUncyBkZWZhdWx0IGlzIGBJbmZpbml0eWAsIHdoaWNoIGxldHMgYVxuICogYnVyc3Qgb2YgY29uY3VycmVudCBjYWxscyBvcGVuIHVuYm91bmRlZCBzb2NrZXRzIGFnYWluc3QgYSBkb3duc3RyZWFtIHNlcnZpY2VcbiAqIChmZCBleGhhdXN0aW9uICsgY29ubmVjdGlvbi1zdG9ybSBvbiB0aGUgY2FsbGVlKS4gNjQgaXMgYW1wbGUgZm9yXG4gKiBzZXJ2aWNlLXRvLXNlcnZpY2UgZmFuLW91dCB3aGlsZSBzdGF5aW5nIGJvdW5kZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1NPQ0tFVFMgPSBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9NQVhfU09DS0VUUyB8fCAnNjQnLCAxMCk7XG5cbi8vIEhUVFAgbWV0aG9kcyB0aGF0IGFyZSBpZGVtcG90ZW50IGJ5IGRlZmluaXRpb24g4oCUIHNhZmUgdG8gYXV0by1yZXRyeSBvbiBhXG4vLyA1eHgvY29ubmVjdGlvbi90aW1lb3V0IHdpdGhvdXQgcmlza2luZyBhIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdC5cbmNvbnN0IElERU1QT1RFTlRfTUVUSE9EUyA9IG5ldyBTZXQoWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pO1xuXG4vKipcbiAqIEhUVFAgcmVxdWVzdCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFJlcXVlc3QgaGVhZGVycyAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMikgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIEJhc2UgZGVsYXkgYmV0d2VlbiByZXRyaWVzIGluIG1zIOKAlCBkb3VibGVzIGVhY2ggYXR0ZW1wdCAoZGVmYXVsdDogMjAwKSAqL1xuICByZXRyeURlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHNwZWNpZmljYWxseSBmb3IgNDI5IHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IDQpICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIChhZGRlZCBhcyBYLVJlcXVlc3QtSWQgaGVhZGVyKSAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcmVhdCB0aGlzIHJlcXVlc3QgYXMgc2FmZSB0byBhdXRvLXJldHJ5IG9uIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgZXZlblxuICAgKiB0aG91Z2ggdGhlIG1ldGhvZCBpcyBub24taWRlbXBvdGVudCAoZS5nLiB0aGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudCBieSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXksIG9yIHRoZSBvcGVyYXRpb24gaXMgbmF0dXJhbGx5IGlkZW1wb3RlbnQpLiBEZWZhdWx0IGZhbHNlOlxuICAgKiBub24taWRlbXBvdGVudCBtZXRob2RzIGFyZSBOT1QgcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcywgb25seSBvbiA0MjkuXG4gICAqL1xuICBpZGVtcG90ZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIVFRQIGNsaWVudCByZXNwb25zZSB3cmFwcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIC8qKiBSZXNwb25zZSBib2R5IChwYXJzZWQgSlNPTikgKi9cbiAgYm9keTogVDtcbiAgLyoqIFJlc3BvbnNlIGhlYWRlcnMgKi9cbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzO1xufVxuXG4vKipcbiAqIEludGVybmFsIEhUVFAgY2xpZW50IGZvciBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gKiAgIGhvc3Q6ICdxdW90YScsXG4gKiAgIHBvcnQ6IDMwMDAsXG4gKiAgIHRpbWVvdXQ6IDUwMDAsXG4gKiB9KTtcbiAqXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9vcmcxMjMvYXBpQ2FsbHMnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KCcvb3JnMTIzL2luY3JlbWVudCcsIHsgcXVvdGFUeXBlOiAnYXBpQ2FsbHMnIH0pO1xuICogYGBgXG4gKi9cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBwb29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgc2hhcmVkIGBodHRwLkFnZW50YCB0byByZXVzZSBhY3Jvc3MgY2xpZW50cyAocG9vbHMgc29ja2V0cyB0byB0aGUgc2FtZVxuICAgKiBob3N0KS4gV2hlbiBzdXBwbGllZCwgdGhlIGNsaWVudCBkb2VzIE5PVCBvd24gaXQg4oCUIHtAbGluayBJbnRlcm5hbEh0dHBDbGllbnQuZGVzdHJveX1cbiAgICogbGVhdmVzIGEgYm9ycm93ZWQgYWdlbnQgdW50b3VjaGVkIHNvIG90aGVyIGNsaWVudHMga2VlcCB3b3JraW5nLlxuICAgKi9cbiAgYWdlbnQ/OiBodHRwLkFnZW50O1xuICAvKiogQ2FwIG9uIGNvbmN1cnJlbnQga2VlcC1hbGl2ZSBzb2NrZXRzIHdoZW4gbWludGluZyBhbiBhZ2VudCAoZGVmYXVsdCA2NCkuICovXG4gIG1heFNvY2tldHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEh0dHBDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8U2VydmljZUNvbmZpZz47XG4gIHByaXZhdGUgYWdlbnQ6IGh0dHAuQWdlbnQ7XG4gIC8qKiBUcnVlIG9ubHkgd2hlbiB0aGlzIGNsaWVudCBNSU5URUQgaXRzIGFnZW50IChzbyBkZXN0cm95KCkgbWF5IHRlYXIgaXQgZG93bikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3duc0FnZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBTZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25uZWN0aW9uLXBvb2wgY29udHJvbHMgKHNoYXJlZCBhZ2VudCAvIHNvY2tldCBjYXApXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zPy5hZ2VudCkge1xuICAgICAgLy8gQm9ycm93ZWQsIGNhbGxlci1vd25lZCBhZ2VudCDigJQgcG9vbGVkIGFjcm9zcyBjbGllbnRzLCBub3Qgb3VycyB0byBkZXN0cm95LlxuICAgICAgdGhpcy5hZ2VudCA9IG9wdGlvbnMuYWdlbnQ7XG4gICAgICB0aGlzLm93bnNBZ2VudCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPd24gYSBrZWVwLWFsaXZlIGFnZW50IHdpdGggYSBCT1VOREVEIHNvY2tldCBwb29sIChubyBtb3JlIEluZmluaXR5KS5cbiAgICAgIHRoaXMuYWdlbnQgPSBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogdHJ1ZSwgbWF4U29ja2V0czogb3B0aW9ucz8ubWF4U29ja2V0cyA/PyBERUZBVUxUX01BWF9TT0NLRVRTIH0pO1xuICAgICAgdGhpcy5vd25zQWdlbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBrZWVwLWFsaXZlIHNvY2tldCBwb29sLiBJZGVtcG90ZW50IGFuZCBzYWZlIHRvIGNhbGwgb24gc2h1dGRvd24uXG4gICAqIEEgYm9ycm93ZWQgKGNhbGxlci1zdXBwbGllZCkgYWdlbnQgaXMgbGVmdCBpbnRhY3Qg4oCUIG9ubHkgYW4gYWdlbnQgdGhpcyBjbGllbnRcbiAgICogY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHNvIHRlYXJpbmcgZG93biBvbmUgY2xpZW50IGNhbid0IHNldmVyIGFub3RoZXIncyBwb29sLlxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vd25zQWdlbnQpIHRoaXMuYWdlbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBHRVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBPU1QgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUE9TVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQVVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQVVQnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdERUxFVEUnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiAtIDQyOSAocmF0ZSBsaW1pdCk6IHJlc3BlY3RzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLCB1c2VzIGxvbmdlciBiYXNlIGRlbGF5ICg0eCksXG4gICAqICAgcmV0cmllcyB1cCB0byBgbWF4UmF0ZUxpbWl0UmV0cmllc2AgdGltZXMgKGRlZmF1bHQgNCkuXG4gICAqIC0gNTAyLzUwMy81MDQgKHNlcnZlciBlcnJvcnMpOiBzdGFuZGFyZCBleHBvbmVudGlhbCBiYWNrb2ZmLCB1cCB0byBgbWF4UmV0cmllc2AgKGRlZmF1bHQgMikuXG4gICAqIC0gQ29ubmVjdGlvbiBlcnJvcnMgLyB0aW1lb3V0czogcmV0cmllcyB1cCB0byBgbWF4UmV0cmllc2AuXG4gICAqIC0gQWxsIGRlbGF5cyBpbmNsdWRlIMKxMjUlIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdFdpdGhSZXRyeTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIC8vIEEgbWFsZm9ybWVkIHBhdGggaXMgYSBDTElFTlQgYnVnLCBub3QgYSBkb3duc3RyZWFtIGZhdWx0IOKAlCByZWplY3QgaXQgdXBcbiAgICAvLyBmcm9udCBzbyBpdCBuZXZlciBidXJucyByZXRyaWVzIG9yIGZlZWRzIHRoZSBjaXJjdWl0IGJyZWFrZXIgKHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNoZWQgdHJhZmZpYyB0byBhIHBlcmZlY3RseSBoZWFsdGh5IGRvd25zdHJlYW0pLiByZXF1ZXN0KCkga2VlcHNcbiAgICAvLyB0aGUgc2FtZSBndWFyZCBhcyBkZWZlbmNlLWluLWRlcHRoLlxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpO1xuXG4gICAgLy8gV2hldGhlciBpdCdzIHNhZmUgdG8gYXV0by1yZXRyeSB0aGlzIHJlcXVlc3Qgb24gYSA1eHgvY29ubmVjdGlvbi90aW1lb3V0LlxuICAgIC8vIEEgdGltZWQtb3V0IFBPU1QgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBzZXJ2ZXItc2lkZSwgc28gcmV0cnlpbmdcbiAgICAvLyBhIG5vbi1pZGVtcG90ZW50IHJlcXVlc3Qgcmlza3MgYSBEVVBMSUNBVEUgc2lkZSBlZmZlY3QgKGRvdWJsZS1jaGFyZ2UsXG4gICAgLy8gZG91YmxlLWNyZWF0ZSkuIE9ubHkgR0VUL0hFQUQvT1BUSU9OUywgYW4gZXhwbGljaXQgYGlkZW1wb3RlbnRgIG9wdC1pbiwgb3JcbiAgICAvLyBhIHJlcXVlc3QgY2FycnlpbmcgYW4gSWRlbXBvdGVuY3ktS2V5IGFyZSBhdXRvLXJldHJpZWQgb24gdGhvc2UgZmFpbHVyZXMuXG4gICAgLy8gKDQyOSBpcyBhbHdheXMgcmV0cmllZCDigJQgc2VlIGJlbG93IOKAlCBzaW5jZSBpdCB3YXMgcmVqZWN0ZWQsIG5vdCBwcm9jZXNzZWQuKVxuICAgIGNvbnN0IHJldHJ5U2FmZSA9XG4gICAgICBJREVNUE9URU5UX01FVEhPRFMuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSB8fFxuICAgICAgb3B0aW9ucz8uaWRlbXBvdGVudCA9PT0gdHJ1ZSB8fFxuICAgICAgISEob3B0aW9ucz8uaGVhZGVycyAmJiAob3B0aW9ucy5oZWFkZXJzWydJZGVtcG90ZW5jeS1LZXknXSB8fCBvcHRpb25zLmhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddKSk7XG5cbiAgICAvLyBQZXItdGFyZ2V0IGNpcmN1aXQgYnJlYWtlciArIFMyUyByZXF1ZXN0IG1ldHJpY3MuIGB0YXJnZXRgIGlzIHRoZSBzaGFyZWRcbiAgICAvLyBicmVha2VyL21ldHJpYyBrZXkgc28gb25lIGJhZCBkb3duc3RyZWFtIHRyaXBzIG9uY2UgKG5vdCBvbmNlLXBlci1jbGllbnQpXG4gICAgLy8gYW5kIGRhc2hib2FyZHMgY2FuIHNlZSBTMlMgaGVhbHRoIHBlciBjYWxsZWUuXG4gICAgY29uc3QgdGFyZ2V0ID0gYCR7dGhpcy5jb25maWcuaG9zdH06JHt0aGlzLmNvbmZpZy5wb3J0fWA7XG4gICAgY29uc3QgYnJlYWtlciA9IGdldENpcmN1aXRCcmVha2VyKHRhcmdldCk7XG4gICAgaWYgKCFicmVha2VyLmFsbG93UmVxdWVzdCgpKSB7XG4gICAgICAvLyBGYXN0LWZhaWwgd2l0aG91dCB0b3VjaGluZyB0aGUgbmV0d29yayDigJQgdGhpcyBpcyB0aGUgbG9hZC1zaGVkZGluZyB0aGF0XG4gICAgICAvLyBwcmV2ZW50cyBhIGRvd25zdHJlYW0gYnJvd25vdXQgZnJvbSBjYXNjYWRpbmcgdmlhIHJldHJ5IHN0b3Jtcy5cbiAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnY2lyY3VpdF9vcGVuJyB9KTtcbiAgICAgIHRocm93IG5ldyBDaXJjdWl0T3BlbkVycm9yKHRhcmdldCk7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSB0b3RhbE1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PFQ+KG1ldGhvZCwgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRSZXRyeURlY2lzaW9uKHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMsIGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgLy8gNDI5IGlzIHNhZmUgdG8gcmV0cnkgZm9yIEFOWSBtZXRob2QgKHJhdGUtbGltaXRlZCDihpIgbm90IHByb2Nlc3NlZCk7IGFcbiAgICAgICAgLy8gNXh4L2dhdGV3YXkgZXJyb3IgaXMgb25seSByZXRyaWVkIHdoZW4gdGhlIHJlcXVlc3QgaXMgcmV0cnktc2FmZS5cbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5ICYmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkgfHwgcmV0cnlTYWZlKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhkZWNpc2lvbi5yZWFzb24gKyAnLCByZXRyeWluZycsIHsgbWV0aG9kLCBwYXRoLCBhdHRlbXB0OiBhdHRlbXB0ICsgMSwgZGVsYXlNczogZGVjaXNpb24uZGVsYXlNcyB9KTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RfcmV0cmllc190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlcm1pbmFsIHJlc3BvbnNlLiBBIDV4eCBpcyBhIGRvd25zdHJlYW0gZmF1bHQgKGZlZWRzIHRoZSBicmVha2VyKTsgYVxuICAgICAgICAvLyA0MjkgaXMgYmFja3ByZXNzdXJlLCBub3QgYSBmYXVsdCDigJQgdGhlIHNlcnZpY2UgYW5zd2VyZWQsIHNvIGl0IGNvdW50c1xuICAgICAgICAvLyBhcyBzdWNjZXNzIGZvciBicmVha2VyIHB1cnBvc2VzIChuZXZlciB0cmlwIHRoZSBicmVha2VyIG9uIHJhdGUgbGltaXRzKS5cbiAgICAgICAgY29uc3QgaXNTZXJ2ZXJGYXVsdCA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNTAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPD0gNTk5O1xuICAgICAgICBpZiAoaXNTZXJ2ZXJGYXVsdCkge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnc2VydmVyX2Vycm9yJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha2VyLnJlY29yZFN1Y2Nlc3MoKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcblxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldEVycm9yUmV0cnlEZWNpc2lvbihhdHRlbXB0LCByZXRyeUNvbmZpZyk7XG4gICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRSZXRyeSAmJiByZXRyeVNhZmUpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHJ5aW5nIGFmdGVyIGVycm9yJywgeyBtZXRob2QsIHBhdGgsIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgYXR0ZW1wdDogYXR0ZW1wdCArIDEgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0X3JldHJpZXNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHJldHJ5aW5nIChub24taWRlbXBvdGVudCwgb3IgYXR0ZW1wdHMgZXhoYXVzdGVkKSDigJQgYSBjb25uZWN0aW9uXG4gICAgICAgIC8vIGVycm9yL3RpbWVvdXQgaXMgYSBkb3duc3RyZWFtIGZhdWx0OiBmZWVkIHRoZSBicmVha2VyIGFuZCBmYWlsIG5vdy5cbiAgICAgICAgYnJlYWtlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnZXJyb3InIH0pO1xuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9vcCBleGhhdXN0ZWQgd2l0aG91dCByZXR1cm5pbmcgKGFsbCBhdHRlbXB0cyByZXRyaWVkIHRoZW4gcmFuIG91dCkuXG4gICAgYnJlYWtlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdlcnJvcicgfSk7XG4gICAgdGhyb3cgbGFzdEVycm9yITtcbiAgfVxuXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZXF1ZXN0IG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTZXJpYWxpemUgd2hlbiBib2R5IGlzIGRlZmluZWQgKGluY2x1ZGluZyAwL2ZhbHNlLycnIHdoaWNoIGFyZSB2YWxpZCBKU09OIHZhbHVlcykuXG4gICAgICBjb25zdCBib2R5U3RyID0gYm9keSAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IGh0dHAuT3V0Z29pbmdIdHRwSGVhZGVycyA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXG4gICAgICBpZiAob3B0aW9ucz8ucmVxdWVzdElkKSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtUmVxdWVzdC1JZCddID0gb3B0aW9ucy5yZXF1ZXN0SWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcGF0aCB0byBwcmV2ZW50IHByb3RvY29sIGluamVjdGlvbiAvIHJlcXVlc3Qgc211Z2dsaW5nXG4gICAgICBpZiAocGF0aC5pbmNsdWRlcygnOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IC9bXFxyXFxuXFwwXS8udGVzdChwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBodHRwLlJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBob3N0bmFtZTogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5jb25maWcucG9ydCxcbiAgICAgICAgcGF0aDogcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoIDogYC8ke3BhdGh9YCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIGFnZW50OiB0aGlzLmFnZW50LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAocmVzKSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG5cbiAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IHt9O1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBwYXJzZSByZXNwb25zZSBib2R5Jywge1xuICAgICAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogcGFyc2VFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcGFyc2VFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBhcnNlRXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHt9IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIE5vZGUgZHVhbC1zdGFjayBjb25uZWN0IGZhaWx1cmVzIGFyZSBhbiBBZ2dyZWdhdGVFcnJvciB3aXRoIGFuIGVtcHR5XG4gICAgICAgIC8vIGAubWVzc2FnZWA7IHRoZSBjYXVzZSBpcyBpbiBgLmNvZGVgIChFQ09OTlJFRlVTRUQvRVRJTUVET1VUKS4gRmFsbFxuICAgICAgICAvLyBiYWNrIHNvIHRoZSBsb2cgaXNuJ3QgYSBibGFuayBgZXJyb3I6XCJcImAuXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGVycm9yLm1lc3NhZ2UgfHwgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSB8fCBlcnJvci5uYW1lO1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0hUVFAgcmVxdWVzdCBmYWlsZWQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGVycm9yOiBkZXRhaWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dCBhZnRlciAke3RoaXMuY29uZmlnLnRpbWVvdXR9bXNgKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0Jywge1xuICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICByZXEud3JpdGUoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBIVFRQIGNsaWVudCB3aXRoIGVycm9yIGhhbmRsaW5nIHRoYXQgcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuXG4gKiBVc2VmdWwgZm9yIGZhaWwtb3BlbiBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xpZW50IHdyYXBwZXIgd2l0aCBzYWZlIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNhZmVDbGllbnQoY29uZmlnOiBTZXJ2aWNlQ29uZmlnLCBvcHRpb25zPzogSHR0cENsaWVudE9wdGlvbnMpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqIFJlbGVhc2UgdGhlIHVuZGVybHlpbmcga2VlcC1hbGl2ZSBzb2NrZXQgcG9vbCAobm8tb3Agb24gYSBib3Jyb3dlZCBhZ2VudCkuICovXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIGNsaWVudC5kZXN0cm95KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgR0VUIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmdldDxUPihwYXRoLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgR0VUIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUFVUIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgcHV0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnB1dDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUFVUIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIERFTEVURSByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLiBVc2VkIGJ5IGRlc3RydWN0aXZlXG4gICAgICogY3Jvc3Mtc2VydmljZSBvcGVyYXRpb25zIChlLmcuIG9yZy1jYXNjYWRlIGRlbGV0ZSBpbiBwbGF0Zm9ybSkuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlPFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICAgICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5kZWxldGU8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIERFTEVURSBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVoRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV0RiwyRUFBMkU7QUFDM0Usa0VBQWtFO0FBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFtRS9EOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztBQUVuRCxTQUFTLGNB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QyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRDs7O1dBR0c7UUFDSCxLQUFLLENBQUMsTUFBTSxDQUNWLElBQVksRUFDWixPQUF3QjtZQUV4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgZ2V0Q2lyY3VpdEJyZWFrZXIsIENpcmN1aXRPcGVuRXJyb3IgfSBmcm9tICcuL2NpcmN1aXQtYnJlYWtlci5qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbiAgdHlwZSBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaHR0cC1jbGllbnQnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGVudjogYEhUVFBfQ0xJRU5UX1RJTUVPVVRgKS5cbiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfVElNRU9VVCB8fCAnNTAwMCcsIDEwKTtcblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBjb25jdXJyZW50IGtlZXAtYWxpdmUgc29ja2V0cyBwZXIgY2xpZW50IGFnZW50XG4gKiAoZW52OiBgSFRUUF9DTElFTlRfTUFYX1NPQ0tFVFNgKS4gTm9kZSdzIGRlZmF1bHQgaXMgYEluZmluaXR5YCwgd2hpY2ggbGV0cyBhXG4gKiBidXJzdCBvZiBjb25jdXJyZW50IGNhbGxzIG9wZW4gdW5ib3VuZGVkIHNvY2tldHMgYWdhaW5zdCBhIGRvd25zdHJlYW0gc2VydmljZVxuICogKGZkIGV4aGF1c3Rpb24gKyBjb25uZWN0aW9uLXN0b3JtIG9uIHRoZSBjYWxsZWUpLiA2NCBpcyBhbXBsZSBmb3JcbiAqIHNlcnZpY2UtdG8tc2VydmljZSBmYW4tb3V0IHdoaWxlIHN0YXlpbmcgYm91bmRlZC5cbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfU09DS0VUUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX01BWF9TT0NLRVRTIHx8ICc2NCcsIDEwKTtcblxuLy8gSFRUUCBtZXRob2RzIHRoYXQgYXJlIGlkZW1wb3RlbnQgYnkgZGVmaW5pdGlvbiDigJQgc2FmZSB0byBhdXRvLXJldHJ5IG9uIGFcbi8vIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgd2l0aG91dCByaXNraW5nIGEgZHVwbGljYXRlIHNpZGUgZWZmZWN0LlxuY29uc3QgSURFTVBPVEVOVF9NRVRIT0RTID0gbmV3IFNldChbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXSk7XG5cbi8qKlxuICogSFRUUCByZXF1ZXN0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnMge1xuICAvKiogUmVxdWVzdCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKSAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgc3BlY2lmaWNhbGx5IGZvciA0MjkgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDogNCkgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgKGFkZGVkIGFzIFgtUmVxdWVzdC1JZCBoZWFkZXIpICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyZWF0IHRoaXMgcmVxdWVzdCBhcyBzYWZlIHRvIGF1dG8tcmV0cnkgb24gNXh4L2Nvbm5lY3Rpb24vdGltZW91dCBldmVuXG4gICAqIHRob3VnaCB0aGUgbWV0aG9kIGlzIG5vbi1pZGVtcG90ZW50IChlLmcuIHRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50IGJ5IGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSwgb3IgdGhlIG9wZXJhdGlvbiBpcyBuYXR1cmFsbHkgaWRlbXBvdGVudCkuIERlZmF1bHQgZmFsc2U6XG4gICAqIG5vbi1pZGVtcG90ZW50IG1ldGhvZHMgYXJlIE5PVCByZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLCBvbmx5IG9uIDQyOS5cbiAgICovXG4gIGlkZW1wb3RlbnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IHJlc3BvbnNlIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudFJlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIC8qKiBIVFRQIHN0YXR1cyBjb2RlICovXG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgLyoqIFJlc3BvbnNlIGJvZHkgKHBhcnNlZCBKU09OKSAqL1xuICBib2R5OiBUO1xuICAvKiogUmVzcG9uc2UgaGVhZGVycyAqL1xuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgSFRUUCBjbGllbnQgZm9yIHNlcnZpY2UtdG8tc2VydmljZSBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAqICAgaG9zdDogJ3F1b3RhJyxcbiAqICAgcG9ydDogMzAwMCxcbiAqICAgdGltZW91dDogNTAwMCxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL29yZzEyMy9hcGlDYWxscycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBvc3QoJy9vcmcxMjMvaW5jcmVtZW50JywgeyBxdW90YVR5cGU6ICdhcGlDYWxscycgfSk7XG4gKiBgYGBcbiAqL1xuLyoqXG4gKiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjbGllbnQncyBjb25uZWN0aW9uIHBvb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudE9wdGlvbnMge1xuICAvKipcbiAgICogQSBjYWxsZXItb3duZWQgYGh0dHAuQWdlbnRgIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBwcm9jZXNzLXdpZGUgc2hhcmVkIG9uZS5cbiAgICogVGhlIGNsaWVudCBuZXZlciBkZXN0cm95cyBpdC5cbiAgICovXG4gIGFnZW50PzogaHR0cC5BZ2VudDtcbiAgLyoqIENhcCBvbiBjb25jdXJyZW50IGtlZXAtYWxpdmUgc29ja2V0cyBmb3IgdGhlIHNoYXJlZCBhZ2VudCAoZGVmYXVsdCA2NCkuICovXG4gIG1heFNvY2tldHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvY2Vzcy13aWRlIGtlZXAtYWxpdmUgYWdlbnRzLCBvbmUgcGVyIGBob3N0OnBvcnRgIChhbmQgc29ja2V0IGNhcCkg4oCUXG4gKiBtaXJyb3JpbmcgdGhlIHBlci10YXJnZXQgY2lyY3VpdC1icmVha2VyIHJlZ2lzdHJ5LiBDbGllbnRzIGFyZSBjaGVhcCBhbmQgb2Z0ZW5cbiAqIGJ1aWx0IHBlciBjYWxsIChhbiBvcmctaGllcmFyY2h5IHdhbGsgYnVpbGRzIG9uZSBwZXIgaG9wKSwgc28gYSBwZXItY2xpZW50XG4gKiBhZ2VudCB0aHJldyBhd2F5IGl0cyBwb29sZWQgc29ja2V0cyBldmVyeSB0aW1lIGFuZCB0aGUgc29ja2V0IGNhcCBib3VuZGVkXG4gKiBub3RoaW5nLiBTaGFyaW5nIHRoZSBhZ2VudCBwb29scyBjb25uZWN0aW9ucyB0byBhIGRvd25zdHJlYW0gYWNyb3NzIGV2ZXJ5XG4gKiBjbGllbnQgdGhhdCB0YXJnZXRzIGl0LlxuICovXG5jb25zdCBzaGFyZWRBZ2VudHMgPSBuZXcgTWFwPHN0cmluZywgaHR0cC5BZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0U2hhcmVkQWdlbnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIsIG1heFNvY2tldHM6IG51bWJlcik6IGh0dHAuQWdlbnQge1xuICBjb25zdCBrZXkgPSBgJHtob3N0fToke3BvcnR9OiR7bWF4U29ja2V0c31gO1xuICBsZXQgYWdlbnQgPSBzaGFyZWRBZ2VudHMuZ2V0KGtleSk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBodHRwLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlLCBtYXhTb2NrZXRzIH0pO1xuICAgIHNoYXJlZEFnZW50cy5zZXQoa2V5LCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIENsb3NlIGV2ZXJ5IHNoYXJlZCBrZWVwLWFsaXZlIGFnZW50IChpZGxlIHNvY2tldHMgYXJlIHJlbGVhc2VkOyBpbi1mbGlnaHRcbiAqIHJlcXVlc3RzIGZpbmlzaCkuIEZvciBwcm9jZXNzIHNodXRkb3duIGFuZCB0ZXN0cyDigJQgYSBsYXRlciByZXF1ZXN0IHNpbXBseVxuICogYnVpbGRzIGEgZnJlc2ggYWdlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95U2hhcmVkSHR0cEFnZW50cygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhZ2VudCBvZiBzaGFyZWRBZ2VudHMudmFsdWVzKCkpIGFnZW50LmRlc3Ryb3koKTtcbiAgc2hhcmVkQWdlbnRzLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEh0dHBDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8U2VydmljZUNvbmZpZz47XG4gIHByaXZhdGUgYWdlbnQ6IGh0dHAuQWdlbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBIVFRQIGNsaWVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFNlcnZpY2UgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbm5lY3Rpb24tcG9vbCBjb250cm9scyAob3duIGFnZW50IC8gc29ja2V0IGNhcClcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2VydmljZUNvbmZpZywgb3B0aW9ucz86IEh0dHBDbGllbnRPcHRpb25zKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBob3N0OiBjb25maWcuaG9zdCxcbiAgICAgIHBvcnQ6IGNvbmZpZy5wb3J0LFxuICAgICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gREVGQVVMVF9USU1FT1VULFxuICAgIH07XG4gICAgdGhpcy5hZ2VudCA9IG9wdGlvbnM/LmFnZW50XG4gICAgICA/PyBnZXRTaGFyZWRBZ2VudCh0aGlzLmNvbmZpZy5ob3N0LCB0aGlzLmNvbmZpZy5wb3J0LCBvcHRpb25zPy5tYXhTb2NrZXRzID8/IERFRkFVTFRfTUFYX1NPQ0tFVFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBHRVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBPU1QgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUE9TVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQVVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQVVQnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdERUxFVEUnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiAtIDQyOSAocmF0ZSBsaW1pdCk6IHJlc3BlY3RzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLCB1c2VzIGxvbmdlciBiYXNlIGRlbGF5ICg0eCksXG4gICAqICAgcmV0cmllcyB1cCB0byBgbWF4UmF0ZUxpbWl0UmV0cmllc2AgdGltZXMgKGRlZmF1bHQgNCkuXG4gICAqIC0gNTAyLzUwMy81MDQgKHNlcnZlciBlcnJvcnMpOiBzdGFuZGFyZCBleHBvbmVudGlhbCBiYWNrb2ZmLCB1cCB0byBgbWF4UmV0cmllc2AgKGRlZmF1bHQgMikuXG4gICAqIC0gQ29ubmVjdGlvbiBlcnJvcnMgLyB0aW1lb3V0czogcmV0cmllcyB1cCB0byBgbWF4UmV0cmllc2AuXG4gICAqIC0gQWxsIGRlbGF5cyBpbmNsdWRlIMKxMjUlIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdFdpdGhSZXRyeTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIC8vIEEgbWFsZm9ybWVkIHBhdGggaXMgYSBDTElFTlQgYnVnLCBub3QgYSBkb3duc3RyZWFtIGZhdWx0IOKAlCByZWplY3QgaXQgdXBcbiAgICAvLyBmcm9udCBzbyBpdCBuZXZlciBidXJucyByZXRyaWVzIG9yIGZlZWRzIHRoZSBjaXJjdWl0IGJyZWFrZXIgKHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNoZWQgdHJhZmZpYyB0byBhIHBlcmZlY3RseSBoZWFsdGh5IGRvd25zdHJlYW0pLiByZXF1ZXN0KCkga2VlcHNcbiAgICAvLyB0aGUgc2FtZSBndWFyZCBhcyBkZWZlbmNlLWluLWRlcHRoLlxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpO1xuXG4gICAgLy8gV2hldGhlciBpdCdzIHNhZmUgdG8gYXV0by1yZXRyeSB0aGlzIHJlcXVlc3Qgb24gYSA1eHgvY29ubmVjdGlvbi90aW1lb3V0LlxuICAgIC8vIEEgdGltZWQtb3V0IFBPU1QgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBzZXJ2ZXItc2lkZSwgc28gcmV0cnlpbmdcbiAgICAvLyBhIG5vbi1pZGVtcG90ZW50IHJlcXVlc3Qgcmlza3MgYSBEVVBMSUNBVEUgc2lkZSBlZmZlY3QgKGRvdWJsZS1jaGFyZ2UsXG4gICAgLy8gZG91YmxlLWNyZWF0ZSkuIE9ubHkgR0VUL0hFQUQvT1BUSU9OUywgYW4gZXhwbGljaXQgYGlkZW1wb3RlbnRgIG9wdC1pbiwgb3JcbiAgICAvLyBhIHJlcXVlc3QgY2FycnlpbmcgYW4gSWRlbXBvdGVuY3ktS2V5IGFyZSBhdXRvLXJldHJpZWQgb24gdGhvc2UgZmFpbHVyZXMuXG4gICAgLy8gKDQyOSBpcyBhbHdheXMgcmV0cmllZCDigJQgc2VlIGJlbG93IOKAlCBzaW5jZSBpdCB3YXMgcmVqZWN0ZWQsIG5vdCBwcm9jZXNzZWQuKVxuICAgIGNvbnN0IHJldHJ5U2FmZSA9XG4gICAgICBJREVNUE9URU5UX01FVEhPRFMuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSB8fFxuICAgICAgb3B0aW9ucz8uaWRlbXBvdGVudCA9PT0gdHJ1ZSB8fFxuICAgICAgISEob3B0aW9ucz8uaGVhZGVycyAmJiAob3B0aW9ucy5oZWFkZXJzWydJZGVtcG90ZW5jeS1LZXknXSB8fCBvcHRpb25zLmhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddKSk7XG5cbiAgICAvLyBQZXItdGFyZ2V0IGNpcmN1aXQgYnJlYWtlciArIFMyUyByZXF1ZXN0IG1ldHJpY3MuIGB0YXJnZXRgIGlzIHRoZSBzaGFyZWRcbiAgICAvLyBicmVha2VyL21ldHJpYyBrZXkgc28gb25lIGJhZCBkb3duc3RyZWFtIHRyaXBzIG9uY2UgKG5vdCBvbmNlLXBlci1jbGllbnQpXG4gICAgLy8gYW5kIGRhc2hib2FyZHMgY2FuIHNlZSBTMlMgaGVhbHRoIHBlciBjYWxsZWUuXG4gICAgY29uc3QgdGFyZ2V0ID0gYCR7dGhpcy5jb25maWcuaG9zdH06JHt0aGlzLmNvbmZpZy5wb3J0fWA7XG4gICAgY29uc3QgYnJlYWtlciA9IGdldENpcmN1aXRCcmVha2VyKHRhcmdldCk7XG4gICAgaWYgKCFicmVha2VyLmFsbG93UmVxdWVzdCgpKSB7XG4gICAgICAvLyBGYXN0LWZhaWwgd2l0aG91dCB0b3VjaGluZyB0aGUgbmV0d29yayDigJQgdGhpcyBpcyB0aGUgbG9hZC1zaGVkZGluZyB0aGF0XG4gICAgICAvLyBwcmV2ZW50cyBhIGRvd25zdHJlYW0gYnJvd25vdXQgZnJvbSBjYXNjYWRpbmcgdmlhIHJldHJ5IHN0b3Jtcy5cbiAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnY2lyY3VpdF9vcGVuJyB9KTtcbiAgICAgIHRocm93IG5ldyBDaXJjdWl0T3BlbkVycm9yKHRhcmdldCk7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSB0b3RhbE1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PFQ+KG1ldGhvZCwgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRSZXRyeURlY2lzaW9uKHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMsIGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgLy8gNDI5IGlzIHNhZmUgdG8gcmV0cnkgZm9yIEFOWSBtZXRob2QgKHJhdGUtbGltaXRlZCDihpIgbm90IHByb2Nlc3NlZCk7IGFcbiAgICAgICAgLy8gNXh4L2dhdGV3YXkgZXJyb3IgaXMgb25seSByZXRyaWVkIHdoZW4gdGhlIHJlcXVlc3QgaXMgcmV0cnktc2FmZS5cbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5ICYmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkgfHwgcmV0cnlTYWZlKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhkZWNpc2lvbi5yZWFzb24gKyAnLCByZXRyeWluZycsIHsgbWV0aG9kLCBwYXRoLCBhdHRlbXB0OiBhdHRlbXB0ICsgMSwgZGVsYXlNczogZGVjaXNpb24uZGVsYXlNcyB9KTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RfcmV0cmllc190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlcm1pbmFsIHJlc3BvbnNlLiBBIDV4eCBpcyBhIGRvd25zdHJlYW0gZmF1bHQgKGZlZWRzIHRoZSBicmVha2VyKTsgYVxuICAgICAgICAvLyA0MjkgaXMgYmFja3ByZXNzdXJlLCBub3QgYSBmYXVsdCDigJQgdGhlIHNlcnZpY2UgYW5zd2VyZWQsIHNvIGl0IGNvdW50c1xuICAgICAgICAvLyBhcyBzdWNjZXNzIGZvciBicmVha2VyIHB1cnBvc2VzIChuZXZlciB0cmlwIHRoZSBicmVha2VyIG9uIHJhdGUgbGltaXRzKS5cbiAgICAgICAgY29uc3QgaXNTZXJ2ZXJGYXVsdCA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNTAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPD0gNTk5O1xuICAgICAgICBpZiAoaXNTZXJ2ZXJGYXVsdCkge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnc2VydmVyX2Vycm9yJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha2VyLnJlY29yZFN1Y2Nlc3MoKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcblxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldEVycm9yUmV0cnlEZWNpc2lvbihhdHRlbXB0LCByZXRyeUNvbmZpZyk7XG4gICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRSZXRyeSAmJiByZXRyeVNhZmUpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHJ5aW5nIGFmdGVyIGVycm9yJywgeyBtZXRob2QsIHBhdGgsIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgYXR0ZW1wdDogYXR0ZW1wdCArIDEgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0X3JldHJpZXNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHJldHJ5aW5nIChub24taWRlbXBvdGVudCwgb3IgYXR0ZW1wdHMgZXhoYXVzdGVkKSDigJQgYSBjb25uZWN0aW9uXG4gICAgICAgIC8vIGVycm9yL3RpbWVvdXQgaXMgYSBkb3duc3RyZWFtIGZhdWx0OiBmZWVkIHRoZSBicmVha2VyIGFuZCBmYWlsIG5vdy5cbiAgICAgICAgYnJlYWtlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnZXJyb3InIH0pO1xuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9vcCBleGhhdXN0ZWQgd2l0aG91dCByZXR1cm5pbmcgKGFsbCBhdHRlbXB0cyByZXRyaWVkIHRoZW4gcmFuIG91dCkuXG4gICAgYnJlYWtlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdlcnJvcicgfSk7XG4gICAgdGhyb3cgbGFzdEVycm9yITtcbiAgfVxuXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZXF1ZXN0IG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTZXJpYWxpemUgd2hlbiBib2R5IGlzIGRlZmluZWQgKGluY2x1ZGluZyAwL2ZhbHNlLycnIHdoaWNoIGFyZSB2YWxpZCBKU09OIHZhbHVlcykuXG4gICAgICBjb25zdCBib2R5U3RyID0gYm9keSAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IGh0dHAuT3V0Z29pbmdIdHRwSGVhZGVycyA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXG4gICAgICBpZiAob3B0aW9ucz8ucmVxdWVzdElkKSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtUmVxdWVzdC1JZCddID0gb3B0aW9ucy5yZXF1ZXN0SWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcGF0aCB0byBwcmV2ZW50IHByb3RvY29sIGluamVjdGlvbiAvIHJlcXVlc3Qgc211Z2dsaW5nXG4gICAgICBpZiAocGF0aC5pbmNsdWRlcygnOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IC9bXFxyXFxuXFwwXS8udGVzdChwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBodHRwLlJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBob3N0bmFtZTogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5jb25maWcucG9ydCxcbiAgICAgICAgcGF0aDogcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoIDogYC8ke3BhdGh9YCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIGFnZW50OiB0aGlzLmFnZW50LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAocmVzKSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG5cbiAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IHt9O1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBwYXJzZSByZXNwb25zZSBib2R5Jywge1xuICAgICAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogcGFyc2VFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcGFyc2VFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBhcnNlRXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHt9IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIE5vZGUgZHVhbC1zdGFjayBjb25uZWN0IGZhaWx1cmVzIGFyZSBhbiBBZ2dyZWdhdGVFcnJvciB3aXRoIGFuIGVtcHR5XG4gICAgICAgIC8vIGAubWVzc2FnZWA7IHRoZSBjYXVzZSBpcyBpbiBgLmNvZGVgIChFQ09OTlJFRlVTRUQvRVRJTUVET1VUKS4gRmFsbFxuICAgICAgICAvLyBiYWNrIHNvIHRoZSBsb2cgaXNuJ3QgYSBibGFuayBgZXJyb3I6XCJcImAuXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGVycm9yLm1lc3NhZ2UgfHwgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSB8fCBlcnJvci5uYW1lO1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0hUVFAgcmVxdWVzdCBmYWlsZWQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGVycm9yOiBkZXRhaWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dCBhZnRlciAke3RoaXMuY29uZmlnLnRpbWVvdXR9bXNgKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0Jywge1xuICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICByZXEud3JpdGUoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBIVFRQIGNsaWVudCB3aXRoIGVycm9yIGhhbmRsaW5nIHRoYXQgcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuXG4gKiBVc2VmdWwgZm9yIGZhaWwtb3BlbiBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xpZW50IHdyYXBwZXIgd2l0aCBzYWZlIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNhZmVDbGllbnQoY29uZmlnOiBTZXJ2aWNlQ29uZmlnLCBvcHRpb25zPzogSHR0cENsaWVudE9wdGlvbnMpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2FmZSBHRVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXQ8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZ2V0PFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBHRVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUE9TVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIHBvc3Q8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucG9zdDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUE9TVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgREVMRVRFIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuIFVzZWQgYnkgZGVzdHJ1Y3RpdmVcbiAgICAgKiBjcm9zcy1zZXJ2aWNlIG9wZXJhdGlvbnMgKGUuZy4gb3JnLWNhc2NhZGUgZGVsZXRlIGluIHBsYXRmb3JtKS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGU8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmRlbGV0ZTxUPihwYXRoLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgREVMRVRFIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
package/lib/services/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './api-key-exchange.js';
|
|
1
2
|
export * from './cache-service.js';
|
|
2
3
|
export * from './leader-lock.js';
|
|
3
4
|
export * from './scheduler.js';
|
|
@@ -5,6 +6,8 @@ export * from './compliance-client.js';
|
|
|
5
6
|
export * from './compliance-event-subscriber.js';
|
|
6
7
|
export * from './entity-events.js';
|
|
7
8
|
export * from './http-client.js';
|
|
9
|
+
export * from './jwks-cache.js';
|
|
10
|
+
export * from './service-keys.js';
|
|
8
11
|
export * from './circuit-breaker.js';
|
|
9
12
|
export * from './durable-event-bus.js';
|
|
10
13
|
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
|
package/lib/services/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
export * from './api-key-exchange.js';
|
|
3
4
|
export * from './cache-service.js';
|
|
4
5
|
export * from './leader-lock.js';
|
|
5
6
|
export * from './scheduler.js';
|
|
@@ -7,6 +8,8 @@ export * from './compliance-client.js';
|
|
|
7
8
|
export * from './compliance-event-subscriber.js';
|
|
8
9
|
export * from './entity-events.js';
|
|
9
10
|
export * from './http-client.js';
|
|
11
|
+
export * from './jwks-cache.js';
|
|
12
|
+
export * from './service-keys.js';
|
|
10
13
|
export * from './circuit-breaker.js';
|
|
11
14
|
export * from './durable-event-bus.js';
|
|
12
15
|
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
|
|
@@ -17,4 +20,4 @@ export * from './env-redis.js';
|
|
|
17
20
|
export * from './token-revocation.js';
|
|
18
21
|
export * from './sse-ticket-store.js';
|
|
19
22
|
export * from './service-boot.js';
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2p3a3MtY2FjaGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlLWtleXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kdXJhYmxlLWV2ZW50LWJ1cy5qcyc7XG5leHBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGNhbGN1bGF0ZUJhY2tvZmYsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQgdHlwZSB7IFJldHJ5Q29uZmlnLCBSZXRyeURlY2lzaW9uIH0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3F1b3RhLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuIl19
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The JWKS cache every verifier in the fleet shares.
|
|
3
|
+
*
|
|
4
|
+
* Platform signs user tokens with ES256 and publishes the public halves at
|
|
5
|
+
* `/.well-known/jwks.json`. Verifiers must not fetch that per request (platform
|
|
6
|
+
* would land on the hot path of the whole fleet) nor cache it forever (a rotated
|
|
7
|
+
* key would never be picked up), so the contract is fixed here and reused by
|
|
8
|
+
* api-core's `requireAuth`, image-registry's auth resolver and the CLI:
|
|
9
|
+
*
|
|
10
|
+
* - **Refresh every 10 minutes.** A key rotated in at platform is trusted fleet-
|
|
11
|
+
* wide within that window without anyone restarting.
|
|
12
|
+
* - **Refetch once on an unknown `kid`.** A brand-new signing key is picked up
|
|
13
|
+
* immediately instead of 401-ing every request until the next refresh. Rate-
|
|
14
|
+
* limited ({@link UNKNOWN_KID_REFETCH_COOLDOWN_MS}) so a flood of forged `kid`s
|
|
15
|
+
* can't turn into a fetch storm against platform.
|
|
16
|
+
* - **Negative-cache failures briefly.** A platform outage doesn't become a
|
|
17
|
+
* fetch-per-request amplifier.
|
|
18
|
+
* - **Fail closed.** An unverifiable token is not an identity: when the key set
|
|
19
|
+
* cannot be obtained the verifier throws {@link JwksUnavailableError} and the
|
|
20
|
+
* caller answers 401/503 — it NEVER falls through to "allow".
|
|
21
|
+
* A key set already in hand is still used while a refresh is failing (the keys
|
|
22
|
+
* are public and don't expire; refusing every request because platform blipped
|
|
23
|
+
* would be a self-inflicted outage), which is why the negative cache exists.
|
|
24
|
+
*/
|
|
25
|
+
import type { KeyObject } from 'crypto';
|
|
26
|
+
import { type JwksDocument } from '../utils/jwk.js';
|
|
27
|
+
/** How long a fetched key set is served before a refresh is due. */
|
|
28
|
+
export declare const JWKS_REFRESH_INTERVAL_MS = 600000;
|
|
29
|
+
/** How long a fetch FAILURE suppresses further attempts. */
|
|
30
|
+
export declare const JWKS_NEGATIVE_TTL_MS = 10000;
|
|
31
|
+
/** Minimum gap between unknown-`kid` refetches, so forged kids can't stampede platform. */
|
|
32
|
+
export declare const UNKNOWN_KID_REFETCH_COOLDOWN_MS = 30000;
|
|
33
|
+
/** The key set could not be obtained — the token's validity is UNKNOWN (503-shaped). */
|
|
34
|
+
export declare class JwksUnavailableError extends Error {
|
|
35
|
+
constructor(message?: string);
|
|
36
|
+
}
|
|
37
|
+
/** The key set was obtained and does NOT contain the token's `kid` (401-shaped). */
|
|
38
|
+
export declare class UnknownKidError extends Error {
|
|
39
|
+
constructor(kid: string);
|
|
40
|
+
}
|
|
41
|
+
/** Fetches the raw JWKS document. Rejects on any transport/shape failure. */
|
|
42
|
+
export type JwksFetcher = () => Promise<JwksDocument>;
|
|
43
|
+
export interface JwksCacheOptions {
|
|
44
|
+
fetch: JwksFetcher;
|
|
45
|
+
/** For metrics/logging (e.g. `'platform'`). */
|
|
46
|
+
source?: string;
|
|
47
|
+
refreshIntervalMs?: number;
|
|
48
|
+
negativeTtlMs?: number;
|
|
49
|
+
unknownKidCooldownMs?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A key set with the freshness bookkeeping the contract above needs. Deliberately
|
|
53
|
+
* transport-agnostic: the CLI and the Lambda hand it their own fetcher.
|
|
54
|
+
*/
|
|
55
|
+
export declare class JwksCache {
|
|
56
|
+
private readonly options;
|
|
57
|
+
private keys;
|
|
58
|
+
private fetchedAt;
|
|
59
|
+
private failedUntil;
|
|
60
|
+
private lastUnknownKidFetchAt;
|
|
61
|
+
private inFlight;
|
|
62
|
+
private readonly refreshIntervalMs;
|
|
63
|
+
private readonly negativeTtlMs;
|
|
64
|
+
private readonly unknownKidCooldownMs;
|
|
65
|
+
private readonly source;
|
|
66
|
+
constructor(options: JwksCacheOptions);
|
|
67
|
+
/**
|
|
68
|
+
* The verification key for `kid`.
|
|
69
|
+
*
|
|
70
|
+
* @throws {JwksUnavailableError} the key set could not be obtained at all.
|
|
71
|
+
* @throws {UnknownKidError} the key set is in hand but has no such key.
|
|
72
|
+
*/
|
|
73
|
+
getKey(kid: string): Promise<KeyObject>;
|
|
74
|
+
/** Every currently-trusted `kid`. Exposed for diagnostics and tests. */
|
|
75
|
+
knownKids(): string[];
|
|
76
|
+
/** Drop everything, so the next lookup refetches. */
|
|
77
|
+
reset(): void;
|
|
78
|
+
/** Refetch when the set is missing or past its refresh interval. */
|
|
79
|
+
private ensureFresh;
|
|
80
|
+
/** One real fetch, shared by every concurrent caller. */
|
|
81
|
+
private refresh;
|
|
82
|
+
private performFetch;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Fetch platform's JWKS over the in-cluster address every other caller uses
|
|
86
|
+
* (`PLATFORM_SERVICE_HOST` / `PLATFORM_SERVICE_PORT`), or the absolute
|
|
87
|
+
* `PLATFORM_JWKS_URL` when one is configured (the CLI and the events Lambda run
|
|
88
|
+
* outside the cluster).
|
|
89
|
+
*
|
|
90
|
+
* Unauthenticated by design: the key set is public, and requiring a credential
|
|
91
|
+
* to fetch the keys that verify credentials is a bootstrap cycle.
|
|
92
|
+
*/
|
|
93
|
+
export declare function fetchPlatformJwks(): Promise<JwksDocument>;
|
|
94
|
+
/** Fetch a JWKS document from an absolute URL (outside-the-cluster verifiers). */
|
|
95
|
+
export declare function fetchJwksFromUrl(url: string, timeoutMs?: number): Promise<JwksDocument>;
|
|
96
|
+
/** The process-wide cache of platform's published signing keys. */
|
|
97
|
+
export declare function platformJwksCache(): JwksCache;
|
|
98
|
+
/**
|
|
99
|
+
* Replace the process-wide cache — used by tests, and by any host that must
|
|
100
|
+
* supply its own fetcher. Pass `undefined` to drop back to the default.
|
|
101
|
+
*/
|
|
102
|
+
export declare function setPlatformJwksCache(cache: JwksCache | undefined): void;
|