@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.
Files changed (39) hide show
  1. package/dist/health.d.ts +14 -18
  2. package/dist/health.d.ts.map +1 -1
  3. package/dist/health.js +71 -68
  4. package/dist/index.d.ts +4 -8
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +828 -9
  7. package/dist/node/health.js +72 -0
  8. package/dist/node/index.js +827 -0
  9. package/dist/node/runtime.js +208 -0
  10. package/dist/node/secrets/env-secret-provider.js +158 -0
  11. package/dist/node/secrets/gcp-secret-manager.js +346 -0
  12. package/dist/node/secrets/index.js +549 -0
  13. package/dist/node/secrets/manager.js +182 -0
  14. package/dist/node/secrets/provider.js +73 -0
  15. package/dist/runtime.d.ts +86 -90
  16. package/dist/runtime.d.ts.map +1 -1
  17. package/dist/runtime.js +204 -182
  18. package/dist/secrets/env-secret-provider.d.ts +20 -23
  19. package/dist/secrets/env-secret-provider.d.ts.map +1 -1
  20. package/dist/secrets/env-secret-provider.js +157 -80
  21. package/dist/secrets/gcp-secret-manager.d.ts +25 -28
  22. package/dist/secrets/gcp-secret-manager.d.ts.map +1 -1
  23. package/dist/secrets/gcp-secret-manager.js +339 -222
  24. package/dist/secrets/index.d.ts +5 -5
  25. package/dist/secrets/index.d.ts.map +1 -0
  26. package/dist/secrets/index.js +549 -5
  27. package/dist/secrets/manager.d.ts +32 -35
  28. package/dist/secrets/manager.d.ts.map +1 -1
  29. package/dist/secrets/manager.js +180 -101
  30. package/dist/secrets/provider.d.ts +42 -45
  31. package/dist/secrets/provider.d.ts.map +1 -1
  32. package/dist/secrets/provider.js +69 -54
  33. package/package.json +76 -30
  34. package/dist/health.js.map +0 -1
  35. package/dist/runtime.js.map +0 -1
  36. package/dist/secrets/env-secret-provider.js.map +0 -1
  37. package/dist/secrets/gcp-secret-manager.js.map +0 -1
  38. package/dist/secrets/manager.js.map +0 -1
  39. 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 { SecretProvider } from "./secrets/provider.js";
2
- import { ConnectionStatus, IntegrationConnection } from "@contractspec/lib.contracts/integrations/connection";
3
- import { ResolvedAppConfig, ResolvedIntegration } from "@contractspec/lib.contracts/app-config/runtime";
4
- import { IntegrationSpec } from "@contractspec/lib.contracts/integrations/spec";
5
-
6
- //#region src/runtime.d.ts
7
- interface IntegrationTraceMetadata {
8
- blueprintName: string;
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
- tenantId: string;
14
- appId: string;
15
- environment?: string;
16
- slotId?: string;
17
- integrationKey: string;
18
- integrationVersion: string;
19
- connectionId: string;
20
- status: 'success' | 'error';
21
- durationMs?: number;
22
- errorCode?: string;
23
- errorMessage?: string;
24
- occurredAt: Date;
25
- metadata?: Record<string, string | number | boolean>;
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
- record(event: IntegrationTelemetryEvent): Promise<void> | void;
25
+ export interface IntegrationTelemetryEmitter {
26
+ record(event: IntegrationTelemetryEvent): Promise<void> | void;
29
27
  }
30
- type IntegrationInvocationStatus = 'success' | 'error';
31
- interface IntegrationContext {
32
- tenantId: string;
33
- appId: string;
34
- environment?: string;
35
- slotId?: string;
36
- spec: IntegrationSpec;
37
- connection: IntegrationConnection;
38
- secretProvider: SecretProvider;
39
- secretReference: string;
40
- trace: IntegrationTraceMetadata;
41
- config?: Record<string, unknown>;
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
- tenantId: string;
45
- appId: string;
46
- environment?: string;
47
- blueprintName: string;
48
- blueprintVersion: string;
49
- configVersion: string;
50
- slotId: string;
51
- operation: string;
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
- code: string;
55
- message: string;
56
- retryable: boolean;
57
- cause?: unknown;
51
+ export interface IntegrationCallError {
52
+ code: string;
53
+ message: string;
54
+ retryable: boolean;
55
+ cause?: unknown;
58
56
  }
59
- interface IntegrationCallResult<T> {
60
- success: boolean;
61
- data?: T;
62
- error?: IntegrationCallError;
63
- metadata: {
64
- latencyMs: number;
65
- connectionId: string;
66
- ownershipMode: IntegrationConnection['ownershipMode'];
67
- attempts: number;
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
- telemetry?: IntegrationTelemetryEmitter;
72
- maxAttempts?: number;
73
- backoffMs?: number;
74
- shouldRetry?: (error: unknown, attempt: number) => boolean;
75
- sleep?: (ms: number) => Promise<void>;
76
- now?: () => Date;
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
- private readonly secretProvider;
80
- private readonly telemetry?;
81
- private readonly maxAttempts;
82
- private readonly backoffMs;
83
- private readonly shouldRetry;
84
- private readonly sleep;
85
- private readonly now;
86
- constructor(secretProvider: SecretProvider, options?: IntegrationCallGuardOptions);
87
- executeWithGuards<T>(slotId: string, operation: string, _input: unknown, resolvedConfig: ResolvedAppConfig, executor: (connection: IntegrationConnection, secrets: Record<string, string>) => Promise<T>): Promise<IntegrationCallResult<T>>;
88
- private findIntegration;
89
- private fetchSecrets;
90
- private parseSecret;
91
- private emitTelemetry;
92
- private failure;
93
- private makeContext;
94
- private errorCodeFor;
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
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","names":[],"sources":["../src/runtime.ts"],"sourcesContent":[],"mappings":";;;;;;UAaiB,wBAAA;;EAAA,gBAAA,EAAA,MAAA;EAMA,aAAA,EAAA,MAAA;AAgBjB;AAIY,UApBK,yBAAA,CAoBsB;EAEtB,QAAA,EAAA,MAAA;EAKT,KAAA,EAAA,MAAA;EACM,WAAA,CAAA,EAAA,MAAA;EACI,MAAA,CAAA,EAAA,MAAA;EAET,cAAA,EAAA,MAAA;EACE,kBAAA,EAAA,MAAA;EAAM,YAAA,EAAA,MAAA;EAGA,MAAA,EAAA,SAAA,GAAA,OAAsB;EAWtB,UAAA,CAAA,EAAA,MAAA;EAOA,SAAA,CAAA,EAAA,MAAA;EAER,YAAA,CAAA,EAAA,MAAA;EACC,UAAA,EA5CI,IA4CJ;EAIS,QAAA,CAAA,EA/CN,MA+CM,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA;;AAKF,UAjDA,2BAAA,CAiD2B;EAC9B,MAAA,CAAA,KAAA,EAjDE,yBAiDF,CAAA,EAjD8B,OAiD9B,CAAA,IAAA,CAAA,GAAA,IAAA;;AAKA,KAnDF,2BAAA,GAmDE,SAAA,GAAA,OAAA;AAAI,UAjDD,kBAAA,CAiDC;EAML,QAAA,EAAA,MAAA;EASwB,KAAA,EAAA,MAAA;EACxB,WAAA,CAAA,EAAA,MAAA;EAyBO,MAAA,CAAA,EAAA,MAAA;EAEF,IAAA,EAvFV,eAuFU;EACH,UAAA,EAvFD,qBAuFC;EACE,cAAA,EAvFC,cAuFD;EAAR,eAAA,EAAA,MAAA;EAC0B,KAAA,EAtF1B,wBAsF0B;EAAtB,MAAA,CAAA,EArFF,MAqFE,CAAA,MAAA,EAAA,OAAA,CAAA;;AAAD,UAlFK,sBAAA,CAkFL;EAiPI,QAAA,EAAA,MAAA;EASA,KAAA,EAAA,MAAA;;;;;;;;UAjUC,oBAAA;;;;;;UAOA;;SAER;UACC;;;;mBAIS;;;;UAKF,2BAAA;cACH;;;;0BAIY;cACZ;;cAMD,oBAAA;;;;;;;;8BASwB,0BACxB;2FAyBO,0CAEF,gCACH,2BACN,QAAQ,KACZ,QAAQ,sBAAsB;;;;;;;;;iBAiPnB,qBAAA,cAAmC;iBASnC,qBAAA,SAA8B"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}