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,134 @@
|
|
|
1
|
+
import { MeridianError } from "./types.js";
|
|
2
|
+
const SENSITIVE_METADATA_KEYS = [
|
|
3
|
+
"password",
|
|
4
|
+
"secret",
|
|
5
|
+
"token",
|
|
6
|
+
"apiKey",
|
|
7
|
+
"api_key",
|
|
8
|
+
"authorization",
|
|
9
|
+
"cookie",
|
|
10
|
+
"session",
|
|
11
|
+
"credentials",
|
|
12
|
+
"privateKey",
|
|
13
|
+
"private_key",
|
|
14
|
+
"access_token",
|
|
15
|
+
"refresh_token",
|
|
16
|
+
];
|
|
17
|
+
function sanitizeErrorMetadata(metadata) {
|
|
18
|
+
const sanitized = {};
|
|
19
|
+
const lowerSensitiveKeys = SENSITIVE_METADATA_KEYS.map((k) => k.toLowerCase());
|
|
20
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
21
|
+
const lowerKey = key.toLowerCase();
|
|
22
|
+
if (lowerSensitiveKeys.some((sensitiveKey) => lowerKey.includes(sensitiveKey))) {
|
|
23
|
+
sanitized[key] = "[REDACTED]";
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (value && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date)) {
|
|
27
|
+
sanitized[key] = sanitizeErrorMetadata(value);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
sanitized[key] = value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return sanitized;
|
|
34
|
+
}
|
|
35
|
+
const VALID_CATEGORIES = [
|
|
36
|
+
"auth",
|
|
37
|
+
"rate_limit",
|
|
38
|
+
"network",
|
|
39
|
+
"provider",
|
|
40
|
+
"validation",
|
|
41
|
+
];
|
|
42
|
+
function isValidCategory(category) {
|
|
43
|
+
return typeof category === "string" && VALID_CATEGORIES.includes(category);
|
|
44
|
+
}
|
|
45
|
+
function inferCategory(error) {
|
|
46
|
+
if (error && typeof error === "object") {
|
|
47
|
+
const err = error;
|
|
48
|
+
if (typeof err.status === "number") {
|
|
49
|
+
const status = err.status;
|
|
50
|
+
if (status === 401 || status === 403)
|
|
51
|
+
return "auth";
|
|
52
|
+
if (status === 429)
|
|
53
|
+
return "rate_limit";
|
|
54
|
+
if (status >= 500)
|
|
55
|
+
return "provider";
|
|
56
|
+
if (status >= 400)
|
|
57
|
+
return "validation";
|
|
58
|
+
}
|
|
59
|
+
if (typeof err.message === "string") {
|
|
60
|
+
const msg = err.message.toLowerCase();
|
|
61
|
+
if (msg.includes("timeout") || msg.includes("econnreset") || msg.includes("enotfound")) {
|
|
62
|
+
return "network";
|
|
63
|
+
}
|
|
64
|
+
if (msg.includes("unauthorized") || msg.includes("forbidden") || msg.includes("auth")) {
|
|
65
|
+
return "auth";
|
|
66
|
+
}
|
|
67
|
+
if (msg.includes("rate limit") || msg.includes("too many requests")) {
|
|
68
|
+
return "rate_limit";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return "provider";
|
|
73
|
+
}
|
|
74
|
+
function inferRetryable(category, error) {
|
|
75
|
+
if (category === "auth")
|
|
76
|
+
return false;
|
|
77
|
+
if (category === "rate_limit")
|
|
78
|
+
return true;
|
|
79
|
+
if (category === "network")
|
|
80
|
+
return true;
|
|
81
|
+
if (category === "provider") {
|
|
82
|
+
if (error && typeof error === "object" && "retryable" in error) {
|
|
83
|
+
return Boolean(error.retryable);
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
export function sanitizeMeridianError(error, expectedProvider, requestId = "") {
|
|
90
|
+
if (!error) {
|
|
91
|
+
return createFallbackError("Unknown error", expectedProvider, requestId);
|
|
92
|
+
}
|
|
93
|
+
if (typeof error !== "object") {
|
|
94
|
+
return createFallbackError(String(error), expectedProvider, requestId);
|
|
95
|
+
}
|
|
96
|
+
const err = error;
|
|
97
|
+
const message = typeof err.message === "string" && err.message.length > 0
|
|
98
|
+
? err.message
|
|
99
|
+
: "Unknown error";
|
|
100
|
+
const rawCategory = err.category;
|
|
101
|
+
const category = isValidCategory(rawCategory)
|
|
102
|
+
? rawCategory
|
|
103
|
+
: inferCategory(error);
|
|
104
|
+
const rawRetryable = err.retryable;
|
|
105
|
+
const retryable = typeof rawRetryable === "boolean"
|
|
106
|
+
? rawRetryable
|
|
107
|
+
: inferRetryable(category, error);
|
|
108
|
+
const provider = expectedProvider;
|
|
109
|
+
const errorRequestId = typeof err.requestId === "string" && err.requestId.length > 0
|
|
110
|
+
? err.requestId
|
|
111
|
+
: requestId;
|
|
112
|
+
const status = typeof err.status === "number" ? err.status : undefined;
|
|
113
|
+
const rawMetadata = err.metadata;
|
|
114
|
+
const metadata = rawMetadata ? sanitizeErrorMetadata(rawMetadata) : undefined;
|
|
115
|
+
let retryAfter;
|
|
116
|
+
if (err.retryAfter instanceof Date) {
|
|
117
|
+
retryAfter = err.retryAfter;
|
|
118
|
+
}
|
|
119
|
+
else if (typeof err.retryAfter === "number") {
|
|
120
|
+
retryAfter = new Date(Date.now() + err.retryAfter * 1000);
|
|
121
|
+
}
|
|
122
|
+
else if (typeof err.retryAfter === "string") {
|
|
123
|
+
const parsed = Date.parse(err.retryAfter);
|
|
124
|
+
if (!isNaN(parsed)) {
|
|
125
|
+
retryAfter = new Date(parsed);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const sanitized = new MeridianError(message, category, provider, retryable, errorRequestId, metadata, retryAfter, status);
|
|
129
|
+
return sanitized;
|
|
130
|
+
}
|
|
131
|
+
function createFallbackError(message, provider, requestId = "") {
|
|
132
|
+
return new MeridianError(message, "provider", provider, false, requestId);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=error-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-sanitizer.js","sourceRoot":"","sources":["../../src/core/error-sanitizer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAGvE,MAAM,uBAAuB,GAAsB;IACjD,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,eAAe;IACf,QAAQ;IACR,SAAS;IACT,aAAa;IACb,YAAY;IACZ,aAAa;IACb,cAAc;IACd,eAAe;CACP,CAAC;AAGX,SAAS,qBAAqB,CAAC,QAAiC;IAC9D,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAGnC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC/E,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAC9B,SAAS;QACX,CAAC;QAGD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;YAC5F,SAAS,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAgC,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,MAAM,gBAAgB,GAAqC;IACzD,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;IACV,YAAY;CACJ,CAAC;AAIX,SAAS,eAAe,CAAC,QAAiB;IACxC,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAiC,CAAC,CAAC;AACtG,CAAC;AAGD,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAG7C,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,MAAM,CAAC;YACpD,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,YAAY,CAAC;YACxC,IAAI,MAAM,IAAI,GAAG;gBAAE,OAAO,UAAU,CAAC;YACrC,IAAI,MAAM,IAAI,GAAG;gBAAE,OAAO,YAAY,CAAC;QACzC,CAAC;QAGD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtF,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACpE,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAGD,OAAO,UAAU,CAAC;AACpB,CAAC;AAGD,SAAS,cAAc,CAAC,QAA+B,EAAE,KAAc;IAErE,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAGtC,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAG3C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAGxC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAE5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAE,KAAgC,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,OAAO,KAAK,CAAC;AACf,CAAC;AAID,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,gBAAwB,EACxB,YAAoB,EAAE;IAGtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,mBAAmB,CAAC,eAAe,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAGD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAG7C,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACvE,CAAC,CAAC,GAAG,CAAC,OAAO;QACb,CAAC,CAAC,eAAe,CAAC;IAGpB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAA0B,eAAe,CAAC,WAAW,CAAC;QAClE,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAGzB,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC;IACnC,MAAM,SAAS,GAAY,OAAO,YAAY,KAAK,SAAS;QAC1D,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAGpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAGlC,MAAM,cAAc,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAClF,CAAC,CAAC,GAAG,CAAC,SAAS;QACf,CAAC,CAAC,SAAS,CAAC;IAGd,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAMvE,MAAM,WAAW,GAAG,GAAG,CAAC,QAA+C,CAAC;IACxE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAG9E,IAAI,UAA4B,CAAC;IACjC,IAAI,GAAG,CAAC,UAAU,YAAY,IAAI,EAAE,CAAC;QACnC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC9C,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,aAAa,CACjC,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,cAAc,EACd,QAAQ,EACR,UAAU,EACV,MAAM,CACP,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,SAAS,mBAAmB,CAAC,OAAe,EAAE,QAAgB,EAAE,YAAoB,EAAE;IACpF,OAAO,IAAI,aAAa,CACtB,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function parseRetryAfter(header: string | null): Date | null;
|
|
2
|
+
export interface LinkHeader {
|
|
3
|
+
url: string;
|
|
4
|
+
rel: string;
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseLinkHeader(header: string | null): LinkHeader[];
|
|
8
|
+
export declare function findLinkByRel(links: LinkHeader[], rel: string): LinkHeader | null;
|
|
9
|
+
export interface ParsedRateLimit {
|
|
10
|
+
limit: number;
|
|
11
|
+
remaining: number;
|
|
12
|
+
reset: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare function parseRateLimitHeaders(headers: Headers): ParsedRateLimit | null;
|
|
15
|
+
//# sourceMappingURL=header-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-parser.d.ts","sourceRoot":"","sources":["../../src/core/header-parser.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CA0BlE;AAGD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,EAAE,CAkBnE;AA2ED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAEjF;AAGD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,CAAC;CACb;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CA4B9E"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
export function parseRetryAfter(header) {
|
|
2
|
+
if (!header || typeof header !== "string") {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
const trimmed = header.trim();
|
|
6
|
+
const seconds = parseInt(trimmed, 10);
|
|
7
|
+
if (!isNaN(seconds) && seconds >= 0 && seconds <= 86400 * 365) {
|
|
8
|
+
return new Date(Date.now() + seconds * 1000);
|
|
9
|
+
}
|
|
10
|
+
const date = Date.parse(trimmed);
|
|
11
|
+
if (!isNaN(date)) {
|
|
12
|
+
const parsedDate = new Date(date);
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
if (parsedDate.getTime() > now && parsedDate.getTime() < now + 86400 * 365 * 1000) {
|
|
15
|
+
return parsedDate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function parseLinkHeader(header) {
|
|
21
|
+
if (!header || typeof header !== "string") {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const links = [];
|
|
25
|
+
const parts = splitLinkHeader(header);
|
|
26
|
+
for (const part of parts) {
|
|
27
|
+
const link = parseSingleLink(part.trim());
|
|
28
|
+
if (link) {
|
|
29
|
+
links.push(link);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return links;
|
|
33
|
+
}
|
|
34
|
+
function splitLinkHeader(header) {
|
|
35
|
+
const parts = [];
|
|
36
|
+
let current = "";
|
|
37
|
+
let inAngleBrackets = false;
|
|
38
|
+
for (let i = 0; i < header.length; i++) {
|
|
39
|
+
const char = header[i];
|
|
40
|
+
if (char === "<") {
|
|
41
|
+
inAngleBrackets = true;
|
|
42
|
+
current += char;
|
|
43
|
+
}
|
|
44
|
+
else if (char === ">") {
|
|
45
|
+
inAngleBrackets = false;
|
|
46
|
+
current += char;
|
|
47
|
+
}
|
|
48
|
+
else if (char === "," && !inAngleBrackets) {
|
|
49
|
+
parts.push(current.trim());
|
|
50
|
+
current = "";
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
current += char;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (current.trim()) {
|
|
57
|
+
parts.push(current.trim());
|
|
58
|
+
}
|
|
59
|
+
return parts;
|
|
60
|
+
}
|
|
61
|
+
function parseSingleLink(link) {
|
|
62
|
+
const urlMatch = link.match(/^<([^>]+)>/);
|
|
63
|
+
if (!urlMatch || !urlMatch[1]) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const url = urlMatch[1];
|
|
67
|
+
const params = {};
|
|
68
|
+
let rel = "";
|
|
69
|
+
const remaining = link.slice(urlMatch[0].length);
|
|
70
|
+
const paramParts = remaining.split(";");
|
|
71
|
+
for (const paramPart of paramParts) {
|
|
72
|
+
const trimmed = paramPart.trim();
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
continue;
|
|
75
|
+
const match = trimmed.match(/^(\w+)=["']?([^"']+)["']?$/);
|
|
76
|
+
if (match && match[1] && match[2]) {
|
|
77
|
+
const key = match[1].toLowerCase();
|
|
78
|
+
const value = match[2];
|
|
79
|
+
if (key === "rel") {
|
|
80
|
+
rel = value;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
params[key] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!rel) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return { url, rel, params };
|
|
91
|
+
}
|
|
92
|
+
export function findLinkByRel(links, rel) {
|
|
93
|
+
return links.find((link) => link.rel === rel) ?? null;
|
|
94
|
+
}
|
|
95
|
+
export function parseRateLimitHeaders(headers) {
|
|
96
|
+
let limit = parseIntHeader(headers.get("X-RateLimit-Limit"));
|
|
97
|
+
let remaining = parseIntHeader(headers.get("X-RateLimit-Remaining"));
|
|
98
|
+
let reset = parseResetHeader(headers.get("X-RateLimit-Reset"));
|
|
99
|
+
if (limit === null) {
|
|
100
|
+
limit = parseIntHeader(headers.get("RateLimit-Limit"));
|
|
101
|
+
}
|
|
102
|
+
if (remaining === null) {
|
|
103
|
+
remaining = parseIntHeader(headers.get("RateLimit-Remaining"));
|
|
104
|
+
}
|
|
105
|
+
if (reset === null) {
|
|
106
|
+
reset = parseResetHeader(headers.get("RateLimit-Reset"));
|
|
107
|
+
}
|
|
108
|
+
if (limit === null || remaining === null || reset === null) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (limit < 0 || remaining < 0 || remaining > limit) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return { limit, remaining, reset };
|
|
115
|
+
}
|
|
116
|
+
function parseIntHeader(value) {
|
|
117
|
+
if (!value || typeof value !== "string") {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const parsed = parseInt(value.trim(), 10);
|
|
121
|
+
if (isNaN(parsed) || parsed < 0 || parsed > Number.MAX_SAFE_INTEGER) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return parsed;
|
|
125
|
+
}
|
|
126
|
+
function parseResetHeader(value) {
|
|
127
|
+
if (!value || typeof value !== "string") {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const trimmed = value.trim();
|
|
131
|
+
const timestamp = parseInt(trimmed, 10);
|
|
132
|
+
if (!isNaN(timestamp) && timestamp > 0) {
|
|
133
|
+
const now = Math.floor(Date.now() / 1000);
|
|
134
|
+
if (timestamp >= now - 60 && timestamp < now + 86400 * 365) {
|
|
135
|
+
return new Date(timestamp * 1000);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const date = Date.parse(trimmed);
|
|
139
|
+
if (!isNaN(date)) {
|
|
140
|
+
const parsedDate = new Date(date);
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
if (parsedDate.getTime() >= now - 60000 && parsedDate.getTime() < now + 86400 * 365 * 1000) {
|
|
143
|
+
return parsedDate;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=header-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-parser.js","sourceRoot":"","sources":["../../src/core/header-parser.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAG9B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAE9D,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAGD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAUD,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAG/B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAGD,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAExB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,eAAe,GAAG,KAAK,CAAC;YACxB,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAGD,SAAS,eAAe,CAAC,IAAY;IAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,GAAG,GAAG,EAAE,CAAC;IAGb,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,SAAS;QAGvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC1D,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEvB,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAClB,GAAG,GAAG,KAAK,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAGD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,KAAmB,EAAE,GAAW;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AASD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAEpD,IAAI,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7D,IAAI,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAG/D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAGD,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAGD,SAAS,cAAc,CAAC,KAAoB;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,SAAS,gBAAgB,CAAC,KAAoB;IAC5C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAG7B,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS,IAAI,GAAG,GAAG,EAAE,IAAI,SAAS,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC;YAC3D,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAGD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,GAAG,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;YAC3F,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NormalizedResponse, RawResponse, RateLimitInfo, PaginationInfo } from "./types.js";
|
|
2
|
+
export declare class ResponseNormalizer {
|
|
3
|
+
static normalize<T>(raw: RawResponse, provider: string, rateLimitInfo: RateLimitInfo, paginationInfo?: PaginationInfo, warnings?: string[], schemaVersion?: string): NormalizedResponse<T>;
|
|
4
|
+
static extractPaginationInfo(raw: RawResponse, paginationStrategy: {
|
|
5
|
+
hasNext: (response: RawResponse) => boolean;
|
|
6
|
+
extractCursor: (response: RawResponse) => string | null;
|
|
7
|
+
extractTotal: (response: RawResponse) => number | null;
|
|
8
|
+
}): PaginationInfo | undefined;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/core/normalizer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAElB,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,EAChB,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,QAAQ,GAAE,MAAM,EAAO,EACvB,aAAa,GAAE,MAAgB,GAC9B,kBAAkB,CAAC,CAAC,CAAC;IAqBxB,MAAM,CAAC,qBAAqB,CAC1B,GAAG,EAAE,WAAW,EAChB,kBAAkB,EAAE;QAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,OAAO,CAAC;QAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,CAAA;KAAE,GACnL,cAAc,GAAG,SAAS;CAoB9B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
export class ResponseNormalizer {
|
|
3
|
+
static normalize(raw, provider, rateLimitInfo, paginationInfo, warnings = [], schemaVersion = "1.0.0") {
|
|
4
|
+
const requestId = randomUUID();
|
|
5
|
+
const meta = {
|
|
6
|
+
provider,
|
|
7
|
+
requestId,
|
|
8
|
+
rateLimit: rateLimitInfo,
|
|
9
|
+
warnings,
|
|
10
|
+
schemaVersion,
|
|
11
|
+
};
|
|
12
|
+
if (paginationInfo) {
|
|
13
|
+
meta.pagination = paginationInfo;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
data: raw.body,
|
|
17
|
+
meta,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
static extractPaginationInfo(raw, paginationStrategy) {
|
|
21
|
+
const hasNext = paginationStrategy.hasNext(raw);
|
|
22
|
+
if (!hasNext) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const cursor = paginationStrategy.extractCursor(raw);
|
|
26
|
+
const total = paginationStrategy.extractTotal(raw);
|
|
27
|
+
const pagination = {
|
|
28
|
+
hasNext,
|
|
29
|
+
};
|
|
30
|
+
if (cursor !== null) {
|
|
31
|
+
pagination.cursor = cursor;
|
|
32
|
+
}
|
|
33
|
+
if (total !== null) {
|
|
34
|
+
pagination.total = total;
|
|
35
|
+
}
|
|
36
|
+
return pagination;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../src/core/normalizer.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAC,SAAS,CACd,GAAgB,EAChB,QAAgB,EAChB,aAA4B,EAC5B,cAA+B,EAC/B,WAAqB,EAAE,EACvB,gBAAwB,OAAO;QAE/B,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAiB;YACzB,QAAQ;YACR,SAAS;YACT,SAAS,EAAE,aAAa;YACxB,QAAQ;YACR,aAAa;SACd,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC;QACnC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAS;YACnB,IAAI;SACL,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,qBAAqB,CAC1B,GAAgB,EAChB,kBAAoL;QAEpL,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEnD,MAAM,UAAU,GAAmB;YACjC,OAAO;SACR,CAAC;QACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Metric } from "./types.js";
|
|
2
|
+
export interface ObservabilitySanitizerOptions {
|
|
3
|
+
redactedKeys?: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function sanitizeObject(obj: unknown, opts?: ObservabilitySanitizerOptions): unknown;
|
|
6
|
+
export declare function sanitizeMetric(metric: Metric, opts?: ObservabilitySanitizerOptions): Metric;
|
|
7
|
+
//# sourceMappingURL=observability-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability-sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/observability-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,6BAA6B;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAgBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,6BAA6B,GAAG,OAAO,CAsB1F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,6BAA6B,GAAG,MAAM,CAW3F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const DEFAULT = [
|
|
2
|
+
"authorization",
|
|
3
|
+
"cookie",
|
|
4
|
+
"token",
|
|
5
|
+
"apikey",
|
|
6
|
+
"api_key",
|
|
7
|
+
"body",
|
|
8
|
+
];
|
|
9
|
+
function shouldRedact(key, redacted) {
|
|
10
|
+
const lower = key.toLowerCase();
|
|
11
|
+
return redacted.some(r => lower.includes(r));
|
|
12
|
+
}
|
|
13
|
+
export function sanitizeObject(obj, opts) {
|
|
14
|
+
const redacted = (opts?.redactedKeys ?? DEFAULT).map(s => s.toLowerCase());
|
|
15
|
+
if (obj === null || obj === undefined)
|
|
16
|
+
return obj;
|
|
17
|
+
if (typeof obj === "string")
|
|
18
|
+
return obj;
|
|
19
|
+
if (typeof obj !== "object")
|
|
20
|
+
return obj;
|
|
21
|
+
if (Array.isArray(obj)) {
|
|
22
|
+
return obj.map(v => sanitizeObject(v, opts));
|
|
23
|
+
}
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
26
|
+
if (shouldRedact(k, redacted)) {
|
|
27
|
+
out[k] = "[REDACTED]";
|
|
28
|
+
}
|
|
29
|
+
else if (v && typeof v === "object") {
|
|
30
|
+
out[k] = sanitizeObject(v, opts);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
out[k] = v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
export function sanitizeMetric(metric, opts) {
|
|
39
|
+
const redacted = (opts?.redactedKeys ?? DEFAULT).map(s => s.toLowerCase());
|
|
40
|
+
const tags = {};
|
|
41
|
+
for (const [k, v] of Object.entries(metric.tags)) {
|
|
42
|
+
if (shouldRedact(k, redacted) || shouldRedact(v, redacted)) {
|
|
43
|
+
tags[k] = "[REDACTED]";
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
tags[k] = v;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { ...metric, tags };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=observability-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability-sanitizer.js","sourceRoot":"","sources":["../../src/core/observability-sanitizer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,GAAG;IACd,eAAe;IACf,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;CACP,CAAC;AAEF,SAAS,YAAY,CAAC,GAAW,EAAE,QAAkB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY,EAAE,IAAoC;IAC/E,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE3E,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QACpE,IAAI,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;QACxB,CAAC;aAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACtC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAoC;IACjF,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ProviderAdapter, RequestOptions, NormalizedResponse, ObservabilityAdapter } from "./types.js";
|
|
2
|
+
import { ProviderCircuitBreaker } from "../strategies/circuit-breaker.js";
|
|
3
|
+
import { RateLimiter } from "../strategies/rate-limit.js";
|
|
4
|
+
import { RetryStrategy } from "../strategies/retry.js";
|
|
5
|
+
import { IdempotencyResolver } from "../strategies/idempotency.js";
|
|
6
|
+
import type { AuthConfig } from "./types.js";
|
|
7
|
+
export interface PipelineConfig {
|
|
8
|
+
provider: string;
|
|
9
|
+
adapter: ProviderAdapter;
|
|
10
|
+
authConfig: AuthConfig;
|
|
11
|
+
circuitBreaker: ProviderCircuitBreaker;
|
|
12
|
+
rateLimiter: RateLimiter;
|
|
13
|
+
retryStrategy: RetryStrategy;
|
|
14
|
+
idempotencyResolver: IdempotencyResolver;
|
|
15
|
+
observability: ObservabilityAdapter[];
|
|
16
|
+
timeout: number | undefined;
|
|
17
|
+
autoGenerateIdempotencyKeys?: boolean;
|
|
18
|
+
sanitizerOptions?: {
|
|
19
|
+
redactedKeys?: string[];
|
|
20
|
+
piiRedaction?: boolean | undefined;
|
|
21
|
+
} | undefined;
|
|
22
|
+
compliance?: {
|
|
23
|
+
piiRedaction?: boolean | undefined;
|
|
24
|
+
auditLog?: boolean | undefined;
|
|
25
|
+
} | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare class RequestPipeline {
|
|
28
|
+
private config;
|
|
29
|
+
constructor(config: PipelineConfig);
|
|
30
|
+
private safelyBroadcastObservability;
|
|
31
|
+
execute<T>(endpoint: string, options?: RequestOptions): Promise<NormalizedResponse<T>>;
|
|
32
|
+
private executeHttpRequest;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EAKrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAMnE,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,sBAAsB,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,gBAAgB,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAC/F,UAAU,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;CACjG;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAKlC,OAAO,CAAC,4BAA4B;IAiC9B,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YA8NnB,kBAAkB;CAwFjC"}
|