@pipeline-builder/api-server 3.4.83 → 3.4.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/app-factory.js +9 -1
- package/lib/api/health-checks.d.ts +39 -5
- package/lib/api/health-checks.js +59 -7
- package/lib/api/index.d.ts +1 -0
- package/lib/api/index.js +3 -1
- package/lib/api/mongo-connect.d.ts +0 -12
- package/lib/api/mongo-connect.js +17 -10
- package/lib/api/readiness.d.ts +29 -0
- package/lib/api/readiness.js +65 -0
- package/lib/api/server.js +101 -20
- package/package.json +3 -3
package/lib/api/app-factory.js
CHANGED
|
@@ -13,6 +13,7 @@ import { v7 as uuid } from 'uuid';
|
|
|
13
13
|
import { etagMiddleware } from './etag-middleware.js';
|
|
14
14
|
import { idempotencyMiddleware } from './idempotency-middleware.js';
|
|
15
15
|
import { metricsMiddleware, metricsHandler, incCounter } from './metrics.js';
|
|
16
|
+
import { readinessGuard } from './readiness.js';
|
|
16
17
|
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
17
18
|
// Wire api-core's counter shim to the real prom-client registry. This is
|
|
18
19
|
// a no-op until incCounter is called for the first time (lazy registration
|
|
@@ -128,6 +129,13 @@ export function createApp(options = {}) {
|
|
|
128
129
|
serviceName: process.env.SERVICE_NAME || 'api',
|
|
129
130
|
checkDependencies,
|
|
130
131
|
}));
|
|
132
|
+
// Readiness guard — 503s business traffic while the service is NotReady
|
|
133
|
+
// (datastore still connecting at startup, or dropped). Mounted right after
|
|
134
|
+
// the health router and before everything else so a NotReady request is
|
|
135
|
+
// rejected cheaply, before rate-limit / idempotency / business handlers ever
|
|
136
|
+
// touch a disconnected datastore. It allowlists the infra endpoints
|
|
137
|
+
// (/metrics, /warmup, /docs, /logs) registered below, plus /health + /ready.
|
|
138
|
+
app.use(readinessGuard());
|
|
131
139
|
// Warm-up endpoint — pre-opens connection pools so the first real request
|
|
132
140
|
// doesn't pay cold-start latency. Always pings Postgres; services using
|
|
133
141
|
// Mongo / Redis / SQS pass `warmupHooks` so those are warmed in parallel.
|
|
@@ -229,4 +237,4 @@ export function createApp(options = {}) {
|
|
|
229
237
|
app.get('/logs/:requestId', sseManager.middleware());
|
|
230
238
|
return { app, sseManager };
|
|
231
239
|
}
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5LLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZGLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxPQUFPLEVBQUUsRUFBZ0UsTUFBTSxTQUFTLENBQUM7QUFDaEcsT0FBTyxTQUFTLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCx5RUFBeUU7QUFDekUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSxtRUFBbUU7QUFDbkUsaUJBQWlCLENB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b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgc2VuZFN1Y2Nlc3MsIHNlbmRFcnJvciwgZ2VuZXJhdGVPcGVuQXBpU3BlYywgRXJyb3JDb2RlLCBjcmVhdGVMb2dnZXIsIGdldE9yZ0lkLCBjcmVhdGVIZWFsdGhSb3V0ZXIsIHNldENvdW50ZXJFbWl0dGVyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBPcGVuQXBpU3BlY09wdGlvbnMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb25maWcsIENvcmVDb25zdGFudHMsIGdldENvbm5lY3Rpb24gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCBjb21wcmVzc2lvbiBmcm9tICdjb21wcmVzc2lvbic7XG5pbXBvcnQgY29ycyBmcm9tICdjb3JzJztcbmltcG9ydCBleHByZXNzLCB7IHR5cGUgRXhwcmVzcywgdHlwZSBOZXh0RnVuY3Rpb24sIHR5cGUgUmVxdWVzdCwgdHlwZSBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHJhdGVMaW1pdCwgeyBpcEtleUdlbmVyYXRvciB9IGZyb20gJ2V4cHJlc3MtcmF0ZS1saW1pdCc7XG5pbXBvcnQgaGVsbWV0IGZyb20gJ2hlbG1ldCc7XG5pbXBvcnQgc3dhZ2dlclVpIGZyb20gJ3N3YWdnZXItdWktZXhwcmVzcyc7XG5pbXBvcnQgeyB2NyBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBldGFnTWlkZGxld2FyZSB9IGZyb20gJy4vZXRhZy1taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IGlkZW1wb3RlbmN5TWlkZGxld2FyZSB9IGZyb20gJy4vaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBtZXRyaWNzTWlkZGxld2FyZSwgbWV0cmljc0hhbmRsZXIsIGluY0NvdW50ZXIgfSBmcm9tICcuL21ldHJpY3MuanMnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8vIFdpcmUgYXBpLWNvcmUncyBjb3VudGVyIHNoaW0gdG8gdGhlIHJlYWwgcHJvbS1jbGllbnQgcmVnaXN0cnkuIFRoaXMgaXNcbi8vIGEgbm8tb3AgdW50aWwgaW5jQ291bnRlciBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIChsYXp5IHJlZ2lzdHJhdGlvblxuLy8gaW4gbWV0cmljcy50cyksIGFuZCBsZXRzIGFwaS1jb3JlIGhlbHBlcnMgbGlrZSB0aGUgcXVvdGEgY2xpZW50IHJlY29yZFxuLy8gYHF1b3RhX2ZhaWxfb3Blbl90b3RhbGAgd2l0aG91dCB0YWtpbmcgYSBoYXJkIGRlcCBvbiBhcGktc2VydmVyLlxuc2V0Q291bnRlckVtaXR0ZXIoaW5jQ291bnRlcik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcE9wdGlvbnMge1xuICAvKiogRW5hYmxlIENPUlMgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUNvcnM/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVIZWxtZXQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZVJhdGVMaW1pdD86IGJvb2xlYW47XG4gIC8qKiBSZWRpcyBVUkwgZm9yIHNoYXJlZCByYXRlLWxpbWl0IHN0YXRlIChlLmcuICdyZWRpczovL2hvc3Q6NjM3OScpLiBJbi1tZW1vcnkgd2hlbiBvbWl0dGVkLiAqL1xuICByZWRpc1VybD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSBKU09OIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSnNvbkJvZHk/OiBib29sZWFuO1xuICAvKiogSlNPTiBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICBqc29uTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgVVJMLWVuY29kZWQgYm9keSBwYXJzaW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVVcmxFbmNvZGVkPzogYm9vbGVhbjtcbiAgLyoqIFVSTC1lbmNvZGVkIGJvZHkgc2l6ZSBsaW1pdCAoZGVmYXVsdDogJzFtYicpICovXG4gIHVybEVuY29kZWRMaW1pdD86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBTU0UgbWFuYWdlciBpbnN0YW5jZSAqL1xuICBzc2VNYW5hZ2VyPzogU1NFTWFuYWdlcjtcbiAgLyoqIEhlYWx0aCBjaGVjayBkZXBlbmRlbmN5IGNoZWNrZXIg4oCUIGlmIHByb3ZpZGVkLCAvaGVhbHRoIHJlcG9ydHMgZGVwZW5kZW5jeSBzdGF0dXMgKi9cbiAgY2hlY2tEZXBlbmRlbmNpZXM/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+PjtcbiAgLyoqIEVuYWJsZSBPcGVuQVBJIHNwZWMgYXQgL2RvY3Mvb3BlbmFwaS5qc29uIGFuZCBTd2FnZ2VyIFVJIGF0IC9kb2NzIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVPcGVuQXBpPzogYm9vbGVhbjtcbiAgLyoqIE9wZW5BUEkgc3BlYyBjdXN0b21pemF0aW9uIG9wdGlvbnMgKi9cbiAgb3BlbkFwaU9wdGlvbnM/OiBPcGVuQXBpU3BlY09wdGlvbnM7XG4gIC8qKiBFbmFibGUgZ3ppcC9kZWZsYXRlIHJlc3BvbnNlIGNvbXByZXNzaW9uIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb21wcmVzc2lvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB3YXJtdXAgY2FsbGJhY2tzIGludm9rZWQgYnkgYEdFVCAvd2FybXVwYCBpbiBhZGRpdGlvbiB0byB0aGVcbiAgICogZGVmYXVsdCBQb3N0Z3JlcyBwaW5nLiBVc2UgZm9yIHNlcnZpY2VzIHRoYXQgZGVwZW5kIG9uIE1vbmdvLCBSZWRpcyxcbiAgICogU1FTLCBldGMuIOKAlCBwcmUtd2FybWluZyBvcGVucyBjb25uZWN0aW9uIHBvb2xzIGJlZm9yZSByZWFsIHRyYWZmaWNcbiAgICogYXJyaXZlcy4gRWFjaCBjYWxsYmFjayBzaG91bGQgcmVzb2x2ZSB3aGVuIGl0cyBkZXBlbmRlbmN5IGlzIHJlYWR5O1xuICAgKiBhbnkgcmVqZWN0aW9uIGNhdXNlcyAvd2FybXVwIHRvIHJldHVybiA1MDMuXG4gICAqL1xuICB3YXJtdXBIb29rcz86IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4+O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjcmVhdGluZyBhbiBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXBwUmVzdWx0IHtcbiAgLyoqIENvbmZpZ3VyZWQgRXhwcmVzcyBhcHBsaWNhdGlvbiAqL1xuICBhcHA6IEV4cHJlc3M7XG4gIC8qKiBTU0UgbWFuYWdlciBpbnN0YW5jZSAqL1xuICBzc2VNYW5hZ2VyOiBTU0VNYW5hZ2VyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgY29uZmlndXJlIGFuIEV4cHJlc3MgYXBwbGljYXRpb24gd2l0aCBjb21tb24gbWlkZGxld2FyZVxuICpcbiAqIFNldHMgdXA6XG4gKiAtIENPUlMgd2l0aCBjb25maWd1cmVkIG9yaWdpbnNcbiAqIC0gSGVsbWV0IHNlY3VyaXR5IGhlYWRlcnNcbiAqIC0gUmF0ZSBsaW1pdGluZ1xuICogLSBKU09OIGFuZCBVUkwtZW5jb2RlZCBib2R5IHBhcnNpbmdcbiAqIC0gVHJ1c3QgcHJveHkgc2V0dGluZ3NcbiAqIC0gSGVhbHRoIGNoZWNrIGVuZHBvaW50ICgvaGVhbHRoKVxuICogLSBNZXRyaWNzIGVuZHBvaW50ICgvbWV0cmljcylcbiAqIC0gU1NFIGxvZ3MgZW5kcG9pbnQgKC9sb2dzLzpyZXF1ZXN0SWQpXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIENvbmZpZ3VyZWQgRXhwcmVzcyBhcHAgYW5kIFNTRSBtYW5hZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgLy8gWW91ciByb3V0ZSBoYW5kbGVyXG4gKiB9KTtcbiAqXG4gKiBzdGFydFNlcnZlcihhcHAsIHsgbmFtZTogJ015IFNlcnZpY2UnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcHAob3B0aW9uczogQ3JlYXRlQXBwT3B0aW9ucyA9IHt9KTogQ3JlYXRlQXBwUmVzdWx0IHtcbiAgY29uc3Qge1xuICAgIGVuYWJsZUNvcnMgPSB0cnVlLFxuICAgIGVuYWJsZUhlbG1ldCA9IHRydWUsXG4gICAgZW5hYmxlUmF0ZUxpbWl0ID0gdHJ1ZSxcbiAgICBlbmFibGVKc29uQm9keSA9IHRydWUsXG4gICAganNvbkxpbWl0ID0gJzFtYicsXG4gICAgZW5hYmxlVXJsRW5jb2RlZCA9IHRydWUsXG4gICAgdXJsRW5jb2RlZExpbWl0ID0gJzFtYicsXG4gICAgc3NlTWFuYWdlciA9IG5ldyBTU0VNYW5hZ2VyKCksXG4gICAgY2hlY2tEZXBlbmRlbmNpZXMsXG4gICAgZW5hYmxlT3BlbkFwaSA9IHRydWUsXG4gICAgb3BlbkFwaU9wdGlvbnMsXG4gICAgZW5hYmxlQ29tcHJlc3Npb24gPSB0cnVlLFxuICAgIHdhcm11cEhvb2tzID0gW10sXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEZhaWwgZmFzdCBpZiBKV1RfU0VDUkVUIGlzIG5vdCBjb25maWd1cmVkIOKAlCBwcmV2ZW50cyBzaWxlbnQgYXV0aCBmYWlsdXJlcyBhdCBydW50aW1lXG4gIGlmICghcHJvY2Vzcy5lbnYuSldUX1NFQ1JFVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSldUX1NFQ1JFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZC4gU2V0IGl0IGJlZm9yZSBzdGFydGluZyB0aGUgc2VydmVyLicpO1xuICB9XG5cbiAgLy8gT3BlblRlbGVtZXRyeSBpcyBOT1QgaW5pdGlhbGl6ZWQgaGVyZTogYnkgdGhlIHRpbWUgY3JlYXRlQXBwIHJ1bnMsIGV4cHJlc3NcbiAgLy8gYW5kIGh0dHAgaGF2ZSBhbHJlYWR5IGJlZW4gcmVxdWlyZWQsIHNvIHRoZSBhdXRvLWluc3RydW1lbnRhdGlvbiBob29rc1xuICAvLyB3b3VsZCBoYXZlIG5vdGhpbmcgdG8gcGF0Y2ggKG5vIGluYm91bmQgc3BhbiDihpIgbm8gdHJhY2UgaWQpLiBUcmFjaW5nIGlzXG4gIC8vIHN0YXJ0ZWQgYnkgdGhlIGBvdGVsLWJvb3RzdHJhcC5qc2AgcHJlbG9hZCBpbnN0ZWFkIChub2RlIC1yIOKApiDigJQgc2VlIGVhY2hcbiAgLy8gc2VydmljZSdzIERvY2tlcmZpbGUgQ01EIC8gc3RhcnQgc2NyaXB0KSwgd2hpY2ggcnVucyBiZWZvcmUgYW55XG4gIC8vIGluc3RydW1lbnRlZCBtb2R1bGUgbG9hZHMuIGBjdXJyZW50VHJhY2VJZCgpYCB0aGVuIHJlYWRzIHRoZSBhY3RpdmUgc3Bhbi5cblxuICBjb25zdCBzZXJ2ZXJDb25maWcgPSBDb25maWcuZ2V0KCdzZXJ2ZXInKTtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIFNlY3VyaXR5IG1pZGRsZXdhcmUuXG4gIC8vXG4gIC8vIFN3YWdnZXIgVUkgbmVlZHMgdW5zYWZlLWlubGluZSArIHVuc2FmZS1ldmFsIGZvciBpdHMgYnVuZGxlZCBzY3JpcHRzIOKAlFxuICAvLyBidXQgd2Ugb25seSByZWxheCBDU1AgdGhhdCBmYXIgd2hlbiAoYSkgT3BlbkFQSSBpcyBlbmFibGVkIEFORCAoYikgd2UncmVcbiAgLy8gbm90IGluIHByb2R1Y3Rpb24uIEluIHByb2QsIFN3YWdnZXIgc2hvdWxkIGJlIHNlcnZlZCBiZWhpbmQgYSBzZXBhcmF0ZVxuICAvLyBob3N0IG9yIGF1dGgtZ2F0ZWQgcm91dGU7IHRoZSBtYWluIGFwcCBrZWVwcyB0aGUgc3RyaWN0IENTUCBzbyBhIFN0b3JlZFxuICAvLyBYU1MgaW4gYW55IGhhbmRsZXIgY2FuJ3QgYGV2YWwoKWAgYXJiaXRyYXJ5IHNjcmlwdC5cbiAgY29uc3QgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgYWxsb3dTd2FnZ2VyQ3NwID0gZW5hYmxlT3BlbkFwaSAmJiAhaXNQcm9kdWN0aW9uO1xuICBpZiAoZW5hYmxlSGVsbWV0KSB7XG4gICAgYXBwLnVzZShoZWxtZXQoe1xuICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IHtcbiAgICAgICAgICBkZWZhdWx0U3JjOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgc2NyaXB0U3JjOiBhbGxvd1N3YWdnZXJDc3BcbiAgICAgICAgICAgID8gW1wiJ3NlbGYnXCIsIFwiJ3Vuc2FmZS1pbmxpbmUnXCIsIFwiJ3Vuc2FmZS1ldmFsJ1wiXVxuICAgICAgICAgICAgOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgc3R5bGVTcmM6IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiXSxcbiAgICAgICAgICBpbWdTcmM6IFtcIidzZWxmJ1wiLCAnZGF0YTonLCAnYmxvYjonXSxcbiAgICAgICAgICBjb25uZWN0U3JjOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgZm9udFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIG9iamVjdFNyYzogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGZyYW1lQW5jZXN0b3JzOiBbXCInbm9uZSdcIl0sXG4gICAgICAgICAgYmFzZVVyaTogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvcm1BY3Rpb246IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICB9XG5cbiAgaWYgKGVuYWJsZUNvcnMpIHtcbiAgICBhcHAudXNlKGNvcnMoc2VydmVyQ29uZmlnLmNvcnMpKTtcbiAgfVxuXG4gIC8vIFJlc3BvbnNlIGNvbXByZXNzaW9uIChnemlwL2RlZmxhdGUpIOKAlCBza2lwIFNTRSBzdHJlYW1zXG4gIGlmIChlbmFibGVDb21wcmVzc2lvbikge1xuICAgIGFwcC51c2UoY29tcHJlc3Npb24oe1xuICAgICAgZmlsdGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIERvbid0IGNvbXByZXNzIFNTRSBzdHJlYW1zXG4gICAgICAgIGlmIChyZXEuaGVhZGVycy5hY2NlcHQgPT09ICd0ZXh0L2V2ZW50LXN0cmVhbScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uLmZpbHRlcihyZXEsIHJlcyk7XG4gICAgICB9LFxuICAgICAgdGhyZXNob2xkOiBDb3JlQ29uc3RhbnRzLkNPTVBSRVNTSU9OX1RIUkVTSE9MRF9CWVRFUyxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBFVGFnIHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsIEdFVCByZXF1ZXN0cyAoMzA0IE5vdCBNb2RpZmllZClcbiAgYXBwLnVzZShldGFnTWlkZGxld2FyZSgpKTtcblxuICAvLyBCb2R5IHBhcnNpbmdcbiAgaWYgKGVuYWJsZUpzb25Cb2R5KSB7XG4gICAgYXBwLnVzZShleHByZXNzLmpzb24oeyBsaW1pdDoganNvbkxpbWl0IH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVVcmxFbmNvZGVkKSB7XG4gICAgYXBwLnVzZShleHByZXNzLnVybGVuY29kZWQoeyBleHRlbmRlZDogdHJ1ZSwgbGltaXQ6IHVybEVuY29kZWRMaW1pdCB9KSk7XG4gIH1cblxuICAvLyBUcnVzdCBwcm94eSAobXVzdCBiZSBzZXQgYmVmb3JlIHJhdGUgbGltaXRlciBzbyByZXEuaXAgcmVzb2x2ZXMgY29ycmVjdGx5KVxuICBhcHAuc2V0KCd0cnVzdCBwcm94eScsIHNlcnZlckNvbmZpZy50cnVzdFByb3h5KTtcblxuICAvLyBSZXF1ZXN0IElEIOKAlCBwcmVmZXIgZXhpc3RpbmcgaGVhZGVyIGZyb20gbmdpbngsIG90aGVyd2lzZSBnZW5lcmF0ZSBvbmVcbiAgYXBwLnVzZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBoZHIgPSByZXEuaGVhZGVyc1sneC1yZXF1ZXN0LWlkJ107XG4gICAgY29uc3QgcmVxdWVzdElkID0gKEFycmF5LmlzQXJyYXkoaGRyKSA/IGhkclswXSA6IGhkcikgfHwgdXVpZCgpO1xuICAgIHJlcS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgcmVzLnNldEhlYWRlcignWC1SZXF1ZXN0LUlkJywgcmVxdWVzdElkKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayByZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gaXQgaXMgbmV2ZXIgdGhyb3R0bGVkXG4gIGFwcC51c2UoY3JlYXRlSGVhbHRoUm91dGVyKHtcbiAgICBzZXJ2aWNlTmFtZTogcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknLFxuICAgIGNoZWNrRGVwZW5kZW5jaWVzLFxuICB9KSk7XG5cbiAgLy8gV2FybS11cCBlbmRwb2ludCDigJQgcHJlLW9wZW5zIGNvbm5lY3Rpb24gcG9vbHMgc28gdGhlIGZpcnN0IHJlYWwgcmVxdWVzdFxuICAvLyBkb2Vzbid0IHBheSBjb2xkLXN0YXJ0IGxhdGVuY3kuIEFsd2F5cyBwaW5ncyBQb3N0Z3Jlczsgc2VydmljZXMgdXNpbmdcbiAgLy8gTW9uZ28gLyBSZWRpcyAvIFNRUyBwYXNzIGB3YXJtdXBIb29rc2Agc28gdGhvc2UgYXJlIHdhcm1lZCBpbiBwYXJhbGxlbC5cbiAgYXBwLmdldCgnL3dhcm11cCcsIGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0Q29ubmVjdGlvbigpLnRlc3RDb25uZWN0aW9uKCksXG4gICAgICAgIC4uLndhcm11cEhvb2tzLm1hcCgoaG9vaykgPT4gaG9vaygpKSxcbiAgICAgIF0pO1xuICAgICAgc2VuZFN1Y2Nlc3MocmVzLCAyMDAsIHsgd2FybWVkOiB0cnVlLCBob29rczogd2FybXVwSG9va3MubGVuZ3RoIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc2VuZEVycm9yKHJlcywgNTAzLCAnV2FybXVwIGZhaWxlZCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbWV0aGV1cyBtZXRyaWNzIGVuZHBvaW50IOKAlCBhbHdheXMgcmVnaXN0ZXJlZCAobmV2ZXIgdGhyb3R0bGVkKVxuICBhcHAuZ2V0KCcvbWV0cmljcycsIG1ldHJpY3NIYW5kbGVyKCkpO1xuXG4gIC8vIE9wZW5BUEkgc3BlYyBhbmQgU3dhZ2dlciBVSSAocmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyKVxuICBpZiAoZW5hYmxlT3BlbkFwaSkge1xuICAgIGNvbnN0IHNwZWMgPSBnZW5lcmF0ZU9wZW5BcGlTcGVjKG9wZW5BcGlPcHRpb25zKTtcbiAgICBhcHAuZ2V0KCcvZG9jcy9vcGVuYXBpLmpzb24nLCAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgcmVzLmpzb24oc3BlYyk7XG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2RvY3MnLCBzd2FnZ2VyVWkuc2VydmUsIHN3YWdnZXJVaS5zZXR1cChzcGVjLCB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IG9wZW5BcGlPcHRpb25zPy50aXRsZSA/PyAnUGlwZWxpbmUgQnVpbGRlciBBUEkgRG9jcycsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gUmF0ZSBsaW1pdGluZyDigJQgdXNlcyBSZWRpcyB3aGVuIHJlZGlzVXJsIGlzIHByb3ZpZGVkIGZvciBzaGFyZWQgc3RhdGUgYWNyb3NzIGluc3RhbmNlc1xuICBpZiAoZW5hYmxlUmF0ZUxpbWl0KSB7XG4gICAgY29uc3QgcmF0ZUxpbWl0Q29uZmlnID0gQ29uZmlnLmdldCgncmF0ZUxpbWl0Jyk7XG5cbiAgICBjb25zdCByYXRlTGltaXRPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiByYXRlTGltaXQ+WzBdID0ge1xuICAgICAgbWF4OiByYXRlTGltaXRDb25maWcubWF4LFxuICAgICAgd2luZG93TXM6IHJhdGVMaW1pdENvbmZpZy53aW5kb3dNcyxcbiAgICAgIHN0YW5kYXJkSGVhZGVyczogdHJ1ZSxcbiAgICAgIGxlZ2FjeUhlYWRlcnM6IGZhbHNlLFxuICAgICAgLy8gU2tpcCByYXRlIGxpbWl0aW5nIGZvciBpbnRlcm5hbCBzZXJ2aWNlIGNhbGxzIChpbml0IHNjcmlwdHMsIGludGVyLXNlcnZpY2UpXG4gICAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiByZXEuaGVhZGVyc1sneC1pbnRlcm5hbC1zZXJ2aWNlJ10gPT09ICd0cnVlJyxcbiAgICAgIC8vIFBlci1vcmcga2V5OiB1c2Ugb3JnSWQgZnJvbSBKV1Qgd2hlbiBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBJUC5cbiAgICAgIC8vIGlwS2V5R2VuZXJhdG9yIG5vcm1hbGl6ZXMgSVB2NiB0byBhIC82NCBwcmVmaXggc28gYSBzaW5nbGUgdXNlciBjYW4ndFxuICAgICAgLy8gcm90YXRlIGxvdy1iaXRzIHRvIGVzY2FwZSB0aGUgYnVja2V0OyBleHByZXNzLXJhdGUtbGltaXQgOC54J3NcbiAgICAgIC8vIHZhbGlkYXRvciBhbHNvIHJlZnVzZXMgdG8gc3RhcnQgd2l0aG91dCBpdC5cbiAgICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCkgPT4gZ2V0T3JnSWQocmVxKSB8fCBpcEtleUdlbmVyYXRvcihyZXEuaXAgfHwgJ2Fub24nLCA2NCksXG4gICAgICBoYW5kbGVyOiAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MjksICdUb28gbWFueSByZXF1ZXN0cywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCBFcnJvckNvZGUuUkFURV9MSU1JVF9FWENFRURFRCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBVc2UgUmVkaXMgc3RvcmUgd2hlbiBhdmFpbGFibGUgZm9yIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgaW5zdGFuY2VzXG4gICAgaWYgKG9wdGlvbnMucmVkaXNVcmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEVTTSBoYXMgbm8gZ2xvYmFsIGByZXF1aXJlYDsgY3JlYXRlUmVxdWlyZSBsb2FkcyB0aGUgb3B0aW9uYWwgcmVkaXNcbiAgICAgICAgLy8gZGVwcyBzeW5jaHJvbm91c2x5IGhlcmUgKG9ubHkgd2hlbiBhIHJlZGlzVXJsIGlzIGNvbmZpZ3VyZWQpLlxuICAgICAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCB7IFJlZGlzU3RvcmUgfSA9IHJlcXVpcmUoJ3JhdGUtbGltaXQtcmVkaXMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJyk7XG4gICAgICAgIGNvbnN0IHJlZGlzQ2xpZW50ID0gbmV3IFJlZGlzKG9wdGlvbnMucmVkaXNVcmwpO1xuICAgICAgICByYXRlTGltaXRPcHRpb25zLnN0b3JlID0gbmV3IFJlZGlzU3RvcmUoe1xuICAgICAgICAgIHNlbmRDb21tYW5kOiAoLi4uYXJnczogc3RyaW5nW10pID0+IHJlZGlzQ2xpZW50LmNhbGwoLi4uYXJncyksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncmF0ZS1saW1pdCcpLndhcm4oJ1JlZGlzIHN0b3JlIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gaW4tbWVtb3J5IHJhdGUgbGltaXRpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHAudXNlKHJhdGVMaW1pdChyYXRlTGltaXRPcHRpb25zKSk7XG4gIH1cblxuICAvLyBFeHByZXNzIHJlcXVlc3QgdGltZW91dCDigJQgdXNlcyBDb3JlQ29uc3RhbnRzIHRvIHNoYXJlIHRoZSBzYW1lIGRlZmF1bHQgYXMgTGFtYmRhIGhhbmRsZXJzXG4gIGNvbnN0IHRpbWVvdXRNcyA9IENvcmVDb25zdGFudHMuSEFORExFUl9USU1FT1VUX01TO1xuICBhcHAudXNlKChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICByZXMuc2V0VGltZW91dCh0aW1lb3V0TXMsICgpID0+IHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ1JlcXVlc3QgdGltZW91dCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gUmVxdWVzdCBkdXJhdGlvbiBsb2dnaW5nXG4gIGNvbnN0IGR1cmF0aW9uTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXF1ZXN0LWR1cmF0aW9uJyk7XG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgICBkdXJhdGlvbkxvZ2dlci5pbmZvKGAke3JlcS5tZXRob2R9ICR7cmVxLm9yaWdpbmFsVXJsfSAke3Jlcy5zdGF0dXNDb2RlfSAke2R1cmF0aW9ufW1zYCwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5vcmlnaW5hbFVybCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgIGR1cmF0aW9uTXM6IGR1cmF0aW9uLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIFByb21ldGhldXMgbWV0cmljcyBtaWRkbGV3YXJlIOKAlCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50XG4gIGFwcC51c2UobWV0cmljc01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gSWRlbXBvdGVuY3kga2V5IHN1cHBvcnQgZm9yIG11dGF0aW9uIGVuZHBvaW50c1xuICBhcHAudXNlKGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpKTtcblxuICAvLyBTU0UgbG9ncyBlbmRwb2ludFxuICBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5LLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZGLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxPQUFPLEVBQUUsRUFBZ0UsTUFBTSxTQUFTLENBQUM7QUFDaEcsT0FBTyxTQUFTLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0QseUVBQXlFO0FBQ3pFLDJFQUEy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QUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBzZW5kU3VjY2Vzcywgc2VuZEVycm9yLCBnZW5lcmF0ZU9wZW5BcGlTcGVjLCBFcnJvckNvZGUsIGNyZWF0ZUxvZ2dlciwgZ2V0T3JnSWQsIGNyZWF0ZUhlYWx0aFJvdXRlciwgc2V0Q291bnRlckVtaXR0ZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IE9wZW5BcGlTcGVjT3B0aW9ucyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cywgZ2V0Q29ubmVjdGlvbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IGNvbXByZXNzaW9uIGZyb20gJ2NvbXByZXNzaW9uJztcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnO1xuaW1wb3J0IGV4cHJlc3MsIHsgdHlwZSBFeHByZXNzLCB0eXBlIE5leHRGdW5jdGlvbiwgdHlwZSBSZXF1ZXN0LCB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgcmF0ZUxpbWl0LCB7IGlwS2V5R2VuZXJhdG9yIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBzd2FnZ2VyVWkgZnJvbSAnc3dhZ2dlci11aS1leHByZXNzJztcbmltcG9ydCB7IHY3IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGV0YWdNaWRkbGV3YXJlIH0gZnJvbSAnLi9ldGFnLW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgaWRlbXBvdGVuY3lNaWRkbGV3YXJlIH0gZnJvbSAnLi9pZGVtcG90ZW5jeS1taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IG1ldHJpY3NNaWRkbGV3YXJlLCBtZXRyaWNzSGFuZGxlciwgaW5jQ291bnRlciB9IGZyb20gJy4vbWV0cmljcy5qcyc7XG5pbXBvcnQgeyByZWFkaW5lc3NHdWFyZCB9IGZyb20gJy4vcmVhZGluZXNzLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG4vLyBXaXJlIGFwaS1jb3JlJ3MgY291bnRlciBzaGltIHRvIHRoZSByZWFsIHByb20tY2xpZW50IHJlZ2lzdHJ5LiBUaGlzIGlzXG4vLyBhIG5vLW9wIHVudGlsIGluY0NvdW50ZXIgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAobGF6eSByZWdpc3RyYXRpb25cbi8vIGluIG1ldHJpY3MudHMpLCBhbmQgbGV0cyBhcGktY29yZSBoZWxwZXJzIGxpa2UgdGhlIHF1b3RhIGNsaWVudCByZWNvcmRcbi8vIGBxdW90YV9mYWlsX29wZW5fdG90YWxgIHdpdGhvdXQgdGFraW5nIGEgaGFyZCBkZXAgb24gYXBpLXNlcnZlci5cbnNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBPcHRpb25zIHtcbiAgLyoqIEVuYWJsZSBDT1JTIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb3JzPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVycyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSGVsbWV0PzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVSYXRlTGltaXQ/OiBib29sZWFuO1xuICAvKiogUmVkaXMgVVJMIGZvciBzaGFyZWQgcmF0ZS1saW1pdCBzdGF0ZSAoZS5nLiAncmVkaXM6Ly9ob3N0OjYzNzknKS4gSW4tbWVtb3J5IHdoZW4gb21pdHRlZC4gKi9cbiAgcmVkaXNVcmw/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgSlNPTiBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUpzb25Cb2R5PzogYm9vbGVhbjtcbiAgLyoqIEpTT04gYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAganNvbkxpbWl0Pzogc3RyaW5nO1xuICAvKiogRW5hYmxlIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlVXJsRW5jb2RlZD86IGJvb2xlYW47XG4gIC8qKiBVUkwtZW5jb2RlZCBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICB1cmxFbmNvZGVkTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBIZWFsdGggY2hlY2sgZGVwZW5kZW5jeSBjaGVja2VyIOKAlCBpZiBwcm92aWRlZCwgL2hlYWx0aCByZXBvcnRzIGRlcGVuZGVuY3kgc3RhdHVzICovXG4gIGNoZWNrRGVwZW5kZW5jaWVzPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nPj47XG4gIC8qKiBFbmFibGUgT3BlbkFQSSBzcGVjIGF0IC9kb2NzL29wZW5hcGkuanNvbiBhbmQgU3dhZ2dlciBVSSBhdCAvZG9jcyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlT3BlbkFwaT86IGJvb2xlYW47XG4gIC8qKiBPcGVuQVBJIHNwZWMgY3VzdG9taXphdGlvbiBvcHRpb25zICovXG4gIG9wZW5BcGlPcHRpb25zPzogT3BlbkFwaVNwZWNPcHRpb25zO1xuICAvKiogRW5hYmxlIGd6aXAvZGVmbGF0ZSByZXNwb25zZSBjb21wcmVzc2lvbiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgd2FybXVwIGNhbGxiYWNrcyBpbnZva2VkIGJ5IGBHRVQgL3dhcm11cGAgaW4gYWRkaXRpb24gdG8gdGhlXG4gICAqIGRlZmF1bHQgUG9zdGdyZXMgcGluZy4gVXNlIGZvciBzZXJ2aWNlcyB0aGF0IGRlcGVuZCBvbiBNb25nbywgUmVkaXMsXG4gICAqIFNRUywgZXRjLiDigJQgcHJlLXdhcm1pbmcgb3BlbnMgY29ubmVjdGlvbiBwb29scyBiZWZvcmUgcmVhbCB0cmFmZmljXG4gICAqIGFycml2ZXMuIEVhY2ggY2FsbGJhY2sgc2hvdWxkIHJlc29sdmUgd2hlbiBpdHMgZGVwZW5kZW5jeSBpcyByZWFkeTtcbiAgICogYW55IHJlamVjdGlvbiBjYXVzZXMgL3dhcm11cCB0byByZXR1cm4gNTAzLlxuICAgKi9cbiAgd2FybXVwSG9va3M/OiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+Pjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcFJlc3VsdCB7XG4gIC8qKiBDb25maWd1cmVkIEV4cHJlc3MgYXBwbGljYXRpb24gKi9cbiAgYXBwOiBFeHByZXNzO1xuICAvKiogU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcjogU1NFTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhbiBFeHByZXNzIGFwcGxpY2F0aW9uIHdpdGggY29tbW9uIG1pZGRsZXdhcmVcbiAqXG4gKiBTZXRzIHVwOlxuICogLSBDT1JTIHdpdGggY29uZmlndXJlZCBvcmlnaW5zXG4gKiAtIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzXG4gKiAtIFJhdGUgbGltaXRpbmdcbiAqIC0gSlNPTiBhbmQgVVJMLWVuY29kZWQgYm9keSBwYXJzaW5nXG4gKiAtIFRydXN0IHByb3h5IHNldHRpbmdzXG4gKiAtIEhlYWx0aCBjaGVjayBlbmRwb2ludCAoL2hlYWx0aClcbiAqIC0gTWV0cmljcyBlbmRwb2ludCAoL21ldHJpY3MpXG4gKiAtIFNTRSBsb2dzIGVuZHBvaW50ICgvbG9ncy86cmVxdWVzdElkKVxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEV4cHJlc3MgYXBwIGFuZCBTU0UgbWFuYWdlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIC8vIFlvdXIgcm91dGUgaGFuZGxlclxuICogfSk7XG4gKlxuICogc3RhcnRTZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBwKG9wdGlvbnM6IENyZWF0ZUFwcE9wdGlvbnMgPSB7fSk6IENyZWF0ZUFwcFJlc3VsdCB7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVDb3JzID0gdHJ1ZSxcbiAgICBlbmFibGVIZWxtZXQgPSB0cnVlLFxuICAgIGVuYWJsZVJhdGVMaW1pdCA9IHRydWUsXG4gICAgZW5hYmxlSnNvbkJvZHkgPSB0cnVlLFxuICAgIGpzb25MaW1pdCA9ICcxbWInLFxuICAgIGVuYWJsZVVybEVuY29kZWQgPSB0cnVlLFxuICAgIHVybEVuY29kZWRMaW1pdCA9ICcxbWInLFxuICAgIHNzZU1hbmFnZXIgPSBuZXcgU1NFTWFuYWdlcigpLFxuICAgIGNoZWNrRGVwZW5kZW5jaWVzLFxuICAgIGVuYWJsZU9wZW5BcGkgPSB0cnVlLFxuICAgIG9wZW5BcGlPcHRpb25zLFxuICAgIGVuYWJsZUNvbXByZXNzaW9uID0gdHJ1ZSxcbiAgICB3YXJtdXBIb29rcyA9IFtdLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBGYWlsIGZhc3QgaWYgSldUX1NFQ1JFVCBpcyBub3QgY29uZmlndXJlZCDigJQgcHJldmVudHMgc2lsZW50IGF1dGggZmFpbHVyZXMgYXQgcnVudGltZVxuICBpZiAoIXByb2Nlc3MuZW52LkpXVF9TRUNSRVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFNldCBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlci4nKTtcbiAgfVxuXG4gIC8vIE9wZW5UZWxlbWV0cnkgaXMgTk9UIGluaXRpYWxpemVkIGhlcmU6IGJ5IHRoZSB0aW1lIGNyZWF0ZUFwcCBydW5zLCBleHByZXNzXG4gIC8vIGFuZCBodHRwIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVpcmVkLCBzbyB0aGUgYXV0by1pbnN0cnVtZW50YXRpb24gaG9va3NcbiAgLy8gd291bGQgaGF2ZSBub3RoaW5nIHRvIHBhdGNoIChubyBpbmJvdW5kIHNwYW4g4oaSIG5vIHRyYWNlIGlkKS4gVHJhY2luZyBpc1xuICAvLyBzdGFydGVkIGJ5IHRoZSBgb3RlbC1ib290c3RyYXAuanNgIHByZWxvYWQgaW5zdGVhZCAobm9kZSAtciDigKYg4oCUIHNlZSBlYWNoXG4gIC8vIHNlcnZpY2UncyBEb2NrZXJmaWxlIENNRCAvIHN0YXJ0IHNjcmlwdCksIHdoaWNoIHJ1bnMgYmVmb3JlIGFueVxuICAvLyBpbnN0cnVtZW50ZWQgbW9kdWxlIGxvYWRzLiBgY3VycmVudFRyYWNlSWQoKWAgdGhlbiByZWFkcyB0aGUgYWN0aXZlIHNwYW4uXG5cbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBTZWN1cml0eSBtaWRkbGV3YXJlLlxuICAvL1xuICAvLyBTd2FnZ2VyIFVJIG5lZWRzIHVuc2FmZS1pbmxpbmUgKyB1bnNhZmUtZXZhbCBmb3IgaXRzIGJ1bmRsZWQgc2NyaXB0cyDigJRcbiAgLy8gYnV0IHdlIG9ubHkgcmVsYXggQ1NQIHRoYXQgZmFyIHdoZW4gKGEpIE9wZW5BUEkgaXMgZW5hYmxlZCBBTkQgKGIpIHdlJ3JlXG4gIC8vIG5vdCBpbiBwcm9kdWN0aW9uLiBJbiBwcm9kLCBTd2FnZ2VyIHNob3VsZCBiZSBzZXJ2ZWQgYmVoaW5kIGEgc2VwYXJhdGVcbiAgLy8gaG9zdCBvciBhdXRoLWdhdGVkIHJvdXRlOyB0aGUgbWFpbiBhcHAga2VlcHMgdGhlIHN0cmljdCBDU1Agc28gYSBTdG9yZWRcbiAgLy8gWFNTIGluIGFueSBoYW5kbGVyIGNhbid0IGBldmFsKClgIGFyYml0cmFyeSBzY3JpcHQuXG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGFsbG93U3dhZ2dlckNzcCA9IGVuYWJsZU9wZW5BcGkgJiYgIWlzUHJvZHVjdGlvbjtcbiAgaWYgKGVuYWJsZUhlbG1ldCkge1xuICAgIGFwcC51c2UoaGVsbWV0KHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICBkaXJlY3RpdmVzOiB7XG4gICAgICAgICAgZGVmYXVsdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHNjcmlwdFNyYzogYWxsb3dTd2FnZ2VyQ3NwXG4gICAgICAgICAgICA/IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiLCBcIid1bnNhZmUtZXZhbCdcIl1cbiAgICAgICAgICAgIDogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHN0eWxlU3JjOiBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIl0sXG4gICAgICAgICAgaW1nU3JjOiBbXCInc2VsZidcIiwgJ2RhdGE6JywgJ2Jsb2I6J10sXG4gICAgICAgICAgY29ubmVjdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvbnRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBvYmplY3RTcmM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBmcmFtZUFuY2VzdG9yczogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGJhc2VVcmk6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb3JtQWN0aW9uOiBbXCInc2VsZidcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVDb3JzKSB7XG4gICAgYXBwLnVzZShjb3JzKHNlcnZlckNvbmZpZy5jb3JzKSk7XG4gIH1cblxuICAvLyBSZXNwb25zZSBjb21wcmVzc2lvbiAoZ3ppcC9kZWZsYXRlKSDigJQgc2tpcCBTU0Ugc3RyZWFtc1xuICBpZiAoZW5hYmxlQ29tcHJlc3Npb24pIHtcbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKHtcbiAgICAgIGZpbHRlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBjb21wcmVzcyBTU0Ugc3RyZWFtc1xuICAgICAgICBpZiAocmVxLmhlYWRlcnMuYWNjZXB0ID09PSAndGV4dC9ldmVudC1zdHJlYW0nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2lvbi5maWx0ZXIocmVxLCByZXMpO1xuICAgICAgfSxcbiAgICAgIHRocmVzaG9sZDogQ29yZUNvbnN0YW50cy5DT01QUkVTU0lPTl9USFJFU0hPTERfQllURVMsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gRVRhZyBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBHRVQgcmVxdWVzdHMgKDMwNCBOb3QgTW9kaWZpZWQpXG4gIGFwcC51c2UoZXRhZ01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gQm9keSBwYXJzaW5nXG4gIGlmIChlbmFibGVKc29uQm9keSkge1xuICAgIGFwcC51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IGpzb25MaW1pdCB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlVXJsRW5jb2RlZCkge1xuICAgIGFwcC51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUsIGxpbWl0OiB1cmxFbmNvZGVkTGltaXQgfSkpO1xuICB9XG5cbiAgLy8gVHJ1c3QgcHJveHkgKG11c3QgYmUgc2V0IGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gcmVxLmlwIHJlc29sdmVzIGNvcnJlY3RseSlcbiAgYXBwLnNldCgndHJ1c3QgcHJveHknLCBzZXJ2ZXJDb25maWcudHJ1c3RQcm94eSk7XG5cbiAgLy8gUmVxdWVzdCBJRCDigJQgcHJlZmVyIGV4aXN0aW5nIGhlYWRlciBmcm9tIG5naW54LCBvdGhlcndpc2UgZ2VuZXJhdGUgb25lXG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3QgaGRyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChBcnJheS5pc0FycmF5KGhkcikgPyBoZHJbMF0gOiBoZHIpIHx8IHV1aWQoKTtcbiAgICByZXEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtUmVxdWVzdC1JZCcsIHJlcXVlc3RJZCk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBIZWFsdGggY2hlY2sgcmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIGl0IGlzIG5ldmVyIHRocm90dGxlZFxuICBhcHAudXNlKGNyZWF0ZUhlYWx0aFJvdXRlcih7XG4gICAgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJyxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgfSkpO1xuXG4gIC8vIFJlYWRpbmVzcyBndWFyZCDigJQgNTAzcyBidXNpbmVzcyB0cmFmZmljIHdoaWxlIHRoZSBzZXJ2aWNlIGlzIE5vdFJlYWR5XG4gIC8vIChkYXRhc3RvcmUgc3RpbGwgY29ubmVjdGluZyBhdCBzdGFydHVwLCBvciBkcm9wcGVkKS4gTW91bnRlZCByaWdodCBhZnRlclxuICAvLyB0aGUgaGVhbHRoIHJvdXRlciBhbmQgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBzbyBhIE5vdFJlYWR5IHJlcXVlc3QgaXNcbiAgLy8gcmVqZWN0ZWQgY2hlYXBseSwgYmVmb3JlIHJhdGUtbGltaXQgLyBpZGVtcG90ZW5jeSAvIGJ1c2luZXNzIGhhbmRsZXJzIGV2ZXJcbiAgLy8gdG91Y2ggYSBkaXNjb25uZWN0ZWQgZGF0YXN0b3JlLiBJdCBhbGxvd2xpc3RzIHRoZSBpbmZyYSBlbmRwb2ludHNcbiAgLy8gKC9tZXRyaWNzLCAvd2FybXVwLCAvZG9jcywgL2xvZ3MpIHJlZ2lzdGVyZWQgYmVsb3csIHBsdXMgL2hlYWx0aCArIC9yZWFkeS5cbiAgYXBwLnVzZShyZWFkaW5lc3NHdWFyZCgpKTtcblxuICAvLyBXYXJtLXVwIGVuZHBvaW50IOKAlCBwcmUtb3BlbnMgY29ubmVjdGlvbiBwb29scyBzbyB0aGUgZmlyc3QgcmVhbCByZXF1ZXN0XG4gIC8vIGRvZXNuJ3QgcGF5IGNvbGQtc3RhcnQgbGF0ZW5jeS4gQWx3YXlzIHBpbmdzIFBvc3RncmVzOyBzZXJ2aWNlcyB1c2luZ1xuICAvLyBNb25nbyAvIFJlZGlzIC8gU1FTIHBhc3MgYHdhcm11cEhvb2tzYCBzbyB0aG9zZSBhcmUgd2FybWVkIGluIHBhcmFsbGVsLlxuICBhcHAuZ2V0KCcvd2FybXVwJywgYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSxcbiAgICAgICAgLi4ud2FybXVwSG9va3MubWFwKChob29rKSA9PiBob29rKCkpLFxuICAgICAgXSk7XG4gICAgICBzZW5kU3VjY2VzcyhyZXMsIDIwMCwgeyB3YXJtZWQ6IHRydWUsIGhvb2tzOiB3YXJtdXBIb29rcy5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdXYXJtdXAgZmFpbGVkJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgZW5kcG9pbnQg4oCUIGFsd2F5cyByZWdpc3RlcmVkIChuZXZlciB0aHJvdHRsZWQpXG4gIGFwcC5nZXQoJy9tZXRyaWNzJywgbWV0cmljc0hhbmRsZXIoKSk7XG5cbiAgLy8gT3BlbkFQSSBzcGVjIGFuZCBTd2FnZ2VyIFVJIChyZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIpXG4gIGlmIChlbmFibGVPcGVuQXBpKSB7XG4gICAgY29uc3Qgc3BlYyA9IGdlbmVyYXRlT3BlbkFwaVNwZWMob3BlbkFwaU9wdGlvbnMpO1xuICAgIGFwcC5nZXQoJy9kb2NzL29wZW5hcGkuanNvbicsIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICByZXMuanNvbihzcGVjKTtcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvZG9jcycsIHN3YWdnZXJVaS5zZXJ2ZSwgc3dhZ2dlclVpLnNldHVwKHNwZWMsIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogb3BlbkFwaU9wdGlvbnM/LnRpdGxlID8/ICdQaXBlbGluZSBCdWlsZGVyIEFQSSBEb2NzJyxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBSYXRlIGxpbWl0aW5nIOKAlCB1c2VzIFJlZGlzIHdoZW4gcmVkaXNVcmwgaXMgcHJvdmlkZWQgZm9yIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgaW5zdGFuY2VzXG4gIGlmIChlbmFibGVSYXRlTGltaXQpIHtcbiAgICBjb25zdCByYXRlTGltaXRDb25maWcgPSBDb25maWcuZ2V0KCdyYXRlTGltaXQnKTtcblxuICAgIGNvbnN0IHJhdGVMaW1pdE9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgICBtYXg6IHJhdGVMaW1pdENvbmZpZy5tYXgsXG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zLFxuICAgICAgc3RhbmRhcmRIZWFkZXJzOiB0cnVlLFxuICAgICAgbGVnYWN5SGVhZGVyczogZmFsc2UsXG4gICAgICAvLyBTa2lwIHJhdGUgbGltaXRpbmcgZm9yIGludGVybmFsIHNlcnZpY2UgY2FsbHMgKGluaXQgc2NyaXB0cywgaW50ZXItc2VydmljZSlcbiAgICAgIHNraXA6IChyZXE6IFJlcXVlc3QpID0+IHJlcS5oZWFkZXJzWyd4LWludGVybmFsLXNlcnZpY2UnXSA9PT0gJ3RydWUnLFxuICAgICAgLy8gUGVyLW9yZyBrZXk6IHVzZSBvcmdJZCBmcm9tIEpXVCB3aGVuIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIElQLlxuICAgICAgLy8gaXBLZXlHZW5lcmF0b3Igbm9ybWFsaXplcyBJUHY2IHRvIGEgLzY0IHByZWZpeCBzbyBhIHNpbmdsZSB1c2VyIGNhbid0XG4gICAgICAvLyByb3RhdGUgbG93LWJpdHMgdG8gZXNjYXBlIHRoZSBidWNrZXQ7IGV4cHJlc3MtcmF0ZS1saW1pdCA4Lngnc1xuICAgICAgLy8gdmFsaWRhdG9yIGFsc28gcmVmdXNlcyB0byBzdGFydCB3aXRob3V0IGl0LlxuICAgICAga2V5R2VuZXJhdG9yOiAocmVxOiBSZXF1ZXN0KSA9PiBnZXRPcmdJZChyZXEpIHx8IGlwS2V5R2VuZXJhdG9yKHJlcS5pcCB8fCAnYW5vbicsIDY0KSxcbiAgICAgIGhhbmRsZXI6IChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDQyOSwgJ1RvbyBtYW55IHJlcXVlc3RzLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsIEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFVzZSBSZWRpcyBzdG9yZSB3aGVuIGF2YWlsYWJsZSBmb3Igc2hhcmVkIHN0YXRlIGFjcm9zcyBpbnN0YW5jZXNcbiAgICBpZiAob3B0aW9ucy5yZWRpc1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRVNNIGhhcyBubyBnbG9iYWwgYHJlcXVpcmVgOyBjcmVhdGVSZXF1aXJlIGxvYWRzIHRoZSBvcHRpb25hbCByZWRpc1xuICAgICAgICAvLyBkZXBzIHN5bmNocm9ub3VzbHkgaGVyZSAob25seSB3aGVuIGEgcmVkaXNVcmwgaXMgY29uZmlndXJlZCkuXG4gICAgICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIGNvbnN0IHsgUmVkaXNTdG9yZSB9ID0gcmVxdWlyZSgncmF0ZS1saW1pdC1yZWRpcycpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCBSZWRpcyA9IHJlcXVpcmUoJ2lvcmVkaXMnKTtcbiAgICAgICAgY29uc3QgcmVkaXNDbGllbnQgPSBuZXcgUmVkaXMob3B0aW9ucy5yZWRpc1VybCk7XG4gICAgICAgIHJhdGVMaW1pdE9wdGlvbnMuc3RvcmUgPSBuZXcgUmVkaXNTdG9yZSh7XG4gICAgICAgICAgc2VuZENvbW1hbmQ6ICguLi5hcmdzOiBzdHJpbmdbXSkgPT4gcmVkaXNDbGllbnQuY2FsbCguLi5hcmdzKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY3JlYXRlTG9nZ2VyKCdyYXRlLWxpbWl0Jykud2FybignUmVkaXMgc3RvcmUgdW5hdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBpbi1tZW1vcnkgcmF0ZSBsaW1pdGluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcC51c2UocmF0ZUxpbWl0KHJhdGVMaW1pdE9wdGlvbnMpKTtcbiAgfVxuXG4gIC8vIEV4cHJlc3MgcmVxdWVzdCB0aW1lb3V0IOKAlCB1c2VzIENvcmVDb25zdGFudHMgdG8gc2hhcmUgdGhlIHNhbWUgZGVmYXVsdCBhcyBMYW1iZGEgaGFuZGxlcnNcbiAgY29uc3QgdGltZW91dE1zID0gQ29yZUNvbnN0YW50cy5IQU5ETEVSX1RJTUVPVVRfTVM7XG4gIGFwcC51c2UoKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIHJlcy5zZXRUaW1lb3V0KHRpbWVvdXRNcywgKCkgPT4ge1xuICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNTAzLCAnUmVxdWVzdCB0aW1lb3V0Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBSZXF1ZXN0IGR1cmF0aW9uIGxvZ2dpbmdcbiAgY29uc3QgZHVyYXRpb25Mb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcXVlc3QtZHVyYXRpb24nKTtcbiAgYXBwLnVzZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgICAgIGR1cmF0aW9uTG9nZ2VyLmluZm8oYCR7cmVxLm1ldGhvZH0gJHtyZXEub3JpZ2luYWxVcmx9ICR7cmVzLnN0YXR1c0NvZGV9ICR7ZHVyYXRpb259bXNgLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLm9yaWdpbmFsVXJsLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgZHVyYXRpb25NczogZHVyYXRpb24sXG4gICAgICAgIHJlcXVlc3RJZDogcmVxLnJlcXVlc3RJZCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gUHJvbWV0aGV1cyBtZXRyaWNzIG1pZGRsZXdhcmUg4oCUIHJlY29yZHMgcmVxdWVzdCBkdXJhdGlvbiBhbmQgY291bnRcbiAgYXBwLnVzZShtZXRyaWNzTWlkZGxld2FyZSgpKTtcblxuICAvLyBJZGVtcG90ZW5jeSBrZXkgc3VwcG9ydCBmb3IgbXV0YXRpb24gZW5kcG9pbnRzXG4gIGFwcC51c2UoaWRlbXBvdGVuY3lNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIFNTRSBsb2dzIGVuZHBvaW50XG4gIGFwcC5nZXQoJy9sb2dzLzpyZXF1ZXN0SWQnLCBzc2VNYW5hZ2VyLm1pZGRsZXdhcmUoKSk7XG5cbiAgcmV0dXJuIHsgYXBwLCBzc2VNYW5hZ2VyIH07XG59XG4iXX0=
|
|
@@ -2,12 +2,46 @@ type HealthStatus = 'connected' | 'disconnected' | 'unknown';
|
|
|
2
2
|
type HealthResult = Record<string, HealthStatus>;
|
|
3
3
|
/**
|
|
4
4
|
* Postgres health probe: returns `{ postgres: 'connected' }` when the pool's
|
|
5
|
-
* connection test succeeds, `{ postgres: 'disconnected' }` on any error
|
|
6
|
-
* (so `/
|
|
7
|
-
* option of `createApp()` for any service backed by the
|
|
8
|
-
* Drizzle connection.
|
|
5
|
+
* connection test succeeds, `{ postgres: 'disconnected' }` on any error or
|
|
6
|
+
* timeout (so `/ready` correctly reports 503). Use as (part of) the
|
|
7
|
+
* `checkDependencies` option of `createApp()` for any service backed by the
|
|
8
|
+
* shared pipeline-data Drizzle connection.
|
|
9
9
|
*/
|
|
10
|
-
export declare function postgresHealthCheck(): Promise<HealthResult>;
|
|
10
|
+
export declare function postgresHealthCheck(timeoutMs?: number): Promise<HealthResult>;
|
|
11
|
+
/** Minimal shape of an ioredis client needed for a health PING. */
|
|
12
|
+
interface RedisLike {
|
|
13
|
+
ping(): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Source of a redis client: either the client itself, or a (sync/async) getter.
|
|
17
|
+
* The getter form supports BullMQ's `queue.client` (a `Promise<RedisClient>`)
|
|
18
|
+
* so a service can probe the exact connection its queue uses without opening
|
|
19
|
+
* a second one.
|
|
20
|
+
*/
|
|
21
|
+
type RedisClientSource = RedisLike | (() => RedisLike | Promise<RedisLike>);
|
|
22
|
+
/**
|
|
23
|
+
* Redis health probe factory: pass the service's EXISTING ioredis connection
|
|
24
|
+
* (or a getter for it — e.g. `() => queue.client`) and get back a
|
|
25
|
+
* `checkDependencies` callback that `PING`s it. Mirrors `mongoHealthCheck` —
|
|
26
|
+
* it probes the real connection rather than opening a throwaway one per call.
|
|
27
|
+
* The PING is time-boxed so a down redis (whose offline queue would otherwise
|
|
28
|
+
* buffer the command) reports `disconnected` quickly instead of hanging.
|
|
29
|
+
*/
|
|
30
|
+
export declare function redisHealthCheck(source: RedisClientSource, timeoutMs?: number): () => Promise<HealthResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Combine several dependency probes into one `checkDependencies` callback that
|
|
33
|
+
* runs them IN PARALLEL and merges their results. A slow/failed probe can't
|
|
34
|
+
* delay the others or time out the whole `/ready` response.
|
|
35
|
+
*
|
|
36
|
+
* CONTRACT: each probe must CATCH internally and RETURN its `{ name: status }`
|
|
37
|
+
* (as the built-in postgres/redis/mongo probes do). A probe that THROWS is
|
|
38
|
+
* merged as `{}` — its dependency then vanishes from the map and `/ready`
|
|
39
|
+
* reports 200 with the dep simply absent (a silent false-healthy), rather than
|
|
40
|
+
* surfacing it as `disconnected`. The `.catch(() => ({}))` below only exists so
|
|
41
|
+
* one misbehaving probe can't take down the others, NOT as a substitute for a
|
|
42
|
+
* probe returning its own disconnected status.
|
|
43
|
+
*/
|
|
44
|
+
export declare function combineHealthChecks(...checks: Array<() => Promise<HealthResult>>): () => Promise<HealthResult>;
|
|
11
45
|
/**
|
|
12
46
|
* Minimal shape expected of a mongoose connection for the health probe.
|
|
13
47
|
* Accepts `mongoose.connection` directly without requiring mongoose as a
|
package/lib/api/health-checks.js
CHANGED
|
@@ -1,22 +1,74 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { getConnection } from '@pipeline-builder/pipeline-core';
|
|
4
|
+
/**
|
|
5
|
+
* Reject if `promise` hasn't settled within `ms`. A health/readiness probe
|
|
6
|
+
* must never hang the `/ready` response — a down datastore (or a BullMQ
|
|
7
|
+
* ioredis client with `maxRetriesPerRequest: null` + an offline queue) can
|
|
8
|
+
* leave a `ping()`/query pending indefinitely, so every probe is time-boxed.
|
|
9
|
+
*/
|
|
10
|
+
function withTimeout(promise, ms, label) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
13
|
+
timer.unref?.();
|
|
14
|
+
promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err); });
|
|
15
|
+
});
|
|
16
|
+
}
|
|
4
17
|
/**
|
|
5
18
|
* Postgres health probe: returns `{ postgres: 'connected' }` when the pool's
|
|
6
|
-
* connection test succeeds, `{ postgres: 'disconnected' }` on any error
|
|
7
|
-
* (so `/
|
|
8
|
-
* option of `createApp()` for any service backed by the
|
|
9
|
-
* Drizzle connection.
|
|
19
|
+
* connection test succeeds, `{ postgres: 'disconnected' }` on any error or
|
|
20
|
+
* timeout (so `/ready` correctly reports 503). Use as (part of) the
|
|
21
|
+
* `checkDependencies` option of `createApp()` for any service backed by the
|
|
22
|
+
* shared pipeline-data Drizzle connection.
|
|
10
23
|
*/
|
|
11
|
-
export async function postgresHealthCheck() {
|
|
24
|
+
export async function postgresHealthCheck(timeoutMs = 3000) {
|
|
12
25
|
try {
|
|
13
|
-
await getConnection().testConnection();
|
|
26
|
+
await withTimeout(getConnection().testConnection(), timeoutMs, 'postgres testConnection');
|
|
14
27
|
return { postgres: 'connected' };
|
|
15
28
|
}
|
|
16
29
|
catch {
|
|
17
30
|
return { postgres: 'disconnected' };
|
|
18
31
|
}
|
|
19
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Redis health probe factory: pass the service's EXISTING ioredis connection
|
|
35
|
+
* (or a getter for it — e.g. `() => queue.client`) and get back a
|
|
36
|
+
* `checkDependencies` callback that `PING`s it. Mirrors `mongoHealthCheck` —
|
|
37
|
+
* it probes the real connection rather than opening a throwaway one per call.
|
|
38
|
+
* The PING is time-boxed so a down redis (whose offline queue would otherwise
|
|
39
|
+
* buffer the command) reports `disconnected` quickly instead of hanging.
|
|
40
|
+
*/
|
|
41
|
+
export function redisHealthCheck(source, timeoutMs = 2000) {
|
|
42
|
+
return async () => {
|
|
43
|
+
try {
|
|
44
|
+
const client = typeof source === 'function' ? await source() : source;
|
|
45
|
+
await withTimeout(client.ping(), timeoutMs, 'redis ping');
|
|
46
|
+
return { redis: 'connected' };
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { redis: 'disconnected' };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Combine several dependency probes into one `checkDependencies` callback that
|
|
55
|
+
* runs them IN PARALLEL and merges their results. A slow/failed probe can't
|
|
56
|
+
* delay the others or time out the whole `/ready` response.
|
|
57
|
+
*
|
|
58
|
+
* CONTRACT: each probe must CATCH internally and RETURN its `{ name: status }`
|
|
59
|
+
* (as the built-in postgres/redis/mongo probes do). A probe that THROWS is
|
|
60
|
+
* merged as `{}` — its dependency then vanishes from the map and `/ready`
|
|
61
|
+
* reports 200 with the dep simply absent (a silent false-healthy), rather than
|
|
62
|
+
* surfacing it as `disconnected`. The `.catch(() => ({}))` below only exists so
|
|
63
|
+
* one misbehaving probe can't take down the others, NOT as a substitute for a
|
|
64
|
+
* probe returning its own disconnected status.
|
|
65
|
+
*/
|
|
66
|
+
export function combineHealthChecks(...checks) {
|
|
67
|
+
return async () => {
|
|
68
|
+
const results = await Promise.all(checks.map((check) => check().catch(() => ({}))));
|
|
69
|
+
return Object.assign({}, ...results);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
20
72
|
/**
|
|
21
73
|
* MongoDB health probe factory: pass `mongoose.connection` and get back a
|
|
22
74
|
* `checkDependencies` callback that reports based on mongoose's readyState.
|
|
@@ -32,4 +84,4 @@ export function mongoHealthCheck(connection) {
|
|
|
32
84
|
: 'disconnected',
|
|
33
85
|
});
|
|
34
86
|
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLWNoZWNrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaGVhbHRoLWNoZWNrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUtoRTs7Ozs7R0FLRztBQUNILFNBQVMsV0FBVyxDQUFJLE9BQW1CLEVBQUUsRUFBVSxFQUFFLEtBQWE7SUFDcEUsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDL0MsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsU0FBUyxHQUFHLElBQUk7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0FBQ0gsQ0FBQztBQWVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBeUIsRUFBRSxTQUFTLEdBQUcsSUFBSTtJQUMxRSxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2hCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBRyxNQUEwQztJQUU3QyxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFtQixDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBaUIsQ0FBQztJQUN2RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBV0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxVQUFrQztJQUNqRSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsQixPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFDaEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUNBQWlDO2dCQUN6RSxDQUFDLENBQUMsY0FBYztLQUNyQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGdldENvbm5lY3Rpb24gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcblxudHlwZSBIZWFsdGhTdGF0dXMgPSAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nO1xudHlwZSBIZWFsdGhSZXN1bHQgPSBSZWNvcmQ8c3RyaW5nLCBIZWFsdGhTdGF0dXM+O1xuXG4vKipcbiAqIFJlamVjdCBpZiBgcHJvbWlzZWAgaGFzbid0IHNldHRsZWQgd2l0aGluIGBtc2AuIEEgaGVhbHRoL3JlYWRpbmVzcyBwcm9iZVxuICogbXVzdCBuZXZlciBoYW5nIHRoZSBgL3JlYWR5YCByZXNwb25zZSDigJQgYSBkb3duIGRhdGFzdG9yZSAob3IgYSBCdWxsTVFcbiAqIGlvcmVkaXMgY2xpZW50IHdpdGggYG1heFJldHJpZXNQZXJSZXF1ZXN0OiBudWxsYCArIGFuIG9mZmxpbmUgcXVldWUpIGNhblxuICogbGVhdmUgYSBgcGluZygpYC9xdWVyeSBwZW5kaW5nIGluZGVmaW5pdGVseSwgc28gZXZlcnkgcHJvYmUgaXMgdGltZS1ib3hlZC5cbiAqL1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgbXM6IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGAke2xhYmVsfSB0aW1lZCBvdXQgYWZ0ZXIgJHttc31tc2ApKSwgbXMpO1xuICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZSh2YWx1ZSk7IH0sXG4gICAgICAoZXJyKSA9PiB7IGNsZWFyVGltZW91dCh0aW1lcik7IHJlamVjdChlcnIpOyB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBvc3RncmVzIGhlYWx0aCBwcm9iZTogcmV0dXJucyBgeyBwb3N0Z3JlczogJ2Nvbm5lY3RlZCcgfWAgd2hlbiB0aGUgcG9vbCdzXG4gKiBjb25uZWN0aW9uIHRlc3Qgc3VjY2VlZHMsIGB7IHBvc3RncmVzOiAnZGlzY29ubmVjdGVkJyB9YCBvbiBhbnkgZXJyb3Igb3JcbiAqIHRpbWVvdXQgKHNvIGAvcmVhZHlgIGNvcnJlY3RseSByZXBvcnRzIDUwMykuIFVzZSBhcyAocGFydCBvZikgdGhlXG4gKiBgY2hlY2tEZXBlbmRlbmNpZXNgIG9wdGlvbiBvZiBgY3JlYXRlQXBwKClgIGZvciBhbnkgc2VydmljZSBiYWNrZWQgYnkgdGhlXG4gKiBzaGFyZWQgcGlwZWxpbmUtZGF0YSBEcml6emxlIGNvbm5lY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3N0Z3Jlc0hlYWx0aENoZWNrKHRpbWVvdXRNcyA9IDMwMDApOiBQcm9taXNlPEhlYWx0aFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGF3YWl0IHdpdGhUaW1lb3V0KGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpLCB0aW1lb3V0TXMsICdwb3N0Z3JlcyB0ZXN0Q29ubmVjdGlvbicpO1xuICAgIHJldHVybiB7IHBvc3RncmVzOiAnY29ubmVjdGVkJyB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBwb3N0Z3JlczogJ2Rpc2Nvbm5lY3RlZCcgfTtcbiAgfVxufVxuXG4vKiogTWluaW1hbCBzaGFwZSBvZiBhbiBpb3JlZGlzIGNsaWVudCBuZWVkZWQgZm9yIGEgaGVhbHRoIFBJTkcuICovXG5pbnRlcmZhY2UgUmVkaXNMaWtlIHtcbiAgcGluZygpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogU291cmNlIG9mIGEgcmVkaXMgY2xpZW50OiBlaXRoZXIgdGhlIGNsaWVudCBpdHNlbGYsIG9yIGEgKHN5bmMvYXN5bmMpIGdldHRlci5cbiAqIFRoZSBnZXR0ZXIgZm9ybSBzdXBwb3J0cyBCdWxsTVEncyBgcXVldWUuY2xpZW50YCAoYSBgUHJvbWlzZTxSZWRpc0NsaWVudD5gKVxuICogc28gYSBzZXJ2aWNlIGNhbiBwcm9iZSB0aGUgZXhhY3QgY29ubmVjdGlvbiBpdHMgcXVldWUgdXNlcyB3aXRob3V0IG9wZW5pbmdcbiAqIGEgc2Vjb25kIG9uZS5cbiAqL1xudHlwZSBSZWRpc0NsaWVudFNvdXJjZSA9IFJlZGlzTGlrZSB8ICgoKSA9PiBSZWRpc0xpa2UgfCBQcm9taXNlPFJlZGlzTGlrZT4pO1xuXG4vKipcbiAqIFJlZGlzIGhlYWx0aCBwcm9iZSBmYWN0b3J5OiBwYXNzIHRoZSBzZXJ2aWNlJ3MgRVhJU1RJTkcgaW9yZWRpcyBjb25uZWN0aW9uXG4gKiAob3IgYSBnZXR0ZXIgZm9yIGl0IOKAlCBlLmcuIGAoKSA9PiBxdWV1ZS5jbGllbnRgKSBhbmQgZ2V0IGJhY2sgYVxuICogYGNoZWNrRGVwZW5kZW5jaWVzYCBjYWxsYmFjayB0aGF0IGBQSU5HYHMgaXQuIE1pcnJvcnMgYG1vbmdvSGVhbHRoQ2hlY2tgIOKAlFxuICogaXQgcHJvYmVzIHRoZSByZWFsIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gb3BlbmluZyBhIHRocm93YXdheSBvbmUgcGVyIGNhbGwuXG4gKiBUaGUgUElORyBpcyB0aW1lLWJveGVkIHNvIGEgZG93biByZWRpcyAod2hvc2Ugb2ZmbGluZSBxdWV1ZSB3b3VsZCBvdGhlcndpc2VcbiAqIGJ1ZmZlciB0aGUgY29tbWFuZCkgcmVwb3J0cyBgZGlzY29ubmVjdGVkYCBxdWlja2x5IGluc3RlYWQgb2YgaGFuZ2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGlzSGVhbHRoQ2hlY2soc291cmNlOiBSZWRpc0NsaWVudFNvdXJjZSwgdGltZW91dE1zID0gMjAwMCk6ICgpID0+IFByb21pc2U8SGVhbHRoUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBhd2FpdCBzb3VyY2UoKSA6IHNvdXJjZTtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KGNsaWVudC5waW5nKCksIHRpbWVvdXRNcywgJ3JlZGlzIHBpbmcnKTtcbiAgICAgIHJldHVybiB7IHJlZGlzOiAnY29ubmVjdGVkJyB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgcmVkaXM6ICdkaXNjb25uZWN0ZWQnIH07XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENvbWJpbmUgc2V2ZXJhbCBkZXBlbmRlbmN5IHByb2JlcyBpbnRvIG9uZSBgY2hlY2tEZXBlbmRlbmNpZXNgIGNhbGxiYWNrIHRoYXRcbiAqIHJ1bnMgdGhlbSBJTiBQQVJBTExFTCBhbmQgbWVyZ2VzIHRoZWlyIHJlc3VsdHMuIEEgc2xvdy9mYWlsZWQgcHJvYmUgY2FuJ3RcbiAqIGRlbGF5IHRoZSBvdGhlcnMgb3IgdGltZSBvdXQgdGhlIHdob2xlIGAvcmVhZHlgIHJlc3BvbnNlLlxuICpcbiAqIENPTlRSQUNUOiBlYWNoIHByb2JlIG11c3QgQ0FUQ0ggaW50ZXJuYWxseSBhbmQgUkVUVVJOIGl0cyBgeyBuYW1lOiBzdGF0dXMgfWBcbiAqIChhcyB0aGUgYnVpbHQtaW4gcG9zdGdyZXMvcmVkaXMvbW9uZ28gcHJvYmVzIGRvKS4gQSBwcm9iZSB0aGF0IFRIUk9XUyBpc1xuICogbWVyZ2VkIGFzIGB7fWAg4oCUIGl0cyBkZXBlbmRlbmN5IHRoZW4gdmFuaXNoZXMgZnJvbSB0aGUgbWFwIGFuZCBgL3JlYWR5YFxuICogcmVwb3J0cyAyMDAgd2l0aCB0aGUgZGVwIHNpbXBseSBhYnNlbnQgKGEgc2lsZW50IGZhbHNlLWhlYWx0aHkpLCByYXRoZXIgdGhhblxuICogc3VyZmFjaW5nIGl0IGFzIGBkaXNjb25uZWN0ZWRgLiBUaGUgYC5jYXRjaCgoKSA9PiAoe30pKWAgYmVsb3cgb25seSBleGlzdHMgc29cbiAqIG9uZSBtaXNiZWhhdmluZyBwcm9iZSBjYW4ndCB0YWtlIGRvd24gdGhlIG90aGVycywgTk9UIGFzIGEgc3Vic3RpdHV0ZSBmb3IgYVxuICogcHJvYmUgcmV0dXJuaW5nIGl0cyBvd24gZGlzY29ubmVjdGVkIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVIZWFsdGhDaGVja3MoXG4gIC4uLmNoZWNrczogQXJyYXk8KCkgPT4gUHJvbWlzZTxIZWFsdGhSZXN1bHQ+PlxuKTogKCkgPT4gUHJvbWlzZTxIZWFsdGhSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2hlY2tzLm1hcCgoY2hlY2spID0+IGNoZWNrKCkuY2F0Y2goKCkgPT4gKHt9IGFzIEhlYWx0aFJlc3VsdCkpKSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIC4uLnJlc3VsdHMpIGFzIEhlYWx0aFJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIHNoYXBlIGV4cGVjdGVkIG9mIGEgbW9uZ29vc2UgY29ubmVjdGlvbiBmb3IgdGhlIGhlYWx0aCBwcm9iZS5cbiAqIEFjY2VwdHMgYG1vbmdvb3NlLmNvbm5lY3Rpb25gIGRpcmVjdGx5IHdpdGhvdXQgcmVxdWlyaW5nIG1vbmdvb3NlIGFzIGFcbiAqIGRlcGVuZGVuY3kgb2YgYXBpLXNlcnZlci5cbiAqL1xuaW50ZXJmYWNlIE1vbmdvb3NlQ29ubmVjdGlvbkxpa2Uge1xuICByZWFkeVN0YXRlOiBudW1iZXI7XG59XG5cbi8qKlxuICogTW9uZ29EQiBoZWFsdGggcHJvYmUgZmFjdG9yeTogcGFzcyBgbW9uZ29vc2UuY29ubmVjdGlvbmAgYW5kIGdldCBiYWNrIGFcbiAqIGBjaGVja0RlcGVuZGVuY2llc2AgY2FsbGJhY2sgdGhhdCByZXBvcnRzIGJhc2VkIG9uIG1vbmdvb3NlJ3MgcmVhZHlTdGF0ZS5cbiAqXG4gKiBNYXBwaW5nIChwZXIgbW9uZ29vc2UgZG9jcyk6IDE9Y29ubmVjdGVkLCAyPWNvbm5lY3RpbmcsIDM9ZGlzY29ubmVjdGluZyxcbiAqIGFueSBvdGhlciB2YWx1ZSAoMD1kaXNjb25uZWN0ZWQsIDk5PXVuaW5pdGlhbGl6ZWQpIGlzIHRyZWF0ZWQgYXNcbiAqICdkaXNjb25uZWN0ZWQnIHNvIGAvaGVhbHRoYCByZXR1cm5zIDUwMy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbmdvSGVhbHRoQ2hlY2soY29ubmVjdGlvbjogTW9uZ29vc2VDb25uZWN0aW9uTGlrZSk6ICgpID0+IFByb21pc2U8SGVhbHRoUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiAoe1xuICAgIG1vbmdvZGI6IGNvbm5lY3Rpb24ucmVhZHlTdGF0ZSA9PT0gMSA/ICdjb25uZWN0ZWQnXG4gICAgICA6IGNvbm5lY3Rpb24ucmVhZHlTdGF0ZSA9PT0gMiA/ICd1bmtub3duJyAvLyBjb25uZWN0aW5nOyB0cmVhdCBhcyB0cmFuc2llbnRcbiAgICAgICAgOiAnZGlzY29ubmVjdGVkJyxcbiAgfSk7XG59XG4iXX0=
|
package/lib/api/index.d.ts
CHANGED
package/lib/api/index.js
CHANGED
|
@@ -23,8 +23,10 @@ export * from './tracing.js';
|
|
|
23
23
|
export * from './metrics.js';
|
|
24
24
|
// Server utilities
|
|
25
25
|
export * from './server.js';
|
|
26
|
+
// Readiness state + guard middleware
|
|
27
|
+
export * from './readiness.js';
|
|
26
28
|
// Route wrapper
|
|
27
29
|
export * from './route-wrapper.js';
|
|
28
30
|
// Request/Response types
|
|
29
31
|
export * from './request-types.js';
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsYUFBYTtBQUNiLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsa0JBQWtCLENBQUM7QUFFakMsY0FBYztBQUNkLGNBQWMsa0JBQWtCLENBQUM7QUFFakMsdUJBQXVCO0FBQ3ZCLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsMkRBQTJEO0FBQzNELGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsZ0JBQWdCO0FBQ2hCLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsY0FBYztBQUNkLGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsZ0JBQWdCO0FBQ2hCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDO0FBRTdCLG1CQUFtQjtBQUNuQixjQUFjLGFBQWEsQ0FBQztBQUU1QixxQ0FBcUM7QUFDckMsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixnQkFBZ0I7QUFDaEIsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyx5QkFBeUI7QUFDekIsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vLyBNaWRkbGV3YXJlXG5leHBvcnQgKiBmcm9tICcuL21pZGRsZXdhcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9taWRkbGV3YXJlLWZhY3RvcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZXh0LW1pZGRsZXdhcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGVjay1xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVpcmUtb3JnLWlkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVuYW50LWNvbnRleHQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9nZXQtY29udGV4dC5qcyc7XG5cbi8vIEFwcCBmYWN0b3J5XG5leHBvcnQgKiBmcm9tICcuL2FwcC1mYWN0b3J5LmpzJztcblxuLy8gSGVhbHRoLWNoZWNrIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vaGVhbHRoLWNoZWNrcy5qcyc7XG5cbi8vIE1vbmdvREIgY29ubmVjdGlvbiBoZWxwZXIgKGRlcGVuZGVuY3ktaW5qZWN0ZWQgbW9uZ29vc2UpXG5leHBvcnQgKiBmcm9tICcuL21vbmdvLWNvbm5lY3QuanMnO1xuXG4vLyBRdW90YSBoZWxwZXJzXG5leHBvcnQgKiBmcm9tICcuL3F1b3RhLWhlbHBlcnMuanMnO1xuXG4vLyBJZGVtcG90ZW5jeVxuZXhwb3J0ICogZnJvbSAnLi9pZGVtcG90ZW5jeS1taWRkbGV3YXJlLmpzJztcblxuLy8gT2JzZXJ2YWJpbGl0eVxuZXhwb3J0ICogZnJvbSAnLi90cmFjaW5nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWV0cmljcy5qcyc7XG5cbi8vIFNlcnZlciB1dGlsaXRpZXNcbmV4cG9ydCAqIGZyb20gJy4vc2VydmVyLmpzJztcblxuLy8gUmVhZGluZXNzIHN0YXRlICsgZ3VhcmQgbWlkZGxld2FyZVxuZXhwb3J0ICogZnJvbSAnLi9yZWFkaW5lc3MuanMnO1xuXG4vLyBSb3V0ZSB3cmFwcGVyXG5leHBvcnQgKiBmcm9tICcuL3JvdXRlLXdyYXBwZXIuanMnO1xuXG4vLyBSZXF1ZXN0L1Jlc3BvbnNlIHR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QtdHlwZXMuanMnO1xuIl19
|
|
@@ -15,17 +15,5 @@ interface MongooseLike {
|
|
|
15
15
|
serverSelectionTimeoutMS: number;
|
|
16
16
|
}): Promise<unknown>;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Connect to MongoDB with sensible production-ready pool defaults and
|
|
20
|
-
* standard event-handler wiring (error / disconnected / reconnected).
|
|
21
|
-
*
|
|
22
|
-
* Pool sizing is read from env (`MONGO_MAX_POOL`, `MONGO_MIN_POOL`,
|
|
23
|
-
* `MONGO_SERVER_SELECTION_MS`). Without these the driver default of
|
|
24
|
-
* `maxPoolSize=100` lets a burst exhaust Mongo's connection ceiling
|
|
25
|
-
* across replicas. Defaults: 20 max / 2 min / 5s server selection.
|
|
26
|
-
*
|
|
27
|
-
* Pass the service's own mongoose instance — api-server doesn't bundle
|
|
28
|
-
* mongoose itself.
|
|
29
|
-
*/
|
|
30
18
|
export declare function connectMongo(mongoose: MongooseLike, uri: string): Promise<void>;
|
|
31
19
|
export {};
|
package/lib/api/mongo-connect.js
CHANGED
|
@@ -14,21 +14,28 @@ const logger = createLogger('mongo-connect');
|
|
|
14
14
|
* Pass the service's own mongoose instance — api-server doesn't bundle
|
|
15
15
|
* mongoose itself.
|
|
16
16
|
*/
|
|
17
|
+
let handlersWired = false;
|
|
17
18
|
export async function connectMongo(mongoose, uri) {
|
|
18
19
|
mongoose.set('strictQuery', true);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
// Wire the connection event handlers exactly once. The startup supervisor
|
|
21
|
+
// may call connectMongo repeatedly (retrying until Mongo is reachable);
|
|
22
|
+
// re-registering on every attempt would leak listeners.
|
|
23
|
+
if (!handlersWired) {
|
|
24
|
+
handlersWired = true;
|
|
25
|
+
mongoose.connection.on('error', (err) => {
|
|
26
|
+
logger.error('MongoDB connection error', { error: err?.message });
|
|
27
|
+
});
|
|
28
|
+
mongoose.connection.on('disconnected', () => {
|
|
29
|
+
logger.warn('MongoDB disconnected');
|
|
30
|
+
});
|
|
31
|
+
mongoose.connection.on('reconnected', () => {
|
|
32
|
+
logger.info('MongoDB reconnected');
|
|
33
|
+
});
|
|
34
|
+
}
|
|
28
35
|
const maxPoolSize = parseInt(process.env.MONGO_MAX_POOL || '20', 10);
|
|
29
36
|
const minPoolSize = parseInt(process.env.MONGO_MIN_POOL || '2', 10);
|
|
30
37
|
const serverSelectionTimeoutMS = parseInt(process.env.MONGO_SERVER_SELECTION_MS || '5000', 10);
|
|
31
38
|
await mongoose.connect(uri, { maxPoolSize, minPoolSize, serverSelectionTimeoutMS });
|
|
32
39
|
logger.info('MongoDB connection established', { maxPoolSize, minPoolSize, serverSelectionTimeoutMS });
|
|
33
40
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28tY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbW9uZ28tY29ubmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUFvQjdDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBRTFCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQXNCLEVBQUUsR0FBVztJQUNwRSxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVsQywwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHdEQUF3RDtJQUN4RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsYUFBYSxHQUFHLElBQUksQ0FBQztRQUVyQixRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFL0YsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQztBQUN4RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdtb25nby1jb25uZWN0Jyk7XG5cbi8qKlxuICogTWluaW1hbCBzaGFwZSBvZiBtb25nb29zZSBhY2NlcHRlZCBieSBgY29ubmVjdE1vbmdvYC4gUGFzc2luZyB0aGUgcmVhbFxuICogbW9uZ29vc2Ugb2JqZWN0IHNhdGlzZmllcyBpdDsgYXBpLXNlcnZlciB0YWtlcyBtb25nb29zZSBhcyBhIHBhcmFtZXRlclxuICogKGRlcGVuZGVuY3kgaW5qZWN0aW9uKSBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gZGVjbGFyZSBtb25nb29zZSBhcyBhXG4gKiBkZXBlbmRlbmN5IGl0c2VsZi5cbiAqL1xuaW50ZXJmYWNlIE1vbmdvb3NlTGlrZSB7XG4gIHNldChvcHRpb246IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duO1xuICBjb25uZWN0aW9uOiB7XG4gICAgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChlcnI/OiBFcnJvcikgPT4gdm9pZCk6IHVua25vd247XG4gIH07XG4gIGNvbm5lY3QodXJpOiBzdHJpbmcsIG9wdGlvbnM6IHtcbiAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIG1pblBvb2xTaXplOiBudW1iZXI7XG4gICAgc2VydmVyU2VsZWN0aW9uVGltZW91dE1TOiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIENvbm5lY3QgdG8gTW9uZ29EQiB3aXRoIHNlbnNpYmxlIHByb2R1Y3Rpb24tcmVhZHkgcG9vbCBkZWZhdWx0cyBhbmRcbiAqIHN0YW5kYXJkIGV2ZW50LWhhbmRsZXIgd2lyaW5nIChlcnJvciAvIGRpc2Nvbm5lY3RlZCAvIHJlY29ubmVjdGVkKS5cbiAqXG4gKiBQb29sIHNpemluZyBpcyByZWFkIGZyb20gZW52IChgTU9OR09fTUFYX1BPT0xgLCBgTU9OR09fTUlOX1BPT0xgLFxuICogYE1PTkdPX1NFUlZFUl9TRUxFQ1RJT05fTVNgKS4gV2l0aG91dCB0aGVzZSB0aGUgZHJpdmVyIGRlZmF1bHQgb2ZcbiAqIGBtYXhQb29sU2l6ZT0xMDBgIGxldHMgYSBidXJzdCBleGhhdXN0IE1vbmdvJ3MgY29ubmVjdGlvbiBjZWlsaW5nXG4gKiBhY3Jvc3MgcmVwbGljYXMuIERlZmF1bHRzOiAyMCBtYXggLyAyIG1pbiAvIDVzIHNlcnZlciBzZWxlY3Rpb24uXG4gKlxuICogUGFzcyB0aGUgc2VydmljZSdzIG93biBtb25nb29zZSBpbnN0YW5jZSDigJQgYXBpLXNlcnZlciBkb2Vzbid0IGJ1bmRsZVxuICogbW9uZ29vc2UgaXRzZWxmLlxuICovXG5sZXQgaGFuZGxlcnNXaXJlZCA9IGZhbHNlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdE1vbmdvKG1vbmdvb3NlOiBNb25nb29zZUxpa2UsIHVyaTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIG1vbmdvb3NlLnNldCgnc3RyaWN0UXVlcnknLCB0cnVlKTtcblxuICAvLyBXaXJlIHRoZSBjb25uZWN0aW9uIGV2ZW50IGhhbmRsZXJzIGV4YWN0bHkgb25jZS4gVGhlIHN0YXJ0dXAgc3VwZXJ2aXNvclxuICAvLyBtYXkgY2FsbCBjb25uZWN0TW9uZ28gcmVwZWF0ZWRseSAocmV0cnlpbmcgdW50aWwgTW9uZ28gaXMgcmVhY2hhYmxlKTtcbiAgLy8gcmUtcmVnaXN0ZXJpbmcgb24gZXZlcnkgYXR0ZW1wdCB3b3VsZCBsZWFrIGxpc3RlbmVycy5cbiAgaWYgKCFoYW5kbGVyc1dpcmVkKSB7XG4gICAgaGFuZGxlcnNXaXJlZCA9IHRydWU7XG5cbiAgICBtb25nb29zZS5jb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignTW9uZ29EQiBjb25uZWN0aW9uIGVycm9yJywgeyBlcnJvcjogZXJyPy5tZXNzYWdlIH0pO1xuICAgIH0pO1xuXG4gICAgbW9uZ29vc2UuY29ubmVjdGlvbi5vbignZGlzY29ubmVjdGVkJywgKCkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ01vbmdvREIgZGlzY29ubmVjdGVkJyk7XG4gICAgfSk7XG5cbiAgICBtb25nb29zZS5jb25uZWN0aW9uLm9uKCdyZWNvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKCdNb25nb0RCIHJlY29ubmVjdGVkJyk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhQb29sU2l6ZSA9IHBhcnNlSW50KHByb2Nlc3MuZW52Lk1PTkdPX01BWF9QT09MIHx8ICcyMCcsIDEwKTtcbiAgY29uc3QgbWluUG9vbFNpemUgPSBwYXJzZUludChwcm9jZXNzLmVudi5NT05HT19NSU5fUE9PTCB8fCAnMicsIDEwKTtcbiAgY29uc3Qgc2VydmVyU2VsZWN0aW9uVGltZW91dE1TID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTU9OR09fU0VSVkVSX1NFTEVDVElPTl9NUyB8fCAnNTAwMCcsIDEwKTtcblxuICBhd2FpdCBtb25nb29zZS5jb25uZWN0KHVyaSwgeyBtYXhQb29sU2l6ZSwgbWluUG9vbFNpemUsIHNlcnZlclNlbGVjdGlvblRpbWVvdXRNUyB9KTtcbiAgbG9nZ2VyLmluZm8oJ01vbmdvREIgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcsIHsgbWF4UG9vbFNpemUsIG1pblBvb2xTaXplLCBzZXJ2ZXJTZWxlY3Rpb25UaW1lb3V0TVMgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
/** True once dependencies have connected (and remain connected). */
|
|
3
|
+
export declare function isReady(): boolean;
|
|
4
|
+
/** Set by the startup supervisor (and tests). */
|
|
5
|
+
export declare function setReady(ready: boolean): void;
|
|
6
|
+
/**
|
|
7
|
+
* Default infra endpoints that must stay reachable while NotReady, so
|
|
8
|
+
* orchestrators can probe liveness/readiness, scrape metrics, warm pools,
|
|
9
|
+
* serve docs, and relay SSE logs during startup or a dependency outage. This
|
|
10
|
+
* matches what `createApp` mounts. A service whose own routes COLLIDE with one
|
|
11
|
+
* of these prefixes (e.g. platform serves a tenant log API at `/logs`) must
|
|
12
|
+
* pass a narrower list to `readinessGuard()` so its business routes stay gated.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_READINESS_BYPASS: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Readiness guard — while the service is NotReady (dependencies not yet
|
|
17
|
+
* connected, or dropped), reject business requests with 503 + Retry-After
|
|
18
|
+
* instead of letting them hit a disconnected datastore and 500.
|
|
19
|
+
*
|
|
20
|
+
* This is the portable, app-level readiness mechanism that works on every
|
|
21
|
+
* deploy target — including Docker Compose (single replica, no orchestrator
|
|
22
|
+
* traffic-draining) and Fargate (ECS exposes only one per-service health
|
|
23
|
+
* signal, which is also a kill trigger). k8s readiness probes layer on top.
|
|
24
|
+
*
|
|
25
|
+
* @param bypassPaths Infra prefixes that always pass through even while
|
|
26
|
+
* NotReady. Defaults to {@link DEFAULT_READINESS_BYPASS}; pass a custom list
|
|
27
|
+
* when a business route would otherwise collide with a default prefix.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readinessGuard(bypassPaths?: readonly string[]): RequestHandler;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { sendError } from '@pipeline-builder/api-core';
|
|
4
|
+
/**
|
|
5
|
+
* Service readiness state.
|
|
6
|
+
*
|
|
7
|
+
* Flipped by startServer's dependency supervisor: set false the instant we
|
|
8
|
+
* start listening, true once the backing store(s) connect, and back to false
|
|
9
|
+
* if they later drop. Read by the readiness-guard middleware (and tests).
|
|
10
|
+
*
|
|
11
|
+
* Module-level singleton: each service runs as its own process with exactly
|
|
12
|
+
* one server, so a single flag is sufficient and avoids threading state
|
|
13
|
+
* through createApp + startServer.
|
|
14
|
+
*
|
|
15
|
+
* Defaults to `true` so an app built with createApp but NOT started via
|
|
16
|
+
* startServer — every route unit test, which drives the app directly with
|
|
17
|
+
* supertest — is never blocked by the guard. startServer flips it to false
|
|
18
|
+
* synchronously before it opens the port, so the production path is gated.
|
|
19
|
+
*/
|
|
20
|
+
let serviceReady = true;
|
|
21
|
+
/** True once dependencies have connected (and remain connected). */
|
|
22
|
+
export function isReady() {
|
|
23
|
+
return serviceReady;
|
|
24
|
+
}
|
|
25
|
+
/** Set by the startup supervisor (and tests). */
|
|
26
|
+
export function setReady(ready) {
|
|
27
|
+
serviceReady = ready;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default infra endpoints that must stay reachable while NotReady, so
|
|
31
|
+
* orchestrators can probe liveness/readiness, scrape metrics, warm pools,
|
|
32
|
+
* serve docs, and relay SSE logs during startup or a dependency outage. This
|
|
33
|
+
* matches what `createApp` mounts. A service whose own routes COLLIDE with one
|
|
34
|
+
* of these prefixes (e.g. platform serves a tenant log API at `/logs`) must
|
|
35
|
+
* pass a narrower list to `readinessGuard()` so its business routes stay gated.
|
|
36
|
+
*/
|
|
37
|
+
export const DEFAULT_READINESS_BYPASS = ['/health', '/ready', '/metrics', '/warmup', '/docs', '/logs'];
|
|
38
|
+
function isBypassed(path, bypass) {
|
|
39
|
+
return bypass.some((p) => path === p || path.startsWith(`${p}/`));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Readiness guard — while the service is NotReady (dependencies not yet
|
|
43
|
+
* connected, or dropped), reject business requests with 503 + Retry-After
|
|
44
|
+
* instead of letting them hit a disconnected datastore and 500.
|
|
45
|
+
*
|
|
46
|
+
* This is the portable, app-level readiness mechanism that works on every
|
|
47
|
+
* deploy target — including Docker Compose (single replica, no orchestrator
|
|
48
|
+
* traffic-draining) and Fargate (ECS exposes only one per-service health
|
|
49
|
+
* signal, which is also a kill trigger). k8s readiness probes layer on top.
|
|
50
|
+
*
|
|
51
|
+
* @param bypassPaths Infra prefixes that always pass through even while
|
|
52
|
+
* NotReady. Defaults to {@link DEFAULT_READINESS_BYPASS}; pass a custom list
|
|
53
|
+
* when a business route would otherwise collide with a default prefix.
|
|
54
|
+
*/
|
|
55
|
+
export function readinessGuard(bypassPaths = DEFAULT_READINESS_BYPASS) {
|
|
56
|
+
return (req, res, next) => {
|
|
57
|
+
if (serviceReady || isBypassed(req.path, bypassPaths)) {
|
|
58
|
+
next();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
res.setHeader('Retry-After', '5');
|
|
62
|
+
sendError(res, 503, 'Service not ready — dependencies are still connecting');
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGluZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9yZWFkaW5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHdkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBRXhCLG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsT0FBTztJQUNyQixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBYztJQUNyQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRXZHLFNBQVMsVUFBVSxDQUFDLElBQVksRUFBRSxNQUF5QjtJQUN6RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsY0FBaUMsd0JBQXdCO0lBQ3RGLE9BQU8sQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQUksRUFBUSxFQUFFO1FBQ2pELElBQUksWUFBWSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxFQUFFLENBQUM7WUFDUCxPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLHVEQUF1RCxDQUFDLENBQUM7SUFDL0UsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlcXVlc3RIYW5kbGVyLCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuXG4vKipcbiAqIFNlcnZpY2UgcmVhZGluZXNzIHN0YXRlLlxuICpcbiAqIEZsaXBwZWQgYnkgc3RhcnRTZXJ2ZXIncyBkZXBlbmRlbmN5IHN1cGVydmlzb3I6IHNldCBmYWxzZSB0aGUgaW5zdGFudCB3ZVxuICogc3RhcnQgbGlzdGVuaW5nLCB0cnVlIG9uY2UgdGhlIGJhY2tpbmcgc3RvcmUocykgY29ubmVjdCwgYW5kIGJhY2sgdG8gZmFsc2VcbiAqIGlmIHRoZXkgbGF0ZXIgZHJvcC4gUmVhZCBieSB0aGUgcmVhZGluZXNzLWd1YXJkIG1pZGRsZXdhcmUgKGFuZCB0ZXN0cykuXG4gKlxuICogTW9kdWxlLWxldmVsIHNpbmdsZXRvbjogZWFjaCBzZXJ2aWNlIHJ1bnMgYXMgaXRzIG93biBwcm9jZXNzIHdpdGggZXhhY3RseVxuICogb25lIHNlcnZlciwgc28gYSBzaW5nbGUgZmxhZyBpcyBzdWZmaWNpZW50IGFuZCBhdm9pZHMgdGhyZWFkaW5nIHN0YXRlXG4gKiB0aHJvdWdoIGNyZWF0ZUFwcCArIHN0YXJ0U2VydmVyLlxuICpcbiAqIERlZmF1bHRzIHRvIGB0cnVlYCBzbyBhbiBhcHAgYnVpbHQgd2l0aCBjcmVhdGVBcHAgYnV0IE5PVCBzdGFydGVkIHZpYVxuICogc3RhcnRTZXJ2ZXIg4oCUIGV2ZXJ5IHJvdXRlIHVuaXQgdGVzdCwgd2hpY2ggZHJpdmVzIHRoZSBhcHAgZGlyZWN0bHkgd2l0aFxuICogc3VwZXJ0ZXN0IOKAlCBpcyBuZXZlciBibG9ja2VkIGJ5IHRoZSBndWFyZC4gc3RhcnRTZXJ2ZXIgZmxpcHMgaXQgdG8gZmFsc2VcbiAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIGl0IG9wZW5zIHRoZSBwb3J0LCBzbyB0aGUgcHJvZHVjdGlvbiBwYXRoIGlzIGdhdGVkLlxuICovXG5sZXQgc2VydmljZVJlYWR5ID0gdHJ1ZTtcblxuLyoqIFRydWUgb25jZSBkZXBlbmRlbmNpZXMgaGF2ZSBjb25uZWN0ZWQgKGFuZCByZW1haW4gY29ubmVjdGVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2VydmljZVJlYWR5O1xufVxuXG4vKiogU2V0IGJ5IHRoZSBzdGFydHVwIHN1cGVydmlzb3IgKGFuZCB0ZXN0cykuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZHkocmVhZHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgc2VydmljZVJlYWR5ID0gcmVhZHk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpbmZyYSBlbmRwb2ludHMgdGhhdCBtdXN0IHN0YXkgcmVhY2hhYmxlIHdoaWxlIE5vdFJlYWR5LCBzb1xuICogb3JjaGVzdHJhdG9ycyBjYW4gcHJvYmUgbGl2ZW5lc3MvcmVhZGluZXNzLCBzY3JhcGUgbWV0cmljcywgd2FybSBwb29scyxcbiAqIHNlcnZlIGRvY3MsIGFuZCByZWxheSBTU0UgbG9ncyBkdXJpbmcgc3RhcnR1cCBvciBhIGRlcGVuZGVuY3kgb3V0YWdlLiBUaGlzXG4gKiBtYXRjaGVzIHdoYXQgYGNyZWF0ZUFwcGAgbW91bnRzLiBBIHNlcnZpY2Ugd2hvc2Ugb3duIHJvdXRlcyBDT0xMSURFIHdpdGggb25lXG4gKiBvZiB0aGVzZSBwcmVmaXhlcyAoZS5nLiBwbGF0Zm9ybSBzZXJ2ZXMgYSB0ZW5hbnQgbG9nIEFQSSBhdCBgL2xvZ3NgKSBtdXN0XG4gKiBwYXNzIGEgbmFycm93ZXIgbGlzdCB0byBgcmVhZGluZXNzR3VhcmQoKWAgc28gaXRzIGJ1c2luZXNzIHJvdXRlcyBzdGF5IGdhdGVkLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUFESU5FU1NfQllQQVNTID0gWycvaGVhbHRoJywgJy9yZWFkeScsICcvbWV0cmljcycsICcvd2FybXVwJywgJy9kb2NzJywgJy9sb2dzJ107XG5cbmZ1bmN0aW9uIGlzQnlwYXNzZWQocGF0aDogc3RyaW5nLCBieXBhc3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBieXBhc3Muc29tZSgocCkgPT4gcGF0aCA9PT0gcCB8fCBwYXRoLnN0YXJ0c1dpdGgoYCR7cH0vYCkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmVzcyBndWFyZCDigJQgd2hpbGUgdGhlIHNlcnZpY2UgaXMgTm90UmVhZHkgKGRlcGVuZGVuY2llcyBub3QgeWV0XG4gKiBjb25uZWN0ZWQsIG9yIGRyb3BwZWQpLCByZWplY3QgYnVzaW5lc3MgcmVxdWVzdHMgd2l0aCA1MDMgKyBSZXRyeS1BZnRlclxuICogaW5zdGVhZCBvZiBsZXR0aW5nIHRoZW0gaGl0IGEgZGlzY29ubmVjdGVkIGRhdGFzdG9yZSBhbmQgNTAwLlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcnRhYmxlLCBhcHAtbGV2ZWwgcmVhZGluZXNzIG1lY2hhbmlzbSB0aGF0IHdvcmtzIG9uIGV2ZXJ5XG4gKiBkZXBsb3kgdGFyZ2V0IOKAlCBpbmNsdWRpbmcgRG9ja2VyIENvbXBvc2UgKHNpbmdsZSByZXBsaWNhLCBubyBvcmNoZXN0cmF0b3JcbiAqIHRyYWZmaWMtZHJhaW5pbmcpIGFuZCBGYXJnYXRlIChFQ1MgZXhwb3NlcyBvbmx5IG9uZSBwZXItc2VydmljZSBoZWFsdGhcbiAqIHNpZ25hbCwgd2hpY2ggaXMgYWxzbyBhIGtpbGwgdHJpZ2dlcikuIGs4cyByZWFkaW5lc3MgcHJvYmVzIGxheWVyIG9uIHRvcC5cbiAqXG4gKiBAcGFyYW0gYnlwYXNzUGF0aHMgSW5mcmEgcHJlZml4ZXMgdGhhdCBhbHdheXMgcGFzcyB0aHJvdWdoIGV2ZW4gd2hpbGVcbiAqICAgTm90UmVhZHkuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQURJTkVTU19CWVBBU1N9OyBwYXNzIGEgY3VzdG9tIGxpc3RcbiAqICAgd2hlbiBhIGJ1c2luZXNzIHJvdXRlIHdvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggYSBkZWZhdWx0IHByZWZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRpbmVzc0d1YXJkKGJ5cGFzc1BhdGhzOiByZWFkb25seSBzdHJpbmdbXSA9IERFRkFVTFRfUkVBRElORVNTX0JZUEFTUyk6IFJlcXVlc3RIYW5kbGVyIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQpOiB2b2lkID0+IHtcbiAgICBpZiAoc2VydmljZVJlYWR5IHx8IGlzQnlwYXNzZWQocmVxLnBhdGgsIGJ5cGFzc1BhdGhzKSkge1xuICAgICAgbmV4dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsICc1Jyk7XG4gICAgc2VuZEVycm9yKHJlcywgNTAzLCAnU2VydmljZSBub3QgcmVhZHkg4oCUIGRlcGVuZGVuY2llcyBhcmUgc3RpbGwgY29ubmVjdGluZycpO1xuICB9O1xufVxuIl19
|
package/lib/api/server.js
CHANGED
|
@@ -1,11 +1,85 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { Server } from 'http';
|
|
4
|
-
import { createLogger, installCrashHandlers } from '@pipeline-builder/api-core';
|
|
4
|
+
import { createLogger, errorMessage, installCrashHandlers } from '@pipeline-builder/api-core';
|
|
5
5
|
import { Config, getConnection, closeConnection } from '@pipeline-builder/pipeline-core';
|
|
6
6
|
import { shutdownTracing } from './tracing.js';
|
|
7
|
+
import { setReady, isReady } from './readiness.js';
|
|
7
8
|
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
8
9
|
const logger = createLogger('server');
|
|
10
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
// Dependency-supervisor cadence. Initial connect retries with capped backoff;
|
|
12
|
+
// once connected, re-checks at a steady interval so a later outage flips the
|
|
13
|
+
// service NotReady (draining traffic) and a recovery flips it back — without
|
|
14
|
+
// ever exiting / restarting the process.
|
|
15
|
+
const READY_RETRY_BASE_MS = 1000;
|
|
16
|
+
const READY_RETRY_MAX_MS = 10000;
|
|
17
|
+
const READY_MONITOR_INTERVAL_MS = parseInt(process.env.READINESS_MONITOR_INTERVAL_MS || '15000', 10);
|
|
18
|
+
/**
|
|
19
|
+
* Establish and continuously monitor the service's datastore dependency,
|
|
20
|
+
* flipping readiness state instead of crash-looping.
|
|
21
|
+
*
|
|
22
|
+
* - Establish phase: retry `onBeforeStart` (e.g. connectMongo) with capped
|
|
23
|
+
* backoff until it succeeds — a cold datastore must never exit the process.
|
|
24
|
+
* - Monitor phase: poll `testDatabase` for the life of the process; flip
|
|
25
|
+
* ready/NotReady on transitions. While NotReady the readiness guard 503s
|
|
26
|
+
* business traffic and orchestrator readiness probes drain the instance.
|
|
27
|
+
*
|
|
28
|
+
* Runs in the background (the HTTP server is already listening). Stops when
|
|
29
|
+
* `aborted()` returns true (graceful shutdown), so it never keeps a closing
|
|
30
|
+
* process alive.
|
|
31
|
+
*/
|
|
32
|
+
async function superviseDependencies(name, onBeforeStart, testDatabase, aborted) {
|
|
33
|
+
if (onBeforeStart) {
|
|
34
|
+
let delay = READY_RETRY_BASE_MS;
|
|
35
|
+
while (!aborted()) {
|
|
36
|
+
try {
|
|
37
|
+
await onBeforeStart();
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger.warn(`${name}: dependency init failed, retrying in ${delay}ms`, { error: errorMessage(error) });
|
|
42
|
+
await sleep(delay);
|
|
43
|
+
delay = Math.min(delay * 2, READY_RETRY_MAX_MS);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// No datastore to gate on → ready as soon as we are listening.
|
|
48
|
+
if (testDatabase === false) {
|
|
49
|
+
setReady(true);
|
|
50
|
+
logger.info(`${name} ready (no datastore dependency)`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const probe = testDatabase ?? (() => getConnection().testConnection());
|
|
54
|
+
let waitDelay = READY_RETRY_BASE_MS;
|
|
55
|
+
while (!aborted()) {
|
|
56
|
+
let ok = false;
|
|
57
|
+
try {
|
|
58
|
+
ok = await probe();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
ok = false;
|
|
62
|
+
}
|
|
63
|
+
if (ok && !isReady()) {
|
|
64
|
+
setReady(true);
|
|
65
|
+
waitDelay = READY_RETRY_BASE_MS;
|
|
66
|
+
logger.info(`${name} ready — dependencies connected`);
|
|
67
|
+
}
|
|
68
|
+
else if (!ok && isReady()) {
|
|
69
|
+
setReady(false);
|
|
70
|
+
logger.warn(`${name} degraded — dependency check failing (now NotReady)`);
|
|
71
|
+
}
|
|
72
|
+
// Steady cadence once ready; faster backoff while waiting so we flip to
|
|
73
|
+
// ready promptly when the datastore comes up.
|
|
74
|
+
if (isReady()) {
|
|
75
|
+
await sleep(READY_MONITOR_INTERVAL_MS);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await sleep(waitDelay);
|
|
79
|
+
waitDelay = Math.min(waitDelay * 2, READY_RETRY_MAX_MS);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
9
83
|
/**
|
|
10
84
|
* Start an Express server with graceful shutdown handling
|
|
11
85
|
*
|
|
@@ -39,21 +113,16 @@ export async function startServer(app, options = {}) {
|
|
|
39
113
|
// Validate auth configuration at server startup (not during CDK synthesis)
|
|
40
114
|
Config.validateAuth();
|
|
41
115
|
logger.info(`Starting ${name}...`);
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
throw new Error('Database connection failed');
|
|
53
|
-
}
|
|
54
|
-
logger.info('Database connection established');
|
|
55
|
-
}
|
|
56
|
-
// Start server
|
|
116
|
+
// Mark NotReady synchronously, BEFORE the port opens, so no request slips
|
|
117
|
+
// through the readiness guard before the supervisor has run. The supervisor
|
|
118
|
+
// flips it true once dependencies connect.
|
|
119
|
+
setReady(false);
|
|
120
|
+
// Listen FIRST. Previously the process tested the DB and `process.exit(1)`'d
|
|
121
|
+
// on failure (to be restarted), so during a cold-DB stampede services
|
|
122
|
+
// crash-looped and never even opened their port. Now we open the port
|
|
123
|
+
// immediately — /health (liveness), /ready (readiness) and the readiness
|
|
124
|
+
// guard all respond at once — and establish + monitor the datastore in the
|
|
125
|
+
// background, reporting NotReady until it connects instead of exiting.
|
|
57
126
|
const server = app.listen(port, () => {
|
|
58
127
|
logger.info(`${name} listening on port: ${port}`);
|
|
59
128
|
logger.info(`Platform URL: ${serverConfig.platformUrl}`);
|
|
@@ -61,6 +130,16 @@ export async function startServer(app, options = {}) {
|
|
|
61
130
|
});
|
|
62
131
|
// Shutdown handler (guarded against concurrent signals)
|
|
63
132
|
let shuttingDown = false;
|
|
133
|
+
// Background dependency supervisor — established + monitored after listen,
|
|
134
|
+
// stopped on shutdown so it never keeps a closing process alive. Guard the
|
|
135
|
+
// floating promise: every expected failure is handled inside, so a rejection
|
|
136
|
+
// here means a programming error — log it and leave the service NotReady
|
|
137
|
+
// rather than letting it become an unhandledRejection that crash-exits the
|
|
138
|
+
// process (which would defeat the whole "never exit on dependency trouble"
|
|
139
|
+
// goal).
|
|
140
|
+
superviseDependencies(name, onBeforeStart, testDatabase, () => shuttingDown).catch((error) => {
|
|
141
|
+
logger.error('Dependency supervisor crashed; service will remain NotReady', { error: errorMessage(error) });
|
|
142
|
+
});
|
|
64
143
|
const shutdown = async (signal) => {
|
|
65
144
|
if (shuttingDown)
|
|
66
145
|
return;
|
|
@@ -139,9 +218,11 @@ export function runServer(app, options = {}) {
|
|
|
139
218
|
// process exits for the orchestrator to restart. No-op under NODE_ENV=test.
|
|
140
219
|
installCrashHandlers(logger);
|
|
141
220
|
startServer(app, options).catch((error) => {
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
//
|
|
221
|
+
// startServer now listens-first and supervises the DB in the background, so
|
|
222
|
+
// it only rejects on a genuinely fatal SETUP error (invalid auth config, a
|
|
223
|
+
// failed onStart, the port already in use). Log message + stack explicitly:
|
|
224
|
+
// an Error in winston metadata serializes to `{}` (message/stack are
|
|
225
|
+
// non-enumerable), which would otherwise hide the cause behind `{error:{}}`.
|
|
145
226
|
logger.error('Failed to start server', {
|
|
146
227
|
error: error instanceof Error ? error.message : String(error),
|
|
147
228
|
stack: error instanceof Error ? error.stack : undefined,
|
|
@@ -149,4 +230,4 @@ export function runServer(app, options = {}) {
|
|
|
149
230
|
process.exit(1);
|
|
150
231
|
});
|
|
151
232
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFzQ3RDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLEdBQVksRUFDWixVQUE4QixFQUFFO0lBRWhDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsTUFBTSxFQUNKLElBQUksR0FBRyxjQUFjLEVBQ3JCLFVBQVUsRUFDVixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEdBQ2QsR0FBRyxPQUFPLENBQUM7SUFDWixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFFL0MsMkVBQTJFO0lBQzNFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV0QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsQ0FBQztJQUVuQyx5REFBeUQ7SUFDekQsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxZQUFZLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxTQUFTLEdBQUcsWUFBWTtZQUM1QixDQUFDLENBQUMsTUFBTSxZQUFZLEVBQUU7WUFDdEIsQ0FBQyxDQUFDLE1BQU0sYUFBYSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFM0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGVBQWU7SUFDZixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksdUJBQXVCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCx3REFBd0Q7SUFDeEQsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxNQUFlLEVBQUUsRUFBRTtRQUN6QyxJQUFJLFlBQVk7WUFBRSxPQUFPO1FBQ3pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLHdDQUF3QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUVsQyxpQ0FBaUM7WUFDakMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVsRyw0QkFBNEI7WUFDNUIsSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQztvQkFDSCxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixNQUFNLGFBQWEsRUFBRSxDQUFDO29CQUN4QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxlQUFlLEVBQUUsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgsK0JBQStCO1FBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDLENBQUM7SUFFRiwyQkFBMkI7SUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhELE9BQU87UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFZLEVBQUUsVUFBOEIsRUFBRTtJQUN0RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hDLDhFQUE4RTtRQUM5RSw2RUFBNkU7UUFDN0UsOERBQThEO1FBQzlELE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUU7WUFDckMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDN0QsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDeEQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGluc3RhbGxDcmFzaEhhbmRsZXJzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnLCBnZXRDb25uZWN0aW9uLCBjbG9zZUNvbm5lY3Rpb24gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzcyB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgc2h1dGRvd25UcmFjaW5nIH0gZnJvbSAnLi90cmFjaW5nLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlcicpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgbG9nZ2luZyAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogUG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQ6IGZyb20gY29uZmlnKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogU1NFIG1hbmFnZXIgZm9yIGdyYWNlZnVsIHNodXRkb3duICovXG4gIHNzZU1hbmFnZXI/OiBTU0VNYW5hZ2VyO1xuICAvKiogU2h1dGRvd24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDE1MDAwKSAqL1xuICBzaHV0ZG93blRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIENhbGxiYWNrIGFmdGVyIHNlcnZlciBzdGFydHMgKi9cbiAgb25TdGFydD86IChwb3J0OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayBiZWZvcmUgc2h1dGRvd24gKi9cbiAgb25TaHV0ZG93bj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW5zIGJlZm9yZSBkYXRhYmFzZSBjaGVjayAoZS5nLiwgaW5pdGlhbGl6ZSBleHRlcm5hbCBjb25uZWN0aW9ucykgKi9cbiAgb25CZWZvcmVTdGFydD86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgaGVhbHRoIGNoZWNrLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIHRlc3RDb25uZWN0aW9uICovXG4gIHRlc3REYXRhYmFzZT86ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IGZhbHNlO1xuICAvKiogQ3VzdG9tIGRhdGFiYXNlIGNsb3NlLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIGNsb3NlQ29ubmVjdGlvbiAqL1xuICBjbG9zZURhdGFiYXNlPzogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgZmFsc2U7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJSZXN1bHQge1xuICAvKiogSFRUUCBzZXJ2ZXIgaW5zdGFuY2UgKi9cbiAgc2VydmVyOiBTZXJ2ZXI7XG4gIC8qKiBQb3J0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uICovXG4gIHBvcnQ6IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIHRvIG1hbnVhbGx5IHRyaWdnZXIgc2h1dGRvd24gKi9cbiAgc2h1dGRvd246ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogU3RhcnQgYW4gRXhwcmVzcyBzZXJ2ZXIgd2l0aCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGluZ1xuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0aW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIG9uIFNJR0lOVC9TSUdURVJNXG4gKiAtIFNTRSBjb25uZWN0aW9uIGNsZWFudXBcbiAqIC0gQ29uZmlndXJhYmxlIHNodXRkb3duIHRpbWVvdXRcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRXhwcmVzcyBhcHBsaWNhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgb3B0aW9uc1xuICogQHJldHVybnMgU2VydmVyIGluc3RhbmNlIGFuZCBjb250cm9sIGZ1bmN0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgaGFuZGxlcik7XG4gKlxuICogYXdhaXQgc3RhcnRTZXJ2ZXIoYXBwLCB7XG4gKiAgIG5hbWU6ICdNeSBNaWNyb3NlcnZpY2UnLFxuICogICBzc2VNYW5hZ2VyLFxuICogICBvblN0YXJ0OiAocG9ydCkgPT4gY29uc29sZS5sb2coYExpc3RlbmluZyBvbiAke3BvcnR9YCksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoXG4gIGFwcDogRXhwcmVzcyxcbiAgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFN0YXJ0U2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICBjb25zdCB7XG4gICAgbmFtZSA9ICdNaWNyb3NlcnZpY2UnLFxuICAgIHNzZU1hbmFnZXIsXG4gICAgc2h1dGRvd25UaW1lb3V0TXMgPSAxNTAwMCxcbiAgICBvblN0YXJ0LFxuICAgIG9uU2h1dGRvd24sXG4gICAgb25CZWZvcmVTdGFydCxcbiAgICB0ZXN0RGF0YWJhc2UsXG4gICAgY2xvc2VEYXRhYmFzZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gc2VydmVyQ29uZmlnLnBvcnQ7XG5cbiAgLy8gVmFsaWRhdGUgYXV0aCBjb25maWd1cmF0aW9uIGF0IHNlcnZlciBzdGFydHVwIChub3QgZHVyaW5nIENESyBzeW50aGVzaXMpXG4gIENvbmZpZy52YWxpZGF0ZUF1dGgoKTtcblxuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJHtuYW1lfS4uLmApO1xuXG4gIC8vIFByZS1zdGFydCBob29rIChlLmcuLCBpbml0aWFsaXplIGV4dGVybmFsIGNvbm5lY3Rpb25zKVxuICBpZiAob25CZWZvcmVTdGFydCkge1xuICAgIGF3YWl0IG9uQmVmb3JlU3RhcnQoKTtcbiAgfVxuXG4gIC8vIFRlc3QgZGF0YWJhc2UgY29ubmVjdGlvblxuICBpZiAodGVzdERhdGFiYXNlICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IGRiSGVhbHRoeSA9IHRlc3REYXRhYmFzZVxuICAgICAgPyBhd2FpdCB0ZXN0RGF0YWJhc2UoKVxuICAgICAgOiBhd2FpdCBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKTtcblxuICAgIGlmICghZGJIZWFsdGh5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IHNlcnZlclxuICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSBsaXN0ZW5pbmcgb24gcG9ydDogJHtwb3J0fWApO1xuICAgIGxvZ2dlci5pbmZvKGBQbGF0Zm9ybSBVUkw6ICR7c2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsfWApO1xuICAgIG9uU3RhcnQ/Lihwb3J0KTtcbiAgfSk7XG5cbiAgLy8gU2h1dGRvd24gaGFuZGxlciAoZ3VhcmRlZCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2lnbmFscylcbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICBjb25zdCBzaHV0ZG93biA9IGFzeW5jIChzaWduYWw/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24gZ3JhY2VmdWxseS4uLmApO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSBzaHV0ZG93biBjYWxsYmFja1xuICAgIGlmIChvblNodXRkb3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvblNodXRkb3duKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIG9uU2h1dGRvd24gY2FsbGJhY2snLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIFNTRSBjb25uZWN0aW9uc1xuICAgIGlmIChzc2VNYW5hZ2VyKSB7XG4gICAgICBzc2VNYW5hZ2VyLnNodXRkb3duKCk7XG4gICAgICBsb2dnZXIuaW5mbygnU1NFIGNvbm5lY3Rpb25zIGNsb3NlZCcpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIEhUVFAgc2VydmVyXG4gICAgc2VydmVyLmNsb3NlKGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKCdIVFRQIHNlcnZlciBjbG9zZWQnKTtcblxuICAgICAgLy8gU2h1dGRvd24gT3BlblRlbGVtZXRyeSB0cmFjaW5nXG4gICAgICBhd2FpdCBzaHV0ZG93blRyYWNpbmcoKS5jYXRjaChlcnIgPT4gbG9nZ2VyLmVycm9yKCdFcnJvciBzaHV0dGluZyBkb3duIHRyYWNpbmcnLCB7IGVycm9yOiBlcnIgfSkpO1xuXG4gICAgICAvLyBDbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gICAgICBpZiAoY2xvc2VEYXRhYmFzZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoY2xvc2VEYXRhYmFzZSkge1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VEYXRhYmFzZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBjbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gY2xvc2VkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBjbG9zaW5nIGRhdGFiYXNlJywgeyBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSk7XG5cbiAgICAvLyBGb3JjZSBzaHV0ZG93biBhZnRlciB0aW1lb3V0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZvcmNlZCBzaHV0ZG93biBhZnRlciB0aW1lb3V0Jyk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSwgc2h1dGRvd25UaW1lb3V0TXMpLnVucmVmKCk7XG4gIH07XG5cbiAgLy8gUmVnaXN0ZXIgc2lnbmFsIGhhbmRsZXJzXG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgKCkgPT4gdm9pZCBzaHV0ZG93bignU0lHSU5UJykpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCAoKSA9PiB2b2lkIHNodXRkb3duKCdTSUdURVJNJykpO1xuXG4gIHJldHVybiB7XG4gICAgc2VydmVyLFxuICAgIHBvcnQsXG4gICAgc2h1dGRvd246ICgpID0+IHNodXRkb3duKCksXG4gIH07XG59XG5cbi8qKlxuICogU2ltcGxlIHNlcnZlciBzdGFydCB3cmFwcGVyIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRXhwcmVzcyBhcHBsaWNhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIGhhbmRsZXIpO1xuICpcbiAqIHZvaWQgcnVuU2VydmVyKGFwcCwgeyBuYW1lOiAnTXkgU2VydmljZScsIHNzZU1hbmFnZXIgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blNlcnZlcihhcHA6IEV4cHJlc3MsIG9wdGlvbnM6IFN0YXJ0U2VydmVyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIC8vIExhc3QtcmVzb3J0IGZhdWx0IGhhbmRsZXJzIGZvciB0aGUgcHJvZHVjdGlvbiBlbnRyeXBvaW50OiBhbiB1bmhhbmRsZWRcbiAgLy8gcmVqZWN0aW9uIC8gdW5jYXVnaHQgZXhjZXB0aW9uIGlzIGxvZ2dlZCAobm90IHNpbGVudGx5IGZhdGFsKSB0aGVuIHRoZVxuICAvLyBwcm9jZXNzIGV4aXRzIGZvciB0aGUgb3JjaGVzdHJhdG9yIHRvIHJlc3RhcnQuIE5vLW9wIHVuZGVyIE5PREVfRU5WPXRlc3QuXG4gIGluc3RhbGxDcmFzaEhhbmRsZXJzKGxvZ2dlcik7XG4gIHN0YXJ0U2VydmVyKGFwcCwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgLy8gTG9nIHRoZSBtZXNzYWdlICsgc3RhY2sgZXhwbGljaXRseTogYW4gRXJyb3IgaW4gd2luc3RvbiBtZXRhZGF0YSBzZXJpYWxpemVzXG4gICAgLy8gdG8gYHt9YCAobWVzc2FnZS9zdGFjayBhcmUgbm9uLWVudW1lcmFibGUpLCB3aGljaCBoaWQgdGhlIHJlYWwgY2F1c2UgKGUuZy5cbiAgICAvLyBcIkRhdGFiYXNlIGNvbm5lY3Rpb24gZmFpbGVkXCIpIGJlaGluZCBhbiBlbXB0eSBge2Vycm9yOnt9fWAuXG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVyJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbn1cbiJdfQ==
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQWlCLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9GLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLHlDQUF5QztBQUN6QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUNqQyxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQztBQUNqQyxNQUFNLHlCQUF5QixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVyRzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUNsQyxJQUFZLEVBQ1osYUFBZ0QsRUFDaEQsWUFBMEQsRUFDMUQsT0FBc0I7SUFFdEIsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztRQUNoQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxhQUFhLEVBQUUsQ0FBQztnQkFDdEIsTUFBTTtZQUNSLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLHlDQUF5QyxLQUFLLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN2RSxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztJQUNwQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxFQUFFLEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNiLENBQUM7UUFFRCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2YsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLGlDQUFpQyxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM1QixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUkscURBQXFELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLDhDQUE4QztRQUM5QyxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDZCxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQXNDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixHQUFZLEVBQ1osVUFBOEIsRUFBRTtJQUVoQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFDSixJQUFJLEdBQUcsY0FBYyxFQUNyQixVQUFVLEVBQ1YsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixPQUFPLEVBQ1AsVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBQ1osYUFBYSxHQUNkLEdBQUcsT0FBTyxDQUFDO0lBQ1osTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDO0lBRS9DLDJFQUEyRTtJQUMzRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLENBQUM7SUFFbkMsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSwyQ0FBMkM7SUFDM0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhCLDZFQUE2RTtJQUM3RSxzRUFBc0U7SUFDdEUsc0VBQXNFO0lBQ3RFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILHdEQUF3RDtJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsU0FBUztJQUNULHFCQUFxQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkRBQTZELEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxNQUFlLEVBQUUsRUFBRTtRQUN6QyxJQUFJLFlBQVk7WUFBRSxPQUFPO1FBQ3pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLHdDQUF3QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUVsQyxpQ0FBaUM7WUFDakMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVsRyw0QkFBNEI7WUFDNUIsSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQztvQkFDSCxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixNQUFNLGFBQWEsRUFBRSxDQUFDO29CQUN4QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxlQUFlLEVBQUUsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgsK0JBQStCO1FBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDLENBQUM7SUFFRiwyQkFBMkI7SUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhELE9BQU87UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFZLEVBQUUsVUFBOEIsRUFBRTtJQUN0RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hDLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSw2RUFBNkU7UUFDN0UsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRTtZQUNyQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM3RCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN4RCxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBpbnN0YWxsQ3Jhc2hIYW5kbGVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgZ2V0Q29ubmVjdGlvbiwgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3MgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IHNodXRkb3duVHJhY2luZyB9IGZyb20gJy4vdHJhY2luZy5qcyc7XG5pbXBvcnQgeyBzZXRSZWFkeSwgaXNSZWFkeSB9IGZyb20gJy4vcmVhZGluZXNzLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlcicpO1xuXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG4vLyBEZXBlbmRlbmN5LXN1cGVydmlzb3IgY2FkZW5jZS4gSW5pdGlhbCBjb25uZWN0IHJldHJpZXMgd2l0aCBjYXBwZWQgYmFja29mZjtcbi8vIG9uY2UgY29ubmVjdGVkLCByZS1jaGVja3MgYXQgYSBzdGVhZHkgaW50ZXJ2YWwgc28gYSBsYXRlciBvdXRhZ2UgZmxpcHMgdGhlXG4vLyBzZXJ2aWNlIE5vdFJlYWR5IChkcmFpbmluZyB0cmFmZmljKSBhbmQgYSByZWNvdmVyeSBmbGlwcyBpdCBiYWNrIOKAlCB3aXRob3V0XG4vLyBldmVyIGV4aXRpbmcgLyByZXN0YXJ0aW5nIHRoZSBwcm9jZXNzLlxuY29uc3QgUkVBRFlfUkVUUllfQkFTRV9NUyA9IDEwMDA7XG5jb25zdCBSRUFEWV9SRVRSWV9NQVhfTVMgPSAxMDAwMDtcbmNvbnN0IFJFQURZX01PTklUT1JfSU5URVJWQUxfTVMgPSBwYXJzZUludChwcm9jZXNzLmVudi5SRUFESU5FU1NfTU9OSVRPUl9JTlRFUlZBTF9NUyB8fCAnMTUwMDAnLCAxMCk7XG5cbi8qKlxuICogRXN0YWJsaXNoIGFuZCBjb250aW51b3VzbHkgbW9uaXRvciB0aGUgc2VydmljZSdzIGRhdGFzdG9yZSBkZXBlbmRlbmN5LFxuICogZmxpcHBpbmcgcmVhZGluZXNzIHN0YXRlIGluc3RlYWQgb2YgY3Jhc2gtbG9vcGluZy5cbiAqXG4gKiAtIEVzdGFibGlzaCBwaGFzZTogcmV0cnkgYG9uQmVmb3JlU3RhcnRgIChlLmcuIGNvbm5lY3RNb25nbykgd2l0aCBjYXBwZWRcbiAqICAgYmFja29mZiB1bnRpbCBpdCBzdWNjZWVkcyDigJQgYSBjb2xkIGRhdGFzdG9yZSBtdXN0IG5ldmVyIGV4aXQgdGhlIHByb2Nlc3MuXG4gKiAtIE1vbml0b3IgcGhhc2U6IHBvbGwgYHRlc3REYXRhYmFzZWAgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzOyBmbGlwXG4gKiAgIHJlYWR5L05vdFJlYWR5IG9uIHRyYW5zaXRpb25zLiBXaGlsZSBOb3RSZWFkeSB0aGUgcmVhZGluZXNzIGd1YXJkIDUwM3NcbiAqICAgYnVzaW5lc3MgdHJhZmZpYyBhbmQgb3JjaGVzdHJhdG9yIHJlYWRpbmVzcyBwcm9iZXMgZHJhaW4gdGhlIGluc3RhbmNlLlxuICpcbiAqIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgKHRoZSBIVFRQIHNlcnZlciBpcyBhbHJlYWR5IGxpc3RlbmluZykuIFN0b3BzIHdoZW5cbiAqIGBhYm9ydGVkKClgIHJldHVybnMgdHJ1ZSAoZ3JhY2VmdWwgc2h1dGRvd24pLCBzbyBpdCBuZXZlciBrZWVwcyBhIGNsb3NpbmdcbiAqIHByb2Nlc3MgYWxpdmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN1cGVydmlzZURlcGVuZGVuY2llcyhcbiAgbmFtZTogc3RyaW5nLFxuICBvbkJlZm9yZVN0YXJ0OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQsXG4gIHRlc3REYXRhYmFzZTogKCgpID0+IFByb21pc2U8Ym9vbGVhbj4pIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4gIGFib3J0ZWQ6ICgpID0+IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG9uQmVmb3JlU3RhcnQpIHtcbiAgICBsZXQgZGVsYXkgPSBSRUFEWV9SRVRSWV9CQVNFX01TO1xuICAgIHdoaWxlICghYWJvcnRlZCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvbkJlZm9yZVN0YXJ0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYCR7bmFtZX06IGRlcGVuZGVuY3kgaW5pdCBmYWlsZWQsIHJldHJ5aW5nIGluICR7ZGVsYXl9bXNgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheSk7XG4gICAgICAgIGRlbGF5ID0gTWF0aC5taW4oZGVsYXkgKiAyLCBSRUFEWV9SRVRSWV9NQVhfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vIGRhdGFzdG9yZSB0byBnYXRlIG9uIOKGkiByZWFkeSBhcyBzb29uIGFzIHdlIGFyZSBsaXN0ZW5pbmcuXG4gIGlmICh0ZXN0RGF0YWJhc2UgPT09IGZhbHNlKSB7XG4gICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gcmVhZHkgKG5vIGRhdGFzdG9yZSBkZXBlbmRlbmN5KWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByb2JlID0gdGVzdERhdGFiYXNlID8/ICgoKSA9PiBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSk7XG4gIGxldCB3YWl0RGVsYXkgPSBSRUFEWV9SRVRSWV9CQVNFX01TO1xuICB3aGlsZSAoIWFib3J0ZWQoKSkge1xuICAgIGxldCBvayA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBvayA9IGF3YWl0IHByb2JlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBvayA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChvayAmJiAhaXNSZWFkeSgpKSB7XG4gICAgICBzZXRSZWFkeSh0cnVlKTtcbiAgICAgIHdhaXREZWxheSA9IFJFQURZX1JFVFJZX0JBU0VfTVM7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSByZWFkeSDigJQgZGVwZW5kZW5jaWVzIGNvbm5lY3RlZGApO1xuICAgIH0gZWxzZSBpZiAoIW9rICYmIGlzUmVhZHkoKSkge1xuICAgICAgc2V0UmVhZHkoZmFsc2UpO1xuICAgICAgbG9nZ2VyLndhcm4oYCR7bmFtZX0gZGVncmFkZWQg4oCUIGRlcGVuZGVuY3kgY2hlY2sgZmFpbGluZyAobm93IE5vdFJlYWR5KWApO1xuICAgIH1cblxuICAgIC8vIFN0ZWFkeSBjYWRlbmNlIG9uY2UgcmVhZHk7IGZhc3RlciBiYWNrb2ZmIHdoaWxlIHdhaXRpbmcgc28gd2UgZmxpcCB0b1xuICAgIC8vIHJlYWR5IHByb21wdGx5IHdoZW4gdGhlIGRhdGFzdG9yZSBjb21lcyB1cC5cbiAgICBpZiAoaXNSZWFkeSgpKSB7XG4gICAgICBhd2FpdCBzbGVlcChSRUFEWV9NT05JVE9SX0lOVEVSVkFMX01TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2xlZXAod2FpdERlbGF5KTtcbiAgICAgIHdhaXREZWxheSA9IE1hdGgubWluKHdhaXREZWxheSAqIDIsIFJFQURZX1JFVFJZX01BWF9NUyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlck9wdGlvbnMge1xuICAvKiogU2VydmljZSBuYW1lIGZvciBsb2dnaW5nICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBQb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdDogZnJvbSBjb25maWcpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBTU0UgbWFuYWdlciBmb3IgZ3JhY2VmdWwgc2h1dGRvd24gKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBTaHV0ZG93biB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTUwMDApICovXG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQ2FsbGJhY2sgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqL1xuICBvblN0YXJ0PzogKHBvcnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIGJlZm9yZSBzaHV0ZG93biAqL1xuICBvblNodXRkb3duPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1bnMgYmVmb3JlIGRhdGFiYXNlIGNoZWNrIChlLmcuLCBpbml0aWFsaXplIGV4dGVybmFsIGNvbm5lY3Rpb25zKSAqL1xuICBvbkJlZm9yZVN0YXJ0PzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEN1c3RvbSBkYXRhYmFzZSBoZWFsdGggY2hlY2ssIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgdGVzdENvbm5lY3Rpb24gKi9cbiAgdGVzdERhdGFiYXNlPzogKCgpID0+IFByb21pc2U8Ym9vbGVhbj4pIHwgZmFsc2U7XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgY2xvc2UsIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgY2xvc2VDb25uZWN0aW9uICovXG4gIGNsb3NlRGF0YWJhc2U/OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlclJlc3VsdCB7XG4gIC8qKiBIVFRQIHNlcnZlciBpbnN0YW5jZSAqL1xuICBzZXJ2ZXI6IFNlcnZlcjtcbiAgLyoqIFBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gdG8gbWFudWFsbHkgdHJpZ2dlciBzaHV0ZG93biAqL1xuICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBTdGFydCBhbiBFeHByZXNzIHNlcnZlciB3aXRoIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBkYXRhYmFzZSBjb25uZWN0aW9uIHRlc3RpbmdcbiAqIC0gR3JhY2VmdWwgc2h1dGRvd24gb24gU0lHSU5UL1NJR1RFUk1cbiAqIC0gU1NFIGNvbm5lY3Rpb24gY2xlYW51cFxuICogLSBDb25maWd1cmFibGUgc2h1dGRvd24gdGltZW91dFxuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKiBAcmV0dXJucyBTZXJ2ZXIgaW5zdGFuY2UgYW5kIGNvbnRyb2wgZnVuY3Rpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBoYW5kbGVyKTtcbiAqXG4gKiBhd2FpdCBzdGFydFNlcnZlcihhcHAsIHtcbiAqICAgbmFtZTogJ015IE1pY3Jvc2VydmljZScsXG4gKiAgIHNzZU1hbmFnZXIsXG4gKiAgIG9uU3RhcnQ6IChwb3J0KSA9PiBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIG9uICR7cG9ydH1gKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcihcbiAgYXBwOiBFeHByZXNzLFxuICBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U3RhcnRTZXJ2ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IHtcbiAgICBuYW1lID0gJ01pY3Jvc2VydmljZScsXG4gICAgc3NlTWFuYWdlcixcbiAgICBzaHV0ZG93blRpbWVvdXRNcyA9IDE1MDAwLFxuICAgIG9uU3RhcnQsXG4gICAgb25TaHV0ZG93bixcbiAgICBvbkJlZm9yZVN0YXJ0LFxuICAgIHRlc3REYXRhYmFzZSxcbiAgICBjbG9zZURhdGFiYXNlLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBzZXJ2ZXJDb25maWcucG9ydDtcblxuICAvLyBWYWxpZGF0ZSBhdXRoIGNvbmZpZ3VyYXRpb24gYXQgc2VydmVyIHN0YXJ0dXAgKG5vdCBkdXJpbmcgQ0RLIHN5bnRoZXNpcylcbiAgQ29uZmlnLnZhbGlkYXRlQXV0aCgpO1xuXG4gIGxvZ2dlci5pbmZvKGBTdGFydGluZyAke25hbWV9Li4uYCk7XG5cbiAgLy8gTWFyayBOb3RSZWFkeSBzeW5jaHJvbm91c2x5LCBCRUZPUkUgdGhlIHBvcnQgb3BlbnMsIHNvIG5vIHJlcXVlc3Qgc2xpcHNcbiAgLy8gdGhyb3VnaCB0aGUgcmVhZGluZXNzIGd1YXJkIGJlZm9yZSB0aGUgc3VwZXJ2aXNvciBoYXMgcnVuLiBUaGUgc3VwZXJ2aXNvclxuICAvLyBmbGlwcyBpdCB0cnVlIG9uY2UgZGVwZW5kZW5jaWVzIGNvbm5lY3QuXG4gIHNldFJlYWR5KGZhbHNlKTtcblxuICAvLyBMaXN0ZW4gRklSU1QuIFByZXZpb3VzbHkgdGhlIHByb2Nlc3MgdGVzdGVkIHRoZSBEQiBhbmQgYHByb2Nlc3MuZXhpdCgxKWAnZFxuICAvLyBvbiBmYWlsdXJlICh0byBiZSByZXN0YXJ0ZWQpLCBzbyBkdXJpbmcgYSBjb2xkLURCIHN0YW1wZWRlIHNlcnZpY2VzXG4gIC8vIGNyYXNoLWxvb3BlZCBhbmQgbmV2ZXIgZXZlbiBvcGVuZWQgdGhlaXIgcG9ydC4gTm93IHdlIG9wZW4gdGhlIHBvcnRcbiAgLy8gaW1tZWRpYXRlbHkg4oCUIC9oZWFsdGggKGxpdmVuZXNzKSwgL3JlYWR5IChyZWFkaW5lc3MpIGFuZCB0aGUgcmVhZGluZXNzXG4gIC8vIGd1YXJkIGFsbCByZXNwb25kIGF0IG9uY2Ug4oCUIGFuZCBlc3RhYmxpc2ggKyBtb25pdG9yIHRoZSBkYXRhc3RvcmUgaW4gdGhlXG4gIC8vIGJhY2tncm91bmQsIHJlcG9ydGluZyBOb3RSZWFkeSB1bnRpbCBpdCBjb25uZWN0cyBpbnN0ZWFkIG9mIGV4aXRpbmcuXG4gIGNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKGAke25hbWV9IGxpc3RlbmluZyBvbiBwb3J0OiAke3BvcnR9YCk7XG4gICAgbG9nZ2VyLmluZm8oYFBsYXRmb3JtIFVSTDogJHtzZXJ2ZXJDb25maWcucGxhdGZvcm1Vcmx9YCk7XG4gICAgb25TdGFydD8uKHBvcnQpO1xuICB9KTtcblxuICAvLyBTaHV0ZG93biBoYW5kbGVyIChndWFyZGVkIGFnYWluc3QgY29uY3VycmVudCBzaWduYWxzKVxuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5cbiAgLy8gQmFja2dyb3VuZCBkZXBlbmRlbmN5IHN1cGVydmlzb3Ig4oCUIGVzdGFibGlzaGVkICsgbW9uaXRvcmVkIGFmdGVyIGxpc3RlbixcbiAgLy8gc3RvcHBlZCBvbiBzaHV0ZG93biBzbyBpdCBuZXZlciBrZWVwcyBhIGNsb3NpbmcgcHJvY2VzcyBhbGl2ZS4gR3VhcmQgdGhlXG4gIC8vIGZsb2F0aW5nIHByb21pc2U6IGV2ZXJ5IGV4cGVjdGVkIGZhaWx1cmUgaXMgaGFuZGxlZCBpbnNpZGUsIHNvIGEgcmVqZWN0aW9uXG4gIC8vIGhlcmUgbWVhbnMgYSBwcm9ncmFtbWluZyBlcnJvciDigJQgbG9nIGl0IGFuZCBsZWF2ZSB0aGUgc2VydmljZSBOb3RSZWFkeVxuICAvLyByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlY29tZSBhbiB1bmhhbmRsZWRSZWplY3Rpb24gdGhhdCBjcmFzaC1leGl0cyB0aGVcbiAgLy8gcHJvY2VzcyAod2hpY2ggd291bGQgZGVmZWF0IHRoZSB3aG9sZSBcIm5ldmVyIGV4aXQgb24gZGVwZW5kZW5jeSB0cm91YmxlXCJcbiAgLy8gZ29hbCkuXG4gIHN1cGVydmlzZURlcGVuZGVuY2llcyhuYW1lLCBvbkJlZm9yZVN0YXJ0LCB0ZXN0RGF0YWJhc2UsICgpID0+IHNodXR0aW5nRG93bikuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKCdEZXBlbmRlbmN5IHN1cGVydmlzb3IgY3Jhc2hlZDsgc2VydmljZSB3aWxsIHJlbWFpbiBOb3RSZWFkeScsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKHNpZ25hbD86IHN0cmluZykgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuXG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgbG9nZ2VyLmluZm8oYCR7c2lnbmFsfSByZWNlaXZlZCwgc2h1dHRpbmcgZG93biBncmFjZWZ1bGx5Li4uYCk7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIHNodXRkb3duIGNhbGxiYWNrXG4gICAgaWYgKG9uU2h1dGRvd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uU2h1dGRvd24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gb25TaHV0ZG93biBjYWxsYmFjaycsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgU1NFIGNvbm5lY3Rpb25zXG4gICAgaWYgKHNzZU1hbmFnZXIpIHtcbiAgICAgIHNzZU1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdTU0UgY29ubmVjdGlvbnMgY2xvc2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgSFRUUCBzZXJ2ZXJcbiAgICBzZXJ2ZXIuY2xvc2UoYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oJ0hUVFAgc2VydmVyIGNsb3NlZCcpO1xuXG4gICAgICAvLyBTaHV0ZG93biBPcGVuVGVsZW1ldHJ5IHRyYWNpbmdcbiAgICAgIGF3YWl0IHNodXRkb3duVHJhY2luZygpLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ0Vycm9yIHNodXR0aW5nIGRvd24gdHJhY2luZycsIHsgZXJyb3I6IGVyciB9KSk7XG5cbiAgICAgIC8vIENsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChjbG9zZURhdGFiYXNlICE9PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChjbG9zZURhdGFiYXNlKSB7XG4gICAgICAgICAgICBhd2FpdCBjbG9zZURhdGFiYXNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UnLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcblxuICAgIC8vIEZvcmNlIHNodXRkb3duIGFmdGVyIHRpbWVvdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignRm9yY2VkIHNodXRkb3duIGFmdGVyIHRpbWVvdXQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9LCBzaHV0ZG93blRpbWVvdXRNcykudW5yZWYoKTtcbiAgfTtcblxuICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlcnNcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB2b2lkIHNodXRkb3duKCdTSUdJTlQnKSk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJ2ZXIsXG4gICAgcG9ydCxcbiAgICBzaHV0ZG93bjogKCkgPT4gc2h1dGRvd24oKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgc2VydmVyIHN0YXJ0IHdyYXBwZXIgd2l0aCBlcnJvciBoYW5kbGluZ1xuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgaGFuZGxlcik7XG4gKlxuICogdm9pZCBydW5TZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJywgc3NlTWFuYWdlciB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2VydmVyKGFwcDogRXhwcmVzcywgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgLy8gTGFzdC1yZXNvcnQgZmF1bHQgaGFuZGxlcnMgZm9yIHRoZSBwcm9kdWN0aW9uIGVudHJ5cG9pbnQ6IGFuIHVuaGFuZGxlZFxuICAvLyByZWplY3Rpb24gLyB1bmNhdWdodCBleGNlcHRpb24gaXMgbG9nZ2VkIChub3Qgc2lsZW50bHkgZmF0YWwpIHRoZW4gdGhlXG4gIC8vIHByb2Nlc3MgZXhpdHMgZm9yIHRoZSBvcmNoZXN0cmF0b3IgdG8gcmVzdGFydC4gTm8tb3AgdW5kZXIgTk9ERV9FTlY9dGVzdC5cbiAgaW5zdGFsbENyYXNoSGFuZGxlcnMobG9nZ2VyKTtcbiAgc3RhcnRTZXJ2ZXIoYXBwLCBvcHRpb25zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAvLyBzdGFydFNlcnZlciBub3cgbGlzdGVucy1maXJzdCBhbmQgc3VwZXJ2aXNlcyB0aGUgREIgaW4gdGhlIGJhY2tncm91bmQsIHNvXG4gICAgLy8gaXQgb25seSByZWplY3RzIG9uIGEgZ2VudWluZWx5IGZhdGFsIFNFVFVQIGVycm9yIChpbnZhbGlkIGF1dGggY29uZmlnLCBhXG4gICAgLy8gZmFpbGVkIG9uU3RhcnQsIHRoZSBwb3J0IGFscmVhZHkgaW4gdXNlKS4gTG9nIG1lc3NhZ2UgKyBzdGFjayBleHBsaWNpdGx5OlxuICAgIC8vIGFuIEVycm9yIGluIHdpbnN0b24gbWV0YWRhdGEgc2VyaWFsaXplcyB0byBge31gIChtZXNzYWdlL3N0YWNrIGFyZVxuICAgIC8vIG5vbi1lbnVtZXJhYmxlKSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGhpZGUgdGhlIGNhdXNlIGJlaGluZCBge2Vycm9yOnt9fWAuXG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVyJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"rate-limit-redis": "5.0.0",
|
|
44
44
|
"swagger-ui-express": "5.0.1",
|
|
45
45
|
"uuid": "14.0.0",
|
|
46
|
-
"@pipeline-builder/api-core": "3.4.
|
|
47
|
-
"@pipeline-builder/pipeline-core": "3.4.
|
|
46
|
+
"@pipeline-builder/api-core": "3.4.72",
|
|
47
|
+
"@pipeline-builder/pipeline-core": "3.4.80"
|
|
48
48
|
},
|
|
49
49
|
"keywords": [
|
|
50
50
|
"aws",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"access": "public",
|
|
89
89
|
"registry": "https://registry.npmjs.org/"
|
|
90
90
|
},
|
|
91
|
-
"version": "3.4.
|
|
91
|
+
"version": "3.4.85",
|
|
92
92
|
"bugs": {
|
|
93
93
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
94
94
|
},
|