@contractspec/integration.runtime 1.56.1 → 1.58.0
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/health.d.ts +14 -18
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +71 -68
- package/dist/index.d.ts +4 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +828 -9
- package/dist/node/health.js +72 -0
- package/dist/node/index.js +827 -0
- package/dist/node/runtime.js +208 -0
- package/dist/node/secrets/env-secret-provider.js +158 -0
- package/dist/node/secrets/gcp-secret-manager.js +346 -0
- package/dist/node/secrets/index.js +549 -0
- package/dist/node/secrets/manager.js +182 -0
- package/dist/node/secrets/provider.js +73 -0
- package/dist/runtime.d.ts +86 -90
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +204 -182
- package/dist/secrets/env-secret-provider.d.ts +20 -23
- package/dist/secrets/env-secret-provider.d.ts.map +1 -1
- package/dist/secrets/env-secret-provider.js +157 -80
- package/dist/secrets/gcp-secret-manager.d.ts +25 -28
- package/dist/secrets/gcp-secret-manager.d.ts.map +1 -1
- package/dist/secrets/gcp-secret-manager.js +339 -222
- package/dist/secrets/index.d.ts +5 -5
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +549 -5
- package/dist/secrets/manager.d.ts +32 -35
- package/dist/secrets/manager.d.ts.map +1 -1
- package/dist/secrets/manager.js +180 -101
- package/dist/secrets/provider.d.ts +42 -45
- package/dist/secrets/provider.d.ts.map +1 -1
- package/dist/secrets/provider.js +69 -54
- package/package.json +76 -30
- package/dist/health.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/secrets/env-secret-provider.js.map +0 -1
- package/dist/secrets/gcp-secret-manager.js.map +0 -1
- package/dist/secrets/manager.js.map +0 -1
- package/dist/secrets/provider.js.map +0 -1
package/dist/secrets/manager.js
CHANGED
|
@@ -1,104 +1,183 @@
|
|
|
1
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/secrets/provider.ts
|
|
3
|
+
import { Buffer } from "buffer";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
} catch (error) {
|
|
68
|
-
if (error instanceof SecretProviderError) {
|
|
69
|
-
errors.push(error);
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
throw this.composeError(operation, reference, errors);
|
|
76
|
-
}
|
|
77
|
-
composeError(operation, reference, errors, version) {
|
|
78
|
-
if (errors.length === 1) {
|
|
79
|
-
const [singleError] = errors;
|
|
80
|
-
if (singleError) return singleError;
|
|
81
|
-
}
|
|
82
|
-
const messageParts = [`No registered secret provider could ${operation}`, `reference "${reference}"`];
|
|
83
|
-
if (version) messageParts.push(`(version: ${version})`);
|
|
84
|
-
if (errors.length > 1) messageParts.push(`Attempts: ${errors.map((error) => `${error.provider}:${error.code}`).join(", ")}`);
|
|
85
|
-
return new SecretProviderError({
|
|
86
|
-
message: messageParts.join(" "),
|
|
87
|
-
provider: this.id,
|
|
88
|
-
reference,
|
|
89
|
-
code: errors.length > 0 ? errors[errors.length - 1].code : "UNKNOWN",
|
|
90
|
-
cause: errors
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
function safeCanHandle(provider, reference) {
|
|
95
|
-
try {
|
|
96
|
-
return provider.canHandle(reference);
|
|
97
|
-
} catch {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
5
|
+
class SecretProviderError extends Error {
|
|
6
|
+
provider;
|
|
7
|
+
reference;
|
|
8
|
+
code;
|
|
9
|
+
cause;
|
|
10
|
+
constructor(params) {
|
|
11
|
+
super(params.message);
|
|
12
|
+
this.name = "SecretProviderError";
|
|
13
|
+
this.provider = params.provider;
|
|
14
|
+
this.reference = params.reference;
|
|
15
|
+
this.code = params.code ?? "UNKNOWN";
|
|
16
|
+
this.cause = params.cause;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function parseSecretUri(reference) {
|
|
20
|
+
if (!reference) {
|
|
21
|
+
throw new SecretProviderError({
|
|
22
|
+
message: "Secret reference cannot be empty",
|
|
23
|
+
provider: "unknown",
|
|
24
|
+
reference,
|
|
25
|
+
code: "INVALID"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const [scheme, rest] = reference.split("://");
|
|
29
|
+
if (!scheme || !rest) {
|
|
30
|
+
throw new SecretProviderError({
|
|
31
|
+
message: `Invalid secret reference: ${reference}`,
|
|
32
|
+
provider: "unknown",
|
|
33
|
+
reference,
|
|
34
|
+
code: "INVALID"
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const queryIndex = rest.indexOf("?");
|
|
38
|
+
if (queryIndex === -1) {
|
|
39
|
+
return {
|
|
40
|
+
provider: scheme,
|
|
41
|
+
path: rest
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const path = rest.slice(0, queryIndex);
|
|
45
|
+
const query = rest.slice(queryIndex + 1);
|
|
46
|
+
const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
|
|
47
|
+
const [keyRaw, valueRaw] = pair.split("=");
|
|
48
|
+
const key = keyRaw ?? "";
|
|
49
|
+
const value = valueRaw ?? "";
|
|
50
|
+
return [decodeURIComponent(key), decodeURIComponent(value)];
|
|
51
|
+
}));
|
|
52
|
+
return {
|
|
53
|
+
provider: scheme,
|
|
54
|
+
path,
|
|
55
|
+
extras
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function normalizeSecretPayload(payload) {
|
|
59
|
+
if (payload.data instanceof Uint8Array) {
|
|
60
|
+
return payload.data;
|
|
61
|
+
}
|
|
62
|
+
if (payload.encoding === "base64") {
|
|
63
|
+
return Buffer.from(payload.data, "base64");
|
|
64
|
+
}
|
|
65
|
+
if (payload.encoding === "binary") {
|
|
66
|
+
return Buffer.from(payload.data, "binary");
|
|
67
|
+
}
|
|
68
|
+
return Buffer.from(payload.data, "utf-8");
|
|
100
69
|
}
|
|
101
70
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
71
|
+
// src/secrets/manager.ts
|
|
72
|
+
class SecretProviderManager {
|
|
73
|
+
id;
|
|
74
|
+
providers = [];
|
|
75
|
+
registrationCounter = 0;
|
|
76
|
+
constructor(options = {}) {
|
|
77
|
+
this.id = options.id ?? "secret-provider-manager";
|
|
78
|
+
const initialProviders = options.providers ?? [];
|
|
79
|
+
for (const entry of initialProviders) {
|
|
80
|
+
this.register(entry.provider, { priority: entry.priority });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
register(provider, options = {}) {
|
|
84
|
+
this.providers.push({
|
|
85
|
+
provider,
|
|
86
|
+
priority: options.priority ?? 0,
|
|
87
|
+
order: this.registrationCounter++
|
|
88
|
+
});
|
|
89
|
+
this.providers.sort((a, b) => {
|
|
90
|
+
if (a.priority !== b.priority) {
|
|
91
|
+
return b.priority - a.priority;
|
|
92
|
+
}
|
|
93
|
+
return a.order - b.order;
|
|
94
|
+
});
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
canHandle(reference) {
|
|
98
|
+
return this.providers.some(({ provider }) => safeCanHandle(provider, reference));
|
|
99
|
+
}
|
|
100
|
+
async getSecret(reference, options) {
|
|
101
|
+
const errors = [];
|
|
102
|
+
for (const { provider } of this.providers) {
|
|
103
|
+
if (!safeCanHandle(provider, reference)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
return await provider.getSecret(reference, options);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (error instanceof SecretProviderError) {
|
|
110
|
+
errors.push(error);
|
|
111
|
+
if (error.code !== "NOT_FOUND") {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
throw this.composeError("getSecret", reference, errors, options?.version);
|
|
120
|
+
}
|
|
121
|
+
async setSecret(reference, payload) {
|
|
122
|
+
return this.delegateToFirst("setSecret", reference, (provider) => provider.setSecret(reference, payload));
|
|
123
|
+
}
|
|
124
|
+
async rotateSecret(reference, payload) {
|
|
125
|
+
return this.delegateToFirst("rotateSecret", reference, (provider) => provider.rotateSecret(reference, payload));
|
|
126
|
+
}
|
|
127
|
+
async deleteSecret(reference) {
|
|
128
|
+
await this.delegateToFirst("deleteSecret", reference, (provider) => provider.deleteSecret(reference));
|
|
129
|
+
}
|
|
130
|
+
async delegateToFirst(operation, reference, invoker) {
|
|
131
|
+
const errors = [];
|
|
132
|
+
for (const { provider } of this.providers) {
|
|
133
|
+
if (!safeCanHandle(provider, reference)) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
return await invoker(provider);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
if (error instanceof SecretProviderError) {
|
|
140
|
+
errors.push(error);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
throw this.composeError(operation, reference, errors);
|
|
147
|
+
}
|
|
148
|
+
composeError(operation, reference, errors, version) {
|
|
149
|
+
if (errors.length === 1) {
|
|
150
|
+
const [singleError] = errors;
|
|
151
|
+
if (singleError) {
|
|
152
|
+
return singleError;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const messageParts = [
|
|
156
|
+
`No registered secret provider could ${operation}`,
|
|
157
|
+
`reference "${reference}"`
|
|
158
|
+
];
|
|
159
|
+
if (version) {
|
|
160
|
+
messageParts.push(`(version: ${version})`);
|
|
161
|
+
}
|
|
162
|
+
if (errors.length > 1) {
|
|
163
|
+
messageParts.push(`Attempts: ${errors.map((error) => `${error.provider}:${error.code}`).join(", ")}`);
|
|
164
|
+
}
|
|
165
|
+
return new SecretProviderError({
|
|
166
|
+
message: messageParts.join(" "),
|
|
167
|
+
provider: this.id,
|
|
168
|
+
reference,
|
|
169
|
+
code: errors.length > 0 ? errors[errors.length - 1].code : "UNKNOWN",
|
|
170
|
+
cause: errors
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function safeCanHandle(provider, reference) {
|
|
175
|
+
try {
|
|
176
|
+
return provider.canHandle(reference);
|
|
177
|
+
} catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export {
|
|
182
|
+
SecretProviderManager
|
|
183
|
+
};
|
|
@@ -1,53 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
retrievedAt: Date;
|
|
1
|
+
export type SecretReference = string;
|
|
2
|
+
export interface SecretValue {
|
|
3
|
+
data: Uint8Array;
|
|
4
|
+
version?: string;
|
|
5
|
+
metadata?: Record<string, string>;
|
|
6
|
+
retrievedAt: Date;
|
|
8
7
|
}
|
|
9
|
-
interface SecretFetchOptions {
|
|
10
|
-
|
|
8
|
+
export interface SecretFetchOptions {
|
|
9
|
+
version?: string;
|
|
11
10
|
}
|
|
12
|
-
type SecretPayloadEncoding = 'utf-8' | 'base64' | 'binary';
|
|
13
|
-
interface SecretWritePayload {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
export type SecretPayloadEncoding = 'utf-8' | 'base64' | 'binary';
|
|
12
|
+
export interface SecretWritePayload {
|
|
13
|
+
data: string | Uint8Array;
|
|
14
|
+
encoding?: SecretPayloadEncoding;
|
|
15
|
+
contentType?: string;
|
|
16
|
+
labels?: Record<string, string>;
|
|
18
17
|
}
|
|
19
|
-
interface SecretRotationResult {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
interface SecretProvider {
|
|
24
|
-
readonly id: string;
|
|
25
|
-
canHandle(reference: SecretReference): boolean;
|
|
26
|
-
getSecret(reference: SecretReference, options?: SecretFetchOptions): Promise<SecretValue>;
|
|
27
|
-
setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
28
|
-
rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
29
|
-
deleteSecret(reference: SecretReference): Promise<void>;
|
|
18
|
+
export interface SecretRotationResult {
|
|
19
|
+
reference: SecretReference;
|
|
20
|
+
version: string;
|
|
30
21
|
}
|
|
31
|
-
interface
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
export interface SecretProvider {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
canHandle(reference: SecretReference): boolean;
|
|
25
|
+
getSecret(reference: SecretReference, options?: SecretFetchOptions): Promise<SecretValue>;
|
|
26
|
+
setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
27
|
+
rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
28
|
+
deleteSecret(reference: SecretReference): Promise<void>;
|
|
35
29
|
}
|
|
36
|
-
|
|
37
|
-
readonly provider: string;
|
|
38
|
-
readonly reference: SecretReference;
|
|
39
|
-
readonly code: 'NOT_FOUND' | 'FORBIDDEN' | 'INVALID' | 'UNKNOWN';
|
|
40
|
-
readonly cause?: unknown;
|
|
41
|
-
constructor(params: {
|
|
42
|
-
message: string;
|
|
30
|
+
export interface ParsedSecretUri {
|
|
43
31
|
provider: string;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
path: string;
|
|
33
|
+
extras?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
export declare class SecretProviderError extends Error {
|
|
36
|
+
readonly provider: string;
|
|
37
|
+
readonly reference: SecretReference;
|
|
38
|
+
readonly code: 'NOT_FOUND' | 'FORBIDDEN' | 'INVALID' | 'UNKNOWN';
|
|
39
|
+
readonly cause?: unknown;
|
|
40
|
+
constructor(params: {
|
|
41
|
+
message: string;
|
|
42
|
+
provider: string;
|
|
43
|
+
reference: SecretReference;
|
|
44
|
+
code?: SecretProviderError['code'];
|
|
45
|
+
cause?: unknown;
|
|
46
|
+
});
|
|
48
47
|
}
|
|
49
|
-
declare function parseSecretUri(reference: SecretReference): ParsedSecretUri;
|
|
50
|
-
declare function normalizeSecretPayload(payload: SecretWritePayload): Uint8Array;
|
|
51
|
-
//#endregion
|
|
52
|
-
export { ParsedSecretUri, SecretFetchOptions, SecretPayloadEncoding, SecretProvider, SecretProviderError, SecretReference, SecretRotationResult, SecretValue, SecretWritePayload, normalizeSecretPayload, parseSecretUri };
|
|
48
|
+
export declare function parseSecretUri(reference: SecretReference): ParsedSecretUri;
|
|
49
|
+
export declare function normalizeSecretPayload(payload: SecretWritePayload): Uint8Array;
|
|
53
50
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/secrets/provider.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC;IAC/C,SAAS,CACP,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,SAAS,CACP,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,YAAY,CACV,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,eAAe,CAAC;QAC3B,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CAQF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,GAAG,eAAe,CA+C1E;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,kBAAkB,GAC1B,UAAU,CAcZ"}
|
package/dist/secrets/provider.js
CHANGED
|
@@ -1,59 +1,74 @@
|
|
|
1
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/secrets/provider.ts
|
|
3
|
+
import { Buffer } from "buffer";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
5
|
+
class SecretProviderError extends Error {
|
|
6
|
+
provider;
|
|
7
|
+
reference;
|
|
8
|
+
code;
|
|
9
|
+
cause;
|
|
10
|
+
constructor(params) {
|
|
11
|
+
super(params.message);
|
|
12
|
+
this.name = "SecretProviderError";
|
|
13
|
+
this.provider = params.provider;
|
|
14
|
+
this.reference = params.reference;
|
|
15
|
+
this.code = params.code ?? "UNKNOWN";
|
|
16
|
+
this.cause = params.cause;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
18
19
|
function parseSecretUri(reference) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
20
|
+
if (!reference) {
|
|
21
|
+
throw new SecretProviderError({
|
|
22
|
+
message: "Secret reference cannot be empty",
|
|
23
|
+
provider: "unknown",
|
|
24
|
+
reference,
|
|
25
|
+
code: "INVALID"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const [scheme, rest] = reference.split("://");
|
|
29
|
+
if (!scheme || !rest) {
|
|
30
|
+
throw new SecretProviderError({
|
|
31
|
+
message: `Invalid secret reference: ${reference}`,
|
|
32
|
+
provider: "unknown",
|
|
33
|
+
reference,
|
|
34
|
+
code: "INVALID"
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const queryIndex = rest.indexOf("?");
|
|
38
|
+
if (queryIndex === -1) {
|
|
39
|
+
return {
|
|
40
|
+
provider: scheme,
|
|
41
|
+
path: rest
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const path = rest.slice(0, queryIndex);
|
|
45
|
+
const query = rest.slice(queryIndex + 1);
|
|
46
|
+
const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
|
|
47
|
+
const [keyRaw, valueRaw] = pair.split("=");
|
|
48
|
+
const key = keyRaw ?? "";
|
|
49
|
+
const value = valueRaw ?? "";
|
|
50
|
+
return [decodeURIComponent(key), decodeURIComponent(value)];
|
|
51
|
+
}));
|
|
52
|
+
return {
|
|
53
|
+
provider: scheme,
|
|
54
|
+
path,
|
|
55
|
+
extras
|
|
56
|
+
};
|
|
49
57
|
}
|
|
50
58
|
function normalizeSecretPayload(payload) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
if (payload.data instanceof Uint8Array) {
|
|
60
|
+
return payload.data;
|
|
61
|
+
}
|
|
62
|
+
if (payload.encoding === "base64") {
|
|
63
|
+
return Buffer.from(payload.data, "base64");
|
|
64
|
+
}
|
|
65
|
+
if (payload.encoding === "binary") {
|
|
66
|
+
return Buffer.from(payload.data, "binary");
|
|
67
|
+
}
|
|
68
|
+
return Buffer.from(payload.data, "utf-8");
|
|
55
69
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
export {
|
|
71
|
+
parseSecretUri,
|
|
72
|
+
normalizeSecretPayload,
|
|
73
|
+
SecretProviderError
|
|
74
|
+
};
|