@contractspec/integration.runtime 1.57.0 → 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 -181
- 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
|
@@ -1,82 +1,159 @@
|
|
|
1
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/secrets/provider.ts
|
|
3
|
+
import { Buffer as Buffer2 } 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
|
-
|
|
68
|
-
return path.split(/[/:\-.]/).filter(Boolean).map((segment) => segment.replace(/[^a-zA-Z0-9]/g, "_").replace(/_{2,}/g, "_").toUpperCase()).join("_");
|
|
69
|
-
}
|
|
70
|
-
forbiddenError(operation, reference) {
|
|
71
|
-
return new SecretProviderError({
|
|
72
|
-
message: `EnvSecretProvider is read-only. "${operation}" is not allowed for ${reference}.`,
|
|
73
|
-
provider: this.id,
|
|
74
|
-
reference,
|
|
75
|
-
code: "FORBIDDEN"
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
};
|
|
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 Buffer2.from(payload.data, "base64");
|
|
64
|
+
}
|
|
65
|
+
if (payload.encoding === "binary") {
|
|
66
|
+
return Buffer2.from(payload.data, "binary");
|
|
67
|
+
}
|
|
68
|
+
return Buffer2.from(payload.data, "utf-8");
|
|
69
|
+
}
|
|
79
70
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
71
|
+
// src/secrets/env-secret-provider.ts
|
|
72
|
+
class EnvSecretProvider {
|
|
73
|
+
id = "env";
|
|
74
|
+
aliases;
|
|
75
|
+
constructor(options = {}) {
|
|
76
|
+
this.aliases = options.aliases ?? {};
|
|
77
|
+
}
|
|
78
|
+
canHandle(reference) {
|
|
79
|
+
const envKey = this.resolveEnvKey(reference);
|
|
80
|
+
return envKey !== undefined && process.env[envKey] !== undefined;
|
|
81
|
+
}
|
|
82
|
+
async getSecret(reference) {
|
|
83
|
+
const envKey = this.resolveEnvKey(reference);
|
|
84
|
+
if (!envKey) {
|
|
85
|
+
throw new SecretProviderError({
|
|
86
|
+
message: `Unable to resolve environment variable for reference "${reference}".`,
|
|
87
|
+
provider: this.id,
|
|
88
|
+
reference,
|
|
89
|
+
code: "INVALID"
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const value = process.env[envKey];
|
|
93
|
+
if (value === undefined) {
|
|
94
|
+
throw new SecretProviderError({
|
|
95
|
+
message: `Environment variable "${envKey}" not found for reference "${reference}".`,
|
|
96
|
+
provider: this.id,
|
|
97
|
+
reference,
|
|
98
|
+
code: "NOT_FOUND"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
data: Buffer.from(value, "utf-8"),
|
|
103
|
+
version: "current",
|
|
104
|
+
metadata: {
|
|
105
|
+
source: "env",
|
|
106
|
+
envKey
|
|
107
|
+
},
|
|
108
|
+
retrievedAt: new Date
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async setSecret(reference, _payload) {
|
|
112
|
+
throw this.forbiddenError("setSecret", reference);
|
|
113
|
+
}
|
|
114
|
+
async rotateSecret(reference, _payload) {
|
|
115
|
+
throw this.forbiddenError("rotateSecret", reference);
|
|
116
|
+
}
|
|
117
|
+
async deleteSecret(reference) {
|
|
118
|
+
throw this.forbiddenError("deleteSecret", reference);
|
|
119
|
+
}
|
|
120
|
+
resolveEnvKey(reference) {
|
|
121
|
+
if (!reference) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (this.aliases[reference]) {
|
|
125
|
+
return this.aliases[reference];
|
|
126
|
+
}
|
|
127
|
+
if (!reference.includes("://")) {
|
|
128
|
+
return reference;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const parsed = parseSecretUri(reference);
|
|
132
|
+
if (parsed.provider === "env") {
|
|
133
|
+
return parsed.path;
|
|
134
|
+
}
|
|
135
|
+
if (parsed.extras?.env) {
|
|
136
|
+
return parsed.extras.env;
|
|
137
|
+
}
|
|
138
|
+
return this.deriveEnvKey(parsed.path);
|
|
139
|
+
} catch {
|
|
140
|
+
return reference;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
deriveEnvKey(path) {
|
|
144
|
+
if (!path)
|
|
145
|
+
return;
|
|
146
|
+
return path.split(/[/:\-.]/).filter(Boolean).map((segment) => segment.replace(/[^a-zA-Z0-9]/g, "_").replace(/_{2,}/g, "_").toUpperCase()).join("_");
|
|
147
|
+
}
|
|
148
|
+
forbiddenError(operation, reference) {
|
|
149
|
+
return new SecretProviderError({
|
|
150
|
+
message: `EnvSecretProvider is read-only. "${operation}" is not allowed for ${reference}.`,
|
|
151
|
+
provider: this.id,
|
|
152
|
+
reference,
|
|
153
|
+
code: "FORBIDDEN"
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export {
|
|
158
|
+
EnvSecretProvider
|
|
159
|
+
};
|
|
@@ -1,33 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
//#region src/secrets/gcp-secret-manager.d.ts
|
|
1
|
+
import { protos, SecretManagerServiceClient } from '@google-cloud/secret-manager';
|
|
2
|
+
import type { CallOptions } from 'google-gax';
|
|
3
|
+
import type { SecretProvider, SecretReference, SecretRotationResult, SecretValue, SecretWritePayload } from './provider';
|
|
6
4
|
type SecretManagerClient = SecretManagerServiceClient;
|
|
7
5
|
interface GcpSecretManagerProviderOptions {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
projectId?: string;
|
|
7
|
+
client?: SecretManagerClient;
|
|
8
|
+
clientOptions?: ConstructorParameters<typeof SecretManagerServiceClient>[0];
|
|
9
|
+
defaultReplication?: protos.google.cloud.secretmanager.v1.IReplication;
|
|
12
10
|
}
|
|
13
|
-
declare class GcpSecretManagerProvider implements SecretProvider {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
export declare class GcpSecretManagerProvider implements SecretProvider {
|
|
12
|
+
readonly id = "gcp-secret-manager";
|
|
13
|
+
private readonly client;
|
|
14
|
+
private readonly explicitProjectId?;
|
|
15
|
+
private readonly replication;
|
|
16
|
+
constructor(options?: GcpSecretManagerProviderOptions);
|
|
17
|
+
canHandle(reference: SecretReference): boolean;
|
|
18
|
+
getSecret(reference: SecretReference, options?: {
|
|
19
|
+
version?: string;
|
|
20
|
+
}, callOptions?: CallOptions): Promise<SecretValue>;
|
|
21
|
+
setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
22
|
+
rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
|
|
23
|
+
deleteSecret(reference: SecretReference): Promise<void>;
|
|
24
|
+
private parseReference;
|
|
25
|
+
private buildNames;
|
|
26
|
+
private buildVersionName;
|
|
27
|
+
private ensureSecretExists;
|
|
30
28
|
}
|
|
31
|
-
|
|
32
|
-
export { GcpSecretManagerProvider };
|
|
29
|
+
export {};
|
|
33
30
|
//# sourceMappingURL=gcp-secret-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcp-secret-manager.d.ts","
|
|
1
|
+
{"version":3,"file":"gcp-secret-manager.d.ts","sourceRoot":"","sources":["../../src/secrets/gcp-secret-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,KAAK,mBAAmB,GAAG,0BAA0B,CAAC;AAEtD,UAAU,+BAA+B;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC;CACxE;AAYD,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,QAAQ,CAAC,EAAE,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoD;gBAEpE,OAAO,GAAE,+BAAoC;IAQzD,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO;IASxC,SAAS,CACb,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAC9B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,WAAW,CAAC;IAwCjB,SAAS,CACb,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAqC1B,YAAY,CAChB,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAI1B,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7D,OAAO,CAAC,cAAc;IAkEtB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,gBAAgB;YASV,kBAAkB;CAyCjC"}
|