@contractspec/integration.runtime 1.57.0 → 1.59.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
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// src/secrets/provider.ts
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
|
|
4
|
+
class SecretProviderError extends Error {
|
|
5
|
+
provider;
|
|
6
|
+
reference;
|
|
7
|
+
code;
|
|
8
|
+
cause;
|
|
9
|
+
constructor(params) {
|
|
10
|
+
super(params.message);
|
|
11
|
+
this.name = "SecretProviderError";
|
|
12
|
+
this.provider = params.provider;
|
|
13
|
+
this.reference = params.reference;
|
|
14
|
+
this.code = params.code ?? "UNKNOWN";
|
|
15
|
+
this.cause = params.cause;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function parseSecretUri(reference) {
|
|
19
|
+
if (!reference) {
|
|
20
|
+
throw new SecretProviderError({
|
|
21
|
+
message: "Secret reference cannot be empty",
|
|
22
|
+
provider: "unknown",
|
|
23
|
+
reference,
|
|
24
|
+
code: "INVALID"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const [scheme, rest] = reference.split("://");
|
|
28
|
+
if (!scheme || !rest) {
|
|
29
|
+
throw new SecretProviderError({
|
|
30
|
+
message: `Invalid secret reference: ${reference}`,
|
|
31
|
+
provider: "unknown",
|
|
32
|
+
reference,
|
|
33
|
+
code: "INVALID"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const queryIndex = rest.indexOf("?");
|
|
37
|
+
if (queryIndex === -1) {
|
|
38
|
+
return {
|
|
39
|
+
provider: scheme,
|
|
40
|
+
path: rest
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const path = rest.slice(0, queryIndex);
|
|
44
|
+
const query = rest.slice(queryIndex + 1);
|
|
45
|
+
const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
|
|
46
|
+
const [keyRaw, valueRaw] = pair.split("=");
|
|
47
|
+
const key = keyRaw ?? "";
|
|
48
|
+
const value = valueRaw ?? "";
|
|
49
|
+
return [decodeURIComponent(key), decodeURIComponent(value)];
|
|
50
|
+
}));
|
|
51
|
+
return {
|
|
52
|
+
provider: scheme,
|
|
53
|
+
path,
|
|
54
|
+
extras
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function normalizeSecretPayload(payload) {
|
|
58
|
+
if (payload.data instanceof Uint8Array) {
|
|
59
|
+
return payload.data;
|
|
60
|
+
}
|
|
61
|
+
if (payload.encoding === "base64") {
|
|
62
|
+
return Buffer.from(payload.data, "base64");
|
|
63
|
+
}
|
|
64
|
+
if (payload.encoding === "binary") {
|
|
65
|
+
return Buffer.from(payload.data, "binary");
|
|
66
|
+
}
|
|
67
|
+
return Buffer.from(payload.data, "utf-8");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/secrets/manager.ts
|
|
71
|
+
class SecretProviderManager {
|
|
72
|
+
id;
|
|
73
|
+
providers = [];
|
|
74
|
+
registrationCounter = 0;
|
|
75
|
+
constructor(options = {}) {
|
|
76
|
+
this.id = options.id ?? "secret-provider-manager";
|
|
77
|
+
const initialProviders = options.providers ?? [];
|
|
78
|
+
for (const entry of initialProviders) {
|
|
79
|
+
this.register(entry.provider, { priority: entry.priority });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
register(provider, options = {}) {
|
|
83
|
+
this.providers.push({
|
|
84
|
+
provider,
|
|
85
|
+
priority: options.priority ?? 0,
|
|
86
|
+
order: this.registrationCounter++
|
|
87
|
+
});
|
|
88
|
+
this.providers.sort((a, b) => {
|
|
89
|
+
if (a.priority !== b.priority) {
|
|
90
|
+
return b.priority - a.priority;
|
|
91
|
+
}
|
|
92
|
+
return a.order - b.order;
|
|
93
|
+
});
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
canHandle(reference) {
|
|
97
|
+
return this.providers.some(({ provider }) => safeCanHandle(provider, reference));
|
|
98
|
+
}
|
|
99
|
+
async getSecret(reference, options) {
|
|
100
|
+
const errors = [];
|
|
101
|
+
for (const { provider } of this.providers) {
|
|
102
|
+
if (!safeCanHandle(provider, reference)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
return await provider.getSecret(reference, options);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error instanceof SecretProviderError) {
|
|
109
|
+
errors.push(error);
|
|
110
|
+
if (error.code !== "NOT_FOUND") {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
throw this.composeError("getSecret", reference, errors, options?.version);
|
|
119
|
+
}
|
|
120
|
+
async setSecret(reference, payload) {
|
|
121
|
+
return this.delegateToFirst("setSecret", reference, (provider) => provider.setSecret(reference, payload));
|
|
122
|
+
}
|
|
123
|
+
async rotateSecret(reference, payload) {
|
|
124
|
+
return this.delegateToFirst("rotateSecret", reference, (provider) => provider.rotateSecret(reference, payload));
|
|
125
|
+
}
|
|
126
|
+
async deleteSecret(reference) {
|
|
127
|
+
await this.delegateToFirst("deleteSecret", reference, (provider) => provider.deleteSecret(reference));
|
|
128
|
+
}
|
|
129
|
+
async delegateToFirst(operation, reference, invoker) {
|
|
130
|
+
const errors = [];
|
|
131
|
+
for (const { provider } of this.providers) {
|
|
132
|
+
if (!safeCanHandle(provider, reference)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
return await invoker(provider);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
if (error instanceof SecretProviderError) {
|
|
139
|
+
errors.push(error);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
throw this.composeError(operation, reference, errors);
|
|
146
|
+
}
|
|
147
|
+
composeError(operation, reference, errors, version) {
|
|
148
|
+
if (errors.length === 1) {
|
|
149
|
+
const [singleError] = errors;
|
|
150
|
+
if (singleError) {
|
|
151
|
+
return singleError;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const messageParts = [
|
|
155
|
+
`No registered secret provider could ${operation}`,
|
|
156
|
+
`reference "${reference}"`
|
|
157
|
+
];
|
|
158
|
+
if (version) {
|
|
159
|
+
messageParts.push(`(version: ${version})`);
|
|
160
|
+
}
|
|
161
|
+
if (errors.length > 1) {
|
|
162
|
+
messageParts.push(`Attempts: ${errors.map((error) => `${error.provider}:${error.code}`).join(", ")}`);
|
|
163
|
+
}
|
|
164
|
+
return new SecretProviderError({
|
|
165
|
+
message: messageParts.join(" "),
|
|
166
|
+
provider: this.id,
|
|
167
|
+
reference,
|
|
168
|
+
code: errors.length > 0 ? errors[errors.length - 1].code : "UNKNOWN",
|
|
169
|
+
cause: errors
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function safeCanHandle(provider, reference) {
|
|
174
|
+
try {
|
|
175
|
+
return provider.canHandle(reference);
|
|
176
|
+
} catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export {
|
|
181
|
+
SecretProviderManager
|
|
182
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// src/secrets/provider.ts
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
|
|
4
|
+
class SecretProviderError extends Error {
|
|
5
|
+
provider;
|
|
6
|
+
reference;
|
|
7
|
+
code;
|
|
8
|
+
cause;
|
|
9
|
+
constructor(params) {
|
|
10
|
+
super(params.message);
|
|
11
|
+
this.name = "SecretProviderError";
|
|
12
|
+
this.provider = params.provider;
|
|
13
|
+
this.reference = params.reference;
|
|
14
|
+
this.code = params.code ?? "UNKNOWN";
|
|
15
|
+
this.cause = params.cause;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function parseSecretUri(reference) {
|
|
19
|
+
if (!reference) {
|
|
20
|
+
throw new SecretProviderError({
|
|
21
|
+
message: "Secret reference cannot be empty",
|
|
22
|
+
provider: "unknown",
|
|
23
|
+
reference,
|
|
24
|
+
code: "INVALID"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const [scheme, rest] = reference.split("://");
|
|
28
|
+
if (!scheme || !rest) {
|
|
29
|
+
throw new SecretProviderError({
|
|
30
|
+
message: `Invalid secret reference: ${reference}`,
|
|
31
|
+
provider: "unknown",
|
|
32
|
+
reference,
|
|
33
|
+
code: "INVALID"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const queryIndex = rest.indexOf("?");
|
|
37
|
+
if (queryIndex === -1) {
|
|
38
|
+
return {
|
|
39
|
+
provider: scheme,
|
|
40
|
+
path: rest
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const path = rest.slice(0, queryIndex);
|
|
44
|
+
const query = rest.slice(queryIndex + 1);
|
|
45
|
+
const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
|
|
46
|
+
const [keyRaw, valueRaw] = pair.split("=");
|
|
47
|
+
const key = keyRaw ?? "";
|
|
48
|
+
const value = valueRaw ?? "";
|
|
49
|
+
return [decodeURIComponent(key), decodeURIComponent(value)];
|
|
50
|
+
}));
|
|
51
|
+
return {
|
|
52
|
+
provider: scheme,
|
|
53
|
+
path,
|
|
54
|
+
extras
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function normalizeSecretPayload(payload) {
|
|
58
|
+
if (payload.data instanceof Uint8Array) {
|
|
59
|
+
return payload.data;
|
|
60
|
+
}
|
|
61
|
+
if (payload.encoding === "base64") {
|
|
62
|
+
return Buffer.from(payload.data, "base64");
|
|
63
|
+
}
|
|
64
|
+
if (payload.encoding === "binary") {
|
|
65
|
+
return Buffer.from(payload.data, "binary");
|
|
66
|
+
}
|
|
67
|
+
return Buffer.from(payload.data, "utf-8");
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
parseSecretUri,
|
|
71
|
+
normalizeSecretPayload,
|
|
72
|
+
SecretProviderError
|
|
73
|
+
};
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,100 +1,96 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ConnectionStatus, IntegrationConnection } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
blueprintVersion: number;
|
|
10
|
-
configVersion: number;
|
|
1
|
+
import type { ResolvedAppConfig, ResolvedIntegration } from '@contractspec/lib.contracts/app-config/runtime';
|
|
2
|
+
import type { ConnectionStatus, IntegrationConnection } from '@contractspec/lib.contracts/integrations/connection';
|
|
3
|
+
import type { IntegrationSpec } from '@contractspec/lib.contracts/integrations/spec';
|
|
4
|
+
import type { SecretProvider } from './secrets/provider';
|
|
5
|
+
export interface IntegrationTraceMetadata {
|
|
6
|
+
blueprintName: string;
|
|
7
|
+
blueprintVersion: number;
|
|
8
|
+
configVersion: number;
|
|
11
9
|
}
|
|
12
|
-
interface IntegrationTelemetryEvent {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
10
|
+
export interface IntegrationTelemetryEvent {
|
|
11
|
+
tenantId: string;
|
|
12
|
+
appId: string;
|
|
13
|
+
environment?: string;
|
|
14
|
+
slotId?: string;
|
|
15
|
+
integrationKey: string;
|
|
16
|
+
integrationVersion: string;
|
|
17
|
+
connectionId: string;
|
|
18
|
+
status: 'success' | 'error';
|
|
19
|
+
durationMs?: number;
|
|
20
|
+
errorCode?: string;
|
|
21
|
+
errorMessage?: string;
|
|
22
|
+
occurredAt: Date;
|
|
23
|
+
metadata?: Record<string, string | number | boolean>;
|
|
26
24
|
}
|
|
27
|
-
interface IntegrationTelemetryEmitter {
|
|
28
|
-
|
|
25
|
+
export interface IntegrationTelemetryEmitter {
|
|
26
|
+
record(event: IntegrationTelemetryEvent): Promise<void> | void;
|
|
29
27
|
}
|
|
30
|
-
type IntegrationInvocationStatus = 'success' | 'error';
|
|
31
|
-
interface IntegrationContext {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
28
|
+
export type IntegrationInvocationStatus = 'success' | 'error';
|
|
29
|
+
export interface IntegrationContext {
|
|
30
|
+
tenantId: string;
|
|
31
|
+
appId: string;
|
|
32
|
+
environment?: string;
|
|
33
|
+
slotId?: string;
|
|
34
|
+
spec: IntegrationSpec;
|
|
35
|
+
connection: IntegrationConnection;
|
|
36
|
+
secretProvider: SecretProvider;
|
|
37
|
+
secretReference: string;
|
|
38
|
+
trace: IntegrationTraceMetadata;
|
|
39
|
+
config?: Record<string, unknown>;
|
|
42
40
|
}
|
|
43
|
-
interface IntegrationCallContext {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
export interface IntegrationCallContext {
|
|
42
|
+
tenantId: string;
|
|
43
|
+
appId: string;
|
|
44
|
+
environment?: string;
|
|
45
|
+
blueprintName: string;
|
|
46
|
+
blueprintVersion: string;
|
|
47
|
+
configVersion: string;
|
|
48
|
+
slotId: string;
|
|
49
|
+
operation: string;
|
|
52
50
|
}
|
|
53
|
-
interface IntegrationCallError {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
export interface IntegrationCallError {
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
retryable: boolean;
|
|
55
|
+
cause?: unknown;
|
|
58
56
|
}
|
|
59
|
-
interface IntegrationCallResult<T> {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
export interface IntegrationCallResult<T> {
|
|
58
|
+
success: boolean;
|
|
59
|
+
data?: T;
|
|
60
|
+
error?: IntegrationCallError;
|
|
61
|
+
metadata: {
|
|
62
|
+
latencyMs: number;
|
|
63
|
+
connectionId: string;
|
|
64
|
+
ownershipMode: IntegrationConnection['ownershipMode'];
|
|
65
|
+
attempts: number;
|
|
66
|
+
};
|
|
69
67
|
}
|
|
70
|
-
interface IntegrationCallGuardOptions {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
export interface IntegrationCallGuardOptions {
|
|
69
|
+
telemetry?: IntegrationTelemetryEmitter;
|
|
70
|
+
maxAttempts?: number;
|
|
71
|
+
backoffMs?: number;
|
|
72
|
+
shouldRetry?: (error: unknown, attempt: number) => boolean;
|
|
73
|
+
sleep?: (ms: number) => Promise<void>;
|
|
74
|
+
now?: () => Date;
|
|
77
75
|
}
|
|
78
|
-
declare class IntegrationCallGuard {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
76
|
+
export declare class IntegrationCallGuard {
|
|
77
|
+
private readonly secretProvider;
|
|
78
|
+
private readonly telemetry?;
|
|
79
|
+
private readonly maxAttempts;
|
|
80
|
+
private readonly backoffMs;
|
|
81
|
+
private readonly shouldRetry;
|
|
82
|
+
private readonly sleep;
|
|
83
|
+
private readonly now;
|
|
84
|
+
constructor(secretProvider: SecretProvider, options?: IntegrationCallGuardOptions);
|
|
85
|
+
executeWithGuards<T>(slotId: string, operation: string, _input: unknown, resolvedConfig: ResolvedAppConfig, executor: (connection: IntegrationConnection, secrets: Record<string, string>) => Promise<T>): Promise<IntegrationCallResult<T>>;
|
|
86
|
+
private findIntegration;
|
|
87
|
+
private fetchSecrets;
|
|
88
|
+
private parseSecret;
|
|
89
|
+
private emitTelemetry;
|
|
90
|
+
private failure;
|
|
91
|
+
private makeContext;
|
|
92
|
+
private errorCodeFor;
|
|
95
93
|
}
|
|
96
|
-
declare function ensureConnectionReady(integration: ResolvedIntegration): void;
|
|
97
|
-
declare function connectionStatusLabel(status: ConnectionStatus): string;
|
|
98
|
-
//#endregion
|
|
99
|
-
export { IntegrationCallContext, IntegrationCallError, IntegrationCallGuard, IntegrationCallGuardOptions, IntegrationCallResult, IntegrationContext, IntegrationInvocationStatus, IntegrationTelemetryEmitter, IntegrationTelemetryEvent, IntegrationTraceMetadata, connectionStatusLabel, ensureConnectionReady };
|
|
94
|
+
export declare function ensureConnectionReady(integration: ResolvedIntegration): void;
|
|
95
|
+
export declare function connectionStatusLabel(status: ConnectionStatus): string;
|
|
100
96
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|