@pipeline-builder/api-core 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/lib/constants/index.d.ts +0 -1
- package/lib/constants/index.js +1 -2
- package/lib/errors/app-errors.d.ts +8 -3
- package/lib/errors/app-errors.js +10 -5
- package/lib/helpers/access-helpers.d.ts +4 -6
- package/lib/helpers/access-helpers.js +6 -8
- package/lib/helpers/index.d.ts +3 -3
- package/lib/helpers/index.js +4 -4
- package/lib/helpers/org-hierarchy-http.d.ts +11 -10
- package/lib/helpers/org-hierarchy-http.js +24 -35
- package/lib/helpers/org-hierarchy.d.ts +37 -3
- package/lib/helpers/org-hierarchy.js +45 -4
- package/lib/helpers/restore-helpers.d.ts +44 -24
- package/lib/helpers/restore-helpers.js +41 -52
- package/lib/helpers/sse-helpers.d.ts +29 -7
- package/lib/helpers/sse-helpers.js +36 -9
- package/lib/index.d.ts +16 -14
- package/lib/index.js +17 -15
- package/lib/middleware/assurance.d.ts +116 -0
- package/lib/middleware/assurance.js +176 -0
- package/lib/middleware/auth.d.ts +5 -427
- package/lib/middleware/auth.js +36 -789
- package/lib/middleware/ecosystem-guard.d.ts +47 -0
- package/lib/middleware/ecosystem-guard.js +60 -0
- package/lib/middleware/index.d.ts +11 -4
- package/lib/middleware/index.js +12 -5
- package/lib/middleware/jwt-verify.d.ts +52 -0
- package/lib/middleware/jwt-verify.js +105 -0
- package/lib/middleware/permission-gates.d.ts +133 -0
- package/lib/middleware/permission-gates.js +260 -0
- package/lib/middleware/revocation.d.ts +96 -0
- package/lib/middleware/revocation.js +162 -0
- package/lib/middleware/route-table.d.ts +11 -0
- package/lib/middleware/route-table.js +4 -1
- package/lib/middleware/service-tokens.d.ts +83 -0
- package/lib/middleware/service-tokens.js +158 -0
- package/lib/middleware/step-up.d.ts +2 -2
- package/lib/middleware/step-up.js +8 -7
- package/lib/middleware/system-org.d.ts +20 -0
- package/lib/middleware/system-org.js +25 -0
- package/lib/openapi/routes/plugin-routes.js +133 -10
- package/lib/openapi/schema-registry.js +2 -5
- package/lib/routes/index.d.ts +1 -1
- package/lib/routes/index.js +2 -2
- package/lib/services/api-key-exchange.js +7 -5
- package/lib/services/audit-spool.d.ts +34 -10
- package/lib/services/audit-spool.js +75 -34
- package/lib/services/cache-service.d.ts +7 -0
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.d.ts +14 -1
- package/lib/services/circuit-breaker.js +36 -10
- package/lib/services/compliance-client.d.ts +10 -2
- package/lib/services/compliance-client.js +17 -10
- package/lib/services/compliance-event-subscriber.js +6 -6
- package/lib/services/durable-event-bus.js +8 -11
- package/lib/services/ecosystem-notify-client.d.ts +32 -0
- package/lib/services/ecosystem-notify-client.js +71 -0
- package/lib/services/env-redis.d.ts +4 -1
- package/lib/services/env-redis.js +32 -3
- package/lib/services/http-client.d.ts +19 -0
- package/lib/services/http-client.js +98 -19
- package/lib/services/index.d.ts +25 -24
- package/lib/services/index.js +25 -22
- package/lib/services/jwks-cache.js +5 -4
- package/lib/services/leader-lock.d.ts +22 -5
- package/lib/services/leader-lock.js +61 -6
- package/lib/services/quota.d.ts +9 -4
- package/lib/services/quota.js +34 -40
- package/lib/services/remote-audit-client.d.ts +28 -32
- package/lib/services/remote-audit-client.js +166 -49
- package/lib/services/retry-forever.js +5 -11
- package/lib/services/retry-strategy.d.ts +1 -1
- package/lib/services/retry-strategy.js +5 -4
- package/lib/services/scheduler.d.ts +8 -3
- package/lib/services/scheduler.js +17 -5
- package/lib/services/service-boot.d.ts +14 -13
- package/lib/services/service-boot.js +18 -15
- package/lib/services/service-keys.d.ts +1 -1
- package/lib/services/service-keys.js +12 -18
- package/lib/services/sse-ticket-store.d.ts +9 -1
- package/lib/services/sse-ticket-store.js +24 -9
- package/lib/services/system-notification.d.ts +27 -0
- package/lib/services/system-notification.js +50 -0
- package/lib/services/token-revocation.d.ts +50 -1
- package/lib/services/token-revocation.js +103 -3
- package/lib/types/audit-events.d.ts +6 -6
- package/lib/types/audit-events.js +1 -1
- package/lib/types/common.d.ts +32 -13
- package/lib/types/common.js +2 -1
- package/lib/types/ecosystem-notifications.d.ts +142 -0
- package/lib/types/ecosystem-notifications.js +210 -0
- package/lib/types/ecosystem.d.ts +77 -0
- package/lib/types/ecosystem.js +119 -0
- package/lib/types/error-codes.d.ts +81 -0
- package/lib/types/error-codes.js +108 -1
- package/lib/types/feature-flags.d.ts +21 -1
- package/lib/types/feature-flags.js +36 -2
- package/lib/types/index.d.ts +14 -9
- package/lib/types/index.js +15 -10
- package/lib/types/permissions.d.ts +46 -8
- package/lib/types/permissions.js +75 -12
- package/lib/types/plugin-catalog.d.ts +35 -0
- package/lib/types/plugin-catalog.js +39 -0
- package/lib/types/plugin-health.d.ts +102 -0
- package/lib/types/plugin-health.js +184 -0
- package/lib/types/quota-tiers.d.ts +15 -0
- package/lib/types/quota-tiers.js +23 -3
- package/lib/types/wire-vocabulary.d.ts +102 -0
- package/lib/types/wire-vocabulary.js +94 -0
- package/lib/utils/alias-resolver.js +2 -2
- package/lib/utils/audit.d.ts +5 -2
- package/lib/utils/audit.js +6 -3
- package/lib/utils/compliance-attributes.js +3 -4
- package/lib/utils/concurrency.d.ts +7 -0
- package/lib/utils/concurrency.js +13 -1
- package/lib/utils/env.d.ts +3 -4
- package/lib/utils/env.js +4 -5
- package/lib/utils/identity.d.ts +13 -4
- package/lib/utils/identity.js +18 -10
- package/lib/utils/index.d.ts +13 -10
- package/lib/utils/index.js +13 -10
- package/lib/utils/jwk.d.ts +4 -0
- package/lib/utils/jwk.js +13 -1
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/object.d.ts +11 -0
- package/lib/utils/object.js +24 -1
- package/lib/utils/params.d.ts +8 -22
- package/lib/utils/params.js +15 -43
- package/lib/utils/plugin-compliance.d.ts +98 -0
- package/lib/utils/plugin-compliance.js +78 -0
- package/lib/utils/proof-of-work.d.ts +69 -0
- package/lib/utils/proof-of-work.js +139 -0
- package/lib/utils/response.d.ts +16 -6
- package/lib/utils/response.js +18 -15
- package/lib/utils/retention.d.ts +17 -0
- package/lib/utils/retention.js +30 -0
- package/lib/utils/secret-encryption.d.ts +7 -7
- package/lib/utils/secret-encryption.js +9 -10
- package/lib/utils/secret-rotation.js +2 -2
- package/lib/utils/sensitive-patterns.js +4 -5
- package/lib/utils/service-registry.d.ts +15 -0
- package/lib/utils/service-registry.js +24 -0
- package/lib/utils/ssrf.d.ts +11 -2
- package/lib/utils/ssrf.js +112 -33
- package/lib/validation/ai-schemas.js +3 -2
- package/lib/validation/common-schemas.d.ts +0 -9
- package/lib/validation/common-schemas.js +1 -7
- package/lib/validation/dockerfile-static.d.ts +26 -0
- package/lib/validation/dockerfile-static.js +210 -0
- package/lib/validation/index.d.ts +13 -4
- package/lib/validation/index.js +14 -5
- package/lib/validation/message-schemas.js +6 -4
- package/lib/validation/pipeline-schemas.d.ts +8 -2
- package/lib/validation/pipeline-schemas.js +30 -4
- package/lib/validation/plugin-base-images.d.ts +20 -0
- package/lib/validation/plugin-base-images.js +17 -0
- package/lib/validation/plugin-catalog-detect.d.ts +86 -0
- package/lib/validation/plugin-catalog-detect.js +237 -0
- package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
- package/lib/validation/plugin-catalog-metadata.js +162 -0
- package/lib/validation/plugin-heuristics.d.ts +41 -0
- package/lib/validation/plugin-heuristics.js +211 -0
- package/lib/validation/plugin-lint.d.ts +18 -0
- package/lib/validation/plugin-lint.js +136 -0
- package/lib/validation/plugin-name-confusable.d.ts +15 -0
- package/lib/validation/plugin-name-confusable.js +81 -0
- package/lib/validation/plugin-schemas.d.ts +40 -26
- package/lib/validation/plugin-schemas.js +26 -23
- package/lib/validation/plugin-spec-schema.d.ts +112 -0
- package/lib/validation/plugin-spec-schema.js +163 -0
- package/lib/validation/plugin-template-contract.d.ts +64 -0
- package/lib/validation/plugin-template-contract.js +113 -0
- package/package.json +69 -4
- package/lib/testing/mock-api-core.d.ts +0 -150
- package/lib/testing/mock-api-core.js +0 -246
- package/lib/testing/mock-drizzle.d.ts +0 -6
- package/lib/testing/mock-drizzle.js +0 -57
- package/lib/testing/route-coverage.d.ts +0 -64
- package/lib/testing/route-coverage.js +0 -183
- package/lib/testing/service-tokens.d.ts +0 -66
- package/lib/testing/service-tokens.js +0 -137
- package/lib/testing/tier-mock.d.ts +0 -44
- package/lib/testing/tier-mock.js +0 -65
- package/lib/testing/user-tokens.d.ts +0 -75
- package/lib/testing/user-tokens.js +0 -115
|
@@ -2,15 +2,13 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import crypto from 'crypto';
|
|
4
4
|
import { createEnvRedisClient, createRedisReadyGate } from './env-redis.js';
|
|
5
|
+
import { envInt } from '../utils/env.js';
|
|
5
6
|
import { createLogger } from '../utils/logger.js';
|
|
6
7
|
import { errorMessage } from '../utils/response.js';
|
|
7
8
|
const logger = createLogger('sse-ticket-store');
|
|
8
9
|
function newTicketId() {
|
|
9
10
|
return crypto.randomBytes(24).toString('base64url');
|
|
10
11
|
}
|
|
11
|
-
function errMsg(err) {
|
|
12
|
-
return errorMessage(err);
|
|
13
|
-
}
|
|
14
12
|
/** In-memory backend — single-process fallback when Redis isn't configured. */
|
|
15
13
|
export function createMemorySseTicketStore(config) {
|
|
16
14
|
const tickets = new Map();
|
|
@@ -117,7 +115,7 @@ export function createRedisSseTicketStore(redis, config) {
|
|
|
117
115
|
return { ok: false, reason: outcome === 'org' ? 'org' : 'total' };
|
|
118
116
|
}
|
|
119
117
|
catch (err) {
|
|
120
|
-
logger.warn('SSE ticket issue failed (fail-closed)', { error:
|
|
118
|
+
logger.warn('SSE ticket issue failed (fail-closed)', { error: errorMessage(err) });
|
|
121
119
|
return { ok: false, reason: 'total' };
|
|
122
120
|
}
|
|
123
121
|
},
|
|
@@ -133,11 +131,11 @@ export function createRedisSseTicketStore(redis, config) {
|
|
|
133
131
|
// Free the live-count slots now rather than at expiry. Best-effort: a
|
|
134
132
|
// failure here only delays the slot until the member's expiry score.
|
|
135
133
|
await Promise.all([redis.zrem(orgSetKey(rec.orgId), ticketId), redis.zrem(totalSetKey, ticketId)])
|
|
136
|
-
.catch((err) => logger.debug('SSE ticket slot release failed', { error:
|
|
134
|
+
.catch((err) => logger.debug('SSE ticket slot release failed', { error: errorMessage(err) }));
|
|
137
135
|
return rec;
|
|
138
136
|
}
|
|
139
137
|
catch (err) {
|
|
140
|
-
logger.warn('SSE ticket consume failed (fail-closed)', { error:
|
|
138
|
+
logger.warn('SSE ticket consume failed (fail-closed)', { error: errorMessage(err) });
|
|
141
139
|
return null;
|
|
142
140
|
}
|
|
143
141
|
},
|
|
@@ -147,7 +145,7 @@ export function createRedisSseTicketStore(redis, config) {
|
|
|
147
145
|
await redis.set(ownerKey(subject), orgId, 'PX', Math.max(1, Math.ceil(ownerTtlMs)));
|
|
148
146
|
}
|
|
149
147
|
catch (err) {
|
|
150
|
-
logger.warn('SSE stream-owner bind failed', { error:
|
|
148
|
+
logger.warn('SSE stream-owner bind failed', { error: errorMessage(err) });
|
|
151
149
|
}
|
|
152
150
|
},
|
|
153
151
|
async getOwner(subject) {
|
|
@@ -157,12 +155,29 @@ export function createRedisSseTicketStore(redis, config) {
|
|
|
157
155
|
stop() { },
|
|
158
156
|
};
|
|
159
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* The deploy-wide ticket caps: `SSE_MAX_TOTAL_TICKETS` (default 1000) and
|
|
160
|
+
* `SSE_MAX_TICKETS_PER_ORG` (default 10). One reader so every channel parses
|
|
161
|
+
* them the same way.
|
|
162
|
+
*/
|
|
163
|
+
export function envSseTicketCaps() {
|
|
164
|
+
return {
|
|
165
|
+
maxTotal: envInt('SSE_MAX_TOTAL_TICKETS', 1000, { min: 1 }),
|
|
166
|
+
maxPerOrg: envInt('SSE_MAX_TICKETS_PER_ORG', 10, { min: 1 }),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
160
169
|
/**
|
|
161
170
|
* Build an {@link SseTicketStore} from the standard Redis env (`REDIS_URL` or
|
|
162
171
|
* `REDIS_SENTINELS`): the Redis backend when configured (multi-replica safe),
|
|
163
172
|
* otherwise the in-memory single-process backend.
|
|
164
173
|
*/
|
|
165
|
-
export function createEnvSseTicketStore(
|
|
174
|
+
export function createEnvSseTicketStore(options) {
|
|
175
|
+
const caps = envSseTicketCaps();
|
|
176
|
+
const config = {
|
|
177
|
+
...options,
|
|
178
|
+
maxTotal: options.maxTotal ?? caps.maxTotal,
|
|
179
|
+
maxPerOrg: options.maxPerOrg ?? caps.maxPerOrg,
|
|
180
|
+
};
|
|
166
181
|
const redis = createEnvRedisClient('sse-ticket');
|
|
167
182
|
if (redis) {
|
|
168
183
|
logger.info('SSE ticket store: Redis backend (multi-replica)', { keyPrefix: config.keyPrefix });
|
|
@@ -171,4 +186,4 @@ export function createEnvSseTicketStore(config) {
|
|
|
171
186
|
logger.info('SSE ticket store: in-memory backend (single-process fallback)', { keyPrefix: config.keyPrefix });
|
|
172
187
|
return createMemorySseTicketStore(config);
|
|
173
188
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zc2UtdGlja2V0LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBNkRoRCxTQUFTLFdBQVc7SUFDbEIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBWTtJQUMxQixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQUE0QjtJQUVyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxHQUFTLEVBQUU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxLQUFLLE1B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QUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDcEIsTUFBTSxLQUFLLEVBQUUsQ0FBQztZQUNkLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxLQUF3QyxDQUFDO0tBQzlDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUE0QjtJQUNsRSxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBaUIsWUFBWSxDQUFDLENBQUM7SUFDakUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEcsT0FBTyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsK0RBQStELEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUcsT0FBTywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3NlLXRpY2tldC1zdG9yZScpO1xuXG4vKiogV2hhdCBhIHRpY2tldCBhdXRob3JpemVzOiB0aGUgb3duaW5nIG9yZyBhbmQsIGZvciBzdWJqZWN0LWJvdW5kIGNoYW5uZWxzLCB0aGUgc3RyZWFtIHN1YmplY3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFJlY29yZCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBTdHJlYW0gc3ViamVjdCB0aGUgdGlja2V0IGlzIGJvdW5kIHRvIChlLmcuIGEgYnVpbGQtbG9nIHJlcXVlc3RJZCkuIEFic2VudCBmb3Igb3JnLWtleWVkIGNoYW5uZWxzLiAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xufVxuXG4vKiogUmVzdWx0IG9mIHtAbGluayBTc2VUaWNrZXRTdG9yZS5pc3N1ZX0uICovXG5leHBvcnQgdHlwZSBTc2VUaWNrZXRJc3N1ZVJlc3VsdCA9XG4gIHwgeyBvazogdHJ1ZTsgdGlja2V0OiBzdHJpbmcgfVxuICB8IHsgb2s6IGZhbHNlOyByZWFzb246ICd0b3RhbCcgfCAnb3JnJyB9O1xuXG4vKipcbiAqIFRoZSBPTkUgc3RvcmUgZm9yIHNob3J0LWxpdmVkLCBzaW5nbGUtdXNlIFNTRSBhdXRoIHRpY2tldHMsIHBsdXMgdGhlXG4gKiBzdHJlYW0tb3duZXJzaGlwIGJpbmRpbmdzIHN1YmplY3QtYm91bmQgY2hhbm5lbHMgbmVlZC5cbiAqXG4gKiBBIGNsaWVudCBleGNoYW5nZXMgaXRzIEpXVCBmb3IgYSB0aWNrZXQgKHNvIHRoZSB0b2tlbiBuZXZlciBsYW5kcyBpbiBhblxuICogRXZlbnRTb3VyY2UgcXVlcnkgc3RyaW5nIC8gYWNjZXNzIGxvZyksIHRoZW4gcmVkZWVtcyBpdCBvbiB0aGUgU1NFIGBHRVRgLlxuICpcbiAqIC0gKipUaWNrZXRzKiogYXJlIHNpbmdsZS11c2UgYWNyb3NzIHBvZHM6IHRoZSBSZWRpcyBiYWNrZW5kIHJlZGVlbXMgd2l0aFxuICogICBgR0VUREVMYCwgc28gdHdvIHBvZHMgY2FuIG5ldmVyIGJvdGggc3BlbmQgb25lIHRpY2tldC5cbiAqIC0gKipDYXBzIGNvdW50IExJVkUgdGlja2V0cyoqIChpc3N1ZWQsIG5vdCB5ZXQgcmVkZWVtZWQsIG5vdCBleHBpcmVkKSDigJQgcGVyIG9yZ1xuICogICBhbmQgaW4gdG90YWwuIEEgcmVkZWVtZWQgb3IgZXhwaXJlZCB0aWNrZXQgZnJlZXMgaXRzIHNsb3QgaW1tZWRpYXRlbHkuXG4gKiAtICoqT3duZXJzaGlwKiogcmVjb3JkcyB3aGljaCBvcmcgb3ducyBhIHN0cmVhbSBzdWJqZWN0LCBzbyBhIHN1YmplY3QtYm91bmRcbiAqICAgY2hhbm5lbCBjYW4gcmVmdXNlIHRvIG1pbnQgYSB0aWNrZXQgZm9yIGFub3RoZXIgb3JnJ3Mgc3RyZWFtLlxuICpcbiAqIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlc2Ugc2VtYW50aWNzOyB0aGUgaW4tbWVtb3J5IG9uZSBpcyBjb3JyZWN0IGZvciBhXG4gKiBzaW5nbGUgcHJvY2VzcyBvbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFN0b3JlIHtcbiAgLyoqIE1pbnQgYSB0aWNrZXQgZm9yIGBvcmdJZGAgKG9wdGlvbmFsbHkgYm91bmQgdG8gYHN1YmplY3RgKSwgb3IgcmVqZWN0IHdoZW4gYSBsaXZlLXRpY2tldCBjYXAgaXMgcmVhY2hlZC4gKi9cbiAgaXNzdWUob3JnSWQ6IHN0cmluZywgc3ViamVjdD86IHN0cmluZyk6IFByb21pc2U8U3NlVGlja2V0SXNzdWVSZXN1bHQ+O1xuICAvKiogUmVkZWVtIGEgdGlja2V0IGV4YWN0bHkgb25jZTsgbnVsbCB3aGVuIHVua25vd24sIGV4cGlyZWQgb3IgYWxyZWFkeSBzcGVudC4gKi9cbiAgY29uc3VtZSh0aWNrZXRJZDogc3RyaW5nKTogUHJvbWlzZTxTc2VUaWNrZXRSZWNvcmQgfCBudWxsPjtcbiAgLyoqIFJlY29yZCB0aGUgb3JnIHRoYXQgb3ducyBgc3ViamVjdGAgZm9yIGB0dGxNc2AuICovXG4gIGJpbmRPd25lcihzdWJqZWN0OiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHR0bE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhlIG9yZyB0aGF0IG93bnMgYHN1YmplY3RgLCBvciBudWxsIHdoZW4gbm9uZSBpcyBib3VuZC4gVGhyb3dzIHdoZW4gdGhlIGJhY2tlbmQgY2FuJ3QgYW5zd2VyLiAqL1xuICBnZXRPd25lcihzdWJqZWN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAvKiogUmVsZWFzZSB0aW1lcnMvcmVzb3VyY2VzLiBJbi1tZW1vcnkgY2xlYXJzIGl0cyBzd2VlcCBpbnRlcnZhbDsgUmVkaXMgaXMgYSBuby1vcC4gKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKiogQ2FwcyArIFRUTCBmb3IgdGhlIHRpY2tldCBzdG9yZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0U3RvcmVDb25maWcge1xuICAvKiogVGlja2V0IGxpZmV0aW1lIOKAlCBsb25nIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBvcGVuIHRoZSBFdmVudFNvdXJjZS4gKi9cbiAgdHRsTXM6IG51bWJlcjtcbiAgLyoqIENhcCBvbiBMSVZFIHRpY2tldHMgYWNyb3NzIGFsbCBvcmdzIChhYnVzZSAvIG1lbW9yeSBib3VuZCkuICovXG4gIG1heFRvdGFsOiBudW1iZXI7XG4gIC8qKiBDYXAgb24gTElWRSB0aWNrZXRzIHBlciBvcmcgKHNpbmdsZS10ZW5hbnQgZmFpcm5lc3MgYm91bmQpLiAqL1xuICBtYXhQZXJPcmc6IG51bWJlcjtcbiAgLyoqXG4gICAqIEtleSBuYW1lc3BhY2Ugc28gaW5kZXBlbmRlbnQgY2hhbm5lbHMgKG1lc3NhZ2Ugbm90aWZpY2F0aW9ucywgcmVwb3J0aW5nXG4gICAqIGV4ZWN1dGlvbi1zdGF0dXMsIGEgc2VydmljZSdzIGJ1aWxkLWxvZyBzdHJlYW0pIG5ldmVyIHNoYXJlIHRpY2tldHMsIGNhcHNcbiAgICogb3Igb3duZXJzaGlwIGJpbmRpbmdzIOKAlCBhIHRpY2tldCBtaW50ZWQgZm9yIG9uZSBjaGFubmVsIG11c3Qgbm90IGJlXG4gICAqIHJlZGVlbWFibGUgb24gYW5vdGhlci4gT21pdCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLlxuICAgKi9cbiAga2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBuZXdUaWNrZXRJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDI0KS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG59XG5cbmZ1bmN0aW9uIGVyck1zZyhlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXJyb3JNZXNzYWdlKGVycik7XG59XG5cbi8qKiBJbi1tZW1vcnkgYmFja2VuZCDigJQgc2luZ2xlLXByb2Nlc3MgZmFsbGJhY2sgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNzZVRpY2tldFN0b3JlKGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGludGVyZmFjZSBFbnRyeSBleHRlbmRzIFNzZVRpY2tldFJlY29yZCB7IGV4cGlyZXNBdDogbnVtYmVyIH1cbiAgY29uc3QgdGlja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgb3JnSWQ6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4oKTtcblxuICBjb25zdCBzd2VlcCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCB0XSBvZiB0aWNrZXRzKSBpZiAobm93ID49IHQuZXhwaXJlc0F0KSB0aWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+PSBvLmV4cGlyZXNBdCkgb3duZXJzLmRlbGV0ZShpZCk7XG4gIH07XG4gIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoc3dlZXAsIE1hdGgubWF4KDFfMDAwLCBjb25maWcudHRsTXMpKTtcbiAgdGltZXIudW5yZWYoKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGlzc3VlKG9yZ0lkLCBzdWJqZWN0KSB7XG4gICAgICBzd2VlcCgpO1xuICAgICAgaWYgKHRpY2tldHMuc2l6ZSA+PSBjb25maWcubWF4VG90YWwpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICBsZXQgZm9yT3JnID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQpIGZvck9yZysrO1xuICAgICAgaWYgKGZvck9yZyA+PSBjb25maWcubWF4UGVyT3JnKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZycgfTtcbiAgICAgIGNvbnN0IHRpY2tldCA9IG5ld1RpY2tldElkKCk7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXQsIHsgb3JnSWQsIC4uLihzdWJqZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzdWJqZWN0IH0pLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBjb25maWcudHRsTXMgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICBjb25zdCB0ID0gdGlja2V0cy5nZXQodGlja2V0SWQpO1xuICAgICAgdGlja2V0cy5kZWxldGUodGlja2V0SWQpOyAvLyBzaW5nbGUtdXNlIOKAlCBnb25lIHdoZXRoZXIgb3Igbm90IGl0IHdhcyB2YWxpZFxuICAgICAgaWYgKCF0IHx8IERhdGUubm93KCkgPj0gdC5leHBpcmVzQXQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgb3JnSWQ6IHQub3JnSWQsIC4uLih0LnN1YmplY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN1YmplY3Q6IHQuc3ViamVjdCB9KSB9O1xuICAgIH0sXG4gICAgYXN5bmMgYmluZE93bmVyKHN1YmplY3QsIG9yZ0lkLCB0dGxNcykge1xuICAgICAgb3duZXJzLnNldChzdWJqZWN0LCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE93bmVyKHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IG8gPSBvd25lcnMuZ2V0KHN1YmplY3QpO1xuICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUoc3ViamVjdCk7IHJldHVybiBudWxsOyB9XG4gICAgICByZXR1cm4gby5vcmdJZDtcbiAgICB9LFxuICAgIHN0b3AoKSB7IGNsZWFySW50ZXJ2YWwodGltZXIpOyB9LFxuICB9O1xufVxuXG4vKiogTWluaW1hbCBpb3JlZGlzIHN1cmZhY2UgdGhlIFJlZGlzIGJhY2tlbmQgbmVlZHMgKEdFVERFTCByZXF1aXJlcyBSZWRpcyDiiaUgNi4yKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0UmVkaXMgZXh0ZW5kcyBSZWFkeUF3YXJlUmVkaXMge1xuICBldmFsKHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICB6cmVtKGtleTogc3RyaW5nLCAuLi5tZW1iZXJzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbGl2ZS1jb3VudCBpc3N1ZS4gUHJ1bmVzIGV4cGlyZWQgbWVtYmVycyBmcm9tIGJvdGggY2FwIHNldHMsIGNoZWNrcyB0aGVcbiAqIHRvdGFsIHRoZW4gdGhlIHBlci1vcmcgY2FwLCBhbmQgb25seSB0aGVuIHN0b3JlcyB0aGUgdGlja2V0IGFuZCByZWNvcmRzIGl0IGluXG4gKiBib3RoIHNldHMg4oCUIHNvIGNvbmN1cnJlbnQgbWludHMgY2FuJ3Qgb3ZlcnNob290IGEgY2FwIGFuZCBhIGNhcCBjYW4gbmV2ZXJcbiAqIHN0aWNrIChldmVyeSBtZW1iZXIgY2FycmllcyBpdHMgb3duIGV4cGlyeSBzY29yZSBhbmQgZXZlcnkga2V5IGEgVFRMKS5cbiAqXG4gKiBLRVlTOiB0b3RhbCB6c2V0LCBvcmcgenNldCwgdGlja2V0IGtleS5cbiAqIEFSR1Y6IHR0bE1zLCBtYXhUb3RhbCwgbWF4UGVyT3JnLCB0aWNrZXRJZCwgcmVjb3JkIEpTT04uXG4gKiBVc2VzIHRoZSBzZXJ2ZXIgY2xvY2sgc28gZXZlcnkgcG9kIGFncmVlcyBvbiBcImV4cGlyZWRcIi5cbiAqL1xuY29uc3QgSVNTVUVfU0NSSVBUID0gYFxubG9jYWwgdCA9IHJlZGlzLmNhbGwoJ1RJTUUnKVxubG9jYWwgbm93ID0gdG9udW1iZXIodFsxXSkgKiAxMDAwICsgbWF0aC5mbG9vcih0b251bWJlcih0WzJdKSAvIDEwMDApXG5sb2NhbCB0dGwgPSB0b251bWJlcihBUkdWWzFdKVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMV0sICctaW5mJywgbm93KVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMl0sICctaW5mJywgbm93KVxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzFdKSA+PSB0b251bWJlcihBUkdWWzJdKSB0aGVuIHJldHVybiAndG90YWwnIGVuZFxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzJdKSA+PSB0b251bWJlcihBUkdWWzNdKSB0aGVuIHJldHVybiAnb3JnJyBlbmRcbnJlZGlzLmNhbGwoJ1NFVCcsIEtFWVNbM10sIEFSR1ZbNV0sICdQWCcsIHR0bClcbnJlZGlzLmNhbGwoJ1pBREQnLCBLRVlTWzFdLCBub3cgKyB0dGwsIEFSR1ZbNF0pXG5yZWRpcy5jYWxsKCdaQUREJywgS0VZU1syXSwgbm93ICsgdHRsLCBBUkdWWzRdKVxucmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIHR0bClcbnJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBLRVlTWzJdLCB0dGwpXG5yZXR1cm4gJ29rJ2A7XG5cbi8qKlxuICogUmVkaXMgYmFja2VuZCDigJQgbXVsdGktcmVwbGljYSBzYWZlLlxuICpcbiAqIEZhaWwtQ0xPU0VEOiBhIFJlZGlzIGVycm9yIG1ha2VzIGBpc3N1ZWAgcmVqZWN0IChgdG90YWxgKSwgYGNvbnN1bWVgIHJldHVyblxuICogbnVsbCBhbmQgYGdldE93bmVyYCB0aHJvdywgc28gYW4gb3V0YWdlIGRlZ3JhZGVzIHRvIFwibm8gbGl2ZSBzdHJlYW1cIiByYXRoZXJcbiAqIHRoYW4gaGFuZGluZyBvdXQgb3IgYWNjZXB0aW5nIHVudmFsaWRhdGVkIHRpY2tldHMuIGBiaW5kT3duZXJgIGlzIGJlc3QtZWZmb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpczogU3NlVGlja2V0UmVkaXMsIGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGNvbnN0IG5zID0gY29uZmlnLmtleVByZWZpeCA/IGAke2NvbmZpZy5rZXlQcmVmaXh9OmAgOiAnJztcbiAgY29uc3QgdGlja2V0S2V5ID0gKHQ6IHN0cmluZykgPT4gYCR7bnN9c3NlOnRrOiR7dH1gO1xuICBjb25zdCBvcmdTZXRLZXkgPSAobzogc3RyaW5nKSA9PiBgJHtuc31zc2U6dGt6Om9yZzoke299YDtcbiAgY29uc3QgdG90YWxTZXRLZXkgPSBgJHtuc31zc2U6dGt6OmFsbGA7XG4gIGNvbnN0IG93bmVyS2V5ID0gKHM6IHN0cmluZykgPT4gYCR7bnN9c3NlOm93bmVyOiR7c31gO1xuICBjb25zdCB0dGxNcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjb25maWcudHRsTXMpKTtcbiAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IHdhaXQgKGJvdW5kZWQpIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvblxuICAvLyBzbyB0aGUgZmlyc3QgbWludC9yZWRlZW0gYWZ0ZXIgYm9vdCBpc24ndCByZWplY3RlZCBvdXRyaWdodC5cbiAgY29uc3QgcmVhZHkgPSBjcmVhdGVSZWRpc1JlYWR5R2F0ZShyZWRpcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc3N1ZShvcmdJZCwgc3ViamVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVhZHkoKTtcbiAgICAgICAgY29uc3QgdGlja2V0ID0gbmV3VGlja2V0SWQoKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBTc2VUaWNrZXRSZWNvcmQgPSB7IG9yZ0lkLCAuLi4oc3ViamVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3ViamVjdCB9KSB9O1xuICAgICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgcmVkaXMuZXZhbChcbiAgICAgICAgICBJU1NVRV9TQ1JJUFQsIDMsIHRvdGFsU2V0S2V5LCBvcmdTZXRLZXkob3JnSWQpLCB0aWNrZXRLZXkodGlja2V0KSxcbiAgICAgICAgICB0dGxNcywgY29uZmlnLm1heFRvdGFsLCBjb25maWcubWF4UGVyT3JnLCB0aWNrZXQsIEpTT04uc3RyaW5naWZ5KHJlY29yZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvdXRjb21lID09PSAnb2snKSByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiBvdXRjb21lID09PSAnb3JnJyA/ICdvcmcnIDogJ3RvdGFsJyB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGlzc3VlIGZhaWxlZCAoZmFpbC1jbG9zZWQpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXRkZWwodGlja2V0S2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNzZVRpY2tldFJlY29yZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZWM/Lm9yZ0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZyZWUgdGhlIGxpdmUtY291bnQgc2xvdHMgbm93IHJhdGhlciB0aGFuIGF0IGV4cGlyeS4gQmVzdC1lZmZvcnQ6IGFcbiAgICAgICAgLy8gZmFpbHVyZSBoZXJlIG9ubHkgZGVsYXlzIHRoZSBzbG90IHVudGlsIHRoZSBtZW1iZXIncyBleHBpcnkgc2NvcmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZWRpcy56cmVtKG9yZ1NldEtleShyZWMub3JnSWQpLCB0aWNrZXRJZCksIHJlZGlzLnpyZW0odG90YWxTZXRLZXksIHRpY2tldElkKV0pXG4gICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IGxvZ2dlci5kZWJ1ZygnU1NFIHRpY2tldCBzbG90IHJlbGVhc2UgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSkpO1xuICAgICAgICByZXR1cm4gcmVjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGNvbnN1bWUgZmFpbGVkIChmYWlsLWNsb3NlZCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBiaW5kT3duZXIoc3ViamVjdCwgb3JnSWQsIG93bmVyVHRsTXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChvd25lcktleShzdWJqZWN0KSwgb3JnSWQsICdQWCcsIE1hdGgubWF4KDEsIE1hdGguY2VpbChvd25lclR0bE1zKSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBnZXRPd25lcihzdWJqZWN0KSB7XG4gICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgcmV0dXJuIHJlZGlzLmdldChvd25lcktleShzdWJqZWN0KSk7XG4gICAgfSxcbiAgICBzdG9wKCkgeyAvKiBrZXlzIGV4cGlyZSBvbiB0aGVpciBvd24gVFRMICovIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIFNzZVRpY2tldFN0b3JlfSBmcm9tIHRoZSBzdGFuZGFyZCBSZWRpcyBlbnYgKGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfU0VOVElORUxTYCk6IHRoZSBSZWRpcyBiYWNrZW5kIHdoZW4gY29uZmlndXJlZCAobXVsdGktcmVwbGljYSBzYWZlKSxcbiAqIG90aGVyd2lzZSB0aGUgaW4tbWVtb3J5IHNpbmdsZS1wcm9jZXNzIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZTc2VUaWNrZXRTdG9yZShjb25maWc6IFNzZVRpY2tldFN0b3JlQ29uZmlnKTogU3NlVGlja2V0U3RvcmUge1xuICBjb25zdCByZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFNzZVRpY2tldFJlZGlzPignc3NlLXRpY2tldCcpO1xuICBpZiAocmVkaXMpIHtcbiAgICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogUmVkaXMgYmFja2VuZCAobXVsdGktcmVwbGljYSknLCB7IGtleVByZWZpeDogY29uZmlnLmtleVByZWZpeCB9KTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpcywgY29uZmlnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogaW4tbWVtb3J5IGJhY2tlbmQgKHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrKScsIHsga2V5UHJlZml4OiBjb25maWcua2V5UHJlZml4IH0pO1xuICByZXR1cm4gY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUoY29uZmlnKTtcbn1cbiJdfQ==
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zc2UtdGlja2V0LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQTZEaEQsU0FBUyxXQUFXO0lBQ2xCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsMEJBQTBCLENBQUMsTUFBNEI7SUFFckUsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWdELENBQUM7SUFFdkUsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTztZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTO2dCQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJ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Q0FBQywrREFBK0QsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RyxPQUFPLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCwgY3JlYXRlUmVkaXNSZWFkeUdhdGUsIHR5cGUgUmVhZHlBd2FyZVJlZGlzIH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3NlLXRpY2tldC1zdG9yZScpO1xuXG4vKiogV2hhdCBhIHRpY2tldCBhdXRob3JpemVzOiB0aGUgb3duaW5nIG9yZyBhbmQsIGZvciBzdWJqZWN0LWJvdW5kIGNoYW5uZWxzLCB0aGUgc3RyZWFtIHN1YmplY3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFJlY29yZCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBTdHJlYW0gc3ViamVjdCB0aGUgdGlja2V0IGlzIGJvdW5kIHRvIChlLmcuIGEgYnVpbGQtbG9nIHJlcXVlc3RJZCkuIEFic2VudCBmb3Igb3JnLWtleWVkIGNoYW5uZWxzLiAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xufVxuXG4vKiogUmVzdWx0IG9mIHtAbGluayBTc2VUaWNrZXRTdG9yZS5pc3N1ZX0uICovXG5leHBvcnQgdHlwZSBTc2VUaWNrZXRJc3N1ZVJlc3VsdCA9XG4gIHwgeyBvazogdHJ1ZTsgdGlja2V0OiBzdHJpbmcgfVxuICB8IHsgb2s6IGZhbHNlOyByZWFzb246ICd0b3RhbCcgfCAnb3JnJyB9O1xuXG4vKipcbiAqIFRoZSBPTkUgc3RvcmUgZm9yIHNob3J0LWxpdmVkLCBzaW5nbGUtdXNlIFNTRSBhdXRoIHRpY2tldHMsIHBsdXMgdGhlXG4gKiBzdHJlYW0tb3duZXJzaGlwIGJpbmRpbmdzIHN1YmplY3QtYm91bmQgY2hhbm5lbHMgbmVlZC5cbiAqXG4gKiBBIGNsaWVudCBleGNoYW5nZXMgaXRzIEpXVCBmb3IgYSB0aWNrZXQgKHNvIHRoZSB0b2tlbiBuZXZlciBsYW5kcyBpbiBhblxuICogRXZlbnRTb3VyY2UgcXVlcnkgc3RyaW5nIC8gYWNjZXNzIGxvZyksIHRoZW4gcmVkZWVtcyBpdCBvbiB0aGUgU1NFIGBHRVRgLlxuICpcbiAqIC0gKipUaWNrZXRzKiogYXJlIHNpbmdsZS11c2UgYWNyb3NzIHBvZHM6IHRoZSBSZWRpcyBiYWNrZW5kIHJlZGVlbXMgd2l0aFxuICogICBgR0VUREVMYCwgc28gdHdvIHBvZHMgY2FuIG5ldmVyIGJvdGggc3BlbmQgb25lIHRpY2tldC5cbiAqIC0gKipDYXBzIGNvdW50IExJVkUgdGlja2V0cyoqIChpc3N1ZWQsIG5vdCB5ZXQgcmVkZWVtZWQsIG5vdCBleHBpcmVkKSDigJQgcGVyIG9yZ1xuICogICBhbmQgaW4gdG90YWwuIEEgcmVkZWVtZWQgb3IgZXhwaXJlZCB0aWNrZXQgZnJlZXMgaXRzIHNsb3QgaW1tZWRpYXRlbHkuXG4gKiAtICoqT3duZXJzaGlwKiogcmVjb3JkcyB3aGljaCBvcmcgb3ducyBhIHN0cmVhbSBzdWJqZWN0LCBzbyBhIHN1YmplY3QtYm91bmRcbiAqICAgY2hhbm5lbCBjYW4gcmVmdXNlIHRvIG1pbnQgYSB0aWNrZXQgZm9yIGFub3RoZXIgb3JnJ3Mgc3RyZWFtLlxuICpcbiAqIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlc2Ugc2VtYW50aWNzOyB0aGUgaW4tbWVtb3J5IG9uZSBpcyBjb3JyZWN0IGZvciBhXG4gKiBzaW5nbGUgcHJvY2VzcyBvbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFN0b3JlIHtcbiAgLyoqIE1pbnQgYSB0aWNrZXQgZm9yIGBvcmdJZGAgKG9wdGlvbmFsbHkgYm91bmQgdG8gYHN1YmplY3RgKSwgb3IgcmVqZWN0IHdoZW4gYSBsaXZlLXRpY2tldCBjYXAgaXMgcmVhY2hlZC4gKi9cbiAgaXNzdWUob3JnSWQ6IHN0cmluZywgc3ViamVjdD86IHN0cmluZyk6IFByb21pc2U8U3NlVGlja2V0SXNzdWVSZXN1bHQ+O1xuICAvKiogUmVkZWVtIGEgdGlja2V0IGV4YWN0bHkgb25jZTsgbnVsbCB3aGVuIHVua25vd24sIGV4cGlyZWQgb3IgYWxyZWFkeSBzcGVudC4gKi9cbiAgY29uc3VtZSh0aWNrZXRJZDogc3RyaW5nKTogUHJvbWlzZTxTc2VUaWNrZXRSZWNvcmQgfCBudWxsPjtcbiAgLyoqIFJlY29yZCB0aGUgb3JnIHRoYXQgb3ducyBgc3ViamVjdGAgZm9yIGB0dGxNc2AuICovXG4gIGJpbmRPd25lcihzdWJqZWN0OiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHR0bE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhlIG9yZyB0aGF0IG93bnMgYHN1YmplY3RgLCBvciBudWxsIHdoZW4gbm9uZSBpcyBib3VuZC4gVGhyb3dzIHdoZW4gdGhlIGJhY2tlbmQgY2FuJ3QgYW5zd2VyLiAqL1xuICBnZXRPd25lcihzdWJqZWN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAvKiogUmVsZWFzZSB0aW1lcnMvcmVzb3VyY2VzLiBJbi1tZW1vcnkgY2xlYXJzIGl0cyBzd2VlcCBpbnRlcnZhbDsgUmVkaXMgaXMgYSBuby1vcC4gKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKiogQ2FwcyArIFRUTCBmb3IgdGhlIHRpY2tldCBzdG9yZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0U3RvcmVDb25maWcge1xuICAvKiogVGlja2V0IGxpZmV0aW1lIOKAlCBsb25nIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBvcGVuIHRoZSBFdmVudFNvdXJjZS4gKi9cbiAgdHRsTXM6IG51bWJlcjtcbiAgLyoqIENhcCBvbiBMSVZFIHRpY2tldHMgYWNyb3NzIGFsbCBvcmdzIChhYnVzZSAvIG1lbW9yeSBib3VuZCkuICovXG4gIG1heFRvdGFsOiBudW1iZXI7XG4gIC8qKiBDYXAgb24gTElWRSB0aWNrZXRzIHBlciBvcmcgKHNpbmdsZS10ZW5hbnQgZmFpcm5lc3MgYm91bmQpLiAqL1xuICBtYXhQZXJPcmc6IG51bWJlcjtcbiAgLyoqXG4gICAqIEtleSBuYW1lc3BhY2Ugc28gaW5kZXBlbmRlbnQgY2hhbm5lbHMgKG1lc3NhZ2Ugbm90aWZpY2F0aW9ucywgcmVwb3J0aW5nXG4gICAqIGV4ZWN1dGlvbi1zdGF0dXMsIGEgc2VydmljZSdzIGJ1aWxkLWxvZyBzdHJlYW0pIG5ldmVyIHNoYXJlIHRpY2tldHMsIGNhcHNcbiAgICogb3Igb3duZXJzaGlwIGJpbmRpbmdzIOKAlCBhIHRpY2tldCBtaW50ZWQgZm9yIG9uZSBjaGFubmVsIG11c3Qgbm90IGJlXG4gICAqIHJlZGVlbWFibGUgb24gYW5vdGhlci4gT21pdCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLlxuICAgKi9cbiAga2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBuZXdUaWNrZXRJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDI0KS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG59XG5cbi8qKiBJbi1tZW1vcnkgYmFja2VuZCDigJQgc2luZ2xlLXByb2Nlc3MgZmFsbGJhY2sgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNzZVRpY2tldFN0b3JlKGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGludGVyZmFjZSBFbnRyeSBleHRlbmRzIFNzZVRpY2tldFJlY29yZCB7IGV4cGlyZXNBdDogbnVtYmVyIH1cbiAgY29uc3QgdGlja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgb3JnSWQ6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4oKTtcblxuICBjb25zdCBzd2VlcCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCB0XSBvZiB0aWNrZXRzKSBpZiAobm93ID49IHQuZXhwaXJlc0F0KSB0aWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+PSBvLmV4cGlyZXNBdCkgb3duZXJzLmRlbGV0ZShpZCk7XG4gIH07XG4gIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoc3dlZXAsIE1hdGgubWF4KDFfMDAwLCBjb25maWcudHRsTXMpKTtcbiAgdGltZXIudW5yZWYoKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGlzc3VlKG9yZ0lkLCBzdWJqZWN0KSB7XG4gICAgICBzd2VlcCgpO1xuICAgICAgaWYgKHRpY2tldHMuc2l6ZSA+PSBjb25maWcubWF4VG90YWwpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICBsZXQgZm9yT3JnID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQpIGZvck9yZysrO1xuICAgICAgaWYgKGZvck9yZyA+PSBjb25maWcubWF4UGVyT3JnKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZycgfTtcbiAgICAgIGNvbnN0IHRpY2tldCA9IG5ld1RpY2tldElkKCk7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXQsIHsgb3JnSWQsIC4uLihzdWJqZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzdWJqZWN0IH0pLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBjb25maWcudHRsTXMgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICBjb25zdCB0ID0gdGlja2V0cy5nZXQodGlja2V0SWQpO1xuICAgICAgdGlja2V0cy5kZWxldGUodGlja2V0SWQpOyAvLyBzaW5nbGUtdXNlIOKAlCBnb25lIHdoZXRoZXIgb3Igbm90IGl0IHdhcyB2YWxpZFxuICAgICAgaWYgKCF0IHx8IERhdGUubm93KCkgPj0gdC5leHBpcmVzQXQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgb3JnSWQ6IHQub3JnSWQsIC4uLih0LnN1YmplY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN1YmplY3Q6IHQuc3ViamVjdCB9KSB9O1xuICAgIH0sXG4gICAgYXN5bmMgYmluZE93bmVyKHN1YmplY3QsIG9yZ0lkLCB0dGxNcykge1xuICAgICAgb3duZXJzLnNldChzdWJqZWN0LCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE93bmVyKHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IG8gPSBvd25lcnMuZ2V0KHN1YmplY3QpO1xuICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUoc3ViamVjdCk7IHJldHVybiBudWxsOyB9XG4gICAgICByZXR1cm4gby5vcmdJZDtcbiAgICB9LFxuICAgIHN0b3AoKSB7IGNsZWFySW50ZXJ2YWwodGltZXIpOyB9LFxuICB9O1xufVxuXG4vKiogTWluaW1hbCBpb3JlZGlzIHN1cmZhY2UgdGhlIFJlZGlzIGJhY2tlbmQgbmVlZHMgKEdFVERFTCByZXF1aXJlcyBSZWRpcyDiiaUgNi4yKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0UmVkaXMgZXh0ZW5kcyBSZWFkeUF3YXJlUmVkaXMge1xuICBldmFsKHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICB6cmVtKGtleTogc3RyaW5nLCAuLi5tZW1iZXJzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbGl2ZS1jb3VudCBpc3N1ZS4gUHJ1bmVzIGV4cGlyZWQgbWVtYmVycyBmcm9tIGJvdGggY2FwIHNldHMsIGNoZWNrcyB0aGVcbiAqIHRvdGFsIHRoZW4gdGhlIHBlci1vcmcgY2FwLCBhbmQgb25seSB0aGVuIHN0b3JlcyB0aGUgdGlja2V0IGFuZCByZWNvcmRzIGl0IGluXG4gKiBib3RoIHNldHMg4oCUIHNvIGNvbmN1cnJlbnQgbWludHMgY2FuJ3Qgb3ZlcnNob290IGEgY2FwIGFuZCBhIGNhcCBjYW4gbmV2ZXJcbiAqIHN0aWNrIChldmVyeSBtZW1iZXIgY2FycmllcyBpdHMgb3duIGV4cGlyeSBzY29yZSBhbmQgZXZlcnkga2V5IGEgVFRMKS5cbiAqXG4gKiBLRVlTOiB0b3RhbCB6c2V0LCBvcmcgenNldCwgdGlja2V0IGtleS5cbiAqIEFSR1Y6IHR0bE1zLCBtYXhUb3RhbCwgbWF4UGVyT3JnLCB0aWNrZXRJZCwgcmVjb3JkIEpTT04uXG4gKiBVc2VzIHRoZSBzZXJ2ZXIgY2xvY2sgc28gZXZlcnkgcG9kIGFncmVlcyBvbiBcImV4cGlyZWRcIi5cbiAqL1xuY29uc3QgSVNTVUVfU0NSSVBUID0gYFxubG9jYWwgdCA9IHJlZGlzLmNhbGwoJ1RJTUUnKVxubG9jYWwgbm93ID0gdG9udW1iZXIodFsxXSkgKiAxMDAwICsgbWF0aC5mbG9vcih0b251bWJlcih0WzJdKSAvIDEwMDApXG5sb2NhbCB0dGwgPSB0b251bWJlcihBUkdWWzFdKVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMV0sICctaW5mJywgbm93KVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMl0sICctaW5mJywgbm93KVxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzFdKSA+PSB0b251bWJlcihBUkdWWzJdKSB0aGVuIHJldHVybiAndG90YWwnIGVuZFxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzJdKSA+PSB0b251bWJlcihBUkdWWzNdKSB0aGVuIHJldHVybiAnb3JnJyBlbmRcbnJlZGlzLmNhbGwoJ1NFVCcsIEtFWVNbM10sIEFSR1ZbNV0sICdQWCcsIHR0bClcbnJlZGlzLmNhbGwoJ1pBREQnLCBLRVlTWzFdLCBub3cgKyB0dGwsIEFSR1ZbNF0pXG5yZWRpcy5jYWxsKCdaQUREJywgS0VZU1syXSwgbm93ICsgdHRsLCBBUkdWWzRdKVxucmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIHR0bClcbnJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBLRVlTWzJdLCB0dGwpXG5yZXR1cm4gJ29rJ2A7XG5cbi8qKlxuICogUmVkaXMgYmFja2VuZCDigJQgbXVsdGktcmVwbGljYSBzYWZlLlxuICpcbiAqIEZhaWwtQ0xPU0VEOiBhIFJlZGlzIGVycm9yIG1ha2VzIGBpc3N1ZWAgcmVqZWN0IChgdG90YWxgKSwgYGNvbnN1bWVgIHJldHVyblxuICogbnVsbCBhbmQgYGdldE93bmVyYCB0aHJvdywgc28gYW4gb3V0YWdlIGRlZ3JhZGVzIHRvIFwibm8gbGl2ZSBzdHJlYW1cIiByYXRoZXJcbiAqIHRoYW4gaGFuZGluZyBvdXQgb3IgYWNjZXB0aW5nIHVudmFsaWRhdGVkIHRpY2tldHMuIGBiaW5kT3duZXJgIGlzIGJlc3QtZWZmb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpczogU3NlVGlja2V0UmVkaXMsIGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGNvbnN0IG5zID0gY29uZmlnLmtleVByZWZpeCA/IGAke2NvbmZpZy5rZXlQcmVmaXh9OmAgOiAnJztcbiAgY29uc3QgdGlja2V0S2V5ID0gKHQ6IHN0cmluZykgPT4gYCR7bnN9c3NlOnRrOiR7dH1gO1xuICBjb25zdCBvcmdTZXRLZXkgPSAobzogc3RyaW5nKSA9PiBgJHtuc31zc2U6dGt6Om9yZzoke299YDtcbiAgY29uc3QgdG90YWxTZXRLZXkgPSBgJHtuc31zc2U6dGt6OmFsbGA7XG4gIGNvbnN0IG93bmVyS2V5ID0gKHM6IHN0cmluZykgPT4gYCR7bnN9c3NlOm93bmVyOiR7c31gO1xuICBjb25zdCB0dGxNcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjb25maWcudHRsTXMpKTtcbiAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IHdhaXQgKGJvdW5kZWQpIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvblxuICAvLyBzbyB0aGUgZmlyc3QgbWludC9yZWRlZW0gYWZ0ZXIgYm9vdCBpc24ndCByZWplY3RlZCBvdXRyaWdodC5cbiAgY29uc3QgcmVhZHkgPSBjcmVhdGVSZWRpc1JlYWR5R2F0ZShyZWRpcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc3N1ZShvcmdJZCwgc3ViamVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVhZHkoKTtcbiAgICAgICAgY29uc3QgdGlja2V0ID0gbmV3VGlja2V0SWQoKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBTc2VUaWNrZXRSZWNvcmQgPSB7IG9yZ0lkLCAuLi4oc3ViamVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3ViamVjdCB9KSB9O1xuICAgICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgcmVkaXMuZXZhbChcbiAgICAgICAgICBJU1NVRV9TQ1JJUFQsIDMsIHRvdGFsU2V0S2V5LCBvcmdTZXRLZXkob3JnSWQpLCB0aWNrZXRLZXkodGlja2V0KSxcbiAgICAgICAgICB0dGxNcywgY29uZmlnLm1heFRvdGFsLCBjb25maWcubWF4UGVyT3JnLCB0aWNrZXQsIEpTT04uc3RyaW5naWZ5KHJlY29yZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvdXRjb21lID09PSAnb2snKSByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiBvdXRjb21lID09PSAnb3JnJyA/ICdvcmcnIDogJ3RvdGFsJyB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGlzc3VlIGZhaWxlZCAoZmFpbC1jbG9zZWQpJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXRkZWwodGlja2V0S2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNzZVRpY2tldFJlY29yZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZWM/Lm9yZ0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZyZWUgdGhlIGxpdmUtY291bnQgc2xvdHMgbm93IHJhdGhlciB0aGFuIGF0IGV4cGlyeS4gQmVzdC1lZmZvcnQ6IGFcbiAgICAgICAgLy8gZmFpbHVyZSBoZXJlIG9ubHkgZGVsYXlzIHRoZSBzbG90IHVudGlsIHRoZSBtZW1iZXIncyBleHBpcnkgc2NvcmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZWRpcy56cmVtKG9yZ1NldEtleShyZWMub3JnSWQpLCB0aWNrZXRJZCksIHJlZGlzLnpyZW0odG90YWxTZXRLZXksIHRpY2tldElkKV0pXG4gICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IGxvZ2dlci5kZWJ1ZygnU1NFIHRpY2tldCBzbG90IHJlbGVhc2UgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSkpO1xuICAgICAgICByZXR1cm4gcmVjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGNvbnN1bWUgZmFpbGVkIChmYWlsLWNsb3NlZCknLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBiaW5kT3duZXIoc3ViamVjdCwgb3JnSWQsIG93bmVyVHRsTXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChvd25lcktleShzdWJqZWN0KSwgb3JnSWQsICdQWCcsIE1hdGgubWF4KDEsIE1hdGguY2VpbChvd25lclR0bE1zKSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBnZXRPd25lcihzdWJqZWN0KSB7XG4gICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgcmV0dXJuIHJlZGlzLmdldChvd25lcktleShzdWJqZWN0KSk7XG4gICAgfSxcbiAgICBzdG9wKCkgeyAvKiBrZXlzIGV4cGlyZSBvbiB0aGVpciBvd24gVFRMICovIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGRlcGxveS13aWRlIHRpY2tldCBjYXBzOiBgU1NFX01BWF9UT1RBTF9USUNLRVRTYCAoZGVmYXVsdCAxMDAwKSBhbmRcbiAqIGBTU0VfTUFYX1RJQ0tFVFNfUEVSX09SR2AgKGRlZmF1bHQgMTApLiBPbmUgcmVhZGVyIHNvIGV2ZXJ5IGNoYW5uZWwgcGFyc2VzXG4gKiB0aGVtIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudlNzZVRpY2tldENhcHMoKTogUGljazxTc2VUaWNrZXRTdG9yZUNvbmZpZywgJ21heFRvdGFsJyB8ICdtYXhQZXJPcmcnPiB7XG4gIHJldHVybiB7XG4gICAgbWF4VG90YWw6IGVudkludCgnU1NFX01BWF9UT1RBTF9USUNLRVRTJywgMTAwMCwgeyBtaW46IDEgfSksXG4gICAgbWF4UGVyT3JnOiBlbnZJbnQoJ1NTRV9NQVhfVElDS0VUU19QRVJfT1JHJywgMTAsIHsgbWluOiAxIH0pLFxuICB9O1xufVxuXG4vKioge0BsaW5rIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlfSBjb25maWc6IHRoZSBjYXBzIGRlZmF1bHQgdG8ge0BsaW5rIGVudlNzZVRpY2tldENhcHN9LiAqL1xuZXhwb3J0IHR5cGUgRW52U3NlVGlja2V0U3RvcmVDb25maWcgPSBPbWl0PFNzZVRpY2tldFN0b3JlQ29uZmlnLCAnbWF4VG90YWwnIHwgJ21heFBlck9yZyc+XG4gICYgUGFydGlhbDxQaWNrPFNzZVRpY2tldFN0b3JlQ29uZmlnLCAnbWF4VG90YWwnIHwgJ21heFBlck9yZyc+PjtcblxuLyoqXG4gKiBCdWlsZCBhbiB7QGxpbmsgU3NlVGlja2V0U3RvcmV9IGZyb20gdGhlIHN0YW5kYXJkIFJlZGlzIGVudiAoYFJFRElTX1VSTGAgb3JcbiAqIGBSRURJU19TRU5USU5FTFNgKTogdGhlIFJlZGlzIGJhY2tlbmQgd2hlbiBjb25maWd1cmVkIChtdWx0aS1yZXBsaWNhIHNhZmUpLFxuICogb3RoZXJ3aXNlIHRoZSBpbi1tZW1vcnkgc2luZ2xlLXByb2Nlc3MgYmFja2VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlKG9wdGlvbnM6IEVudlNzZVRpY2tldFN0b3JlQ29uZmlnKTogU3NlVGlja2V0U3RvcmUge1xuICBjb25zdCBjYXBzID0gZW52U3NlVGlja2V0Q2FwcygpO1xuICBjb25zdCBjb25maWc6IFNzZVRpY2tldFN0b3JlQ29uZmlnID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWF4VG90YWw6IG9wdGlvbnMubWF4VG90YWwgPz8gY2Fwcy5tYXhUb3RhbCxcbiAgICBtYXhQZXJPcmc6IG9wdGlvbnMubWF4UGVyT3JnID8/IGNhcHMubWF4UGVyT3JnLFxuICB9O1xuICBjb25zdCByZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFNzZVRpY2tldFJlZGlzPignc3NlLXRpY2tldCcpO1xuICBpZiAocmVkaXMpIHtcbiAgICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogUmVkaXMgYmFja2VuZCAobXVsdGktcmVwbGljYSknLCB7IGtleVByZWZpeDogY29uZmlnLmtleVByZWZpeCB9KTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpcywgY29uZmlnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogaW4tbWVtb3J5IGJhY2tlbmQgKHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrKScsIHsga2V5UHJlZml4OiBjb25maWcua2V5UHJlZml4IH0pO1xuICByZXR1cm4gY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUoY29uZmlnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ServiceConfig } from '../types/common.js';
|
|
2
|
+
import type { MessagePriority } from '../types/wire-vocabulary.js';
|
|
3
|
+
/** The message service's service-to-service notification route. */
|
|
4
|
+
export declare const SYSTEM_NOTIFY_PATH = "/messages/internal/notify";
|
|
5
|
+
/** A SYSTEM-authored in-app message for a recipient org, optionally one user. */
|
|
6
|
+
export interface SystemNotification {
|
|
7
|
+
recipientOrgId: string;
|
|
8
|
+
recipientUserId?: string;
|
|
9
|
+
subject: string;
|
|
10
|
+
content: string;
|
|
11
|
+
priority?: MessagePriority;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Drop a SYSTEM-authored message into a recipient org's inbox via the message
|
|
15
|
+
* service's internal notify route (which also pushes the real-time SSE ping).
|
|
16
|
+
* Authenticates with this process's signed service token, scoped to the
|
|
17
|
+
* recipient org.
|
|
18
|
+
*
|
|
19
|
+
* REPORTS whether the message was persisted: true only on a 2xx. Never throws —
|
|
20
|
+
* an unreachable service or a refusal is logged and returns false, so a caller
|
|
21
|
+
* whose non-delivery costs something (a retried reminder, a notification log)
|
|
22
|
+
* can act on it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sendSystemNotification(notification: SystemNotification, opts?: {
|
|
25
|
+
service?: ServiceConfig;
|
|
26
|
+
serviceName?: string;
|
|
27
|
+
}): Promise<boolean>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { createSafeClient } from './http-client.js';
|
|
4
|
+
import { serviceIdentity } from './service-keys.js';
|
|
5
|
+
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
6
|
+
import { createLogger } from '../utils/logger.js';
|
|
7
|
+
import { errorMessage } from '../utils/response.js';
|
|
8
|
+
import { serviceEndpoint } from '../utils/service-registry.js';
|
|
9
|
+
const logger = createLogger('system-notification');
|
|
10
|
+
/** The message service's service-to-service notification route. */
|
|
11
|
+
export const SYSTEM_NOTIFY_PATH = '/messages/internal/notify';
|
|
12
|
+
/**
|
|
13
|
+
* Drop a SYSTEM-authored message into a recipient org's inbox via the message
|
|
14
|
+
* service's internal notify route (which also pushes the real-time SSE ping).
|
|
15
|
+
* Authenticates with this process's signed service token, scoped to the
|
|
16
|
+
* recipient org.
|
|
17
|
+
*
|
|
18
|
+
* REPORTS whether the message was persisted: true only on a 2xx. Never throws —
|
|
19
|
+
* an unreachable service or a refusal is logged and returns false, so a caller
|
|
20
|
+
* whose non-delivery costs something (a retried reminder, a notification log)
|
|
21
|
+
* can act on it.
|
|
22
|
+
*/
|
|
23
|
+
export async function sendSystemNotification(notification, opts = {}) {
|
|
24
|
+
try {
|
|
25
|
+
const client = createSafeClient(opts.service ?? serviceEndpoint('message'));
|
|
26
|
+
const result = await client.post(SYSTEM_NOTIFY_PATH, notification, {
|
|
27
|
+
headers: {
|
|
28
|
+
authorization: getServiceAuthHeader({
|
|
29
|
+
serviceName: opts.serviceName ?? serviceIdentity(),
|
|
30
|
+
orgId: notification.recipientOrgId,
|
|
31
|
+
role: 'member',
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
// The safe client resolves null on a transport failure rather than throwing.
|
|
36
|
+
if (result === null || result.statusCode < 200 || result.statusCode >= 300) {
|
|
37
|
+
logger.warn('System notification not delivered', {
|
|
38
|
+
recipientOrgId: notification.recipientOrgId,
|
|
39
|
+
statusCode: result?.statusCode ?? 'unreachable',
|
|
40
|
+
});
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
logger.warn('System notification failed', { recipientOrgId: notification.recipientOrgId, error: errorMessage(err) });
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLW5vdGlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zeXN0ZW0tbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRW5ELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQVc5RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsWUFBZ0MsRUFDaEMsSUFBSSxHQUFzRCxFQUFFO0lBRTVELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRTtZQUNqRSxPQUFPLEVBQUU7Z0JBQ1AsYUFBYSxFQUFFLG9CQUFvQixDQUFDO29CQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLEVBQUU7b0JBQ2xELEtBQUssRUFBRSxZQUFZLENBQUMsY0FBYztvQkFDbEMsSUFBSSxFQUFFLFFBQVE7aUJBQ2YsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsNkVBQTZFO1FBQzdFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUU7Z0JBQy9DLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYztnQkFDM0MsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLElBQUksYUFBYTthQUNoRCxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgc2VydmljZUlkZW50aXR5IH0gZnJvbSAnLi9zZXJ2aWNlLWtleXMuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VQcmlvcml0eSB9IGZyb20gJy4uL3R5cGVzL3dpcmUtdm9jYWJ1bGFyeS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3lzdGVtLW5vdGlmaWNhdGlvbicpO1xuXG4vKiogVGhlIG1lc3NhZ2Ugc2VydmljZSdzIHNlcnZpY2UtdG8tc2VydmljZSBub3RpZmljYXRpb24gcm91dGUuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX05PVElGWV9QQVRIID0gJy9tZXNzYWdlcy9pbnRlcm5hbC9ub3RpZnknO1xuXG4vKiogQSBTWVNURU0tYXV0aG9yZWQgaW4tYXBwIG1lc3NhZ2UgZm9yIGEgcmVjaXBpZW50IG9yZywgb3B0aW9uYWxseSBvbmUgdXNlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtTm90aWZpY2F0aW9uIHtcbiAgcmVjaXBpZW50T3JnSWQ6IHN0cmluZztcbiAgcmVjaXBpZW50VXNlcklkPzogc3RyaW5nO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgcHJpb3JpdHk/OiBNZXNzYWdlUHJpb3JpdHk7XG59XG5cbi8qKlxuICogRHJvcCBhIFNZU1RFTS1hdXRob3JlZCBtZXNzYWdlIGludG8gYSByZWNpcGllbnQgb3JnJ3MgaW5ib3ggdmlhIHRoZSBtZXNzYWdlXG4gKiBzZXJ2aWNlJ3MgaW50ZXJuYWwgbm90aWZ5IHJvdXRlICh3aGljaCBhbHNvIHB1c2hlcyB0aGUgcmVhbC10aW1lIFNTRSBwaW5nKS5cbiAqIEF1dGhlbnRpY2F0ZXMgd2l0aCB0aGlzIHByb2Nlc3MncyBzaWduZWQgc2VydmljZSB0b2tlbiwgc2NvcGVkIHRvIHRoZVxuICogcmVjaXBpZW50IG9yZy5cbiAqXG4gKiBSRVBPUlRTIHdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHBlcnNpc3RlZDogdHJ1ZSBvbmx5IG9uIGEgMnh4LiBOZXZlciB0aHJvd3Mg4oCUXG4gKiBhbiB1bnJlYWNoYWJsZSBzZXJ2aWNlIG9yIGEgcmVmdXNhbCBpcyBsb2dnZWQgYW5kIHJldHVybnMgZmFsc2UsIHNvIGEgY2FsbGVyXG4gKiB3aG9zZSBub24tZGVsaXZlcnkgY29zdHMgc29tZXRoaW5nIChhIHJldHJpZWQgcmVtaW5kZXIsIGEgbm90aWZpY2F0aW9uIGxvZylcbiAqIGNhbiBhY3Qgb24gaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU3lzdGVtTm90aWZpY2F0aW9uKFxuICBub3RpZmljYXRpb246IFN5c3RlbU5vdGlmaWNhdGlvbixcbiAgb3B0czogeyBzZXJ2aWNlPzogU2VydmljZUNvbmZpZzsgc2VydmljZU5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChvcHRzLnNlcnZpY2UgPz8gc2VydmljZUVuZHBvaW50KCdtZXNzYWdlJykpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KFNZU1RFTV9OT1RJRllfUEFUSCwgbm90aWZpY2F0aW9uLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIGF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogb3B0cy5zZXJ2aWNlTmFtZSA/PyBzZXJ2aWNlSWRlbnRpdHkoKSxcbiAgICAgICAgICBvcmdJZDogbm90aWZpY2F0aW9uLnJlY2lwaWVudE9yZ0lkLFxuICAgICAgICAgIHJvbGU6ICdtZW1iZXInLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gVGhlIHNhZmUgY2xpZW50IHJlc29sdmVzIG51bGwgb24gYSB0cmFuc3BvcnQgZmFpbHVyZSByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdC5zdGF0dXNDb2RlIDwgMjAwIHx8IHJlc3VsdC5zdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1N5c3RlbSBub3RpZmljYXRpb24gbm90IGRlbGl2ZXJlZCcsIHtcbiAgICAgICAgcmVjaXBpZW50T3JnSWQ6IG5vdGlmaWNhdGlvbi5yZWNpcGllbnRPcmdJZCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0Py5zdGF0dXNDb2RlID8/ICd1bnJlYWNoYWJsZScsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdTeXN0ZW0gbm90aWZpY2F0aW9uIGZhaWxlZCcsIHsgcmVjaXBpZW50T3JnSWQ6IG5vdGlmaWNhdGlvbi5yZWNpcGllbnRPcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RedisCacheClient } from './cache-service.js';
|
|
2
|
-
import type { TokenRevocationStore } from '../middleware/
|
|
2
|
+
import type { TokenRevocationStore } from '../middleware/revocation.js';
|
|
3
3
|
/**
|
|
4
4
|
* Redis key namespace for the per-user current `tokenVersion`. The platform
|
|
5
5
|
* PUBLISHES to this key on every privilege change; the stateless services READ
|
|
@@ -18,6 +18,38 @@ export declare function tokenRevocationKey(userId: string): string;
|
|
|
18
18
|
export declare const SESSION_REVOCATION_KEY_PREFIX = "authrev:jti:";
|
|
19
19
|
/** The revocation key for one session's token id. */
|
|
20
20
|
export declare function sessionRevocationKey(jti: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Redis key namespaces for revoking ONE credential rather than a whole user:
|
|
23
|
+
*
|
|
24
|
+
* - `revoke:sid:<sid>` — one refresh-session slot (a signed-out device, a
|
|
25
|
+
* revoked machine session). Rejects every access token
|
|
26
|
+
* whose `sid` claim names it.
|
|
27
|
+
* - `revoke:key:<keyId>` — one access key (PAT or service-account key). Rejects
|
|
28
|
+
* the key's exchanged token (`token_use: 'api_key'`,
|
|
29
|
+
* `jti` = key id) and anything derived from it
|
|
30
|
+
* (`parentKeyId`).
|
|
31
|
+
*
|
|
32
|
+
* Platform PUBLISHES these ({@link publishCredentialRevocation}); every service
|
|
33
|
+
* READS them in `requireAuth`. Presence is the whole signal — the value is `1`.
|
|
34
|
+
*/
|
|
35
|
+
export declare const CREDENTIAL_REVOCATION_PREFIX: {
|
|
36
|
+
readonly sid: 'revoke:sid:';
|
|
37
|
+
readonly key: 'revoke:key:';
|
|
38
|
+
};
|
|
39
|
+
/** Which credential a {@link credentialRevocationKey} names. */
|
|
40
|
+
export type CredentialKind = keyof typeof CREDENTIAL_REVOCATION_PREFIX;
|
|
41
|
+
/** The revocation key for one session slot (`sid`) or one access key (`key`). */
|
|
42
|
+
export declare function credentialRevocationKey(kind: CredentialKind, id: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Atomic "set if greater" for the per-user tokenVersion. A plain SET let two
|
|
45
|
+
* concurrent publishes land out of order — an older version overwriting a newer
|
|
46
|
+
* one silently UN-revoked every token between them. The script only ever raises
|
|
47
|
+
* the stored version, and only ever lengthens the entry's TTL.
|
|
48
|
+
*
|
|
49
|
+
* KEYS[1] = revocation key; ARGV[1] = version; ARGV[2] = ttl seconds.
|
|
50
|
+
* Returns 1 when it wrote, 0 when an equal-or-newer version was already there.
|
|
51
|
+
*/
|
|
52
|
+
export declare const SET_IF_GREATER_LUA = "\nlocal cur = tonumber(redis.call('GET', KEYS[1]))\nlocal v = tonumber(ARGV[1])\nlocal ttl = tonumber(ARGV[2])\nif cur and cur >= v then\n if redis.call('TTL', KEYS[1]) < ttl then redis.call('EXPIRE', KEYS[1], ttl) end\n return 0\nend\nredis.call('SET', KEYS[1], ARGV[1], 'EX', ttl)\nreturn 1\n";
|
|
21
53
|
/**
|
|
22
54
|
* Build a {@link TokenRevocationStore} backed by a Redis client, for a stateless
|
|
23
55
|
* service to register via `setTokenRevocationStore`. Reads the current
|
|
@@ -48,6 +80,9 @@ export declare function createEnvRedisTokenRevocationStore(): TokenRevocationSto
|
|
|
48
80
|
* revocation immediately (platform side). Best-effort — never throws; a failure
|
|
49
81
|
* just means the services fall back to natural token expiry for this change.
|
|
50
82
|
*
|
|
83
|
+
* The write is an atomic set-if-greater ({@link SET_IF_GREATER_LUA}), so an
|
|
84
|
+
* out-of-order publish can never lower the stored version.
|
|
85
|
+
*
|
|
51
86
|
* The key is written with a TTL equal to the access-token lifetime: any token
|
|
52
87
|
* that could still carry an older version has expired by the time the entry
|
|
53
88
|
* lapses, so an expired entry can never cause a false "revoked" nor a missed one.
|
|
@@ -73,3 +108,17 @@ export declare function publishTokenRevocation(redis: RedisCacheClient, userId:
|
|
|
73
108
|
* @param ttlMs - time remaining on the session's token
|
|
74
109
|
*/
|
|
75
110
|
export declare function publishSessionRevocation(redis: RedisCacheClient, jti: string, ttlMs: number): Promise<boolean>;
|
|
111
|
+
/**
|
|
112
|
+
* Publish that ONE credential — a session slot (`sid`) or an access key
|
|
113
|
+
* (`key`) — has been revoked, so every service rejects the tokens that name it
|
|
114
|
+
* on the next request (platform side).
|
|
115
|
+
*
|
|
116
|
+
* `ttlSeconds` MUST be at least the longest lifetime of any token that can
|
|
117
|
+
* carry this id (an access token minted from the slot, an exchanged key token,
|
|
118
|
+
* or a token derived from one): the entry lapsing first would read as "not
|
|
119
|
+
* revoked" while such a token is still alive.
|
|
120
|
+
*
|
|
121
|
+
* Returns whether the publish landed, so the caller can report a revocation
|
|
122
|
+
* that did not reach the other services instead of claiming success.
|
|
123
|
+
*/
|
|
124
|
+
export declare function publishCredentialRevocation(redis: RedisCacheClient, kind: CredentialKind, id: string, ttlSeconds: number): Promise<boolean>;
|
|
@@ -27,6 +27,48 @@ export const SESSION_REVOCATION_KEY_PREFIX = 'authrev:jti:';
|
|
|
27
27
|
export function sessionRevocationKey(jti) {
|
|
28
28
|
return `${SESSION_REVOCATION_KEY_PREFIX}${jti}`;
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Redis key namespaces for revoking ONE credential rather than a whole user:
|
|
32
|
+
*
|
|
33
|
+
* - `revoke:sid:<sid>` — one refresh-session slot (a signed-out device, a
|
|
34
|
+
* revoked machine session). Rejects every access token
|
|
35
|
+
* whose `sid` claim names it.
|
|
36
|
+
* - `revoke:key:<keyId>` — one access key (PAT or service-account key). Rejects
|
|
37
|
+
* the key's exchanged token (`token_use: 'api_key'`,
|
|
38
|
+
* `jti` = key id) and anything derived from it
|
|
39
|
+
* (`parentKeyId`).
|
|
40
|
+
*
|
|
41
|
+
* Platform PUBLISHES these ({@link publishCredentialRevocation}); every service
|
|
42
|
+
* READS them in `requireAuth`. Presence is the whole signal — the value is `1`.
|
|
43
|
+
*/
|
|
44
|
+
export const CREDENTIAL_REVOCATION_PREFIX = {
|
|
45
|
+
sid: 'revoke:sid:',
|
|
46
|
+
key: 'revoke:key:',
|
|
47
|
+
};
|
|
48
|
+
/** The revocation key for one session slot (`sid`) or one access key (`key`). */
|
|
49
|
+
export function credentialRevocationKey(kind, id) {
|
|
50
|
+
return `${CREDENTIAL_REVOCATION_PREFIX[kind]}${id}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Atomic "set if greater" for the per-user tokenVersion. A plain SET let two
|
|
54
|
+
* concurrent publishes land out of order — an older version overwriting a newer
|
|
55
|
+
* one silently UN-revoked every token between them. The script only ever raises
|
|
56
|
+
* the stored version, and only ever lengthens the entry's TTL.
|
|
57
|
+
*
|
|
58
|
+
* KEYS[1] = revocation key; ARGV[1] = version; ARGV[2] = ttl seconds.
|
|
59
|
+
* Returns 1 when it wrote, 0 when an equal-or-newer version was already there.
|
|
60
|
+
*/
|
|
61
|
+
export const SET_IF_GREATER_LUA = `
|
|
62
|
+
local cur = tonumber(redis.call('GET', KEYS[1]))
|
|
63
|
+
local v = tonumber(ARGV[1])
|
|
64
|
+
local ttl = tonumber(ARGV[2])
|
|
65
|
+
if cur and cur >= v then
|
|
66
|
+
if redis.call('TTL', KEYS[1]) < ttl then redis.call('EXPIRE', KEYS[1], ttl) end
|
|
67
|
+
return 0
|
|
68
|
+
end
|
|
69
|
+
redis.call('SET', KEYS[1], ARGV[1], 'EX', ttl)
|
|
70
|
+
return 1
|
|
71
|
+
`;
|
|
30
72
|
/**
|
|
31
73
|
* Build a {@link TokenRevocationStore} backed by a Redis client, for a stateless
|
|
32
74
|
* service to register via `setTokenRevocationStore`. Reads the current
|
|
@@ -81,6 +123,26 @@ export function createRedisTokenRevocationStore(redis) {
|
|
|
81
123
|
return 'unavailable';
|
|
82
124
|
}
|
|
83
125
|
},
|
|
126
|
+
async isCredentialRevoked(refs) {
|
|
127
|
+
const keys = [
|
|
128
|
+
...(refs.sid ? [credentialRevocationKey('sid', refs.sid)] : []),
|
|
129
|
+
...refs.keyIds.map((id) => credentialRevocationKey('key', id)),
|
|
130
|
+
];
|
|
131
|
+
if (keys.length === 0)
|
|
132
|
+
return false;
|
|
133
|
+
try {
|
|
134
|
+
const values = await Promise.all(keys.map((k) => redis.get(k)));
|
|
135
|
+
return values.some((v) => v !== null && v !== undefined);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
// Fail-open, like getCurrentVersion: a one-credential revocation is the
|
|
139
|
+
// same class of signal as a tokenVersion bump, and a Redis outage must
|
|
140
|
+
// not lock every session out. Counted so it is alertable.
|
|
141
|
+
emitCounter('token_revocation_fail_open_total', { reason: 'credential-read-error' });
|
|
142
|
+
logger.debug('Credential-revocation read failed (fail-open)', { error: errorMessage(err) });
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
84
146
|
};
|
|
85
147
|
}
|
|
86
148
|
/**
|
|
@@ -141,6 +203,12 @@ export function createEnvRedisTokenRevocationStore() {
|
|
|
141
203
|
}
|
|
142
204
|
return createRedisTokenRevocationStore(redis).getSessionRevocation(jti);
|
|
143
205
|
},
|
|
206
|
+
async isCredentialRevoked(refs) {
|
|
207
|
+
const redis = await client();
|
|
208
|
+
if (!redis)
|
|
209
|
+
return false;
|
|
210
|
+
return createRedisTokenRevocationStore(redis).isCredentialRevoked(refs);
|
|
211
|
+
},
|
|
144
212
|
};
|
|
145
213
|
}
|
|
146
214
|
/**
|
|
@@ -148,6 +216,9 @@ export function createEnvRedisTokenRevocationStore() {
|
|
|
148
216
|
* revocation immediately (platform side). Best-effort — never throws; a failure
|
|
149
217
|
* just means the services fall back to natural token expiry for this change.
|
|
150
218
|
*
|
|
219
|
+
* The write is an atomic set-if-greater ({@link SET_IF_GREATER_LUA}), so an
|
|
220
|
+
* out-of-order publish can never lower the stored version.
|
|
221
|
+
*
|
|
151
222
|
* The key is written with a TTL equal to the access-token lifetime: any token
|
|
152
223
|
* that could still carry an older version has expired by the time the entry
|
|
153
224
|
* lapses, so an expired entry can never cause a false "revoked" nor a missed one.
|
|
@@ -159,8 +230,12 @@ export function createEnvRedisTokenRevocationStore() {
|
|
|
159
230
|
*/
|
|
160
231
|
export async function publishTokenRevocation(redis, userId, tokenVersion, ttlSeconds) {
|
|
161
232
|
try {
|
|
162
|
-
//
|
|
163
|
-
|
|
233
|
+
// Atomic set-if-greater: concurrent publishes can arrive out of order, and a
|
|
234
|
+
// plain SET would let the older version win. A client that can't run Lua is
|
|
235
|
+
// refused (caught below) rather than written racily.
|
|
236
|
+
if (typeof redis.eval !== 'function')
|
|
237
|
+
throw new Error('Redis client cannot run scripts (eval unavailable)');
|
|
238
|
+
await redis.eval(SET_IF_GREATER_LUA, 1, tokenRevocationKey(userId), String(tokenVersion), Math.max(1, Math.floor(ttlSeconds)));
|
|
164
239
|
}
|
|
165
240
|
catch (err) {
|
|
166
241
|
logger.warn('Token-revocation publish failed (services fall back to token expiry)', {
|
|
@@ -194,4 +269,29 @@ export async function publishSessionRevocation(redis, jti, ttlMs) {
|
|
|
194
269
|
return false;
|
|
195
270
|
}
|
|
196
271
|
}
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy90b2tlbi1yZXZvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRWxHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGFBQWEsQ0FBQztBQUV6RCx3Q0FBd0M7QUFDeEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsT0FBTyxHQUFHLDJCQUEyQixHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsY0FBYyxDQUFDO0FBRTVELHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBVztJQUM5QyxPQUFPLEdBQUcsNkJBQTZCLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUFDLEtBQXVCO0lBQ3JFLE9BQU87UUFDTCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBYztZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3hE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TUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkZBQTJGLEVBQUU7WUFDdkcsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlZGlzQ2FjaGVDbGllbnQgfSBmcm9tICcuL2NhY2hlLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgU2Vzc2lvblJldm9jYXRpb25TdGF0ZSwgVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3Rva2VuLXJldm9jYXRpb24nKTtcblxuLyoqXG4gKiBSZWRpcyBrZXkgbmFtZXNwYWNlIGZvciB0aGUgcGVyLXVzZXIgY3VycmVudCBgdG9rZW5WZXJzaW9uYC4gVGhlIHBsYXRmb3JtXG4gKiBQVUJMSVNIRVMgdG8gdGhpcyBrZXkgb24gZXZlcnkgcHJpdmlsZWdlIGNoYW5nZTsgdGhlIHN0YXRlbGVzcyBzZXJ2aWNlcyBSRUFEXG4gKiBpdCBpbiBgcmVxdWlyZUF1dGhgICh2aWEge0BsaW5rIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmV9KSB0byByZWplY3RcbiAqIHRva2VucyBtaW50ZWQgYmVmb3JlIHRoYXQgY2hhbmdlLiBQdWJsaXNoZXIgYW5kIHJlYWRlcnMgTVVTVCBzaGFyZSB0aGlzIGV4YWN0XG4gKiBwcmVmaXgg4oCUIGhlbmNlIGJvdGggaGVscGVycyBsaXZlIGhlcmUsIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1JFVk9DQVRJT05fS0VZX1BSRUZJWCA9ICdhdXRocmV2OnR2Oic7XG5cbi8qKiBUaGUgcmV2b2NhdGlvbiBrZXkgZm9yIGEgdXNlciBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlblJldm9jYXRpb25LZXkodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7VE9LRU5fUkVWT0NBVElPTl9LRVlfUFJFRklYfSR7dXNlcklkfWA7XG59XG5cbi8qKlxuICogUmVkaXMga2V5IG5hbWVzcGFjZSBmb3IgZW5kZWQgSU1QRVJTT05BVElPTiBzZXNzaW9ucywgYnkgdG9rZW4gYGp0aWAuIFNhbWVcbiAqIHB1Ymxpc2gvcmVhZCBzcGxpdCBhcyB0aGUgdG9rZW5WZXJzaW9uIGtleXMgYWJvdmUsIGFuZCBrZXB0IGJlc2lkZSB0aGVtIGZvciB0aGVcbiAqIHNhbWUgcmVhc29uOiBwdWJsaXNoZXIgYW5kIHJlYWRlcnMgbXVzdCBhZ3JlZSBvbiB0aGlzIGV4YWN0IHByZWZpeC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fUkVWT0NBVElPTl9LRVlfUFJFRklYID0gJ2F1dGhyZXY6anRpOic7XG5cbi8qKiBUaGUgcmV2b2NhdGlvbiBrZXkgZm9yIG9uZSBzZXNzaW9uJ3MgdG9rZW4gaWQuICovXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvblJldm9jYXRpb25LZXkoanRpOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U0VTU0lPTl9SRVZPQ0FUSU9OX0tFWV9QUkVGSVh9JHtqdGl9YDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHtAbGluayBUb2tlblJldm9jYXRpb25TdG9yZX0gYmFja2VkIGJ5IGEgUmVkaXMgY2xpZW50LCBmb3IgYSBzdGF0ZWxlc3NcbiAqIHNlcnZpY2UgdG8gcmVnaXN0ZXIgdmlhIGBzZXRUb2tlblJldm9jYXRpb25TdG9yZWAuIFJlYWRzIHRoZSBjdXJyZW50XG4gKiBgdG9rZW5WZXJzaW9uYCB0aGUgcGxhdGZvcm0gcHVibGlzaGVkIGZvciB0aGUgdXNlci5cbiAqXG4gKiBGYWlsLW9wZW4gYnkgY29udHJhY3Q6IGEgbWlzcywgYSBwYXJzZSBmYWlsdXJlLCBvciBhIFJlZGlzIGVycm9yIGFsbCB5aWVsZFxuICogYG51bGxgICjigJQgYHJlcXVpcmVBdXRoYCB0cmVhdHMgdGhhdCBhcyBcIm5vIGtub3duIHJldm9jYXRpb25cIiksIHNvIGEgUmVkaXNcbiAqIG91dGFnZSBkZWdyYWRlcyB0byB0aGUgcHJlLWV4aXN0aW5nIGJlaGF2aW91ciByYXRoZXIgdGhhbiBsb2NraW5nIHVzZXJzIG91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUocmVkaXM6IFJlZGlzQ2FjaGVDbGllbnQpOiBUb2tlblJldm9jYXRpb25TdG9yZSB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0Q3VycmVudFZlcnNpb24odXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmdldCh0b2tlblJldm9jYXRpb25LZXkodXNlcklkKSk7XG4gICAgICAgIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3LnRyaW0oKSA9PT0gJycpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBTdHJpY3QgaW50ZWdlciBwYXJzZTogYE51bWJlcmAgKHVubGlrZSBgcGFyc2VJbnRgKSByZWplY3RzIHRyYWlsaW5nXG4gICAgICAgIC8vIGdhcmJhZ2UgKFwiNWFiY1wiIOKGkiBOYU4pLCBzbyBhIGNvcnJ1cHRlZCBlbnRyeSBmYWlscyBvcGVuIChudWxsIOKGkiBcIm5vdFxuICAgICAgICAvLyByZXZva2VkXCIpIHJhdGhlciB0aGFuIGJlaW5nIHJlYWQgYXMgYSBib2d1cyB2ZXJzaW9uLiBUaGUgZW1wdHktc3RyaW5nXG4gICAgICAgIC8vIGd1YXJkIGFib3ZlIG1hdHRlcnMgYmVjYXVzZSBgTnVtYmVyKCcnKWAgaXMgMCwgbm90IE5hTi5cbiAgICAgICAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSA/IG4gOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFJlZGlzIHdhcyByZWFjaGFibGUgZW5vdWdoIHRvIHRyeSBidXQgdGhlIHJlYWQgZXJyb3JlZCDigJQgdGhpcyBpcyBhXG4gICAgICAgIC8vIERFR1JBREFUSU9OOiB3aGlsZSBpdCBwZXJzaXN0cywgZm9yY2VkIGxvZ291dHMgLyBwcml2aWxlZ2UgcmV2b2NhdGlvbnNcbiAgICAgICAgLy8gc2lsZW50bHkgc3RvcCB0YWtpbmcgZWZmZWN0IHVudGlsIG5hdHVyYWwgdG9rZW4gZXhwaXJ5LiBFbWl0IGEgY291bnRlclxuICAgICAgICAvLyBzbyBgVG9rZW5SZXZvY2F0aW9uRmFpbGluZ09wZW5gIGNhbiBhbGVydCBvbiBhIFNVU1RBSU5FRCByYXRlIChtaXJyb3JzXG4gICAgICAgIC8vIHRoZSBxdW90YV9mYWlsX29wZW5fdG90YWwgcGF0dGVybikuIE5vdCBlbWl0dGVkIGZvciB0aGUgXCJSZWRpcyBub3RcbiAgICAgICAgLy8gY29uZmlndXJlZFwiIHBhdGggKGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUg4oaSIG51bGwgY2xpZW50KSxcbiAgICAgICAgLy8gd2hpY2ggaXMgYSBkZWxpYmVyYXRlIG9wdC1vdXQsIG5vdCBhIGRlZ3JhZGF0aW9uLlxuICAgICAgICBlbWl0Q291bnRlcigndG9rZW5fcmV2b2NhdGlvbl9mYWlsX29wZW5fdG90YWwnLCB7IHJlYXNvbjogJ3JlYWQtZXJyb3InIH0pO1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1Rva2VuLXJldm9jYXRpb24gcmVhZCBmYWlsZWQgKGZhaWwtb3BlbiknLCB7XG4gICAgICAgICAgdXNlcklkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGdldFNlc3Npb25SZXZvY2F0aW9uKGp0aTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uUmV2b2NhdGlvblN0YXRlPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQoc2Vzc2lvblJldm9jYXRpb25LZXkoanRpKSk7XG4gICAgICAgIHJldHVybiByYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQgPyAnbGl2ZScgOiAncmV2b2tlZCc7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gTk9UIGZhaWwtb3BlbiwgdW5saWtlIGdldEN1cnJlbnRWZXJzaW9uIGFib3ZlOiBgdW5hdmFpbGFibGVgIHJlamVjdHNcbiAgICAgICAgLy8gdGhlIGltcGVyc29uYXRpb24gdG9rZW4uIENvdW50ZWQgc28gYSBzdXN0YWluZWQgb3V0YWdlIOKAlCB3aGljaCBzdG9wc1xuICAgICAgICAvLyBzdXBwb3J0IGltcGVyc29uYXRpb24gZXZlcnl3aGVyZSDigJQgaXMgdmlzaWJsZSBhbmQgYWxlcnRhYmxlLlxuICAgICAgICBlbWl0Q291bnRlcignc2Vzc2lvbl9yZXZvY2F0aW9uX3VuYXZhaWxhYmxlX3RvdGFsJywgeyByZWFzb246ICdyZWFkLWVycm9yJyB9KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTZXNzaW9uLXJldm9jYXRpb24gcmVhZCBmYWlsZWQgKHJlamVjdGluZyBpbXBlcnNvbmF0aW9uIHRva2VuKScsIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gJ3VuYXZhaWxhYmxlJztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEge0BsaW5rIFRva2VuUmV2b2NhdGlvblN0b3JlfSBiYWNrZWQgYnkgYSBSZWRpcyBjbGllbnQgdGhhdCBpcyBsYXppbHlcbiAqIGNvbnN0cnVjdGVkIGZyb20gdGhlIHN0YW5kYXJkIGBSRURJU19VUkxgIG9yIGBSRURJU19TRU5USU5FTFNgIGVudiDigJRcbiAqIGZvciBhIHN0YXRlbGVzcyBzZXJ2aWNlIHRoYXQga2VlcHMgTk8gUmVkaXMgY2xpZW50IG9mIGl0cyBvd24uIFRoZSBjbGllbnQgaXNcbiAqIGJ1aWx0IG9uIGZpcnN0IGBnZXRDdXJyZW50VmVyc2lvbmAgY2FsbCBhbmQgbWVtb2l6ZWQ7IGBpb3JlZGlzYCBpcyBsb2FkZWQgdmlhXG4gKiBhIGd1YXJkZWQgZHluYW1pYyByZXF1aXJlIHNvIG1lcmVseSBpbXBvcnRpbmcgdGhpcyBuZXZlciBicmVha3MgYSBidWlsZC90ZXN0XG4gKiB3aGVyZSBSZWRpcyBpc24ndCBwcmVzZW50LlxuICpcbiAqIEZVTExZIEZBSUwtT1BFTjogbm8gZW52IGNvbmZpZ3VyZWQsIGFuIGlvcmVkaXMgbG9hZCBmYWlsdXJlLCBhIGNvbm5lY3QgZXJyb3IsXG4gKiBvciBhbnkgcmVhZCBmYWlsdXJlIGFsbCByZXNvbHZlIHRvIGBudWxsYCAoXCJubyBrbm93biByZXZvY2F0aW9uXCIpLCBzbyBhXG4gKiBzZXJ2aWNlIGRlZ3JhZGVzIHRvIG5hdHVyYWwgdG9rZW4gZXhwaXJ5IHJhdGhlciB0aGFuIGxvY2tpbmcgdXNlcnMgb3V0LiBBXG4gKiBzZXJ2aWNlIG9wdHMgaW4gd2l0aCBhIHNpbmdsZSBib290IGxpbmU6XG4gKiAgIGBzZXRUb2tlblJldm9jYXRpb25TdG9yZShjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpO2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoKTogVG9rZW5SZXZvY2F0aW9uU3RvcmUge1xuICB0eXBlIFJlYWRlclJlZGlzID0gUmVkaXNDYWNoZUNsaWVudCAmIFJlYWR5QXdhcmVSZWRpcztcbiAgLy8gdW5kZWZpbmVkID0gbm90IHlldCBhdHRlbXB0ZWQ7IG51bGwgPSBhdHRlbXB0ZWQgYW5kIHVuYXZhaWxhYmxlIChzdGF5IG9mZikuXG4gIGxldCBjYWNoZWQ6IFJlYWRlclJlZGlzIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlYWR5OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWFkZXIgY2xpZW50LCBidWlsdCBvbiBmaXJzdCB1c2UuIFRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLFxuICAgKiBzbyBhIEdFVCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzIGlzIHJlamVjdGVkIOKAlCB3aGljaCBtYWRlIHRoZVxuICAgKiBGSVJTVCBpbXBlcnNvbmF0aW9uIGNoZWNrIG9uIGV2ZXJ5IHBvZCByZWFkICd1bmF2YWlsYWJsZScgKDQwMSkuIFdhaXRcbiAgICogKGJvdW5kZWQsIG5ldmVyIHJlamVjdGluZykgZm9yIHJlYWRpbmVzczsgYSBnZW51aW5lbHkgZG93biBSZWRpcyB0aGVuIGtlZXBzXG4gICAqIHRoZSBleGlzdGluZyBmYWlsLW9wZW4gLyAndW5hdmFpbGFibGUnIHNlbWFudGljcy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWVudCgpOiBQcm9taXNlPFJlYWRlclJlZGlzIHwgbnVsbD4ge1xuICAgIGlmIChjYWNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2hhcmVkIGVudi1jb25maWd1cmVkIGlvcmVkaXMgY29uc3RydWN0aW9uIChlcnJvciBsaXN0ZW5lciBhdHRhY2hlZCwgbnVsbFxuICAgICAgLy8gd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkKTsgdGhlIHJlYWRlciBzdGF5cyBmYWlsLW9wZW4g4oCUIGEgbnVsbCBjbGllbnRcbiAgICAgIC8vIGp1c3QgZmFsbHMgYmFjayB0byBuYXR1cmFsIHRva2VuIGV4cGlyeS5cbiAgICAgIGNhY2hlZCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlYWRlclJlZGlzPigncmV2b2NhdGlvbi1yZWFkZXInKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlZGlzIHRva2VuLXJldm9jYXRpb24gcmVhZGVyIGluaXRpYWxpemVkJyk7XG4gICAgICAgIHJlYWR5ID0gY3JlYXRlUmVkaXNSZWFkeUdhdGUoY2FjaGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlYWR5KSBhd2FpdCByZWFkeSgpO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldEN1cnJlbnRWZXJzaW9uKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgICBjb25zdCByZWRpcyA9IGF3YWl0IGNsaWVudCgpO1xuICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gY3JlYXRlUmVkaXNUb2tlblJldm9jYXRpb25TdG9yZShyZWRpcykuZ2V0Q3VycmVudFZlcnNpb24odXNlcklkKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldFNlc3Npb25SZXZvY2F0aW9uKGp0aTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uUmV2b2NhdGlvblN0YXRlPiB7XG4gICAgICBjb25zdCByZWRpcyA9IGF3YWl0IGNsaWVudCgpO1xuICAgICAgLy8gTm8gUmVkaXMgY29uZmlndXJlZCDih5IgdGhlcmUgaXMgbm8gd2F5IHRvIGxlYXJuIGEgc2Vzc2lvbiB3YXMgZW5kZWQsIHNvXG4gICAgICAvLyBhbiBpbXBlcnNvbmF0aW9uIHRva2VuIGNhbid0IGJlIHRydXN0ZWQuIEV2ZXJ5IHJlYWwgZGVwbG95bWVudCBydW5zIFJlZGlzXG4gICAgICAvLyAodGhlIGJ1aWxkIHF1ZXVlIG5lZWRzIGl0KSwgc28gdGhpcyBvbmx5IGJpdGVzIGEgbWlzY29uZmlndXJlZCBzZXJ2aWNlLlxuICAgICAgaWYgKCFyZWRpcykge1xuICAgICAgICBlbWl0Q291bnRlcignc2Vzc2lvbl9yZXZvY2F0aW9uX3VuYXZhaWxhYmxlX3RvdGFsJywgeyByZWFzb246ICdub3QtY29uZmlndXJlZCcgfSk7XG4gICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUocmVkaXMpLmdldFNlc3Npb25SZXZvY2F0aW9uIShqdGkpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUHVibGlzaCBhIHVzZXIncyBjdXJyZW50IGB0b2tlblZlcnNpb25gIHNvIHRoZSBzdGF0ZWxlc3Mgc2VydmljZXMgc2VlIHRoZVxuICogcmV2b2NhdGlvbiBpbW1lZGlhdGVseSAocGxhdGZvcm0gc2lkZSkuIEJlc3QtZWZmb3J0IOKAlCBuZXZlciB0aHJvd3M7IGEgZmFpbHVyZVxuICoganVzdCBtZWFucyB0aGUgc2VydmljZXMgZmFsbCBiYWNrIHRvIG5hdHVyYWwgdG9rZW4gZXhwaXJ5IGZvciB0aGlzIGNoYW5nZS5cbiAqXG4gKiBUaGUga2V5IGlzIHdyaXR0ZW4gd2l0aCBhIFRUTCBlcXVhbCB0byB0aGUgYWNjZXNzLXRva2VuIGxpZmV0aW1lOiBhbnkgdG9rZW5cbiAqIHRoYXQgY291bGQgc3RpbGwgY2FycnkgYW4gb2xkZXIgdmVyc2lvbiBoYXMgZXhwaXJlZCBieSB0aGUgdGltZSB0aGUgZW50cnlcbiAqIGxhcHNlcywgc28gYW4gZXhwaXJlZCBlbnRyeSBjYW4gbmV2ZXIgY2F1c2UgYSBmYWxzZSBcInJldm9rZWRcIiBub3IgYSBtaXNzZWQgb25lLlxuICpcbiAqIEBwYXJhbSByZWRpcyAtIHRoZSBwbGF0Zm9ybSdzIFJlZGlzIGNsaWVudFxuICogQHBhcmFtIHVzZXJJZCAtIHRoZSB1c2VyIHdob3NlIHNlc3Npb25zIGNoYW5nZWRcbiAqIEBwYXJhbSB0b2tlblZlcnNpb24gLSB0aGUgdXNlcidzIE5FVyAocG9zdC1pbmNyZW1lbnQpIHRva2VuVmVyc2lvblxuICogQHBhcmFtIHR0bFNlY29uZHMgLSBhY2Nlc3MtdG9rZW4gbGlmZXRpbWUgaW4gc2Vjb25kc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaFRva2VuUmV2b2NhdGlvbihcbiAgcmVkaXM6IFJlZGlzQ2FjaGVDbGllbnQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICB0b2tlblZlcnNpb246IG51bWJlcixcbiAgdHRsU2Vjb25kczogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gaW9yZWRpcy1zdHlsZSB2YXJpYWRpYyBTRVQgd2l0aCBleHBpcnk6IFNFVCBrZXkgdmFsIEVYIHR0bC5cbiAgICBhd2FpdCByZWRpcy5zZXQodG9rZW5SZXZvY2F0aW9uS2V5KHVzZXJJZCksIFN0cmluZyh0b2tlblZlcnNpb24pLCAnRVgnLCBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHR0bFNlY29uZHMpKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdUb2tlbi1yZXZvY2F0aW9uIHB1Ymxpc2ggZmFpbGVkIChzZXJ2aWNlcyBmYWxsIGJhY2sgdG8gdG9rZW4gZXhwaXJ5KScsIHtcbiAgICAgIHVzZXJJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHVibGlzaCB0aGF0IG9uZSBJTVBFUlNPTkFUSU9OIHNlc3Npb24gaGFzIGVuZGVkLCBzbyBldmVyeSBzdGF0ZWxlc3Mgc2VydmljZVxuICogcmVqZWN0cyBpdHMgdG9rZW4gb24gdGhlIG5leHQgcmVxdWVzdCAocGxhdGZvcm0gc2lkZSkuXG4gKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwdWJsaXNoIGxhbmRlZCDigJQgdW5saWtlIGBwdWJsaXNoVG9rZW5SZXZvY2F0aW9uYCwgd2hpY2ggaXNcbiAqIGZpcmUtYW5kLWZvcmdldC4gVGhlIGNhbGxlciBtdXN0IGJlIGFibGUgdG8gdGVsbCB0aGUgcGVyc29uIHdobyBlbmRlZCB0aGVcbiAqIHNlc3Npb24gdGhhdCBpdCBkaWQgTk9UIGVuZCBldmVyeXdoZXJlLCByYXRoZXIgdGhhbiByZXBvcnRpbmcgc3VjY2VzcyB3aGlsZVxuICogdGhlIHRva2VuIHN0aWxsIHdvcmtzIGFnYWluc3Qgb3RoZXIgc2VydmljZXMuXG4gKlxuICogVGhlIGVudHJ5IGV4cGlyZXMgd2l0aCB0aGUgc2Vzc2lvbjogb25jZSB0aGUgdG9rZW4gaXRzZWxmIGNhbiBubyBsb25nZXIgYmVcbiAqIHVzZWQsIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXZva2UsIHNvIHRoZSBrZXkgY2xlYW5zIGl0c2VsZiB1cC5cbiAqXG4gKiBAcGFyYW0gdHRsTXMgLSB0aW1lIHJlbWFpbmluZyBvbiB0aGUgc2Vzc2lvbidzIHRva2VuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoU2Vzc2lvblJldm9jYXRpb24oXG4gIHJlZGlzOiBSZWRpc0NhY2hlQ2xpZW50LFxuICBqdGk6IHN0cmluZyxcbiAgdHRsTXM6IG51bWJlcixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlZGlzLnNldChzZXNzaW9uUmV2b2NhdGlvbktleShqdGkpLCAnMScsICdQWCcsIE1hdGgubWF4KDEwMDAsIE1hdGguY2VpbCh0dGxNcykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1Nlc3Npb24tcmV2b2NhdGlvbiBwdWJsaXNoIGZhaWxlZCAob3RoZXIgc2VydmljZXMgd2lsbCBob25vdXIgdGhlIHRva2VuIHVudGlsIGl0IGV4cGlyZXMpJywge1xuICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
272
|
+
/**
|
|
273
|
+
* Publish that ONE credential — a session slot (`sid`) or an access key
|
|
274
|
+
* (`key`) — has been revoked, so every service rejects the tokens that name it
|
|
275
|
+
* on the next request (platform side).
|
|
276
|
+
*
|
|
277
|
+
* `ttlSeconds` MUST be at least the longest lifetime of any token that can
|
|
278
|
+
* carry this id (an access token minted from the slot, an exchanged key token,
|
|
279
|
+
* or a token derived from one): the entry lapsing first would read as "not
|
|
280
|
+
* revoked" while such a token is still alive.
|
|
281
|
+
*
|
|
282
|
+
* Returns whether the publish landed, so the caller can report a revocation
|
|
283
|
+
* that did not reach the other services instead of claiming success.
|
|
284
|
+
*/
|
|
285
|
+
export async function publishCredentialRevocation(redis, kind, id, ttlSeconds) {
|
|
286
|
+
try {
|
|
287
|
+
await redis.set(credentialRevocationKey(kind, id), '1', 'EX', Math.max(1, Math.ceil(ttlSeconds)));
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
logger.warn('Credential-revocation publish failed (services honour the credential until its tokens expire)', {
|
|
292
|
+
kind, error: errorMessage(err),
|
|
293
|
+
});
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy90b2tlbi1yZXZvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRWxHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGFBQWEsQ0FBQztBQUV6RCx3Q0FBd0M7QUFDeEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsT0FBTyxHQUFHLDJCQUEyQixHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsY0FBYyxDQUFDO0FBRTVELHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBVztJQUM5QyxPQUFPLEdBQUcsNkJBQTZCLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsYUFBYTtDQUNWLENBQUM7QUFLWCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQW9CLEVBQUUsRUFBVTtJQUN0RSxPQUFPLEdBQUcsNEJBQTRCLENBQUMsSUFB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Q0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsS0FBdUIsRUFDdkIsSUFBb0IsRUFDcEIsRUFBVSxFQUNWLFVBQWtCO0lBRWxCLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQywrRkFBK0YsRUFBRTtZQUMzRyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlZGlzQ2FjaGVDbGllbnQgfSBmcm9tICcuL2NhY2hlLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgQ3JlZGVudGlhbFJldm9jYXRpb25SZWZzLCBTZXNzaW9uUmV2b2NhdGlvblN0YXRlLCBUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4uL21pZGRsZXdhcmUvcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigndG9rZW4tcmV2b2NhdGlvbicpO1xuXG4vKipcbiAqIFJlZGlzIGtleSBuYW1lc3BhY2UgZm9yIHRoZSBwZXItdXNlciBjdXJyZW50IGB0b2tlblZlcnNpb25gLiBUaGUgcGxhdGZvcm1cbiAqIFBVQkxJU0hFUyB0byB0aGlzIGtleSBvbiBldmVyeSBwcml2aWxlZ2UgY2hhbmdlOyB0aGUgc3RhdGVsZXNzIHNlcnZpY2VzIFJFQURcbiAqIGl0IGluIGByZXF1aXJlQXV0aGAgKHZpYSB7QGxpbmsgY3JlYXRlUmVkaXNUb2tlblJldm9jYXRpb25TdG9yZX0pIHRvIHJlamVjdFxuICogdG9rZW5zIG1pbnRlZCBiZWZvcmUgdGhhdCBjaGFuZ2UuIFB1Ymxpc2hlciBhbmQgcmVhZGVycyBNVVNUIHNoYXJlIHRoaXMgZXhhY3RcbiAqIHByZWZpeCDigJQgaGVuY2UgYm90aCBoZWxwZXJzIGxpdmUgaGVyZSwgaW4gb25lIHBsYWNlLlxuICovXG5leHBvcnQgY29uc3QgVE9LRU5fUkVWT0NBVElPTl9LRVlfUFJFRklYID0gJ2F1dGhyZXY6dHY6JztcblxuLyoqIFRoZSByZXZvY2F0aW9uIGtleSBmb3IgYSB1c2VyIGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuUmV2b2NhdGlvbktleSh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtUT0tFTl9SRVZPQ0FUSU9OX0tFWV9QUkVGSVh9JHt1c2VySWR9YDtcbn1cblxuLyoqXG4gKiBSZWRpcyBrZXkgbmFtZXNwYWNlIGZvciBlbmRlZCBJTVBFUlNPTkFUSU9OIHNlc3Npb25zLCBieSB0b2tlbiBganRpYC4gU2FtZVxuICogcHVibGlzaC9yZWFkIHNwbGl0IGFzIHRoZSB0b2tlblZlcnNpb24ga2V5cyBhYm92ZSwgYW5kIGtlcHQgYmVzaWRlIHRoZW0gZm9yIHRoZVxuICogc2FtZSByZWFzb246IHB1Ymxpc2hlciBhbmQgcmVhZGVycyBtdXN0IGFncmVlIG9uIHRoaXMgZXhhY3QgcHJlZml4LlxuICovXG5leHBvcnQgY29uc3QgU0VTU0lPTl9SRVZPQ0FUSU9OX0tFWV9QUkVGSVggPSAnYXV0aHJldjpqdGk6JztcblxuLyoqIFRoZSByZXZvY2F0aW9uIGtleSBmb3Igb25lIHNlc3Npb24ncyB0b2tlbiBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uUmV2b2NhdGlvbktleShqdGk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTRVNTSU9OX1JFVk9DQVRJT05fS0VZX1BSRUZJWH0ke2p0aX1gO1xufVxuXG4vKipcbiAqIFJlZGlzIGtleSBuYW1lc3BhY2VzIGZvciByZXZva2luZyBPTkUgY3JlZGVudGlhbCByYXRoZXIgdGhhbiBhIHdob2xlIHVzZXI6XG4gKlxuICogLSBgcmV2b2tlOnNpZDo8c2lkPmAgICDigJQgb25lIHJlZnJlc2gtc2Vzc2lvbiBzbG90IChhIHNpZ25lZC1vdXQgZGV2aWNlLCBhXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2b2tlZCBtYWNoaW5lIHNlc3Npb24pLiBSZWplY3RzIGV2ZXJ5IGFjY2VzcyB0b2tlblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGBzaWRgIGNsYWltIG5hbWVzIGl0LlxuICogLSBgcmV2b2tlOmtleTo8a2V5SWQ+YCDigJQgb25lIGFjY2VzcyBrZXkgKFBBVCBvciBzZXJ2aWNlLWFjY291bnQga2V5KS4gUmVqZWN0c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXkncyBleGNoYW5nZWQgdG9rZW4gKGB0b2tlbl91c2U6ICdhcGlfa2V5J2AsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYGp0aWAgPSBrZXkgaWQpIGFuZCBhbnl0aGluZyBkZXJpdmVkIGZyb20gaXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAoYHBhcmVudEtleUlkYCkuXG4gKlxuICogUGxhdGZvcm0gUFVCTElTSEVTIHRoZXNlICh7QGxpbmsgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9ufSk7IGV2ZXJ5IHNlcnZpY2VcbiAqIFJFQURTIHRoZW0gaW4gYHJlcXVpcmVBdXRoYC4gUHJlc2VuY2UgaXMgdGhlIHdob2xlIHNpZ25hbCDigJQgdGhlIHZhbHVlIGlzIGAxYC5cbiAqL1xuZXhwb3J0IGNvbnN0IENSRURFTlRJQUxfUkVWT0NBVElPTl9QUkVGSVggPSB7XG4gIHNpZDogJ3Jldm9rZTpzaWQ6JyxcbiAga2V5OiAncmV2b2tlOmtleTonLFxufSBhcyBjb25zdDtcblxuLyoqIFdoaWNoIGNyZWRlbnRpYWwgYSB7QGxpbmsgY3JlZGVudGlhbFJldm9jYXRpb25LZXl9IG5hbWVzLiAqL1xuZXhwb3J0IHR5cGUgQ3JlZGVudGlhbEtpbmQgPSBrZXlvZiB0eXBlb2YgQ1JFREVOVElBTF9SRVZPQ0FUSU9OX1BSRUZJWDtcblxuLyoqIFRoZSByZXZvY2F0aW9uIGtleSBmb3Igb25lIHNlc3Npb24gc2xvdCAoYHNpZGApIG9yIG9uZSBhY2Nlc3Mga2V5IChga2V5YCkuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlZGVudGlhbFJldm9jYXRpb25LZXkoa2luZDogQ3JlZGVudGlhbEtpbmQsIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Q1JFREVOVElBTF9SRVZPQ0FUSU9OX1BSRUZJWFtraW5kXX0ke2lkfWA7XG59XG5cbi8qKlxuICogQXRvbWljIFwic2V0IGlmIGdyZWF0ZXJcIiBmb3IgdGhlIHBlci11c2VyIHRva2VuVmVyc2lvbi4gQSBwbGFpbiBTRVQgbGV0IHR3b1xuICogY29uY3VycmVudCBwdWJsaXNoZXMgbGFuZCBvdXQgb2Ygb3JkZXIg4oCUIGFuIG9sZGVyIHZlcnNpb24gb3ZlcndyaXRpbmcgYSBuZXdlclxuICogb25lIHNpbGVudGx5IFVOLXJldm9rZWQgZXZlcnkgdG9rZW4gYmV0d2VlbiB0aGVtLiBUaGUgc2NyaXB0IG9ubHkgZXZlciByYWlzZXNcbiAqIHRoZSBzdG9yZWQgdmVyc2lvbiwgYW5kIG9ubHkgZXZlciBsZW5ndGhlbnMgdGhlIGVudHJ5J3MgVFRMLlxuICpcbiAqIEtFWVNbMV0gPSByZXZvY2F0aW9uIGtleTsgQVJHVlsxXSA9IHZlcnNpb247IEFSR1ZbMl0gPSB0dGwgc2Vjb25kcy5cbiAqIFJldHVybnMgMSB3aGVuIGl0IHdyb3RlLCAwIHdoZW4gYW4gZXF1YWwtb3ItbmV3ZXIgdmVyc2lvbiB3YXMgYWxyZWFkeSB0aGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFVF9JRl9HUkVBVEVSX0xVQSA9IGBcbmxvY2FsIGN1ciA9IHRvbnVtYmVyKHJlZGlzLmNhbGwoJ0dFVCcsIEtFWVNbMV0pKVxubG9jYWwgdiA9IHRvbnVtYmVyKEFSR1ZbMV0pXG5sb2NhbCB0dGwgPSB0b251bWJlcihBUkdWWzJdKVxuaWYgY3VyIGFuZCBjdXIgPj0gdiB0aGVuXG4gIGlmIHJlZGlzLmNhbGwoJ1RUTCcsIEtFWVNbMV0pIDwgdHRsIHRoZW4gcmVkaXMuY2FsbCgnRVhQSVJFJywgS0VZU1sxXSwgdHRsKSBlbmRcbiAgcmV0dXJuIDBcbmVuZFxucmVkaXMuY2FsbCgnU0VUJywgS0VZU1sxXSwgQVJHVlsxXSwgJ0VYJywgdHRsKVxucmV0dXJuIDFcbmA7XG5cbi8qKlxuICogQnVpbGQgYSB7QGxpbmsgVG9rZW5SZXZvY2F0aW9uU3RvcmV9IGJhY2tlZCBieSBhIFJlZGlzIGNsaWVudCwgZm9yIGEgc3RhdGVsZXNzXG4gKiBzZXJ2aWNlIHRvIHJlZ2lzdGVyIHZpYSBgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmVgLiBSZWFkcyB0aGUgY3VycmVudFxuICogYHRva2VuVmVyc2lvbmAgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlZCBmb3IgdGhlIHVzZXIuXG4gKlxuICogRmFpbC1vcGVuIGJ5IGNvbnRyYWN0OiBhIG1pc3MsIGEgcGFyc2UgZmFpbHVyZSwgb3IgYSBSZWRpcyBlcnJvciBhbGwgeWllbGRcbiAqIGBudWxsYCAo4oCUIGByZXF1aXJlQXV0aGAgdHJlYXRzIHRoYXQgYXMgXCJubyBrbm93biByZXZvY2F0aW9uXCIpLCBzbyBhIFJlZGlzXG4gKiBvdXRhZ2UgZGVncmFkZXMgdG8gdGhlIHByZS1leGlzdGluZyBiZWhhdmlvdXIgcmF0aGVyIHRoYW4gbG9ja2luZyB1c2VycyBvdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKHJlZGlzOiBSZWRpc0NhY2hlQ2xpZW50KTogVG9rZW5SZXZvY2F0aW9uU3RvcmUge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldEN1cnJlbnRWZXJzaW9uKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQodG9rZW5SZXZvY2F0aW9uS2V5KHVzZXJJZCkpO1xuICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdy50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gU3RyaWN0IGludGVnZXIgcGFyc2U6IGBOdW1iZXJgICh1bmxpa2UgYHBhcnNlSW50YCkgcmVqZWN0cyB0cmFpbGluZ1xuICAgICAgICAvLyBnYXJiYWdlIChcIjVhYmNcIiDihpIgTmFOKSwgc28gYSBjb3JydXB0ZWQgZW50cnkgZmFpbHMgb3BlbiAobnVsbCDihpIgXCJub3RcbiAgICAgICAgLy8gcmV2b2tlZFwiKSByYXRoZXIgdGhhbiBiZWluZyByZWFkIGFzIGEgYm9ndXMgdmVyc2lvbi4gVGhlIGVtcHR5LXN0cmluZ1xuICAgICAgICAvLyBndWFyZCBhYm92ZSBtYXR0ZXJzIGJlY2F1c2UgYE51bWJlcignJylgIGlzIDAsIG5vdCBOYU4uXG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXIocmF3KTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgPyBuIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBSZWRpcyB3YXMgcmVhY2hhYmxlIGVub3VnaCB0byB0cnkgYnV0IHRoZSByZWFkIGVycm9yZWQg4oCUIHRoaXMgaXMgYVxuICAgICAgICAvLyBERUdSQURBVElPTjogd2hpbGUgaXQgcGVyc2lzdHMsIGZvcmNlZCBsb2dvdXRzIC8gcHJpdmlsZWdlIHJldm9jYXRpb25zXG4gICAgICAgIC8vIHNpbGVudGx5IHN0b3AgdGFraW5nIGVmZmVjdCB1bnRpbCBuYXR1cmFsIHRva2VuIGV4cGlyeS4gRW1pdCBhIGNvdW50ZXJcbiAgICAgICAgLy8gc28gYFRva2VuUmV2b2NhdGlvbkZhaWxpbmdPcGVuYCBjYW4gYWxlcnQgb24gYSBTVVNUQUlORUQgcmF0ZSAobWlycm9yc1xuICAgICAgICAvLyB0aGUgcXVvdGFfZmFpbF9vcGVuX3RvdGFsIHBhdHRlcm4pLiBOb3QgZW1pdHRlZCBmb3IgdGhlIFwiUmVkaXMgbm90XG4gICAgICAgIC8vIGNvbmZpZ3VyZWRcIiBwYXRoIChjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlIOKGkiBudWxsIGNsaWVudCksXG4gICAgICAgIC8vIHdoaWNoIGlzIGEgZGVsaWJlcmF0ZSBvcHQtb3V0LCBub3QgYSBkZWdyYWRhdGlvbi5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3Rva2VuX3Jldm9jYXRpb25fZmFpbF9vcGVuX3RvdGFsJywgeyByZWFzb246ICdyZWFkLWVycm9yJyB9KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUb2tlbi1yZXZvY2F0aW9uIHJlYWQgZmFpbGVkIChmYWlsLW9wZW4pJywge1xuICAgICAgICAgIHVzZXJJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBnZXRTZXNzaW9uUmV2b2NhdGlvbihqdGk6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvblJldm9jYXRpb25TdGF0ZT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVkaXMuZ2V0KHNlc3Npb25SZXZvY2F0aW9uS2V5KGp0aSkpO1xuICAgICAgICByZXR1cm4gcmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkID8gJ2xpdmUnIDogJ3Jldm9rZWQnO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5PVCBmYWlsLW9wZW4sIHVubGlrZSBnZXRDdXJyZW50VmVyc2lvbiBhYm92ZTogYHVuYXZhaWxhYmxlYCByZWplY3RzXG4gICAgICAgIC8vIHRoZSBpbXBlcnNvbmF0aW9uIHRva2VuLiBDb3VudGVkIHNvIGEgc3VzdGFpbmVkIG91dGFnZSDigJQgd2hpY2ggc3RvcHNcbiAgICAgICAgLy8gc3VwcG9ydCBpbXBlcnNvbmF0aW9uIGV2ZXJ5d2hlcmUg4oCUIGlzIHZpc2libGUgYW5kIGFsZXJ0YWJsZS5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3Nlc3Npb25fcmV2b2NhdGlvbl91bmF2YWlsYWJsZV90b3RhbCcsIHsgcmVhc29uOiAncmVhZC1lcnJvcicgfSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2Vzc2lvbi1yZXZvY2F0aW9uIHJlYWQgZmFpbGVkIChyZWplY3RpbmcgaW1wZXJzb25hdGlvbiB0b2tlbiknLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICd1bmF2YWlsYWJsZSc7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBpc0NyZWRlbnRpYWxSZXZva2VkKHJlZnM6IENyZWRlbnRpYWxSZXZvY2F0aW9uUmVmcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgLi4uKHJlZnMuc2lkID8gW2NyZWRlbnRpYWxSZXZvY2F0aW9uS2V5KCdzaWQnLCByZWZzLnNpZCldIDogW10pLFxuICAgICAgICAuLi5yZWZzLmtleUlkcy5tYXAoKGlkKSA9PiBjcmVkZW50aWFsUmV2b2NhdGlvbktleSgna2V5JywgaWQpKSxcbiAgICAgIF07XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKGtleXMubWFwKChrKSA9PiByZWRpcy5nZXQoaykpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5zb21lKCh2KSA9PiB2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gRmFpbC1vcGVuLCBsaWtlIGdldEN1cnJlbnRWZXJzaW9uOiBhIG9uZS1jcmVkZW50aWFsIHJldm9jYXRpb24gaXMgdGhlXG4gICAgICAgIC8vIHNhbWUgY2xhc3Mgb2Ygc2lnbmFsIGFzIGEgdG9rZW5WZXJzaW9uIGJ1bXAsIGFuZCBhIFJlZGlzIG91dGFnZSBtdXN0XG4gICAgICAgIC8vIG5vdCBsb2NrIGV2ZXJ5IHNlc3Npb24gb3V0LiBDb3VudGVkIHNvIGl0IGlzIGFsZXJ0YWJsZS5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3Rva2VuX3Jldm9jYXRpb25fZmFpbF9vcGVuX3RvdGFsJywgeyByZWFzb246ICdjcmVkZW50aWFsLXJlYWQtZXJyb3InIH0pO1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NyZWRlbnRpYWwtcmV2b2NhdGlvbiByZWFkIGZhaWxlZCAoZmFpbC1vcGVuKScsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHtAbGluayBUb2tlblJldm9jYXRpb25TdG9yZX0gYmFja2VkIGJ5IGEgUmVkaXMgY2xpZW50IHRoYXQgaXMgbGF6aWx5XG4gKiBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzdGFuZGFyZCBgUkVESVNfVVJMYCBvciBgUkVESVNfU0VOVElORUxTYCBlbnYg4oCUXG4gKiBmb3IgYSBzdGF0ZWxlc3Mgc2VydmljZSB0aGF0IGtlZXBzIE5PIFJlZGlzIGNsaWVudCBvZiBpdHMgb3duLiBUaGUgY2xpZW50IGlzXG4gKiBidWlsdCBvbiBmaXJzdCBgZ2V0Q3VycmVudFZlcnNpb25gIGNhbGwgYW5kIG1lbW9pemVkOyBgaW9yZWRpc2AgaXMgbG9hZGVkIHZpYVxuICogYSBndWFyZGVkIGR5bmFtaWMgcmVxdWlyZSBzbyBtZXJlbHkgaW1wb3J0aW5nIHRoaXMgbmV2ZXIgYnJlYWtzIGEgYnVpbGQvdGVzdFxuICogd2hlcmUgUmVkaXMgaXNuJ3QgcHJlc2VudC5cbiAqXG4gKiBGVUxMWSBGQUlMLU9QRU46IG5vIGVudiBjb25maWd1cmVkLCBhbiBpb3JlZGlzIGxvYWQgZmFpbHVyZSwgYSBjb25uZWN0IGVycm9yLFxuICogb3IgYW55IHJlYWQgZmFpbHVyZSBhbGwgcmVzb2x2ZSB0byBgbnVsbGAgKFwibm8ga25vd24gcmV2b2NhdGlvblwiKSwgc28gYVxuICogc2VydmljZSBkZWdyYWRlcyB0byBuYXR1cmFsIHRva2VuIGV4cGlyeSByYXRoZXIgdGhhbiBsb2NraW5nIHVzZXJzIG91dC4gQVxuICogc2VydmljZSBvcHRzIGluIHdpdGggYSBzaW5nbGUgYm9vdCBsaW5lOlxuICogICBgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSgpKTtgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCk6IFRva2VuUmV2b2NhdGlvblN0b3JlIHtcbiAgdHlwZSBSZWFkZXJSZWRpcyA9IFJlZGlzQ2FjaGVDbGllbnQgJiBSZWFkeUF3YXJlUmVkaXM7XG4gIC8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkIGFuZCB1bmF2YWlsYWJsZSAoc3RheSBvZmYpLlxuICBsZXQgY2FjaGVkOiBSZWFkZXJSZWRpcyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGxldCByZWFkeTogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVhZGVyIGNsaWVudCwgYnVpbHQgb24gZmlyc3QgdXNlLiBUaGUgZW52IGNsaWVudCBoYXMgbm8gb2ZmbGluZSBxdWV1ZSxcbiAgICogc28gYSBHRVQgYmVmb3JlIHRoZSBmaXJzdCBjb25uZWN0aW9uIGNvbXBsZXRlcyBpcyByZWplY3RlZCDigJQgd2hpY2ggbWFkZSB0aGVcbiAgICogRklSU1QgaW1wZXJzb25hdGlvbiBjaGVjayBvbiBldmVyeSBwb2QgcmVhZCAndW5hdmFpbGFibGUnICg0MDEpLiBXYWl0XG4gICAqIChib3VuZGVkLCBuZXZlciByZWplY3RpbmcpIGZvciByZWFkaW5lc3M7IGEgZ2VudWluZWx5IGRvd24gUmVkaXMgdGhlbiBrZWVwc1xuICAgKiB0aGUgZXhpc3RpbmcgZmFpbC1vcGVuIC8gJ3VuYXZhaWxhYmxlJyBzZW1hbnRpY3MuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBjbGllbnQoKTogUHJvbWlzZTxSZWFkZXJSZWRpcyB8IG51bGw+IHtcbiAgICBpZiAoY2FjaGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNoYXJlZCBlbnYtY29uZmlndXJlZCBpb3JlZGlzIGNvbnN0cnVjdGlvbiAoZXJyb3IgbGlzdGVuZXIgYXR0YWNoZWQsIG51bGxcbiAgICAgIC8vIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCk7IHRoZSByZWFkZXIgc3RheXMgZmFpbC1vcGVuIOKAlCBhIG51bGwgY2xpZW50XG4gICAgICAvLyBqdXN0IGZhbGxzIGJhY2sgdG8gbmF0dXJhbCB0b2tlbiBleHBpcnkuXG4gICAgICBjYWNoZWQgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWFkZXJSZWRpcz4oJ3Jldm9jYXRpb24tcmVhZGVyJyk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZWRpcyB0b2tlbi1yZXZvY2F0aW9uIHJlYWRlciBpbml0aWFsaXplZCcpO1xuICAgICAgICByZWFkeSA9IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKGNhY2hlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSkgYXdhaXQgcmVhZHkoKTtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXRDdXJyZW50VmVyc2lvbih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgIGlmICghcmVkaXMpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUocmVkaXMpLmdldEN1cnJlbnRWZXJzaW9uKHVzZXJJZCk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRTZXNzaW9uUmV2b2NhdGlvbihqdGk6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvblJldm9jYXRpb25TdGF0ZT4ge1xuICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgIC8vIE5vIFJlZGlzIGNvbmZpZ3VyZWQg4oeSIHRoZXJlIGlzIG5vIHdheSB0byBsZWFybiBhIHNlc3Npb24gd2FzIGVuZGVkLCBzb1xuICAgICAgLy8gYW4gaW1wZXJzb25hdGlvbiB0b2tlbiBjYW4ndCBiZSB0cnVzdGVkLiBFdmVyeSByZWFsIGRlcGxveW1lbnQgcnVucyBSZWRpc1xuICAgICAgLy8gKHRoZSBidWlsZCBxdWV1ZSBuZWVkcyBpdCksIHNvIHRoaXMgb25seSBiaXRlcyBhIG1pc2NvbmZpZ3VyZWQgc2VydmljZS5cbiAgICAgIGlmICghcmVkaXMpIHtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3Nlc3Npb25fcmV2b2NhdGlvbl91bmF2YWlsYWJsZV90b3RhbCcsIHsgcmVhc29uOiAnbm90LWNvbmZpZ3VyZWQnIH0pO1xuICAgICAgICByZXR1cm4gJ3VuYXZhaWxhYmxlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKHJlZGlzKS5nZXRTZXNzaW9uUmV2b2NhdGlvbiEoanRpKTtcbiAgICB9LFxuICAgIGFzeW5jIGlzQ3JlZGVudGlhbFJldm9rZWQocmVmczogQ3JlZGVudGlhbFJldm9jYXRpb25SZWZzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCByZWRpcyA9IGF3YWl0IGNsaWVudCgpO1xuICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUocmVkaXMpLmlzQ3JlZGVudGlhbFJldm9rZWQhKHJlZnMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUHVibGlzaCBhIHVzZXIncyBjdXJyZW50IGB0b2tlblZlcnNpb25gIHNvIHRoZSBzdGF0ZWxlc3Mgc2VydmljZXMgc2VlIHRoZVxuICogcmV2b2NhdGlvbiBpbW1lZGlhdGVseSAocGxhdGZvcm0gc2lkZSkuIEJlc3QtZWZmb3J0IOKAlCBuZXZlciB0aHJvd3M7IGEgZmFpbHVyZVxuICoganVzdCBtZWFucyB0aGUgc2VydmljZXMgZmFsbCBiYWNrIHRvIG5hdHVyYWwgdG9rZW4gZXhwaXJ5IGZvciB0aGlzIGNoYW5nZS5cbiAqXG4gKiBUaGUgd3JpdGUgaXMgYW4gYXRvbWljIHNldC1pZi1ncmVhdGVyICh7QGxpbmsgU0VUX0lGX0dSRUFURVJfTFVBfSksIHNvIGFuXG4gKiBvdXQtb2Ytb3JkZXIgcHVibGlzaCBjYW4gbmV2ZXIgbG93ZXIgdGhlIHN0b3JlZCB2ZXJzaW9uLlxuICpcbiAqIFRoZSBrZXkgaXMgd3JpdHRlbiB3aXRoIGEgVFRMIGVxdWFsIHRvIHRoZSBhY2Nlc3MtdG9rZW4gbGlmZXRpbWU6IGFueSB0b2tlblxuICogdGhhdCBjb3VsZCBzdGlsbCBjYXJyeSBhbiBvbGRlciB2ZXJzaW9uIGhhcyBleHBpcmVkIGJ5IHRoZSB0aW1lIHRoZSBlbnRyeVxuICogbGFwc2VzLCBzbyBhbiBleHBpcmVkIGVudHJ5IGNhbiBuZXZlciBjYXVzZSBhIGZhbHNlIFwicmV2b2tlZFwiIG5vciBhIG1pc3NlZCBvbmUuXG4gKlxuICogQHBhcmFtIHJlZGlzIC0gdGhlIHBsYXRmb3JtJ3MgUmVkaXMgY2xpZW50XG4gKiBAcGFyYW0gdXNlcklkIC0gdGhlIHVzZXIgd2hvc2Ugc2Vzc2lvbnMgY2hhbmdlZFxuICogQHBhcmFtIHRva2VuVmVyc2lvbiAtIHRoZSB1c2VyJ3MgTkVXIChwb3N0LWluY3JlbWVudCkgdG9rZW5WZXJzaW9uXG4gKiBAcGFyYW0gdHRsU2Vjb25kcyAtIGFjY2Vzcy10b2tlbiBsaWZldGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoVG9rZW5SZXZvY2F0aW9uKFxuICByZWRpczogUmVkaXNDYWNoZUNsaWVudCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHRva2VuVmVyc2lvbjogbnVtYmVyLFxuICB0dGxTZWNvbmRzOiBudW1iZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBBdG9taWMgc2V0LWlmLWdyZWF0ZXI6IGNvbmN1cnJlbnQgcHVibGlzaGVzIGNhbiBhcnJpdmUgb3V0IG9mIG9yZGVyLCBhbmQgYVxuICAgIC8vIHBsYWluIFNFVCB3b3VsZCBsZXQgdGhlIG9sZGVyIHZlcnNpb24gd2luLiBBIGNsaWVudCB0aGF0IGNhbid0IHJ1biBMdWEgaXNcbiAgICAvLyByZWZ1c2VkIChjYXVnaHQgYmVsb3cpIHJhdGhlciB0aGFuIHdyaXR0ZW4gcmFjaWx5LlxuICAgIGlmICh0eXBlb2YgcmVkaXMuZXZhbCAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdSZWRpcyBjbGllbnQgY2Fubm90IHJ1biBzY3JpcHRzIChldmFsIHVuYXZhaWxhYmxlKScpO1xuICAgIGF3YWl0IHJlZGlzLmV2YWwoU0VUX0lGX0dSRUFURVJfTFVBLCAxLCB0b2tlblJldm9jYXRpb25LZXkodXNlcklkKSwgU3RyaW5nKHRva2VuVmVyc2lvbiksIE1hdGgubWF4KDEsIE1hdGguZmxvb3IodHRsU2Vjb25kcykpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1Rva2VuLXJldm9jYXRpb24gcHVibGlzaCBmYWlsZWQgKHNlcnZpY2VzIGZhbGwgYmFjayB0byB0b2tlbiBleHBpcnkpJywge1xuICAgICAgdXNlcklkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoIHRoYXQgb25lIElNUEVSU09OQVRJT04gc2Vzc2lvbiBoYXMgZW5kZWQsIHNvIGV2ZXJ5IHN0YXRlbGVzcyBzZXJ2aWNlXG4gKiByZWplY3RzIGl0cyB0b2tlbiBvbiB0aGUgbmV4dCByZXF1ZXN0IChwbGF0Zm9ybSBzaWRlKS5cbiAqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHB1Ymxpc2ggbGFuZGVkIOKAlCB1bmxpa2UgYHB1Ymxpc2hUb2tlblJldm9jYXRpb25gLCB3aGljaCBpc1xuICogZmlyZS1hbmQtZm9yZ2V0LiBUaGUgY2FsbGVyIG11c3QgYmUgYWJsZSB0byB0ZWxsIHRoZSBwZXJzb24gd2hvIGVuZGVkIHRoZVxuICogc2Vzc2lvbiB0aGF0IGl0IGRpZCBOT1QgZW5kIGV2ZXJ5d2hlcmUsIHJhdGhlciB0aGFuIHJlcG9ydGluZyBzdWNjZXNzIHdoaWxlXG4gKiB0aGUgdG9rZW4gc3RpbGwgd29ya3MgYWdhaW5zdCBvdGhlciBzZXJ2aWNlcy5cbiAqXG4gKiBUaGUgZW50cnkgZXhwaXJlcyB3aXRoIHRoZSBzZXNzaW9uOiBvbmNlIHRoZSB0b2tlbiBpdHNlbGYgY2FuIG5vIGxvbmdlciBiZVxuICogdXNlZCwgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJldm9rZSwgc28gdGhlIGtleSBjbGVhbnMgaXRzZWxmIHVwLlxuICpcbiAqIEBwYXJhbSB0dGxNcyAtIHRpbWUgcmVtYWluaW5nIG9uIHRoZSBzZXNzaW9uJ3MgdG9rZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbihcbiAgcmVkaXM6IFJlZGlzQ2FjaGVDbGllbnQsXG4gIGp0aTogc3RyaW5nLFxuICB0dGxNczogbnVtYmVyLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVkaXMuc2V0KHNlc3Npb25SZXZvY2F0aW9uS2V5KGp0aSksICcxJywgJ1BYJywgTWF0aC5tYXgoMTAwMCwgTWF0aC5jZWlsKHR0bE1zKSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignU2Vzc2lvbi1yZXZvY2F0aW9uIHB1Ymxpc2ggZmFpbGVkIChvdGhlciBzZXJ2aWNlcyB3aWxsIGhvbm91ciB0aGUgdG9rZW4gdW50aWwgaXQgZXhwaXJlcyknLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUHVibGlzaCB0aGF0IE9ORSBjcmVkZW50aWFsIOKAlCBhIHNlc3Npb24gc2xvdCAoYHNpZGApIG9yIGFuIGFjY2VzcyBrZXlcbiAqIChga2V5YCkg4oCUIGhhcyBiZWVuIHJldm9rZWQsIHNvIGV2ZXJ5IHNlcnZpY2UgcmVqZWN0cyB0aGUgdG9rZW5zIHRoYXQgbmFtZSBpdFxuICogb24gdGhlIG5leHQgcmVxdWVzdCAocGxhdGZvcm0gc2lkZSkuXG4gKlxuICogYHR0bFNlY29uZHNgIE1VU1QgYmUgYXQgbGVhc3QgdGhlIGxvbmdlc3QgbGlmZXRpbWUgb2YgYW55IHRva2VuIHRoYXQgY2FuXG4gKiBjYXJyeSB0aGlzIGlkIChhbiBhY2Nlc3MgdG9rZW4gbWludGVkIGZyb20gdGhlIHNsb3QsIGFuIGV4Y2hhbmdlZCBrZXkgdG9rZW4sXG4gKiBvciBhIHRva2VuIGRlcml2ZWQgZnJvbSBvbmUpOiB0aGUgZW50cnkgbGFwc2luZyBmaXJzdCB3b3VsZCByZWFkIGFzIFwibm90XG4gKiByZXZva2VkXCIgd2hpbGUgc3VjaCBhIHRva2VuIGlzIHN0aWxsIGFsaXZlLlxuICpcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcHVibGlzaCBsYW5kZWQsIHNvIHRoZSBjYWxsZXIgY2FuIHJlcG9ydCBhIHJldm9jYXRpb25cbiAqIHRoYXQgZGlkIG5vdCByZWFjaCB0aGUgb3RoZXIgc2VydmljZXMgaW5zdGVhZCBvZiBjbGFpbWluZyBzdWNjZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uKFxuICByZWRpczogUmVkaXNDYWNoZUNsaWVudCxcbiAga2luZDogQ3JlZGVudGlhbEtpbmQsXG4gIGlkOiBzdHJpbmcsXG4gIHR0bFNlY29uZHM6IG51bWJlcixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlZGlzLnNldChjcmVkZW50aWFsUmV2b2NhdGlvbktleShraW5kLCBpZCksICcxJywgJ0VYJywgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHR0bFNlY29uZHMpKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdDcmVkZW50aWFsLXJldm9jYXRpb24gcHVibGlzaCBmYWlsZWQgKHNlcnZpY2VzIGhvbm91ciB0aGUgY3JlZGVudGlhbCB1bnRpbCBpdHMgdG9rZW5zIGV4cGlyZSknLCB7XG4gICAgICBraW5kLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
|
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
* Platform's own audit events (user.login, org.create, …) live in MongoDB
|
|
5
5
|
* via the AuditEvent model — that's a separate persistence path scoped to
|
|
6
6
|
* the platform service. The events below are emitted by other services
|
|
7
|
-
* (image-registry, etc.) via the `
|
|
7
|
+
* (image-registry, etc.) via the `logAuditEvent` helper as structured log
|
|
8
8
|
* lines with `eventCategory: 'audit'`, scraped by Loki for queryable
|
|
9
9
|
* audit history.
|
|
10
10
|
*
|
|
11
11
|
* Add a new event:
|
|
12
12
|
* 1. Extend the union type below.
|
|
13
|
-
* 2. Document it in `docs/audit-events.md
|
|
14
|
-
*
|
|
15
|
-
* 3. Emit via `
|
|
13
|
+
* 2. Document it in `docs/audit-events.md`, including any payload-specific
|
|
14
|
+
* fields.
|
|
15
|
+
* 3. Emit via `logAuditEvent(logger, { event: 'event.name', … })` from the route.
|
|
16
16
|
*/
|
|
17
17
|
/**
|
|
18
|
-
* Correlation context shared by every cross-service audit event. Optional
|
|
19
|
-
*
|
|
18
|
+
* Correlation context shared by every cross-service audit event. Optional;
|
|
19
|
+
* when populated, these let an operator
|
|
20
20
|
* pivot a Loki audit line to the originating HTTP request (`requestId`) or the
|
|
21
21
|
* end-to-end distributed trace (`traceId`) — and line them up with platform's
|
|
22
22
|
* MongoDB audit events, which carry the same two fields.
|