@pipeline-builder/pipeline-manager 4.4.6 → 4.4.8
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/dist/agent/ai.d.ts +11 -0
- package/dist/agent/ai.d.ts.map +1 -1
- package/dist/agent/ai.js +47 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -2
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +3 -1
- package/dist/commands/create-pipeline.d.ts.map +1 -1
- package/dist/commands/create-pipeline.js +11 -2
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +20 -2
- package/dist/commands/report.js +4 -4
- package/dist/commands/security-report.d.ts +42 -0
- package/dist/commands/security-report.d.ts.map +1 -0
- package/dist/commands/security-report.js +89 -0
- package/dist/commands/setup-events.d.ts.map +1 -1
- package/dist/commands/setup-events.js +14 -1
- package/dist/commands/store-token.d.ts +1 -0
- package/dist/commands/store-token.d.ts.map +1 -1
- package/dist/commands/store-token.js +45 -19
- package/dist/commands/synth.d.ts +7 -1
- package/dist/commands/synth.d.ts.map +1 -1
- package/dist/commands/synth.js +66 -4
- package/dist/commands/verify-plugins.d.ts +45 -0
- package/dist/commands/verify-plugins.d.ts.map +1 -0
- package/dist/commands/verify-plugins.js +134 -0
- package/dist/lambda/token-renew-handler.d.ts +3 -1
- package/dist/lambda/token-renew-handler.d.ts.map +1 -1
- package/dist/lambda/token-renew-handler.js +31 -5
- package/dist/templates/events-stack.json +10 -0
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +20 -3
- package/dist/utils/auth-utils.d.ts.map +1 -1
- package/dist/utils/auth-utils.js +3 -1
- package/dist/utils/cdk-utils.js +2 -2
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +5 -2
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +9 -4
- package/dist/utils/deploy-runner.d.ts +25 -0
- package/dist/utils/deploy-runner.d.ts.map +1 -1
- package/dist/utils/deploy-runner.js +34 -5
- package/dist/utils/device-auth.d.ts.map +1 -1
- package/dist/utils/device-auth.js +4 -3
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +8 -1
- package/dist/utils/pipeline-config.d.ts +3 -0
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +4 -3
- package/dist/utils/platform-secret.d.ts.map +1 -1
- package/dist/utils/platform-secret.js +3 -1
- package/dist/utils/plugin-resolver.d.ts +41 -3
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +125 -21
- package/dist/utils/registration-client.d.ts +28 -0
- package/dist/utils/registration-client.d.ts.map +1 -0
- package/dist/utils/registration-client.js +57 -0
- package/dist/utils/request-context.d.ts +11 -0
- package/dist/utils/request-context.d.ts.map +1 -0
- package/dist/utils/request-context.js +62 -0
- package/dist/utils/service-account.d.ts +6 -4
- package/dist/utils/service-account.d.ts.map +1 -1
- package/dist/utils/service-account.js +14 -9
- package/package.json +6 -5
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { ErrorCode, errorMessage } from '@pipeline-builder/api-core';
|
|
4
|
-
import { pluginArtifactAlias, pluginLookupFilter, unwrapLookup } from '@pipeline-builder/pipeline-core';
|
|
4
|
+
import { collectPluginSteps, exactPinNotFoundMessage, lookupNotFoundState, pluginArtifactAlias, pluginLookupFilter, summarizeLookupWarnings, unwrapLookup, } from '@pipeline-builder/pipeline-core';
|
|
5
|
+
import pico from 'picocolors';
|
|
5
6
|
import { ApiClient } from './api-client.js';
|
|
6
7
|
import { printWarning } from './output-utils.js';
|
|
7
8
|
/**
|
|
@@ -61,17 +62,20 @@ function collectPluginRefs(props) {
|
|
|
61
62
|
/**
|
|
62
63
|
* Lookup refusals that must STOP the synth rather than fall back to
|
|
63
64
|
* deploy-time resolution: an image whose signature doesn't verify, a listing
|
|
64
|
-
* the org can't use (not installed, blocked by its policy, yanked
|
|
65
|
-
* suspended), and
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* the org can't use (not installed, blocked by its allow/deny policy, yanked
|
|
66
|
+
* or suspended), and an org plugin that was deleted. Falling back would
|
|
67
|
+
* quietly turn each into an unresolved step that fails at run time instead of
|
|
68
|
+
* now. Vulnerability state is NEVER one of these: it arrives as graded
|
|
69
|
+
* warnings beside a resolved plugin.
|
|
68
70
|
*/
|
|
69
71
|
const FATAL_LOOKUP_CODES = [
|
|
70
72
|
ErrorCode.IMAGE_VERIFICATION_FAILED,
|
|
71
73
|
ErrorCode.PLUGIN_NOT_INSTALLED,
|
|
72
74
|
ErrorCode.PLUGIN_BLOCKED_BY_POLICY,
|
|
73
75
|
ErrorCode.PLUGIN_UNAVAILABLE,
|
|
74
|
-
|
|
76
|
+
// The org's own plugin was deleted: the lookup refuses it rather than fall
|
|
77
|
+
// through to a same-name listing. (Plugin service code; matched as a string.)
|
|
78
|
+
'PLUGIN_DELETED',
|
|
75
79
|
];
|
|
76
80
|
/** The error code of a plugin service answer, when it is one of {@link FATAL_LOOKUP_CODES}. */
|
|
77
81
|
function fatalLookupCode(err) {
|
|
@@ -79,6 +83,68 @@ function fatalLookupCode(err) {
|
|
|
79
83
|
const code = data && typeof data === 'object' ? data.code : undefined;
|
|
80
84
|
return typeof code === 'string' && FATAL_LOOKUP_CODES.includes(code) ? code : null;
|
|
81
85
|
}
|
|
86
|
+
/** Whether the plugin service answered "no such plugin/version" (404 NOT_FOUND). */
|
|
87
|
+
function isNotFound(err) {
|
|
88
|
+
const response = err?.response;
|
|
89
|
+
const code = response?.data && typeof response.data === 'object' ? response.data.code : undefined;
|
|
90
|
+
return response?.status === 404 || code === ErrorCode.NOT_FOUND;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The version a reference PINS — one exact `x.y.z[-pre]`, not a range or
|
|
94
|
+
* `latest`. A pin names a version that must exist: if it doesn't (never
|
|
95
|
+
* published, or refused by the build's vulnerability gate, which saves
|
|
96
|
+
* nothing), there is no outage to ride out and nothing for the deploy-time
|
|
97
|
+
* lookup to find either.
|
|
98
|
+
*/
|
|
99
|
+
function exactVersionPin(ref) {
|
|
100
|
+
const version = ref.filter?.version;
|
|
101
|
+
return typeof version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? version : null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Every fatal refusal of one pre-resolution pass. Carries the structured list
|
|
105
|
+
* as well as the human message, so the synth can emit a machine-readable
|
|
106
|
+
* failure line (`PB_SYNTH_FAILURE`) the execution events pick up.
|
|
107
|
+
*/
|
|
108
|
+
export class PluginResolutionError extends Error {
|
|
109
|
+
refusals;
|
|
110
|
+
constructor(refusals) {
|
|
111
|
+
super(refusals.length === 1
|
|
112
|
+
? refusals[0].message
|
|
113
|
+
: `${refusals.length} plugins can't be used:\n${refusals.map((r) => ` - ${r.message}`).join('\n')}`);
|
|
114
|
+
this.refusals = refusals;
|
|
115
|
+
this.name = 'PluginResolutionError';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Why an exact pin was not found, phrased from the 404's `details.state`
|
|
120
|
+
* (`deleted` / `inactive` / `yanked` / `missing`). Without a state the answer
|
|
121
|
+
* cannot tell the cases apart, so the message names the two likeliest.
|
|
122
|
+
* Shared with the deploy-time Lambda's CloudFormation reason (pipeline-core).
|
|
123
|
+
*/
|
|
124
|
+
function pinNotFoundMessage(label, pin, err) {
|
|
125
|
+
return exactPinNotFoundMessage(label, pin, lookupNotFoundState(err));
|
|
126
|
+
}
|
|
127
|
+
const SEVERITY_STYLE = {
|
|
128
|
+
info: pico.cyan,
|
|
129
|
+
warning: pico.yellow,
|
|
130
|
+
error: pico.red,
|
|
131
|
+
critical: (t) => pico.bold(pico.red(t)),
|
|
132
|
+
};
|
|
133
|
+
/** Print one lookup warning, prefixed and coloured by its severity. */
|
|
134
|
+
export function printLookupWarning(label, warning) {
|
|
135
|
+
const tag = SEVERITY_STYLE[warning.severity](`[${warning.severity.toUpperCase()}]`);
|
|
136
|
+
printWarning(`${tag} Plugin "${label}": ${warning.message}`);
|
|
137
|
+
}
|
|
138
|
+
/** Print the one-line severity summary of a synth's lookup warnings (nothing when none). */
|
|
139
|
+
export function printLookupWarningSummary(warnings) {
|
|
140
|
+
const line = summarizeLookupWarnings(warnings);
|
|
141
|
+
if (!line)
|
|
142
|
+
return;
|
|
143
|
+
const worst = warnings.some((w) => w.severity === 'critical') ? 'critical'
|
|
144
|
+
: warnings.some((w) => w.severity === 'error') ? 'error'
|
|
145
|
+
: warnings.some((w) => w.severity === 'warning') ? 'warning' : 'info';
|
|
146
|
+
printWarning(SEVERITY_STYLE[worst](line));
|
|
147
|
+
}
|
|
82
148
|
/** The plugin service's own refusal message, when the answer carries one. */
|
|
83
149
|
function serviceMessage(err) {
|
|
84
150
|
const data = err?.response?.data;
|
|
@@ -95,16 +161,40 @@ function serviceMessage(err) {
|
|
|
95
161
|
*
|
|
96
162
|
* Failures are non-fatal: a missing plugin or unreachable API logs a warning
|
|
97
163
|
* and falls through to the deploy-time custom resource path so partial
|
|
98
|
-
* platform outages don't block synth/deploy. The
|
|
99
|
-
*
|
|
164
|
+
* platform outages don't block synth/deploy. The exceptions abort the synth:
|
|
165
|
+
* the {@link FATAL_LOOKUP_CODES} refusals, and an exact version pin that does
|
|
166
|
+
* not exist.
|
|
167
|
+
*
|
|
168
|
+
* Every reference is looked up before anything is thrown, and ALL fatal
|
|
169
|
+
* refusals are reported together. Stopping at the first meant a pipeline with
|
|
170
|
+
* three refused plugins took three synth attempts to learn about all three.
|
|
171
|
+
*
|
|
172
|
+
* Every lookup warning is printed, graded by severity, and appended to
|
|
173
|
+
* `warningSink` when given (the synth prints a one-line summary at its end).
|
|
174
|
+
* A warning never fails the synth — vulnerability state is reported, not
|
|
175
|
+
* enforced.
|
|
176
|
+
*
|
|
177
|
+
* When the props carry a `pipelineId`, each lookup also sends
|
|
178
|
+
* `context: { pipelineId, stepKeys }` — the label (`pluginStepLabel`: `synth` or
|
|
179
|
+
* `<stage>/<alias ?? name>`) of EVERY step the de-duplicated reference serves —
|
|
180
|
+
* so the plugin service can record the warnings it returns against each of
|
|
181
|
+
* those pipeline steps, not only print them into this synth's log.
|
|
100
182
|
*
|
|
101
183
|
* Keyed by `alias || name` to match `PluginLookup.plugin()`.
|
|
102
184
|
*/
|
|
103
|
-
export async function resolvePluginsForProps(client, props) {
|
|
185
|
+
export async function resolvePluginsForProps(client, props, warningSink) {
|
|
104
186
|
const refs = collectPluginRefs(props);
|
|
105
187
|
if (refs.length === 0)
|
|
106
188
|
return {};
|
|
189
|
+
const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
|
|
190
|
+
// One lookup per alias may serve several steps: the labels of each, by alias.
|
|
191
|
+
const stepKeys = new Map();
|
|
192
|
+
for (const step of collectPluginSteps(props)) {
|
|
193
|
+
const key = cacheKey(step);
|
|
194
|
+
stepKeys.set(key, [...(stepKeys.get(key) ?? []), step.label]);
|
|
195
|
+
}
|
|
107
196
|
const resolved = {};
|
|
197
|
+
const fatal = [];
|
|
108
198
|
await Promise.all(refs.map(async (ref) => {
|
|
109
199
|
const key = cacheKey(ref);
|
|
110
200
|
const label = ref.publisher ? `${ref.publisher}/${ref.name}` : ref.name;
|
|
@@ -117,15 +207,24 @@ export async function resolvePluginsForProps(client, props) {
|
|
|
117
207
|
// the ref's plugin name; an explicit filter `name` still takes precedence.
|
|
118
208
|
// Shared with the pipeline service's contract check (same filter, same plugin).
|
|
119
209
|
const filter = pluginLookupFilter(ref);
|
|
210
|
+
const pin = exactVersionPin(ref);
|
|
211
|
+
const refuse = (code, message) => { fatal.push({ plugin: label, code, message }); };
|
|
120
212
|
try {
|
|
121
|
-
const res = await client.post('/api/plugins/lookup', {
|
|
213
|
+
const res = await client.post('/api/plugins/lookup', {
|
|
214
|
+
filter,
|
|
215
|
+
...(pipelineId && stepKeys.has(key) ? { context: { pipelineId, stepKeys: stepKeys.get(key) } } : {}),
|
|
216
|
+
});
|
|
122
217
|
const { plugin, warnings } = unwrapLookup(res);
|
|
123
218
|
for (const warning of warnings) {
|
|
124
|
-
|
|
219
|
+
printLookupWarning(label, warning);
|
|
220
|
+
warningSink?.push(warning);
|
|
125
221
|
}
|
|
126
222
|
if (plugin) {
|
|
127
223
|
resolved[key] = plugin;
|
|
128
224
|
}
|
|
225
|
+
else if (pin) {
|
|
226
|
+
refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin));
|
|
227
|
+
}
|
|
129
228
|
else {
|
|
130
229
|
printWarning(`Plugin "${label}" lookup returned no record — falling back to deploy-time resolution`);
|
|
131
230
|
}
|
|
@@ -134,20 +233,25 @@ export async function resolvePluginsForProps(client, props) {
|
|
|
134
233
|
// A plugin whose image signature doesn't verify, or a listing the org
|
|
135
234
|
// can't use, is NOT an outage to ride out: falling back would quietly
|
|
136
235
|
// turn it into an unresolved step. Stop.
|
|
137
|
-
const
|
|
138
|
-
if (
|
|
139
|
-
|
|
236
|
+
const code = fatalLookupCode(err);
|
|
237
|
+
if (code === ErrorCode.IMAGE_VERIFICATION_FAILED) {
|
|
238
|
+
refuse(code, `Plugin "${label}" image failed signature verification: ${errorMessage(err)}`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (code) {
|
|
242
|
+
refuse(code, `Plugin "${label}" can't be used (${code}): ${serviceMessage(err) ?? errorMessage(err)}`);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (pin && isNotFound(err)) {
|
|
246
|
+
refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin, err));
|
|
247
|
+
return;
|
|
140
248
|
}
|
|
141
|
-
// The block-mode refusal already names the version, the CVEs and the fix:
|
|
142
|
-
// print it as the platform wrote it.
|
|
143
|
-
if (fatal === ErrorCode.PLUGIN_VERSION_VULN_BLOCKED)
|
|
144
|
-
throw new Error(serviceMessage(err) ?? errorMessage(err));
|
|
145
|
-
if (fatal)
|
|
146
|
-
throw new Error(`Plugin "${label}" can't be used (${fatal}): ${errorMessage(err)}`);
|
|
147
249
|
const msg = errorMessage(err);
|
|
148
250
|
printWarning(`Plugin "${label}" pre-resolution failed (${msg}) — falling back to deploy-time resolution`);
|
|
149
251
|
}
|
|
150
252
|
}));
|
|
253
|
+
if (fatal.length > 0)
|
|
254
|
+
throw new PluginResolutionError(fatal);
|
|
151
255
|
return resolved;
|
|
152
256
|
}
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFZLEVBQVEsRUFBRTtRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxNQUFNLElBQUksR0FBSSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQTJCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxD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QztZQUNiLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUseUNBQXlDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssMENBQTBDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakcsQ0FBQztZQUNELDBFQUEwRTtZQUMxRSxxQ0FBcUM7WUFDckMsSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLDJCQUEyQjtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRyxJQUFJLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssb0JBQW9CLEtBQUssTUFBTSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9GLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsV0FBVyxLQUFLLDRCQUE0QixHQUFHLDRDQUE0QyxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcGx1Z2luQXJ0aWZhY3RBbGlhcywgcGx1Z2luTG9va3VwRmlsdGVyLCB1bndyYXBMb29rdXAgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYSBsaXN0aW5nXG4gKiB0aGUgb3JnIGNhbid0IHVzZSAobm90IGluc3RhbGxlZCwgYmxvY2tlZCBieSBpdHMgcG9saWN5LCB5YW5rZWQgb3JcbiAqIHN1c3BlbmRlZCksIGFuZCDigJQgd2l0aCBgUExVR0lOX0JMT0NLX09OX05FV19DUklUSUNBTGAgb24g4oCUIGEgcGluIHRvIGFcbiAqIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIGZsYWdnZWQuIEZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5IHR1cm4gZWFjaCBpbnRvXG4gKiBhbiB1bnJlc29sdmVkIHN0ZXAgdGhhdCBmYWlscyBhdCBydW4gdGltZSBpbnN0ZWFkIG9mIG5vdy5cbiAqL1xuY29uc3QgRkFUQUxfTE9PS1VQX0NPREVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fTk9UX0lOU1RBTExFRCxcbiAgRXJyb3JDb2RlLlBMVUdJTl9CTE9DS0VEX0JZX1BPTElDWSxcbiAgRXJyb3JDb2RlLlBMVUdJTl9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlBMVUdJTl9WRVJTSU9OX1ZVTE5fQkxPQ0tFRCxcbl07XG5cbi8qKiBUaGUgZXJyb3IgY29kZSBvZiBhIHBsdWdpbiBzZXJ2aWNlIGFuc3dlciwgd2hlbiBpdCBpcyBvbmUgb2Yge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30uICovXG5mdW5jdGlvbiBmYXRhbExvb2t1cENvZGUoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBjb2RlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgRkFUQUxfTE9PS1VQX0NPREVTLmluY2x1ZGVzKGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbi8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBvd24gcmVmdXNhbCBtZXNzYWdlLCB3aGVuIHRoZSBhbnN3ZXIgY2FycmllcyBvbmUuICovXG5mdW5jdGlvbiBzZXJ2aWNlTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZGF0YSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U/LmRhdGE7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IChkYXRhIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQcmUtcmVzb2x2ZSBwbHVnaW5zIGJ5IGNhbGxpbmcgdGhlIHNhbWUgYFBPU1QgL2FwaS9wbHVnaW5zL2xvb2t1cGAgZW5kcG9pbnRcbiAqIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIHVzZXMuIFJldHVybmluZyB0aGUgZnVsbCBQbHVnaW5cbiAqIHJlY29yZCBhdCBzeW50aCB0aW1lIGlzIHdoYXQgYWxsb3dzIHRoZSByZXN1bHRpbmcgQ0ZOIHRlbXBsYXRlIHRvIHNoaXBcbiAqIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyAoYDxob3N0Pi88bnM+LzxuYW1lPjo8dmVyc2lvbj5gKSByYXRoZXIgdGhhblxuICogdGhlIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMGAgZmFsbGJhY2sgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoXG4gKiBmb3JjZXMuXG4gKlxuICogRmFpbHVyZXMgYXJlIG5vbi1mYXRhbDogYSBtaXNzaW5nIHBsdWdpbiBvciB1bnJlYWNoYWJsZSBBUEkgbG9ncyBhIHdhcm5pbmdcbiAqIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgcGF0aCBzbyBwYXJ0aWFsXG4gKiBwbGF0Zm9ybSBvdXRhZ2VzIGRvbid0IGJsb2NrIHN5bnRoL2RlcGxveS4gVGhlIGV4Y2VwdGlvbiBpcyBhbiBpbWFnZSB0aGF0XG4gKiBmYWlscyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKAlCB0aGF0IGFib3J0cyB0aGUgc3ludGguXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocmVmcy5tYXAoYXN5bmMgKHJlZikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHJlZik7XG4gICAgY29uc3QgbGFiZWwgPSByZWYucHVibGlzaGVyID8gYCR7cmVmLnB1Ymxpc2hlcn0vJHtyZWYubmFtZX1gIDogcmVmLm5hbWU7XG4gICAgLy8gVGhlIHBsdWdpbiBOQU1FIGxpdmVzIG9uIHRoZSByZWYgKGEgc2libGluZyBvZiBgZmlsdGVyYCksIE5PVCBpbnNpZGUgdGhlXG4gICAgLy8gZmlsdGVyIG9iamVjdCDigJQgYnV0IHRoZSBsb29rdXAgbWF0Y2hlcyBvbiB0aGUgZmlsdGVyLiBBIGZpbHRlciB3aXRob3V0XG4gICAgLy8gYG5hbWVgIChlLmcuIGB7dmVyc2lvbiwgdmlzaWJpbGl0eSwgaXNBY3RpdmUsIGlzRGVmYXVsdH1gKSBtYXRjaGVzIEFOWVxuICAgIC8vIHBsdWdpbiB3aXRoIHRob3NlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgZW5kcG9pbnQgcmV0dXJucyBhbiBhcmJpdHJhcnkgb25lXG4gICAgLy8gKHNlZW46IGBkb2NrZXJmaWxlLW11bHRpLXByb3ZpZGVyYCkuIFRoYXQgbWFkZSB0aGUgc3ludGggYW5kIGV2ZXJ5IHN0ZXBcbiAgICAvLyByZXNvbHZlIHRvIHRoZSBXUk9ORyBwbHVnaW4uIFNvIHdoZW4gdGhlIGZpbHRlciBvbWl0cyBgbmFtZWAsIGZhbGwgYmFjayB0b1xuICAgIC8vIHRoZSByZWYncyBwbHVnaW4gbmFtZTsgYW4gZXhwbGljaXQgZmlsdGVyIGBuYW1lYCBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgIC8vIFNoYXJlZCB3aXRoIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgKHNhbWUgZmlsdGVyLCBzYW1lIHBsdWdpbikuXG4gICAgY29uc3QgZmlsdGVyID0gcGx1Z2luTG9va3VwRmlsdGVyKHJlZik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywgeyBmaWx0ZXIgfSk7XG4gICAgICBjb25zdCB7IHBsdWdpbiwgd2FybmluZ3MgfSA9IHVud3JhcExvb2t1cChyZXMpO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nfWApO1xuICAgICAgfVxuICAgICAgaWYgKHBsdWdpbikge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gcGx1Z2luO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIGxvb2t1cCByZXR1cm5lZCBubyByZWNvcmQg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHBsdWdpbiB3aG9zZSBpbWFnZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIG9yIGEgbGlzdGluZyB0aGUgb3JnXG4gICAgICAvLyBjYW4ndCB1c2UsIGlzIE5PVCBhbiBvdXRhZ2UgdG8gcmlkZSBvdXQ6IGZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5XG4gICAgICAvLyB0dXJuIGl0IGludG8gYW4gdW5yZXNvbHZlZCBzdGVwLiBTdG9wLlxuICAgICAgY29uc3QgZmF0YWwgPSBmYXRhbExvb2t1cENvZGUoZXJyKTtcbiAgICAgIGlmIChmYXRhbCA9PT0gRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke2xhYmVsfVwiIGltYWdlIGZhaWxlZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGJsb2NrLW1vZGUgcmVmdXNhbCBhbHJlYWR5IG5hbWVzIHRoZSB2ZXJzaW9uLCB0aGUgQ1ZFcyBhbmQgdGhlIGZpeDpcbiAgICAgIC8vIHByaW50IGl0IGFzIHRoZSBwbGF0Zm9ybSB3cm90ZSBpdC5cbiAgICAgIGlmIChmYXRhbCA9PT0gRXJyb3JDb2RlLlBMVUdJTl9WRVJTSU9OX1ZVTE5fQkxPQ0tFRCkgdGhyb3cgbmV3IEVycm9yKHNlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycikpO1xuICAgICAgaWYgKGZhdGFsKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7bGFiZWx9XCIgY2FuJ3QgYmUgdXNlZCAoJHtmYXRhbH0pOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgY29uc3QgbXNnID0gZXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgcHJlLXJlc29sdXRpb24gZmFpbGVkICgke21zZ30pIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgIH1cbiAgfSkpO1xuXG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiJdfQ==
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUNMLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUNoRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEdBQy9FLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFZLEVBQVEsRUFBRTtRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxNQUFNLElB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VUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLFlBQVksQ0FBQyxXQUFXLEtBQUssNEJBQTRCLEdBQUcsNENBQTRDLENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQge1xuICBjb2xsZWN0UGx1Z2luU3RlcHMsIGV4YWN0UGluTm90Rm91bmRNZXNzYWdlLCBsb29rdXBOb3RGb3VuZFN0YXRlLCB0eXBlIExvb2t1cFdhcm5pbmcsIHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5LFxuICBwbHVnaW5BcnRpZmFjdEFsaWFzLCBwbHVnaW5Mb29rdXBGaWx0ZXIsIHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzLCB1bndyYXBMb29rdXAsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKiogTWluaW1hbCBwbHVnaW4gcmVmZXJlbmNlIHNoYXBlIOKAlCBtYXRjaGVzIFBsdWdpbk9wdGlvbnMgZnJvbSBwaXBlbGluZS1jb3JlLiAqL1xuaW50ZXJmYWNlIFBsdWdpblJlZiB7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHB1Ymxpc2hlcj86IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENhY2hlIGtleSBtYXRjaGluZyBgUGx1Z2luTG9va3VwLm5vcm1hbGl6ZSgpYDogdGhlIGV4cGxpY2l0IGFsaWFzIHdoZW4gc2V0LFxuICogb3RoZXJ3aXNlIGBbPHB1Ymxpc2hlcj4tXTxuYW1lPi1hbGlhc2Ag4oCUIHBpcGVsaW5lLWNvcmUnc1xuICogYHBsdWdpbkFydGlmYWN0QWxpYXNgLCB0aGUgb25lIHJ1bGUgZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBtYXAgdXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcge1xuICByZXR1cm4gcGx1Z2luQXJ0aWZhY3RBbGlhcyhyZWYpO1xufVxuXG4vKipcbiAqIFdhbGsgdGhlIHBpcGVsaW5lIHByb3BzIHRyZWUgdG8gY29sbGVjdCBldmVyeSBwbHVnaW4gcmVmZXJlbmNlLiBQbHVnaW5zXG4gKiBhcHBlYXIgYXQgYHN5bnRoLnBsdWdpbmAgYW5kIGF0IGBzdGFnZXNbXS5zdGVwc1tdLnBsdWdpbmAuIEVudHJpZXMgYXJlXG4gKiBkZS1kdXBsaWNhdGVkIGJ5IGBjYWNoZUtleSgpYCDigJQgdGhlIHNhbWUga2V5IGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHVzZXMsXG4gKiBzbyB0aGUgcmVzb2x2ZWQtcGx1Z2lucyBtYXAgbG9va3VwcyBtYXRjaCBkb3duc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQbHVnaW5SZWZbXSB7XG4gIGNvbnN0IHJlZnM6IFBsdWdpblJlZltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IHB1c2ggPSAocmF3OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICBjb25zdCByID0gcmF3IGFzIFBsdWdpblJlZjtcbiAgICBpZiAoIXIubmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHIpO1xuICAgIC8vIFRoZSBuYW1lIHRoZSBsb29rdXAgd2lsbCBUQVJHRVQg4oCUIGFuIGV4cGxpY2l0IGBmaWx0ZXIubmFtZWAgd2lucyAoc2VlXG4gICAgLy8gYmVsb3cpLCBzbyB0d28gcmVmcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgcGx1Z2luIGFyZSBub3QgYSBjb2xsaXNpb24uXG4gICAgY29uc3QgbmFtZSA9IChyLmZpbHRlcj8ubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHIubmFtZTtcbiAgICBjb25zdCB0YXJnZXQgPSByLnB1Ymxpc2hlciA/IGAke3IucHVibGlzaGVyfS8ke25hbWV9YCA6IG5hbWU7XG4gICAgY29uc3QgaG9sZGVyID0gc2Vlbi5nZXQoa2V5KTtcbiAgICBpZiAoaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9uZSBhbGlhcyBjYW4gb25seSBldmVyIG1lYW4gb25lIHBsdWdpbi4gRGVkdXBsaWNhdGluZyBvbiB0aGUgYWxpYXNcbiAgICAgIC8vIGFsb25lIGtlcHQgdGhlIEZJUlNUIHBsdWdpbiBhbmQgc2lsZW50bHkgZHJvcHBlZCB0aGUgc2Vjb25kLCBzbyBhIHN0ZXBcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbWF2ZW4tYnVpbGQnLCBhbGlhczogJ2J1aWxkJyB9YCBhZnRlciBhbm90aGVyXG4gICAgICAvLyBkZWNsYXJpbmcgYHsgbmFtZTogJ25vZGVqcy1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIHJhbiBub2RlanMtYnVpbGQnc1xuICAgICAgLy8gaW1hZ2UgYW5kIGNvbW1hbmRzIOKAlCBubyBlcnJvciwganVzdCB0aGUgd3JvbmcgYnVpbGQuXG4gICAgICBpZiAoaG9sZGVyICE9PSB0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQbHVnaW4gYWxpYXMgXCIke2tleX1cIiBpcyB1c2VkIGZvciB0d28gZGlmZmVyZW50IHBsdWdpbnMgKFwiJHtob2xkZXJ9XCIgYW5kIFwiJHt0YXJnZXR9XCIpLiBgXG4gICAgICAgICAgKyAnR2l2ZSBlYWNoIHBsdWdpbiBpdHMgb3duIGFsaWFzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4uc2V0KGtleSwgdGFyZ2V0KTtcbiAgICByZWZzLnB1c2gocik7XG4gIH07XG5cbiAgY29uc3Qgc3ludGggPSBwcm9wcy5zeW50aCBhcyB7IHBsdWdpbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcHVzaChzeW50aD8ucGx1Z2luKTtcblxuICBjb25zdCBzdGFnZXMgPSBwcm9wcy5zdGFnZXMgYXMgQXJyYXk8eyBzdGVwcz86IEFycmF5PHsgcGx1Z2luPzogdW5rbm93biB9PiB9PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RhZ2Uuc3RlcHMgPz8gW10pIHtcbiAgICAgIHB1c2goc3RlcC5wbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG4vKipcbiAqIExvb2t1cCByZWZ1c2FscyB0aGF0IG11c3QgU1RPUCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbCBiYWNrIHRvXG4gKiBkZXBsb3ktdGltZSByZXNvbHV0aW9uOiBhbiBpbWFnZSB3aG9zZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIGEgbGlzdGluZ1xuICogdGhlIG9yZyBjYW4ndCB1c2UgKG5vdCBpbnN0YWxsZWQsIGJsb2NrZWQgYnkgaXRzIGFsbG93L2RlbnkgcG9saWN5LCB5YW5rZWRcbiAqIG9yIHN1c3BlbmRlZCksIGFuZCBhbiBvcmcgcGx1Z2luIHRoYXQgd2FzIGRlbGV0ZWQuIEZhbGxpbmcgYmFjayB3b3VsZFxuICogcXVpZXRseSB0dXJuIGVhY2ggaW50byBhbiB1bnJlc29sdmVkIHN0ZXAgdGhhdCBmYWlscyBhdCBydW4gdGltZSBpbnN0ZWFkIG9mXG4gKiBub3cuIFZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgTkVWRVIgb25lIG9mIHRoZXNlOiBpdCBhcnJpdmVzIGFzIGdyYWRlZFxuICogd2FybmluZ3MgYmVzaWRlIGEgcmVzb2x2ZWQgcGx1Z2luLlxuICovXG5jb25zdCBGQVRBTF9MT09LVVBfQ09ERVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgRXJyb3JDb2RlLlBMVUdJTl9OT1RfSU5TVEFMTEVELFxuICBFcnJvckNvZGUuUExVR0lOX0JMT0NLRURfQllfUE9MSUNZLFxuICBFcnJvckNvZGUuUExVR0lOX1VOQVZBSUxBQkxFLFxuICAvLyBUaGUgb3JnJ3Mgb3duIHBsdWdpbiB3YXMgZGVsZXRlZDogdGhlIGxvb2t1cCByZWZ1c2VzIGl0IHJhdGhlciB0aGFuIGZhbGxcbiAgLy8gdGhyb3VnaCB0byBhIHNhbWUtbmFtZSBsaXN0aW5nLiAoUGx1Z2luIHNlcnZpY2UgY29kZTsgbWF0Y2hlZCBhcyBhIHN0cmluZy4pXG4gICdQTFVHSU5fREVMRVRFRCcsXG5dO1xuXG4vKiogVGhlIGVycm9yIGNvZGUgb2YgYSBwbHVnaW4gc2VydmljZSBhbnN3ZXIsIHdoZW4gaXQgaXMgb25lIG9mIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9LiAqL1xuZnVuY3Rpb24gZmF0YWxMb29rdXBDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIEZBVEFMX0xPT0tVUF9DT0RFUy5pbmNsdWRlcyhjb2RlKSA/IGNvZGUgOiBudWxsO1xufVxuXG4vKiogV2hldGhlciB0aGUgcGx1Z2luIHNlcnZpY2UgYW5zd2VyZWQgXCJubyBzdWNoIHBsdWdpbi92ZXJzaW9uXCIgKDQwNCBOT1RfRk9VTkQpLiAqL1xuZnVuY3Rpb24gaXNOb3RGb3VuZChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgcmVzcG9uc2UgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IHVua25vd247IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlO1xuICBjb25zdCBjb2RlID0gcmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnID8gKHJlc3BvbnNlLmRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0IHx8IGNvZGUgPT09IEVycm9yQ29kZS5OT1RfRk9VTkQ7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gYSByZWZlcmVuY2UgUElOUyDigJQgb25lIGV4YWN0IGB4LnkuelstcHJlXWAsIG5vdCBhIHJhbmdlIG9yXG4gKiBgbGF0ZXN0YC4gQSBwaW4gbmFtZXMgYSB2ZXJzaW9uIHRoYXQgbXVzdCBleGlzdDogaWYgaXQgZG9lc24ndCAobmV2ZXJcbiAqIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSB0aGUgYnVpbGQncyB2dWxuZXJhYmlsaXR5IGdhdGUsIHdoaWNoIHNhdmVzXG4gKiBub3RoaW5nKSwgdGhlcmUgaXMgbm8gb3V0YWdlIHRvIHJpZGUgb3V0IGFuZCBub3RoaW5nIGZvciB0aGUgZGVwbG95LXRpbWVcbiAqIGxvb2t1cCB0byBmaW5kIGVpdGhlci5cbiAqL1xuZnVuY3Rpb24gZXhhY3RWZXJzaW9uUGluKHJlZjogUGx1Z2luUmVmKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZlcnNpb24gPSByZWYuZmlsdGVyPy52ZXJzaW9uO1xuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16Li1dKyk/JC8udGVzdCh2ZXJzaW9uKSA/IHZlcnNpb24gOiBudWxsO1xufVxuXG4vKiogT25lIHBsdWdpbiB0aGUgc3ludGggY291bGQgbm90IHVzZSwgYXMge0BsaW5rIFBsdWdpblJlc29sdXRpb25FcnJvcn0gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUmVmdXNhbCB7XG4gIC8qKiBgWzxwdWJsaXNoZXI+L108bmFtZT5gIG9mIHRoZSByZWZlcmVuY2UuICovXG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuICAvKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZXJyb3IgY29kZSwgb3IgYSBsb2NhbCBvbmUgKGBQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkRgKS4gKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXZlcnkgZmF0YWwgcmVmdXNhbCBvZiBvbmUgcHJlLXJlc29sdXRpb24gcGFzcy4gQ2FycmllcyB0aGUgc3RydWN0dXJlZCBsaXN0XG4gKiBhcyB3ZWxsIGFzIHRoZSBodW1hbiBtZXNzYWdlLCBzbyB0aGUgc3ludGggY2FuIGVtaXQgYSBtYWNoaW5lLXJlYWRhYmxlXG4gKiBmYWlsdXJlIGxpbmUgKGBQQl9TWU5USF9GQUlMVVJFYCkgdGhlIGV4ZWN1dGlvbiBldmVudHMgcGljayB1cC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblJlc29sdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcmVmdXNhbHM6IHJlYWRvbmx5IFBsdWdpblJlZnVzYWxbXSkge1xuICAgIHN1cGVyKHJlZnVzYWxzLmxlbmd0aCA9PT0gMVxuICAgICAgPyByZWZ1c2Fsc1swXSEubWVzc2FnZVxuICAgICAgOiBgJHtyZWZ1c2Fscy5sZW5ndGh9IHBsdWdpbnMgY2FuJ3QgYmUgdXNlZDpcXG4ke3JlZnVzYWxzLm1hcCgocikgPT4gYCAgLSAke3IubWVzc2FnZX1gKS5qb2luKCdcXG4nKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luUmVzb2x1dGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoeSBhbiBleGFjdCBwaW4gd2FzIG5vdCBmb3VuZCwgcGhyYXNlZCBmcm9tIHRoZSA0MDQncyBgZGV0YWlscy5zdGF0ZWBcbiAqIChgZGVsZXRlZGAgLyBgaW5hY3RpdmVgIC8gYHlhbmtlZGAgLyBgbWlzc2luZ2ApLiBXaXRob3V0IGEgc3RhdGUgdGhlIGFuc3dlclxuICogY2Fubm90IHRlbGwgdGhlIGNhc2VzIGFwYXJ0LCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdHdvIGxpa2VsaWVzdC5cbiAqIFNoYXJlZCB3aXRoIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24gKHBpcGVsaW5lLWNvcmUpLlxuICovXG5mdW5jdGlvbiBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIGVycj86IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgbG9va3VwTm90Rm91bmRTdGF0ZShlcnIpKTtcbn1cblxuY29uc3QgU0VWRVJJVFlfU1RZTEU6IFJlY29yZDxMb29rdXBXYXJuaW5nU2V2ZXJpdHksIChzOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gIGluZm86IHBpY28uY3lhbixcbiAgd2FybmluZzogcGljby55ZWxsb3csXG4gIGVycm9yOiBwaWNvLnJlZCxcbiAgY3JpdGljYWw6ICh0KSA9PiBwaWNvLmJvbGQocGljby5yZWQodCkpLFxufTtcblxuLyoqIFByaW50IG9uZSBsb29rdXAgd2FybmluZywgcHJlZml4ZWQgYW5kIGNvbG91cmVkIGJ5IGl0cyBzZXZlcml0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmcobGFiZWw6IHN0cmluZywgd2FybmluZzogTG9va3VwV2FybmluZyk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBTRVZFUklUWV9TVFlMRVt3YXJuaW5nLnNldmVyaXR5XShgWyR7d2FybmluZy5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV1gKTtcbiAgcHJpbnRXYXJuaW5nKGAke3RhZ30gUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG59XG5cbi8qKiBQcmludCB0aGUgb25lLWxpbmUgc2V2ZXJpdHkgc3VtbWFyeSBvZiBhIHN5bnRoJ3MgbG9va3VwIHdhcm5pbmdzIChub3RoaW5nIHdoZW4gbm9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRMb29rdXBXYXJuaW5nU3VtbWFyeSh3YXJuaW5nczogcmVhZG9ubHkgTG9va3VwV2FybmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGxpbmUgPSBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5ncyk7XG4gIGlmICghbGluZSkgcmV0dXJuO1xuICBjb25zdCB3b3JzdCA9IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpID8gJ2NyaXRpY2FsJ1xuICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2Vycm9yJykgPyAnZXJyb3InXG4gICAgICA6IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykgPyAnd2FybmluZycgOiAnaW5mbyc7XG4gIHByaW50V2FybmluZyhTRVZFUklUWV9TVFlMRVt3b3JzdF0obGluZSkpO1xufVxuXG4vKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3Mgb3duIHJlZnVzYWwgbWVzc2FnZSwgd2hlbiB0aGUgYW5zd2VyIGNhcnJpZXMgb25lLiAqL1xuZnVuY3Rpb24gc2VydmljZU1lc3NhZ2UoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBtZXNzYWdlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IG51bGw7XG59XG5cbi8qKlxuICogUHJlLXJlc29sdmUgcGx1Z2lucyBieSBjYWxsaW5nIHRoZSBzYW1lIGBQT1NUIC9hcGkvcGx1Z2lucy9sb29rdXBgIGVuZHBvaW50XG4gKiB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIExhbWJkYSB1c2VzLiBSZXR1cm5pbmcgdGhlIGZ1bGwgUGx1Z2luXG4gKiByZWNvcmQgYXQgc3ludGggdGltZSBpcyB3aGF0IGFsbG93cyB0aGUgcmVzdWx0aW5nIENGTiB0ZW1wbGF0ZSB0byBzaGlwXG4gKiB3aXRoIHJlYWwgQ29kZUJ1aWxkIGltYWdlIFVSSXMgKGA8aG9zdD4vPG5zPi88bmFtZT46PHZlcnNpb24+YCkgcmF0aGVyIHRoYW5cbiAqIHRoZSBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjBgIGZhbGxiYWNrIHRoYXQgdGhlIHN5bnRoLXRpbWUgdG9rZW4gcGF0aFxuICogZm9yY2VzLlxuICpcbiAqIEZhaWx1cmVzIGFyZSBub24tZmF0YWw6IGEgbWlzc2luZyBwbHVnaW4gb3IgdW5yZWFjaGFibGUgQVBJIGxvZ3MgYSB3YXJuaW5nXG4gKiBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIHBhdGggc28gcGFydGlhbFxuICogcGxhdGZvcm0gb3V0YWdlcyBkb24ndCBibG9jayBzeW50aC9kZXBsb3kuIFRoZSBleGNlcHRpb25zIGFib3J0IHRoZSBzeW50aDpcbiAqIHRoZSB7QGxpbmsgRkFUQUxfTE9PS1VQX0NPREVTfSByZWZ1c2FscywgYW5kIGFuIGV4YWN0IHZlcnNpb24gcGluIHRoYXQgZG9lc1xuICogbm90IGV4aXN0LlxuICpcbiAqIEV2ZXJ5IHJlZmVyZW5jZSBpcyBsb29rZWQgdXAgYmVmb3JlIGFueXRoaW5nIGlzIHRocm93biwgYW5kIEFMTCBmYXRhbFxuICogcmVmdXNhbHMgYXJlIHJlcG9ydGVkIHRvZ2V0aGVyLiBTdG9wcGluZyBhdCB0aGUgZmlyc3QgbWVhbnQgYSBwaXBlbGluZSB3aXRoXG4gKiB0aHJlZSByZWZ1c2VkIHBsdWdpbnMgdG9vayB0aHJlZSBzeW50aCBhdHRlbXB0cyB0byBsZWFybiBhYm91dCBhbGwgdGhyZWUuXG4gKlxuICogRXZlcnkgbG9va3VwIHdhcm5pbmcgaXMgcHJpbnRlZCwgZ3JhZGVkIGJ5IHNldmVyaXR5LCBhbmQgYXBwZW5kZWQgdG9cbiAqIGB3YXJuaW5nU2lua2Agd2hlbiBnaXZlbiAodGhlIHN5bnRoIHByaW50cyBhIG9uZS1saW5lIHN1bW1hcnkgYXQgaXRzIGVuZCkuXG4gKiBBIHdhcm5pbmcgbmV2ZXIgZmFpbHMgdGhlIHN5bnRoIOKAlCB2dWxuZXJhYmlsaXR5IHN0YXRlIGlzIHJlcG9ydGVkLCBub3RcbiAqIGVuZm9yY2VkLlxuICpcbiAqIFdoZW4gdGhlIHByb3BzIGNhcnJ5IGEgYHBpcGVsaW5lSWRgLCBlYWNoIGxvb2t1cCBhbHNvIHNlbmRzXG4gKiBgY29udGV4dDogeyBwaXBlbGluZUlkLCBzdGVwS2V5cyB9YCDigJQgdGhlIGxhYmVsIChgcGx1Z2luU3RlcExhYmVsYDogYHN5bnRoYCBvclxuICogYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkgb2YgRVZFUlkgc3RlcCB0aGUgZGUtZHVwbGljYXRlZCByZWZlcmVuY2Ugc2VydmVzIOKAlFxuICogc28gdGhlIHBsdWdpbiBzZXJ2aWNlIGNhbiByZWNvcmQgdGhlIHdhcm5pbmdzIGl0IHJldHVybnMgYWdhaW5zdCBlYWNoIG9mXG4gKiB0aG9zZSBwaXBlbGluZSBzdGVwcywgbm90IG9ubHkgcHJpbnQgdGhlbSBpbnRvIHRoaXMgc3ludGgncyBsb2cuXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgd2FybmluZ1Npbms/OiBMb29rdXBXYXJuaW5nW10sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlZnMgPSBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wcyk7XG4gIGlmIChyZWZzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IHBpcGVsaW5lSWQgPSB0eXBlb2YgcHJvcHMucGlwZWxpbmVJZCA9PT0gJ3N0cmluZycgJiYgcHJvcHMucGlwZWxpbmVJZC5sZW5ndGggPiAwID8gcHJvcHMucGlwZWxpbmVJZCA6IHVuZGVmaW5lZDtcbiAgLy8gT25lIGxvb2t1cCBwZXIgYWxpYXMgbWF5IHNlcnZlIHNldmVyYWwgc3RlcHM6IHRoZSBsYWJlbHMgb2YgZWFjaCwgYnkgYWxpYXMuXG4gIGNvbnN0IHN0ZXBLZXlzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY29sbGVjdFBsdWdpblN0ZXBzKHByb3BzKSkge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHN0ZXApO1xuICAgIHN0ZXBLZXlzLnNldChrZXksIFsuLi4oc3RlcEtleXMuZ2V0KGtleSkgPz8gW10pLCBzdGVwLmxhYmVsXSk7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IGZhdGFsOiBQbHVnaW5SZWZ1c2FsW10gPSBbXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChyZWZzLm1hcChhc3luYyAocmVmKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocmVmKTtcbiAgICBjb25zdCBsYWJlbCA9IHJlZi5wdWJsaXNoZXIgPyBgJHtyZWYucHVibGlzaGVyfS8ke3JlZi5uYW1lfWAgOiByZWYubmFtZTtcbiAgICAvLyBUaGUgcGx1Z2luIE5BTUUgbGl2ZXMgb24gdGhlIHJlZiAoYSBzaWJsaW5nIG9mIGBmaWx0ZXJgKSwgTk9UIGluc2lkZSB0aGVcbiAgICAvLyBmaWx0ZXIgb2JqZWN0IOKAlCBidXQgdGhlIGxvb2t1cCBtYXRjaGVzIG9uIHRoZSBmaWx0ZXIuIEEgZmlsdGVyIHdpdGhvdXRcbiAgICAvLyBgbmFtZWAgKGUuZy4gYHt2ZXJzaW9uLCB2aXNpYmlsaXR5LCBpc0FjdGl2ZSwgaXNEZWZhdWx0fWApIG1hdGNoZXMgQU5ZXG4gICAgLy8gcGx1Z2luIHdpdGggdGhvc2UgYXR0cmlidXRlcywgYW5kIHRoZSBlbmRwb2ludCByZXR1cm5zIGFuIGFyYml0cmFyeSBvbmVcbiAgICAvLyAoc2VlbjogYGRvY2tlcmZpbGUtbXVsdGktcHJvdmlkZXJgKS4gVGhhdCBtYWRlIHRoZSBzeW50aCBhbmQgZXZlcnkgc3RlcFxuICAgIC8vIHJlc29sdmUgdG8gdGhlIFdST05HIHBsdWdpbi4gU28gd2hlbiB0aGUgZmlsdGVyIG9taXRzIGBuYW1lYCwgZmFsbCBiYWNrIHRvXG4gICAgLy8gdGhlIHJlZidzIHBsdWdpbiBuYW1lOyBhbiBleHBsaWNpdCBmaWx0ZXIgYG5hbWVgIHN0aWxsIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2hhcmVkIHdpdGggdGhlIHBpcGVsaW5lIHNlcnZpY2UncyBjb250cmFjdCBjaGVjayAoc2FtZSBmaWx0ZXIsIHNhbWUgcGx1Z2luKS5cbiAgICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5Mb29rdXBGaWx0ZXIocmVmKTtcbiAgICBjb25zdCBwaW4gPSBleGFjdFZlcnNpb25QaW4ocmVmKTtcbiAgICBjb25zdCByZWZ1c2UgPSAoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkID0+IHsgZmF0YWwucHVzaCh7IHBsdWdpbjogbGFiZWwsIGNvZGUsIG1lc3NhZ2UgfSk7IH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywge1xuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIC4uLihwaXBlbGluZUlkICYmIHN0ZXBLZXlzLmhhcyhrZXkpID8geyBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzOiBzdGVwS2V5cy5nZXQoa2V5KSB9IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcGx1Z2luLCB3YXJuaW5ncyB9ID0gdW53cmFwTG9va3VwKHJlcyk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpIHtcbiAgICAgICAgcHJpbnRMb29rdXBXYXJuaW5nKGxhYmVsLCB3YXJuaW5nKTtcbiAgICAgICAgd2FybmluZ1Npbms/LnB1c2god2FybmluZyk7XG4gICAgICB9XG4gICAgICBpZiAocGx1Z2luKSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwbHVnaW47XG4gICAgICB9IGVsc2UgaWYgKHBpbikge1xuICAgICAgICByZWZ1c2UoJ1BMVUdJTl9WRVJTSU9OX05PVF9GT1VORCcsIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgbG9va3VwIHJldHVybmVkIG5vIHJlY29yZCDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgcGx1Z2luIHdob3NlIGltYWdlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgb3IgYSBsaXN0aW5nIHRoZSBvcmdcbiAgICAgIC8vIGNhbid0IHVzZSwgaXMgTk9UIGFuIG91dGFnZSB0byByaWRlIG91dDogZmFsbGluZyBiYWNrIHdvdWxkIHF1aWV0bHlcbiAgICAgIC8vIHR1cm4gaXQgaW50byBhbiB1bnJlc29sdmVkIHN0ZXAuIFN0b3AuXG4gICAgICBjb25zdCBjb2RlID0gZmF0YWxMb29rdXBDb2RlKGVycik7XG4gICAgICBpZiAoY29kZSA9PT0gRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgcmVmdXNlKGNvZGUsIGBQbHVnaW4gXCIke2xhYmVsfVwiIGltYWdlIGZhaWxlZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICByZWZ1c2UoY29kZSwgYFBsdWdpbiBcIiR7bGFiZWx9XCIgY2FuJ3QgYmUgdXNlZCAoJHtjb2RlfSk6ICR7c2VydmljZU1lc3NhZ2UoZXJyKSA/PyBlcnJvck1lc3NhZ2UoZXJyKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBpbiAmJiBpc05vdEZvdW5kKGVycikpIHtcbiAgICAgICAgcmVmdXNlKCdQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkQnLCBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgZXJyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1zZyA9IGVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIHByZS1yZXNvbHV0aW9uIGZhaWxlZCAoJHttc2d9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICB9XG4gIH0pKTtcblxuICBpZiAoZmF0YWwubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFBsdWdpblJlc29sdXRpb25FcnJvcihmYXRhbCk7XG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ApiClient } from './api-client.js';
|
|
2
|
+
/** The command that provisions the registration key, named in every skip warning. */
|
|
3
|
+
export declare const REGISTRATION_KEY_COMMAND = "pipeline-manager infra store-token --scope pipeline_registry:write --schedule";
|
|
4
|
+
/**
|
|
5
|
+
* The client a pipeline-registry write (`POST /pipelines/registry`) is made with.
|
|
6
|
+
*
|
|
7
|
+
* - **A person's credential** (`auth login`, or a `PLATFORM_TOKEN` they set):
|
|
8
|
+
* the same client. People hold `pipeline_registry:write` beside
|
|
9
|
+
* `pipelines:write` through the Member and Admin Roles.
|
|
10
|
+
* - **The stored machine credential** (`--store-tokens`): NOT that client. The
|
|
11
|
+
* `platform` key holds the Pipeline Automation Role — pipeline and plugin reads
|
|
12
|
+
* only — so the registration goes out on the separate `pipeline-register` key,
|
|
13
|
+
* read from the secret named by `PIPELINE_REGISTRATION_SECRET_NAME` (the synth
|
|
14
|
+
* CodeBuild project carries it) or derived from the pipeline's org.
|
|
15
|
+
*
|
|
16
|
+
* There is no fallback to the platform key. When the registration key is absent
|
|
17
|
+
* or unreadable this returns `undefined` after a loud warning naming the
|
|
18
|
+
* `store-token` command that provisions it, and the caller skips registering —
|
|
19
|
+
* a stale step manifest is reported, a broken synth is not acceptable.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveRegistrationClient(opts: {
|
|
22
|
+
client: ApiClient;
|
|
23
|
+
storeTokens?: boolean;
|
|
24
|
+
orgId?: string;
|
|
25
|
+
region?: string;
|
|
26
|
+
profile?: string;
|
|
27
|
+
}): Promise<ApiClient | undefined>;
|
|
28
|
+
//# sourceMappingURL=registration-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-client.d.ts","sourceRoot":"","sources":["../../src/utils/registration-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,kFAA8F,CAAC;AAEpI;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA6BjC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { errorMessage } from '@pipeline-builder/api-core';
|
|
4
|
+
import { PIPELINE_REGISTRATION_CAPABILITY, PIPELINE_REGISTRATION_SECRET_ENV, PIPELINE_REGISTRATION_SECRET_LEAF } from '@pipeline-builder/pipeline-core';
|
|
5
|
+
import { ApiClient } from './api-client.js';
|
|
6
|
+
import { getSecretValue } from './aws-secrets.js';
|
|
7
|
+
import { printInfo, printWarning } from './output-utils.js';
|
|
8
|
+
import { secretNameForOrg } from './platform-secret.js';
|
|
9
|
+
/** The command that provisions the registration key, named in every skip warning. */
|
|
10
|
+
export const REGISTRATION_KEY_COMMAND = `pipeline-manager infra store-token --scope ${PIPELINE_REGISTRATION_CAPABILITY} --schedule`;
|
|
11
|
+
/**
|
|
12
|
+
* The client a pipeline-registry write (`POST /pipelines/registry`) is made with.
|
|
13
|
+
*
|
|
14
|
+
* - **A person's credential** (`auth login`, or a `PLATFORM_TOKEN` they set):
|
|
15
|
+
* the same client. People hold `pipeline_registry:write` beside
|
|
16
|
+
* `pipelines:write` through the Member and Admin Roles.
|
|
17
|
+
* - **The stored machine credential** (`--store-tokens`): NOT that client. The
|
|
18
|
+
* `platform` key holds the Pipeline Automation Role — pipeline and plugin reads
|
|
19
|
+
* only — so the registration goes out on the separate `pipeline-register` key,
|
|
20
|
+
* read from the secret named by `PIPELINE_REGISTRATION_SECRET_NAME` (the synth
|
|
21
|
+
* CodeBuild project carries it) or derived from the pipeline's org.
|
|
22
|
+
*
|
|
23
|
+
* There is no fallback to the platform key. When the registration key is absent
|
|
24
|
+
* or unreadable this returns `undefined` after a loud warning naming the
|
|
25
|
+
* `store-token` command that provisions it, and the caller skips registering —
|
|
26
|
+
* a stale step manifest is reported, a broken synth is not acceptable.
|
|
27
|
+
*/
|
|
28
|
+
export async function resolveRegistrationClient(opts) {
|
|
29
|
+
if (!opts.storeTokens)
|
|
30
|
+
return opts.client;
|
|
31
|
+
const secretName = process.env[PIPELINE_REGISTRATION_SECRET_ENV]
|
|
32
|
+
|| (opts.orgId ? secretNameForOrg(opts.orgId, PIPELINE_REGISTRATION_SECRET_LEAF) : undefined);
|
|
33
|
+
if (!secretName) {
|
|
34
|
+
printWarning(`SKIPPING pipeline registration: no ${PIPELINE_REGISTRATION_SECRET_ENV} and no orgId to derive the registration key's secret from. `
|
|
35
|
+
+ `The stored platform key cannot register pipelines. Provision the registration key with: ${REGISTRATION_KEY_COMMAND}`);
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
let key;
|
|
39
|
+
try {
|
|
40
|
+
const secret = JSON.parse(await getSecretValue(secretName, { region: opts.region, profile: opts.profile }));
|
|
41
|
+
key = secret.password;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
printWarning(`SKIPPING pipeline registration: could not read the registration key from ${secretName} (${errorMessage(err)}). `
|
|
45
|
+
+ 'The stored platform key cannot register pipelines, so the platform\'s step manifest for this pipeline is now stale. '
|
|
46
|
+
+ `Provision the registration key with: ${REGISTRATION_KEY_COMMAND}`);
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (!key) {
|
|
50
|
+
printWarning(`SKIPPING pipeline registration: ${secretName} holds no key (password field). Re-provision it with: ${REGISTRATION_KEY_COMMAND}`);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
printInfo('Registering with the pipeline-registration key', { secret: secretName });
|
|
54
|
+
const config = opts.client.getConfig();
|
|
55
|
+
return new ApiClient({ ...config, auth: { ...config.auth, token: key } });
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9yZWdpc3RyYXRpb24tY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxnQ0FBZ0MsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsOENBQThDLGdDQUFnQyxhQUFhLENBQUM7QUFFcEk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLElBTS9DO0lBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRTFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUM7V0FDM0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixZQUFZLENBQUMsc0NBQXNDLGdDQUFnQyw4REFBOEQ7Y0FDN0ksMkZBQTJGLHdCQUF3QixFQUFFLENBQUMsQ0FBQztRQUMzSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxHQUF1QixDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUEwQixDQUFDO1FBQ3JJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBWSxDQUFDLDRFQUE0RSxVQUFVLEtBQUssWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLO2NBQzFILHNIQUFzSDtjQUN0SCx3Q0FBd0Msd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxZQUFZLENBQUMsbUNBQW1DLFVBQVUseURBQXlELHdCQUF3QixFQUFFLENBQUMsQ0FBQztRQUMvSSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUyxDQUFDLGdEQUFnRCxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QyxPQUFPLElBQUksU0FBUyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBQSVBFTElORV9SRUdJU1RSQVRJT05fQ0FQQUJJTElUWSwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9FTlYsIFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTEVBRiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlY3JldFZhbHVlIH0gZnJvbSAnLi9hd3Mtc2VjcmV0cy5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IHNlY3JldE5hbWVGb3JPcmcgfSBmcm9tICcuL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5cbi8qKiBUaGUgY29tbWFuZCB0aGF0IHByb3Zpc2lvbnMgdGhlIHJlZ2lzdHJhdGlvbiBrZXksIG5hbWVkIGluIGV2ZXJ5IHNraXAgd2FybmluZy4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSQVRJT05fS0VZX0NPTU1BTkQgPSBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlICR7UElQRUxJTkVfUkVHSVNUUkFUSU9OX0NBUEFCSUxJVFl9IC0tc2NoZWR1bGVgO1xuXG4vKipcbiAqIFRoZSBjbGllbnQgYSBwaXBlbGluZS1yZWdpc3RyeSB3cml0ZSAoYFBPU1QgL3BpcGVsaW5lcy9yZWdpc3RyeWApIGlzIG1hZGUgd2l0aC5cbiAqXG4gKiAtICoqQSBwZXJzb24ncyBjcmVkZW50aWFsKiogKGBhdXRoIGxvZ2luYCwgb3IgYSBgUExBVEZPUk1fVE9LRU5gIHRoZXkgc2V0KTpcbiAqICAgdGhlIHNhbWUgY2xpZW50LiBQZW9wbGUgaG9sZCBgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGVgIGJlc2lkZVxuICogICBgcGlwZWxpbmVzOndyaXRlYCB0aHJvdWdoIHRoZSBNZW1iZXIgYW5kIEFkbWluIFJvbGVzLlxuICogLSAqKlRoZSBzdG9yZWQgbWFjaGluZSBjcmVkZW50aWFsKiogKGAtLXN0b3JlLXRva2Vuc2ApOiBOT1QgdGhhdCBjbGllbnQuIFRoZVxuICogICBgcGxhdGZvcm1gIGtleSBob2xkcyB0aGUgUGlwZWxpbmUgQXV0b21hdGlvbiBSb2xlIOKAlCBwaXBlbGluZSBhbmQgcGx1Z2luIHJlYWRzXG4gKiAgIG9ubHkg4oCUIHNvIHRoZSByZWdpc3RyYXRpb24gZ29lcyBvdXQgb24gdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5LFxuICogICByZWFkIGZyb20gdGhlIHNlY3JldCBuYW1lZCBieSBgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9OQU1FYCAodGhlIHN5bnRoXG4gKiAgIENvZGVCdWlsZCBwcm9qZWN0IGNhcnJpZXMgaXQpIG9yIGRlcml2ZWQgZnJvbSB0aGUgcGlwZWxpbmUncyBvcmcuXG4gKlxuICogVGhlcmUgaXMgbm8gZmFsbGJhY2sgdG8gdGhlIHBsYXRmb3JtIGtleS4gV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGtleSBpcyBhYnNlbnRcbiAqIG9yIHVucmVhZGFibGUgdGhpcyByZXR1cm5zIGB1bmRlZmluZWRgIGFmdGVyIGEgbG91ZCB3YXJuaW5nIG5hbWluZyB0aGVcbiAqIGBzdG9yZS10b2tlbmAgY29tbWFuZCB0aGF0IHByb3Zpc2lvbnMgaXQsIGFuZCB0aGUgY2FsbGVyIHNraXBzIHJlZ2lzdGVyaW5nIOKAlFxuICogYSBzdGFsZSBzdGVwIG1hbmlmZXN0IGlzIHJlcG9ydGVkLCBhIGJyb2tlbiBzeW50aCBpcyBub3QgYWNjZXB0YWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSZWdpc3RyYXRpb25DbGllbnQob3B0czoge1xuICBjbGllbnQ6IEFwaUNsaWVudDtcbiAgc3RvcmVUb2tlbnM/OiBib29sZWFuO1xuICBvcmdJZD86IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xufSk6IFByb21pc2U8QXBpQ2xpZW50IHwgdW5kZWZpbmVkPiB7XG4gIGlmICghb3B0cy5zdG9yZVRva2VucykgcmV0dXJuIG9wdHMuY2xpZW50O1xuXG4gIGNvbnN0IHNlY3JldE5hbWUgPSBwcm9jZXNzLmVudltQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOVl1cbiAgICB8fCAob3B0cy5vcmdJZCA/IHNlY3JldE5hbWVGb3JPcmcob3B0cy5vcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHByaW50V2FybmluZyhgU0tJUFBJTkcgcGlwZWxpbmUgcmVnaXN0cmF0aW9uOiBubyAke1BJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WfSBhbmQgbm8gb3JnSWQgdG8gZGVyaXZlIHRoZSByZWdpc3RyYXRpb24ga2V5J3Mgc2VjcmV0IGZyb20uIGBcbiAgICAgICsgYFRoZSBzdG9yZWQgcGxhdGZvcm0ga2V5IGNhbm5vdCByZWdpc3RlciBwaXBlbGluZXMuIFByb3Zpc2lvbiB0aGUgcmVnaXN0cmF0aW9uIGtleSB3aXRoOiAke1JFR0lTVFJBVElPTl9LRVlfQ09NTUFORH1gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IHNlY3JldCA9IEpTT04ucGFyc2UoYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSwgeyByZWdpb246IG9wdHMucmVnaW9uLCBwcm9maWxlOiBvcHRzLnByb2ZpbGUgfSkpIGFzIHsgcGFzc3dvcmQ/OiBzdHJpbmcgfTtcbiAgICBrZXkgPSBzZWNyZXQucGFzc3dvcmQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByaW50V2FybmluZyhgU0tJUFBJTkcgcGlwZWxpbmUgcmVnaXN0cmF0aW9uOiBjb3VsZCBub3QgcmVhZCB0aGUgcmVnaXN0cmF0aW9uIGtleSBmcm9tICR7c2VjcmV0TmFtZX0gKCR7ZXJyb3JNZXNzYWdlKGVycil9KS4gYFxuICAgICAgKyAnVGhlIHN0b3JlZCBwbGF0Zm9ybSBrZXkgY2Fubm90IHJlZ2lzdGVyIHBpcGVsaW5lcywgc28gdGhlIHBsYXRmb3JtXFwncyBzdGVwIG1hbmlmZXN0IGZvciB0aGlzIHBpcGVsaW5lIGlzIG5vdyBzdGFsZS4gJ1xuICAgICAgKyBgUHJvdmlzaW9uIHRoZSByZWdpc3RyYXRpb24ga2V5IHdpdGg6ICR7UkVHSVNUUkFUSU9OX0tFWV9DT01NQU5EfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFrZXkpIHtcbiAgICBwcmludFdhcm5pbmcoYFNLSVBQSU5HIHBpcGVsaW5lIHJlZ2lzdHJhdGlvbjogJHtzZWNyZXROYW1lfSBob2xkcyBubyBrZXkgKHBhc3N3b3JkIGZpZWxkKS4gUmUtcHJvdmlzaW9uIGl0IHdpdGg6ICR7UkVHSVNUUkFUSU9OX0tFWV9DT01NQU5EfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcmludEluZm8oJ1JlZ2lzdGVyaW5nIHdpdGggdGhlIHBpcGVsaW5lLXJlZ2lzdHJhdGlvbiBrZXknLCB7IHNlY3JldDogc2VjcmV0TmFtZSB9KTtcbiAgY29uc3QgY29uZmlnID0gb3B0cy5jbGllbnQuZ2V0Q29uZmlnKCk7XG4gIHJldHVybiBuZXcgQXBpQ2xpZW50KHsgLi4uY29uZmlnLCBhdXRoOiB7IC4uLmNvbmZpZy5hdXRoLCB0b2tlbjoga2V5IH0gfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The header the platform's quota attribution reads the pipeline from. */
|
|
2
|
+
export declare const PIPELINE_ID_HEADER = "X-Pipeline-Id";
|
|
3
|
+
/** Name the pipeline this invocation's platform calls are made for (unset with `undefined`). */
|
|
4
|
+
export declare function setPipelineId(id: string | undefined): void;
|
|
5
|
+
/** Adopt the command's execution id as this invocation's request id. */
|
|
6
|
+
export declare function setInvocationId(id: string): void;
|
|
7
|
+
/** This invocation's request id — the command's execution id, else a per-process uuid. */
|
|
8
|
+
export declare function getInvocationId(): string;
|
|
9
|
+
/** The correlation headers for this invocation (values sanitized, unknown ids omitted). */
|
|
10
|
+
export declare function requestCorrelationHeaders(env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
11
|
+
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/utils/request-context.ts"],"names":[],"mappings":"AA8BA,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE1D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYtG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { correlationHeaders, sanitizeCorrelationValue } from '@pipeline-builder/pipeline-core';
|
|
5
|
+
/**
|
|
6
|
+
* The audit-correlation headers every platform call from this CLI carries, so
|
|
7
|
+
* a server-side audit row joins back to the run that caused it.
|
|
8
|
+
*
|
|
9
|
+
* - `X-Request-Id` — the command's execution id (the `[EXE-…]` printed in the
|
|
10
|
+
* header and the local audit log), or a uuid for this process when no command
|
|
11
|
+
* header was printed.
|
|
12
|
+
* - `X-CodeBuild-Build-Id` — CODEBUILD_BUILD_ID (`<project>:<uuid>`) when running
|
|
13
|
+
* inside CodeBuild.
|
|
14
|
+
* - `X-Pipeline-Execution-Id` — PIPELINE_EXECUTION_ID, which the synth injects into
|
|
15
|
+
* every CodeBuild step from `#{codepipeline.PipelineExecutionId}`. Sent only
|
|
16
|
+
* when set: CODEBUILD_INITIATOR (`codepipeline/<name>`) names the pipeline, not
|
|
17
|
+
* the execution, so nothing is derived from it.
|
|
18
|
+
* - `X-Pipeline-Id` — the platform pipeline a command works on (synth, deploy,
|
|
19
|
+
* plugin verify, security-report), once the command knows it
|
|
20
|
+
* ({@link setPipelineId}). The quota service's usage ledger records it, so
|
|
21
|
+
* "what spent our calls?" can answer "this pipeline's builds".
|
|
22
|
+
*
|
|
23
|
+
* Never an ARN — nothing here can carry an AWS account id.
|
|
24
|
+
*/
|
|
25
|
+
let invocationId;
|
|
26
|
+
let pipelineId;
|
|
27
|
+
/** The header the platform's quota attribution reads the pipeline from. */
|
|
28
|
+
export const PIPELINE_ID_HEADER = 'X-Pipeline-Id';
|
|
29
|
+
/** Name the pipeline this invocation's platform calls are made for (unset with `undefined`). */
|
|
30
|
+
export function setPipelineId(id) {
|
|
31
|
+
pipelineId = id;
|
|
32
|
+
}
|
|
33
|
+
/** Adopt the command's execution id as this invocation's request id. */
|
|
34
|
+
export function setInvocationId(id) {
|
|
35
|
+
invocationId = id;
|
|
36
|
+
}
|
|
37
|
+
/** This invocation's request id — the command's execution id, else a per-process uuid. */
|
|
38
|
+
export function getInvocationId() {
|
|
39
|
+
invocationId ??= randomUUID();
|
|
40
|
+
return invocationId;
|
|
41
|
+
}
|
|
42
|
+
/** The correlation headers for this invocation (values sanitized, unknown ids omitted). */
|
|
43
|
+
export function requestCorrelationHeaders(env = process.env) {
|
|
44
|
+
const inCodeBuild = Boolean(env.CODEBUILD_BUILD_ID);
|
|
45
|
+
const headers = correlationHeaders({
|
|
46
|
+
requestId: getInvocationId(),
|
|
47
|
+
codeBuildBuildId: inCodeBuild ? env.CODEBUILD_BUILD_ID : undefined,
|
|
48
|
+
pipelineExecutionId: inCodeBuild ? env.PIPELINE_EXECUTION_ID : undefined,
|
|
49
|
+
});
|
|
50
|
+
// Same sanitizer as the other ids: a value that isn't a plain id is dropped,
|
|
51
|
+
// never sent mangled.
|
|
52
|
+
const pipeline = sanitizeCorrelationValue(pipelineId);
|
|
53
|
+
if (pipeline)
|
|
54
|
+
headers[PIPELINE_ID_HEADER] = pipeline;
|
|
55
|
+
return headers;
|
|
56
|
+
}
|
|
57
|
+
/** @internal Test-only: forget the invocation id. */
|
|
58
|
+
export function _resetInvocationIdForTests() {
|
|
59
|
+
invocationId = undefined;
|
|
60
|
+
pipelineId = undefined;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFL0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxJQUFJLFlBQWdDLENBQUM7QUFDckMsSUFBSSxVQUE4QixDQUFDO0FBRW5DLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQsZ0dBQWdHO0FBQ2hHLE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBc0I7SUFDbEQsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVTtJQUN4QyxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsTUFBTSxVQUFVLGVBQWU7SUFDN0IsWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO0lBQzlCLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQUcsR0FBc0IsT0FBTyxDQUFDLEdBQUc7SUFDNUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDO1FBQ2pDLFNBQVMsRUFBRSxlQUFlLEVBQUU7UUFDNUIsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQyxDQUFDO0lBQ0gsNkVBQTZFO0lBQzdFLHNCQUFzQjtJQUN0QixNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RCxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDckQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDekIsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjb3JyZWxhdGlvbkhlYWRlcnMsIHNhbml0aXplQ29ycmVsYXRpb25WYWx1ZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuXG4vKipcbiAqIFRoZSBhdWRpdC1jb3JyZWxhdGlvbiBoZWFkZXJzIGV2ZXJ5IHBsYXRmb3JtIGNhbGwgZnJvbSB0aGlzIENMSSBjYXJyaWVzLCBzb1xuICogYSBzZXJ2ZXItc2lkZSBhdWRpdCByb3cgam9pbnMgYmFjayB0byB0aGUgcnVuIHRoYXQgY2F1c2VkIGl0LlxuICpcbiAqIC0gYFgtUmVxdWVzdC1JZGAg4oCUIHRoZSBjb21tYW5kJ3MgZXhlY3V0aW9uIGlkICh0aGUgYFtFWEUt4oCmXWAgcHJpbnRlZCBpbiB0aGVcbiAqICAgaGVhZGVyIGFuZCB0aGUgbG9jYWwgYXVkaXQgbG9nKSwgb3IgYSB1dWlkIGZvciB0aGlzIHByb2Nlc3Mgd2hlbiBubyBjb21tYW5kXG4gKiAgIGhlYWRlciB3YXMgcHJpbnRlZC5cbiAqIC0gYFgtQ29kZUJ1aWxkLUJ1aWxkLUlkYCDigJQgQ09ERUJVSUxEX0JVSUxEX0lEIChgPHByb2plY3Q+Ojx1dWlkPmApIHdoZW4gcnVubmluZ1xuICogICBpbnNpZGUgQ29kZUJ1aWxkLlxuICogLSBgWC1QaXBlbGluZS1FeGVjdXRpb24tSWRgIOKAlCBQSVBFTElORV9FWEVDVVRJT05fSUQsIHdoaWNoIHRoZSBzeW50aCBpbmplY3RzIGludG9cbiAqICAgZXZlcnkgQ29kZUJ1aWxkIHN0ZXAgZnJvbSBgI3tjb2RlcGlwZWxpbmUuUGlwZWxpbmVFeGVjdXRpb25JZH1gLiBTZW50IG9ubHlcbiAqICAgd2hlbiBzZXQ6IENPREVCVUlMRF9JTklUSUFUT1IgKGBjb2RlcGlwZWxpbmUvPG5hbWU+YCkgbmFtZXMgdGhlIHBpcGVsaW5lLCBub3RcbiAqICAgdGhlIGV4ZWN1dGlvbiwgc28gbm90aGluZyBpcyBkZXJpdmVkIGZyb20gaXQuXG4gKiAtIGBYLVBpcGVsaW5lLUlkYCDigJQgdGhlIHBsYXRmb3JtIHBpcGVsaW5lIGEgY29tbWFuZCB3b3JrcyBvbiAoc3ludGgsIGRlcGxveSxcbiAqICAgcGx1Z2luIHZlcmlmeSwgc2VjdXJpdHktcmVwb3J0KSwgb25jZSB0aGUgY29tbWFuZCBrbm93cyBpdFxuICogICAoe0BsaW5rIHNldFBpcGVsaW5lSWR9KS4gVGhlIHF1b3RhIHNlcnZpY2UncyB1c2FnZSBsZWRnZXIgcmVjb3JkcyBpdCwgc29cbiAqICAgXCJ3aGF0IHNwZW50IG91ciBjYWxscz9cIiBjYW4gYW5zd2VyIFwidGhpcyBwaXBlbGluZSdzIGJ1aWxkc1wiLlxuICpcbiAqIE5ldmVyIGFuIEFSTiDigJQgbm90aGluZyBoZXJlIGNhbiBjYXJyeSBhbiBBV1MgYWNjb3VudCBpZC5cbiAqL1xuXG5sZXQgaW52b2NhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKiogVGhlIGhlYWRlciB0aGUgcGxhdGZvcm0ncyBxdW90YSBhdHRyaWJ1dGlvbiByZWFkcyB0aGUgcGlwZWxpbmUgZnJvbS4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9JRF9IRUFERVIgPSAnWC1QaXBlbGluZS1JZCc7XG5cbi8qKiBOYW1lIHRoZSBwaXBlbGluZSB0aGlzIGludm9jYXRpb24ncyBwbGF0Zm9ybSBjYWxscyBhcmUgbWFkZSBmb3IgKHVuc2V0IHdpdGggYHVuZGVmaW5lZGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBpcGVsaW5lSWQoaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBwaXBlbGluZUlkID0gaWQ7XG59XG5cbi8qKiBBZG9wdCB0aGUgY29tbWFuZCdzIGV4ZWN1dGlvbiBpZCBhcyB0aGlzIGludm9jYXRpb24ncyByZXF1ZXN0IGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEludm9jYXRpb25JZChpZDogc3RyaW5nKTogdm9pZCB7XG4gIGludm9jYXRpb25JZCA9IGlkO1xufVxuXG4vKiogVGhpcyBpbnZvY2F0aW9uJ3MgcmVxdWVzdCBpZCDigJQgdGhlIGNvbW1hbmQncyBleGVjdXRpb24gaWQsIGVsc2UgYSBwZXItcHJvY2VzcyB1dWlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9jYXRpb25JZCgpOiBzdHJpbmcge1xuICBpbnZvY2F0aW9uSWQgPz89IHJhbmRvbVVVSUQoKTtcbiAgcmV0dXJuIGludm9jYXRpb25JZDtcbn1cblxuLyoqIFRoZSBjb3JyZWxhdGlvbiBoZWFkZXJzIGZvciB0aGlzIGludm9jYXRpb24gKHZhbHVlcyBzYW5pdGl6ZWQsIHVua25vd24gaWRzIG9taXR0ZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RDb3JyZWxhdGlvbkhlYWRlcnMoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGluQ29kZUJ1aWxkID0gQm9vbGVhbihlbnYuQ09ERUJVSUxEX0JVSUxEX0lEKTtcbiAgY29uc3QgaGVhZGVycyA9IGNvcnJlbGF0aW9uSGVhZGVycyh7XG4gICAgcmVxdWVzdElkOiBnZXRJbnZvY2F0aW9uSWQoKSxcbiAgICBjb2RlQnVpbGRCdWlsZElkOiBpbkNvZGVCdWlsZCA/IGVudi5DT0RFQlVJTERfQlVJTERfSUQgOiB1bmRlZmluZWQsXG4gICAgcGlwZWxpbmVFeGVjdXRpb25JZDogaW5Db2RlQnVpbGQgPyBlbnYuUElQRUxJTkVfRVhFQ1VUSU9OX0lEIDogdW5kZWZpbmVkLFxuICB9KTtcbiAgLy8gU2FtZSBzYW5pdGl6ZXIgYXMgdGhlIG90aGVyIGlkczogYSB2YWx1ZSB0aGF0IGlzbid0IGEgcGxhaW4gaWQgaXMgZHJvcHBlZCxcbiAgLy8gbmV2ZXIgc2VudCBtYW5nbGVkLlxuICBjb25zdCBwaXBlbGluZSA9IHNhbml0aXplQ29ycmVsYXRpb25WYWx1ZShwaXBlbGluZUlkKTtcbiAgaWYgKHBpcGVsaW5lKSBoZWFkZXJzW1BJUEVMSU5FX0lEX0hFQURFUl0gPSBwaXBlbGluZTtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgdGhlIGludm9jYXRpb24gaWQuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0SW52b2NhdGlvbklkRm9yVGVzdHMoKTogdm9pZCB7XG4gIGludm9jYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgcGlwZWxpbmVJZCA9IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SeedBundleId } from '@pipeline-builder/api-core';
|
|
1
2
|
import type { ApiClient } from './api-client.js';
|
|
2
3
|
/** What the caller wants provisioned. */
|
|
3
4
|
export interface ProvisionKeyOptions {
|
|
@@ -10,11 +11,12 @@ export interface ProvisionKeyOptions {
|
|
|
10
11
|
/** Human description recorded on a newly created account. */
|
|
11
12
|
description: string;
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* The built-in Role (by seed bundle) to grant a NEWLY created account —
|
|
15
|
+
* `pipeline_automation` for the platform credential, `pipeline_registration`
|
|
16
|
+
* for the registration one. Absent for a scoped credential, which needs no
|
|
17
|
+
* Role at all.
|
|
16
18
|
*/
|
|
17
|
-
|
|
19
|
+
role?: SeedBundleId;
|
|
18
20
|
/** Narrow capability scope stamped on the KEY (not the account). */
|
|
19
21
|
scope?: string;
|
|
20
22
|
/** Key lifetime in seconds (platform caps this at 365 days). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiDD,iDAAiD;AACjD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AA+DD,qFAAqF;AACrF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG"}
|