meridianjs 0.1.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/CHANGELOG.md +152 -0
- package/LICENSE.md +22 -0
- package/README.md +126 -0
- package/dist/core/adapter-validator.d.ts +10 -0
- package/dist/core/adapter-validator.d.ts.map +1 -0
- package/dist/core/adapter-validator.js +270 -0
- package/dist/core/adapter-validator.js.map +1 -0
- package/dist/core/error-sanitizer.d.ts +3 -0
- package/dist/core/error-sanitizer.d.ts.map +1 -0
- package/dist/core/error-sanitizer.js +134 -0
- package/dist/core/error-sanitizer.js.map +1 -0
- package/dist/core/header-parser.d.ts +15 -0
- package/dist/core/header-parser.d.ts.map +1 -0
- package/dist/core/header-parser.js +148 -0
- package/dist/core/header-parser.js.map +1 -0
- package/dist/core/normalizer.d.ts +10 -0
- package/dist/core/normalizer.d.ts.map +1 -0
- package/dist/core/normalizer.js +39 -0
- package/dist/core/normalizer.js.map +1 -0
- package/dist/core/observability-sanitizer.d.ts +7 -0
- package/dist/core/observability-sanitizer.d.ts.map +1 -0
- package/dist/core/observability-sanitizer.js +51 -0
- package/dist/core/observability-sanitizer.js.map +1 -0
- package/dist/core/pipeline.d.ts +34 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +216 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/request-sanitizer.d.ts +7 -0
- package/dist/core/request-sanitizer.d.ts.map +1 -0
- package/dist/core/request-sanitizer.js +90 -0
- package/dist/core/request-sanitizer.js.map +1 -0
- package/dist/core/types.d.ts +280 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +92 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +341 -0
- package/dist/index.js.map +1 -0
- package/dist/observability/adapter.d.ts +2 -0
- package/dist/observability/adapter.d.ts.map +1 -0
- package/dist/observability/adapter.js +2 -0
- package/dist/observability/adapter.js.map +1 -0
- package/dist/observability/console.d.ts +15 -0
- package/dist/observability/console.d.ts.map +1 -0
- package/dist/observability/console.js +81 -0
- package/dist/observability/console.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +6 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/noop.d.ts +9 -0
- package/dist/observability/noop.d.ts.map +1 -0
- package/dist/observability/noop.js +13 -0
- package/dist/observability/noop.js.map +1 -0
- package/dist/observability/otel.d.ts +51 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +93 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/prometheus.d.ts +29 -0
- package/dist/observability/prometheus.d.ts.map +1 -0
- package/dist/observability/prometheus.js +194 -0
- package/dist/observability/prometheus.js.map +1 -0
- package/dist/providers/anthropic/adapter.d.ts +17 -0
- package/dist/providers/anthropic/adapter.d.ts.map +1 -0
- package/dist/providers/anthropic/adapter.js +151 -0
- package/dist/providers/anthropic/adapter.js.map +1 -0
- package/dist/providers/anthropic/index.d.ts +3 -0
- package/dist/providers/anthropic/index.d.ts.map +1 -0
- package/dist/providers/anthropic/index.js +3 -0
- package/dist/providers/anthropic/index.js.map +1 -0
- package/dist/providers/anthropic/pagination.d.ts +11 -0
- package/dist/providers/anthropic/pagination.d.ts.map +1 -0
- package/dist/providers/anthropic/pagination.js +36 -0
- package/dist/providers/anthropic/pagination.js.map +1 -0
- package/dist/providers/github/adapter.d.ts +18 -0
- package/dist/providers/github/adapter.d.ts.map +1 -0
- package/dist/providers/github/adapter.js +232 -0
- package/dist/providers/github/adapter.js.map +1 -0
- package/dist/providers/github/index.d.ts +3 -0
- package/dist/providers/github/index.d.ts.map +1 -0
- package/dist/providers/github/index.js +3 -0
- package/dist/providers/github/index.js.map +1 -0
- package/dist/providers/github/pagination.d.ts +11 -0
- package/dist/providers/github/pagination.d.ts.map +1 -0
- package/dist/providers/github/pagination.js +53 -0
- package/dist/providers/github/pagination.js.map +1 -0
- package/dist/providers/openai/adapter.d.ts +17 -0
- package/dist/providers/openai/adapter.d.ts.map +1 -0
- package/dist/providers/openai/adapter.js +178 -0
- package/dist/providers/openai/adapter.js.map +1 -0
- package/dist/providers/openai/index.d.ts +3 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +3 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/pagination.d.ts +11 -0
- package/dist/providers/openai/pagination.d.ts.map +1 -0
- package/dist/providers/openai/pagination.js +35 -0
- package/dist/providers/openai/pagination.js.map +1 -0
- package/dist/providers/stripe/adapter.d.ts +17 -0
- package/dist/providers/stripe/adapter.d.ts.map +1 -0
- package/dist/providers/stripe/adapter.js +177 -0
- package/dist/providers/stripe/adapter.js.map +1 -0
- package/dist/providers/stripe/index.d.ts +3 -0
- package/dist/providers/stripe/index.d.ts.map +1 -0
- package/dist/providers/stripe/index.js +3 -0
- package/dist/providers/stripe/index.js.map +1 -0
- package/dist/providers/stripe/pagination.d.ts +11 -0
- package/dist/providers/stripe/pagination.d.ts.map +1 -0
- package/dist/providers/stripe/pagination.js +44 -0
- package/dist/providers/stripe/pagination.js.map +1 -0
- package/dist/public.d.ts +27 -0
- package/dist/public.d.ts.map +1 -0
- package/dist/public.js +23 -0
- package/dist/public.js.map +1 -0
- package/dist/strategies/circuit-breaker.d.ts +22 -0
- package/dist/strategies/circuit-breaker.d.ts.map +1 -0
- package/dist/strategies/circuit-breaker.js +124 -0
- package/dist/strategies/circuit-breaker.js.map +1 -0
- package/dist/strategies/idempotency.d.ts +11 -0
- package/dist/strategies/idempotency.d.ts.map +1 -0
- package/dist/strategies/idempotency.js +55 -0
- package/dist/strategies/idempotency.js.map +1 -0
- package/dist/strategies/index.d.ts +6 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +6 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/pagination.d.ts +29 -0
- package/dist/strategies/pagination.d.ts.map +1 -0
- package/dist/strategies/pagination.js +130 -0
- package/dist/strategies/pagination.js.map +1 -0
- package/dist/strategies/rate-limit.d.ts +16 -0
- package/dist/strategies/rate-limit.d.ts.map +1 -0
- package/dist/strategies/rate-limit.js +94 -0
- package/dist/strategies/rate-limit.js.map +1 -0
- package/dist/strategies/retry.d.ts +13 -0
- package/dist/strategies/retry.d.ts.map +1 -0
- package/dist/strategies/retry.js +62 -0
- package/dist/strategies/retry.js.map +1 -0
- package/dist/validation/drift-detector.d.ts +5 -0
- package/dist/validation/drift-detector.d.ts.map +1 -0
- package/dist/validation/drift-detector.js +79 -0
- package/dist/validation/drift-detector.js.map +1 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schema-storage.d.ts +19 -0
- package/dist/validation/schema-storage.d.ts.map +1 -0
- package/dist/validation/schema-storage.js +131 -0
- package/dist/validation/schema-storage.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { MeridianError } from "./types.js";
|
|
2
|
+
import { sanitizeMeridianError } from "./error-sanitizer.js";
|
|
3
|
+
import { sanitizeObject, sanitizeMetric } from "./observability-sanitizer.js";
|
|
4
|
+
import { sanitizeRequestOptions } from "./request-sanitizer.js";
|
|
5
|
+
import { randomUUID } from "crypto";
|
|
6
|
+
export class RequestPipeline {
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
safelyBroadcastObservability(action, actionName) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
for (const obs of this.config.observability) {
|
|
14
|
+
try {
|
|
15
|
+
action(obs);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
errors.push({
|
|
19
|
+
adapter: obs.constructor?.name || "UnknownObservabilityAdapter",
|
|
20
|
+
error,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (errors.length > 0) {
|
|
25
|
+
const errorSummary = errors
|
|
26
|
+
.map(({ adapter, error }) => ` - ${adapter}: ${error instanceof Error ? error.message : String(error)}`)
|
|
27
|
+
.join("\n");
|
|
28
|
+
console.error(`[Meridian] Observability failure in ${actionName} (${errors.length}/${this.config.observability.length} adapters failed):\n${errorSummary}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async execute(endpoint, options = {}) {
|
|
32
|
+
const requestId = randomUUID();
|
|
33
|
+
const method = options.method ?? "GET";
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
if (this.config.autoGenerateIdempotencyKeys && !options.idempotencyKey) {
|
|
36
|
+
options.idempotencyKey = randomUUID();
|
|
37
|
+
}
|
|
38
|
+
const idempotencyLevel = this.config.idempotencyResolver.getIdempotencyLevel(method, endpoint, options);
|
|
39
|
+
const identity = options.identity;
|
|
40
|
+
const sanitizerOpts = {
|
|
41
|
+
...this.config.sanitizerOptions,
|
|
42
|
+
piiRedaction: this.config.compliance?.piiRedaction || this.config.sanitizerOptions?.piiRedaction
|
|
43
|
+
};
|
|
44
|
+
const sanitizedOptions = sanitizeRequestOptions(options, sanitizerOpts);
|
|
45
|
+
const requestContext = {
|
|
46
|
+
provider: this.config.provider,
|
|
47
|
+
endpoint,
|
|
48
|
+
method,
|
|
49
|
+
requestId,
|
|
50
|
+
timestamp: new Date(),
|
|
51
|
+
options: sanitizedOptions,
|
|
52
|
+
identity,
|
|
53
|
+
};
|
|
54
|
+
this.safelyBroadcastObservability((obs) => obs.logRequest(requestContext), "logRequest");
|
|
55
|
+
try {
|
|
56
|
+
const authToken = await this.config.adapter.authStrategy(this.config.authConfig);
|
|
57
|
+
await this.config.rateLimiter.acquire();
|
|
58
|
+
const response = await this.config.retryStrategy.execute(async () => {
|
|
59
|
+
return await this.config.circuitBreaker.execute(async () => {
|
|
60
|
+
return await this.executeHttpRequest(endpoint, options, authToken);
|
|
61
|
+
});
|
|
62
|
+
}, idempotencyLevel, !!options.idempotencyKey);
|
|
63
|
+
const rateLimitInfo = this.config.adapter.rateLimitPolicy(response.headers);
|
|
64
|
+
this.config.rateLimiter.updateFromHeaders(response.headers, rateLimitInfo);
|
|
65
|
+
const normalized = this.config.adapter.parseResponse(response);
|
|
66
|
+
normalized.meta.requestId = requestId;
|
|
67
|
+
const duration = Date.now() - startTime;
|
|
68
|
+
const responseContext = {
|
|
69
|
+
provider: this.config.provider,
|
|
70
|
+
endpoint,
|
|
71
|
+
method,
|
|
72
|
+
requestId,
|
|
73
|
+
statusCode: response.status,
|
|
74
|
+
duration,
|
|
75
|
+
timestamp: new Date(),
|
|
76
|
+
identity,
|
|
77
|
+
};
|
|
78
|
+
this.safelyBroadcastObservability((obs) => obs.logResponse(responseContext), "logResponse");
|
|
79
|
+
this.safelyBroadcastObservability((obs) => obs.recordMetric(sanitizeMetric({
|
|
80
|
+
name: "meridian.request.count",
|
|
81
|
+
value: 1,
|
|
82
|
+
tags: {
|
|
83
|
+
provider: this.config.provider,
|
|
84
|
+
endpoint,
|
|
85
|
+
status: String(response.status),
|
|
86
|
+
},
|
|
87
|
+
timestamp: new Date(),
|
|
88
|
+
}, this.config.sanitizerOptions)), "recordMetric:request.count");
|
|
89
|
+
this.safelyBroadcastObservability((obs) => obs.recordMetric(sanitizeMetric({
|
|
90
|
+
name: "meridian.request.duration",
|
|
91
|
+
value: duration,
|
|
92
|
+
tags: {
|
|
93
|
+
provider: this.config.provider,
|
|
94
|
+
endpoint,
|
|
95
|
+
},
|
|
96
|
+
timestamp: new Date(),
|
|
97
|
+
}, this.config.sanitizerOptions)), "recordMetric:request.duration");
|
|
98
|
+
return normalized;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const duration = Date.now() - startTime;
|
|
102
|
+
let meridianError;
|
|
103
|
+
try {
|
|
104
|
+
const adapterError = this.config.adapter.parseError(error);
|
|
105
|
+
meridianError = sanitizeMeridianError(adapterError, this.config.provider, requestId);
|
|
106
|
+
}
|
|
107
|
+
catch (parseError) {
|
|
108
|
+
meridianError = sanitizeMeridianError({
|
|
109
|
+
message: error instanceof Error ? error.message : String(error),
|
|
110
|
+
metadata: {
|
|
111
|
+
originalError: error instanceof Error ? error.message : error,
|
|
112
|
+
parseError: parseError instanceof Error ? parseError.message : parseError,
|
|
113
|
+
},
|
|
114
|
+
}, this.config.provider, requestId);
|
|
115
|
+
}
|
|
116
|
+
if (meridianError.category === "rate_limit" && meridianError.retryAfter) {
|
|
117
|
+
this.config.rateLimiter.handle429(Math.floor((meridianError.retryAfter.getTime() - Date.now()) / 1000));
|
|
118
|
+
}
|
|
119
|
+
let errorContext = {
|
|
120
|
+
provider: this.config.provider,
|
|
121
|
+
endpoint,
|
|
122
|
+
method,
|
|
123
|
+
requestId,
|
|
124
|
+
error: meridianError,
|
|
125
|
+
duration,
|
|
126
|
+
timestamp: new Date(),
|
|
127
|
+
identity,
|
|
128
|
+
};
|
|
129
|
+
try {
|
|
130
|
+
const sanitizedError = { ...meridianError };
|
|
131
|
+
if (sanitizedError.metadata) {
|
|
132
|
+
sanitizedError.metadata = sanitizeObject(sanitizedError.metadata, this.config.sanitizerOptions);
|
|
133
|
+
}
|
|
134
|
+
errorContext = { ...errorContext, error: sanitizedError };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
}
|
|
138
|
+
this.safelyBroadcastObservability((obs) => obs.logError(errorContext), "logError");
|
|
139
|
+
this.safelyBroadcastObservability((obs) => obs.recordMetric(sanitizeMetric({
|
|
140
|
+
name: "meridian.request.error",
|
|
141
|
+
value: 1,
|
|
142
|
+
tags: {
|
|
143
|
+
provider: this.config.provider,
|
|
144
|
+
endpoint,
|
|
145
|
+
errorCategory: meridianError.category,
|
|
146
|
+
},
|
|
147
|
+
timestamp: new Date(),
|
|
148
|
+
}, this.config.sanitizerOptions)), "recordMetric:request.error");
|
|
149
|
+
throw meridianError;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async executeHttpRequest(endpoint, options, authToken) {
|
|
153
|
+
const timeout = this.config.timeout ?? 30000;
|
|
154
|
+
const builtRequest = this.config.adapter.buildRequest({
|
|
155
|
+
endpoint,
|
|
156
|
+
options,
|
|
157
|
+
authToken,
|
|
158
|
+
});
|
|
159
|
+
const controller = new AbortController();
|
|
160
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
161
|
+
const fetchOptions = {
|
|
162
|
+
method: builtRequest.method,
|
|
163
|
+
headers: builtRequest.headers,
|
|
164
|
+
signal: controller.signal,
|
|
165
|
+
};
|
|
166
|
+
if (builtRequest.body !== undefined) {
|
|
167
|
+
fetchOptions.body = builtRequest.body;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const response = await fetch(builtRequest.url, fetchOptions);
|
|
171
|
+
let body;
|
|
172
|
+
try {
|
|
173
|
+
const contentType = response.headers.get("content-type");
|
|
174
|
+
if (contentType?.includes("application/json")) {
|
|
175
|
+
body = await response.json();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
body = await response.text();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
body = {};
|
|
183
|
+
}
|
|
184
|
+
const headersMap = new Headers();
|
|
185
|
+
response.headers.forEach((value, key) => {
|
|
186
|
+
headersMap.set(key, value);
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
throw {
|
|
190
|
+
status: response.status,
|
|
191
|
+
headers: headersMap,
|
|
192
|
+
body,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
status: response.status,
|
|
197
|
+
headers: headersMap,
|
|
198
|
+
body,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
203
|
+
throw new MeridianError(`Request timeout after ${timeout}ms`, "network", this.config.provider, true, "", {
|
|
204
|
+
timeout,
|
|
205
|
+
url: builtRequest.url,
|
|
206
|
+
method: builtRequest.method,
|
|
207
|
+
}, undefined, undefined);
|
|
208
|
+
}
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
clearTimeout(timeoutId);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAmBpC,MAAM,OAAO,eAAe;IAClB,MAAM,CAAiB;IAE/B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAGO,4BAA4B,CAClC,MAA+C,EAC/C,UAAkB;QAElB,MAAM,MAAM,GAA+C,EAAE,CAAC;QAE9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,6BAA6B;oBAC/D,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAID,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,MAAM;iBACxB,GAAG,CACF,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CACrB,OAAO,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9E;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO,CAAC,KAAK,CACX,uCAAuC,UAAU,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,uBAAuB,YAAY,EAAE,CAC7I,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,UAA0B,EAAE;QAE5B,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAG7B,IAAI,IAAI,CAAC,MAAM,CAAC,2BAA2B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACvE,OAAO,CAAC,cAAc,GAAG,UAAU,EAAE,CAAC;QACxC,CAAC;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,CAC1E,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;QAGF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAGlC,MAAM,aAAa,GAAG;YACpB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,YAAY;SACjG,CAAC;QAEF,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAExE,MAAM,cAAc,GAAmB;YACrC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ;YACR,MAAM;YACN,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,gBAAgB;YACzB,QAAQ;SACT,CAAC;QAGF,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EACvC,YAAY,CACb,CAAC;QAEF,IAAI,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CACtD,IAAI,CAAC,MAAM,CAAC,UAAU,CACvB,CAAC;YAGF,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAGxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CACtD,KAAK,IAAI,EAAE;gBACT,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAEzD,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAClC,QAAQ,EACR,OAAO,EACP,SAAS,CACV,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,EACD,gBAAgB,EAChB,CAAC,CAAC,OAAO,CAAC,cAAc,CACzB,CAAC;YAGF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CACvD,QAAQ,CAAC,OAAO,CACjB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CACvC,QAAQ,CAAC,OAAO,EAChB,aAAa,CACd,CAAC;YAGF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAG/D,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAKtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,MAAM,eAAe,GAAoB;gBACvC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,QAAQ;gBACR,MAAM;gBACN,SAAS;gBACT,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,QAAQ;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,QAAQ;aACT,CAAC;YAGF,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,EACzC,aAAa,CACd,CAAC;YAGF,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,QAAQ;oBACR,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;iBAChC;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EACjC,4BAA4B,CAC7B,CAAC;YAGF,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,2BAA2B;gBACjC,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,QAAQ;iBACT;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EACjC,+BAA+B,CAChC,CAAC;YAEF,OAAO,UAAmC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAIxC,IAAI,aAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAG3D,aAAa,GAAG,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACvF,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBAEpB,aAAa,GAAG,qBAAqB,CACnC;oBACE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC/D,QAAQ,EAAE;wBACR,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;wBAC7D,UAAU,EAAE,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;qBAC1E;iBACF,EACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,SAAS,CACV,CAAC;YACJ,CAAC;YAGD,IAAI,aAAa,CAAC,QAAQ,KAAK,YAAY,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;gBACxE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAC/B,IAAI,CAAC,KAAK,CACR,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CACzD,CACF,CAAC;YACJ,CAAC;YAED,IAAI,YAAY,GAAiB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,QAAQ;gBACR,MAAM;gBACN,SAAS;gBACT,KAAK,EAAE,aAAa;gBACpB,QAAQ;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,QAAQ;aACT,CAAC;YAMF,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,EAAE,GAAG,aAAa,EAAS,CAAC;gBACnD,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;oBAC5B,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAA4B,CAAC;gBAC7H,CAAC;gBACD,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;YAGD,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,UAAU,CACX,CAAC;YAGF,IAAI,CAAC,4BAA4B,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,QAAQ;oBACR,aAAa,EAAE,aAAa,CAAC,QAAQ;iBACtC;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EACjC,4BAA4B,CAC7B,CAAC;YAEF,MAAM,aAAa,CAAC;QACtB,CAAC;IACH,CAAC;IAGO,KAAK,CAAC,kBAAkB,CAC9B,QAAgB,EAChB,OAAuB,EACvB,SAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QAG7C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YACpD,QAAQ;YACR,OAAO;YACP,SAAS;SACV,CAAC,CAAC;QAGH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAGhE,MAAM,YAAY,GAAgB;YAChC,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC;QACF,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAG7D,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzD,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC9C,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,EAAE,CAAC;YACZ,CAAC;YAGD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;YACjC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAGH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM;oBACJ,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,UAAU;oBACnB,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,UAAU;gBACnB,IAAI;aACU,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,aAAa,CACrB,yBAAyB,OAAO,IAAI,EACpC,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,IAAI,EACJ,EAAE,EACF;oBACE,OAAO;oBACP,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,MAAM,EAAE,YAAY,CAAC,MAAM;iBAC5B,EACD,SAAS,EACT,SAAS,CACV,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CAEF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RequestOptions } from "./types.js";
|
|
2
|
+
export interface SanitizerOptions {
|
|
3
|
+
redactedKeys?: string[];
|
|
4
|
+
piiRedaction?: boolean | undefined;
|
|
5
|
+
}
|
|
6
|
+
export declare function sanitizeRequestOptions(options: RequestOptions | undefined, opts?: SanitizerOptions): RequestOptions;
|
|
7
|
+
//# sourceMappingURL=request-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/request-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAsBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,cAAc,CA+DnH"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const PII_PATTERNS = {
|
|
2
|
+
EMAIL: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
|
|
3
|
+
PHONE: /(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/g,
|
|
4
|
+
SSN: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
5
|
+
CREDIT_CARD: /\b(?:\d[ -]*?){13,16}\b/g,
|
|
6
|
+
};
|
|
7
|
+
const DEFAULT_REDACTED = [
|
|
8
|
+
"authorization",
|
|
9
|
+
"cookie",
|
|
10
|
+
"token",
|
|
11
|
+
"apikey",
|
|
12
|
+
"api_key",
|
|
13
|
+
"body",
|
|
14
|
+
];
|
|
15
|
+
export function sanitizeRequestOptions(options, opts) {
|
|
16
|
+
const redacted = (opts?.redactedKeys ?? DEFAULT_REDACTED).map(k => k.toLowerCase());
|
|
17
|
+
const input = options ?? {};
|
|
18
|
+
const sanitized = { ...input };
|
|
19
|
+
if (sanitized.headers) {
|
|
20
|
+
const headersCopy = {};
|
|
21
|
+
for (const [k, v] of Object.entries(sanitized.headers)) {
|
|
22
|
+
const lower = k.toLowerCase().replace(/[-_]/g, "");
|
|
23
|
+
const lowerValue = String(v).toLowerCase();
|
|
24
|
+
if (redacted.some(r => {
|
|
25
|
+
const normalizedR = r.replace(/[-_]/g, "");
|
|
26
|
+
return lower.includes(normalizedR) || lowerValue.includes(r);
|
|
27
|
+
})) {
|
|
28
|
+
headersCopy[k] = "[REDACTED]";
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
headersCopy[k] = v;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
sanitized.headers = headersCopy;
|
|
35
|
+
}
|
|
36
|
+
if (sanitized.query) {
|
|
37
|
+
const queryCopy = {};
|
|
38
|
+
for (const [k, v] of Object.entries(sanitized.query)) {
|
|
39
|
+
const lower = k.toLowerCase().replace(/[-_]/g, "");
|
|
40
|
+
const lowerValue = String(v).toLowerCase();
|
|
41
|
+
if (redacted.some(r => {
|
|
42
|
+
const normalizedR = r.replace(/[-_]/g, "");
|
|
43
|
+
return lower.includes(normalizedR) || lowerValue.includes(r);
|
|
44
|
+
})) {
|
|
45
|
+
queryCopy[k] = "[REDACTED]";
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
queryCopy[k] = v;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
sanitized.query = queryCopy;
|
|
52
|
+
}
|
|
53
|
+
if (sanitized.body !== undefined) {
|
|
54
|
+
if (redacted.includes("body") && !opts?.piiRedaction) {
|
|
55
|
+
sanitized.body = "[REDACTED]";
|
|
56
|
+
}
|
|
57
|
+
else if (opts?.piiRedaction && typeof sanitized.body === "string") {
|
|
58
|
+
let newBody = sanitized.body;
|
|
59
|
+
for (const pattern of Object.values(PII_PATTERNS)) {
|
|
60
|
+
newBody = newBody.replace(pattern, "[PII-REDACTED]");
|
|
61
|
+
}
|
|
62
|
+
sanitized.body = newBody;
|
|
63
|
+
}
|
|
64
|
+
else if (opts?.piiRedaction && typeof sanitized.body === "object" && sanitized.body !== null) {
|
|
65
|
+
sanitized.body = sanitizeValue(sanitized.body);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return sanitized;
|
|
69
|
+
}
|
|
70
|
+
function sanitizeValue(val) {
|
|
71
|
+
if (typeof val === "string") {
|
|
72
|
+
let newVal = val;
|
|
73
|
+
for (const pattern of Object.values(PII_PATTERNS)) {
|
|
74
|
+
newVal = newVal.replace(pattern, "[PII-REDACTED]");
|
|
75
|
+
}
|
|
76
|
+
return newVal;
|
|
77
|
+
}
|
|
78
|
+
if (Array.isArray(val)) {
|
|
79
|
+
return val.map(sanitizeValue);
|
|
80
|
+
}
|
|
81
|
+
if (typeof val === "object" && val !== null) {
|
|
82
|
+
const copy = {};
|
|
83
|
+
for (const [k, v] of Object.entries(val)) {
|
|
84
|
+
copy[k] = sanitizeValue(v);
|
|
85
|
+
}
|
|
86
|
+
return copy;
|
|
87
|
+
}
|
|
88
|
+
return val;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=request-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-sanitizer.js","sourceRoot":"","sources":["../../src/core/request-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
export interface NormalizedResponse<T = unknown> {
|
|
2
|
+
data: T;
|
|
3
|
+
meta: ResponseMeta;
|
|
4
|
+
}
|
|
5
|
+
export interface ResponseMeta {
|
|
6
|
+
provider: string;
|
|
7
|
+
requestId: string;
|
|
8
|
+
rateLimit: RateLimitInfo;
|
|
9
|
+
pagination?: PaginationInfo;
|
|
10
|
+
warnings: string[];
|
|
11
|
+
schemaVersion: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RateLimitInfo {
|
|
14
|
+
limit: number;
|
|
15
|
+
remaining: number;
|
|
16
|
+
reset: Date;
|
|
17
|
+
}
|
|
18
|
+
export interface PaginationInfo {
|
|
19
|
+
hasNext: boolean;
|
|
20
|
+
cursor?: string;
|
|
21
|
+
total?: number;
|
|
22
|
+
}
|
|
23
|
+
export type MeridianErrorCategory = "auth" | "rate_limit" | "network" | "provider" | "validation";
|
|
24
|
+
export type MeridianErrorCode = "AUTH_FAILED" | "RATE_LIMITED" | "NOT_FOUND" | "BAD_REQUEST" | "UPSTREAM_5XX" | "NETWORK_ERROR" | "TIMEOUT" | "UNKNOWN";
|
|
25
|
+
export declare class MeridianError extends Error {
|
|
26
|
+
category: MeridianErrorCategory;
|
|
27
|
+
retryable: boolean;
|
|
28
|
+
provider: string;
|
|
29
|
+
requestId: string;
|
|
30
|
+
status?: number;
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
retryAfter?: Date;
|
|
33
|
+
constructor(message: string, category: MeridianErrorCategory, provider: string, retryable: boolean, requestId?: string, metadata?: Record<string, unknown>, retryAfter?: Date, status?: number);
|
|
34
|
+
/**
|
|
35
|
+
* Returns the frozen error code from the MeridianErrorCode enum.
|
|
36
|
+
* Maps internal category to public error code contract.
|
|
37
|
+
*/
|
|
38
|
+
get code(): MeridianErrorCode;
|
|
39
|
+
}
|
|
40
|
+
export declare function mapCategoryToErrorCode(category: MeridianErrorCategory, status?: number): MeridianErrorCode;
|
|
41
|
+
export declare function isRetryableByCode(code: MeridianErrorCode): boolean;
|
|
42
|
+
export type ErrorType = "AUTH_ERROR" | "RATE_LIMIT" | "VALIDATION_ERROR" | "PROVIDER_ERROR" | "NETWORK_ERROR" | "CIRCUIT_OPEN";
|
|
43
|
+
export interface NormalizedError extends Error {
|
|
44
|
+
type: ErrorType;
|
|
45
|
+
provider: string;
|
|
46
|
+
actionable: string;
|
|
47
|
+
raw?: unknown;
|
|
48
|
+
retryable: boolean;
|
|
49
|
+
retryAfter?: Date;
|
|
50
|
+
}
|
|
51
|
+
export interface RequestOptions {
|
|
52
|
+
method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
|
|
53
|
+
headers?: Record<string, string>;
|
|
54
|
+
body?: unknown;
|
|
55
|
+
query?: Record<string, string | number | boolean>;
|
|
56
|
+
idempotencyKey?: string;
|
|
57
|
+
timeout?: number;
|
|
58
|
+
identity?: string | undefined;
|
|
59
|
+
}
|
|
60
|
+
export interface RequestContext {
|
|
61
|
+
provider: string;
|
|
62
|
+
endpoint: string;
|
|
63
|
+
method: string;
|
|
64
|
+
requestId: string;
|
|
65
|
+
timestamp: Date;
|
|
66
|
+
options: RequestOptions;
|
|
67
|
+
identity?: string | undefined;
|
|
68
|
+
}
|
|
69
|
+
export interface ResponseContext {
|
|
70
|
+
provider: string;
|
|
71
|
+
endpoint: string;
|
|
72
|
+
method: string;
|
|
73
|
+
requestId: string;
|
|
74
|
+
statusCode: number;
|
|
75
|
+
duration: number;
|
|
76
|
+
timestamp: Date;
|
|
77
|
+
identity?: string | undefined;
|
|
78
|
+
}
|
|
79
|
+
export interface ErrorContext {
|
|
80
|
+
provider: string;
|
|
81
|
+
endpoint: string;
|
|
82
|
+
method: string;
|
|
83
|
+
requestId: string;
|
|
84
|
+
error: MeridianError;
|
|
85
|
+
duration: number;
|
|
86
|
+
timestamp: Date;
|
|
87
|
+
identity?: string | undefined;
|
|
88
|
+
}
|
|
89
|
+
export interface AuthConfig {
|
|
90
|
+
token?: string;
|
|
91
|
+
apiKey?: string;
|
|
92
|
+
apiKeyHeader?: string;
|
|
93
|
+
apiKeyQuery?: string;
|
|
94
|
+
username?: string;
|
|
95
|
+
password?: string;
|
|
96
|
+
clientId?: string;
|
|
97
|
+
clientSecret?: string;
|
|
98
|
+
refreshToken?: string;
|
|
99
|
+
custom?: Record<string, string>;
|
|
100
|
+
}
|
|
101
|
+
export interface AuthToken {
|
|
102
|
+
token: string;
|
|
103
|
+
expiresAt?: Date;
|
|
104
|
+
refreshToken?: string;
|
|
105
|
+
}
|
|
106
|
+
export interface StateStorage {
|
|
107
|
+
get(key: string): Promise<string | null>;
|
|
108
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
109
|
+
del(key: string): Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
export interface RawResponse {
|
|
112
|
+
status: number;
|
|
113
|
+
headers: Headers;
|
|
114
|
+
body: unknown;
|
|
115
|
+
}
|
|
116
|
+
export interface AdapterInput {
|
|
117
|
+
endpoint: string;
|
|
118
|
+
options: RequestOptions;
|
|
119
|
+
authToken: AuthToken;
|
|
120
|
+
baseUrl?: string;
|
|
121
|
+
}
|
|
122
|
+
export interface BuiltRequest {
|
|
123
|
+
url: string;
|
|
124
|
+
method: string;
|
|
125
|
+
headers: Record<string, string>;
|
|
126
|
+
body?: string | undefined;
|
|
127
|
+
}
|
|
128
|
+
export interface ProviderAdapter {
|
|
129
|
+
buildRequest(input: AdapterInput): BuiltRequest;
|
|
130
|
+
parseResponse(raw: RawResponse): NormalizedResponse;
|
|
131
|
+
parseError(raw: unknown): MeridianError;
|
|
132
|
+
authStrategy(config: AuthConfig): Promise<AuthToken>;
|
|
133
|
+
rateLimitPolicy(headers: Headers): RateLimitInfo;
|
|
134
|
+
paginationStrategy(): PaginationStrategy;
|
|
135
|
+
getIdempotencyConfig(): IdempotencyConfig;
|
|
136
|
+
}
|
|
137
|
+
export interface LegacyProviderAdapter {
|
|
138
|
+
authenticate(config: AuthConfig): Promise<AuthToken>;
|
|
139
|
+
makeRequest(endpoint: string, options: RequestOptions, authToken: AuthToken): Promise<RawResponse>;
|
|
140
|
+
normalizeResponse(raw: RawResponse): NormalizedResponse;
|
|
141
|
+
parseRateLimit(headers: Headers): RateLimitInfo;
|
|
142
|
+
parseError(error: unknown): NormalizedError;
|
|
143
|
+
getPaginationStrategy(): PaginationStrategy;
|
|
144
|
+
getIdempotencyConfig(): IdempotencyConfig;
|
|
145
|
+
}
|
|
146
|
+
export declare enum IdempotencyLevel {
|
|
147
|
+
SAFE = "SAFE",
|
|
148
|
+
IDEMPOTENT = "IDEMPOTENT",
|
|
149
|
+
CONDITIONAL = "CONDITIONAL",
|
|
150
|
+
UNSAFE = "UNSAFE"
|
|
151
|
+
}
|
|
152
|
+
export interface IdempotencyConfig {
|
|
153
|
+
defaultSafeOperations: Set<string>;
|
|
154
|
+
operationOverrides: Map<string, IdempotencyLevel>;
|
|
155
|
+
}
|
|
156
|
+
export interface PaginationStrategy {
|
|
157
|
+
extractCursor(response: RawResponse): string | null;
|
|
158
|
+
extractTotal(response: RawResponse): number | null;
|
|
159
|
+
hasNext(response: RawResponse): boolean;
|
|
160
|
+
buildNextRequest(endpoint: string, options: RequestOptions, cursor: string): {
|
|
161
|
+
endpoint: string;
|
|
162
|
+
options: RequestOptions;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export declare enum CircuitState {
|
|
166
|
+
CLOSED = "CLOSED",
|
|
167
|
+
OPEN = "OPEN",
|
|
168
|
+
HALF_OPEN = "HALF_OPEN"
|
|
169
|
+
}
|
|
170
|
+
export interface CircuitBreakerConfig {
|
|
171
|
+
failureThreshold: number;
|
|
172
|
+
successThreshold: number;
|
|
173
|
+
timeout: number;
|
|
174
|
+
volumeThreshold: number;
|
|
175
|
+
rollingWindowMs: number;
|
|
176
|
+
errorThresholdPercentage: number;
|
|
177
|
+
}
|
|
178
|
+
export interface CircuitBreakerStatus {
|
|
179
|
+
state: CircuitState;
|
|
180
|
+
failures: number;
|
|
181
|
+
successes: number;
|
|
182
|
+
lastFailure: Date | null;
|
|
183
|
+
nextAttempt: Date | null;
|
|
184
|
+
}
|
|
185
|
+
export interface RateLimitConfig {
|
|
186
|
+
tokensPerSecond: number;
|
|
187
|
+
maxTokens: number;
|
|
188
|
+
adaptiveBackoff: boolean;
|
|
189
|
+
queueSize?: number;
|
|
190
|
+
}
|
|
191
|
+
export interface RetryConfig {
|
|
192
|
+
maxRetries: number;
|
|
193
|
+
baseDelay: number;
|
|
194
|
+
maxDelay: number;
|
|
195
|
+
jitter: boolean;
|
|
196
|
+
}
|
|
197
|
+
export interface Schema {
|
|
198
|
+
type: string;
|
|
199
|
+
properties?: Record<string, Schema>;
|
|
200
|
+
required?: string[];
|
|
201
|
+
items?: Schema;
|
|
202
|
+
[key: string]: unknown;
|
|
203
|
+
}
|
|
204
|
+
export interface SchemaMetadata {
|
|
205
|
+
provider: string;
|
|
206
|
+
endpoint: string;
|
|
207
|
+
version: string;
|
|
208
|
+
checksum: string;
|
|
209
|
+
createdAt: Date;
|
|
210
|
+
}
|
|
211
|
+
export interface SchemaDrift {
|
|
212
|
+
type: "FIELD_REMOVED" | "TYPE_CHANGED" | "REQUIRED_ADDED" | "REQUIRED_REMOVED";
|
|
213
|
+
field: string;
|
|
214
|
+
oldValue: unknown;
|
|
215
|
+
newValue: unknown;
|
|
216
|
+
severity: "WARNING" | "ERROR";
|
|
217
|
+
}
|
|
218
|
+
export interface SchemaStorage {
|
|
219
|
+
save(provider: string, endpoint: string, schema: Schema, version: string): Promise<void>;
|
|
220
|
+
load(provider: string, endpoint: string): Promise<Schema | null>;
|
|
221
|
+
list(provider: string): Promise<SchemaMetadata[]>;
|
|
222
|
+
}
|
|
223
|
+
export interface Metric {
|
|
224
|
+
name: string;
|
|
225
|
+
value: number;
|
|
226
|
+
tags: Record<string, string>;
|
|
227
|
+
timestamp: Date;
|
|
228
|
+
}
|
|
229
|
+
export interface ObservabilityAdapter {
|
|
230
|
+
logRequest(context: RequestContext): void;
|
|
231
|
+
logResponse(context: ResponseContext): void;
|
|
232
|
+
logError(context: ErrorContext): void;
|
|
233
|
+
logWarning(message: string, metadata?: Record<string, unknown>): void;
|
|
234
|
+
recordMetric(metric: Metric): void;
|
|
235
|
+
}
|
|
236
|
+
export interface ProviderConfig {
|
|
237
|
+
auth: AuthConfig;
|
|
238
|
+
adapter?: ProviderAdapter;
|
|
239
|
+
baseUrl?: string;
|
|
240
|
+
retry?: Partial<RetryConfig>;
|
|
241
|
+
circuitBreaker?: Partial<CircuitBreakerConfig>;
|
|
242
|
+
rateLimit?: Partial<RateLimitConfig>;
|
|
243
|
+
idempotency?: Partial<IdempotencyConfig>;
|
|
244
|
+
}
|
|
245
|
+
export interface MeridianConfig {
|
|
246
|
+
providers?: Record<string, ProviderConfig>;
|
|
247
|
+
defaults?: {
|
|
248
|
+
retry?: Partial<RetryConfig>;
|
|
249
|
+
circuitBreaker?: Partial<CircuitBreakerConfig>;
|
|
250
|
+
rateLimit?: Partial<RateLimitConfig>;
|
|
251
|
+
timeout?: number;
|
|
252
|
+
};
|
|
253
|
+
schemaValidation?: {
|
|
254
|
+
enabled: boolean;
|
|
255
|
+
storage: SchemaStorage;
|
|
256
|
+
onDrift?: (drifts: SchemaDrift[]) => void;
|
|
257
|
+
strictMode?: boolean;
|
|
258
|
+
};
|
|
259
|
+
observability?: ObservabilityAdapter | ObservabilityAdapter[];
|
|
260
|
+
idempotency?: {
|
|
261
|
+
defaultLevel: IdempotencyLevel;
|
|
262
|
+
autoGenerateKeys?: boolean;
|
|
263
|
+
};
|
|
264
|
+
mode?: "local" | "distributed";
|
|
265
|
+
stateStorage?: StateStorage;
|
|
266
|
+
observabilitySanitizer?: {
|
|
267
|
+
redactedKeys?: string[];
|
|
268
|
+
};
|
|
269
|
+
localUnsafe?: boolean;
|
|
270
|
+
compliance?: {
|
|
271
|
+
piiRedaction?: boolean | undefined;
|
|
272
|
+
auditLog?: boolean | undefined;
|
|
273
|
+
};
|
|
274
|
+
[providerName: string]: unknown;
|
|
275
|
+
}
|
|
276
|
+
export declare const SDK_VERSION: string;
|
|
277
|
+
export interface ProviderVersion {
|
|
278
|
+
[provider: string]: string;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|