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.
Files changed (152) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/LICENSE.md +22 -0
  3. package/README.md +126 -0
  4. package/dist/core/adapter-validator.d.ts +10 -0
  5. package/dist/core/adapter-validator.d.ts.map +1 -0
  6. package/dist/core/adapter-validator.js +270 -0
  7. package/dist/core/adapter-validator.js.map +1 -0
  8. package/dist/core/error-sanitizer.d.ts +3 -0
  9. package/dist/core/error-sanitizer.d.ts.map +1 -0
  10. package/dist/core/error-sanitizer.js +134 -0
  11. package/dist/core/error-sanitizer.js.map +1 -0
  12. package/dist/core/header-parser.d.ts +15 -0
  13. package/dist/core/header-parser.d.ts.map +1 -0
  14. package/dist/core/header-parser.js +148 -0
  15. package/dist/core/header-parser.js.map +1 -0
  16. package/dist/core/normalizer.d.ts +10 -0
  17. package/dist/core/normalizer.d.ts.map +1 -0
  18. package/dist/core/normalizer.js +39 -0
  19. package/dist/core/normalizer.js.map +1 -0
  20. package/dist/core/observability-sanitizer.d.ts +7 -0
  21. package/dist/core/observability-sanitizer.d.ts.map +1 -0
  22. package/dist/core/observability-sanitizer.js +51 -0
  23. package/dist/core/observability-sanitizer.js.map +1 -0
  24. package/dist/core/pipeline.d.ts +34 -0
  25. package/dist/core/pipeline.d.ts.map +1 -0
  26. package/dist/core/pipeline.js +216 -0
  27. package/dist/core/pipeline.js.map +1 -0
  28. package/dist/core/request-sanitizer.d.ts +7 -0
  29. package/dist/core/request-sanitizer.d.ts.map +1 -0
  30. package/dist/core/request-sanitizer.js +90 -0
  31. package/dist/core/request-sanitizer.js.map +1 -0
  32. package/dist/core/types.d.ts +280 -0
  33. package/dist/core/types.d.ts.map +1 -0
  34. package/dist/core/types.js +92 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/index.d.ts +39 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +341 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/observability/adapter.d.ts +2 -0
  41. package/dist/observability/adapter.d.ts.map +1 -0
  42. package/dist/observability/adapter.js +2 -0
  43. package/dist/observability/adapter.js.map +1 -0
  44. package/dist/observability/console.d.ts +15 -0
  45. package/dist/observability/console.d.ts.map +1 -0
  46. package/dist/observability/console.js +81 -0
  47. package/dist/observability/console.js.map +1 -0
  48. package/dist/observability/index.d.ts +6 -0
  49. package/dist/observability/index.d.ts.map +1 -0
  50. package/dist/observability/index.js +6 -0
  51. package/dist/observability/index.js.map +1 -0
  52. package/dist/observability/noop.d.ts +9 -0
  53. package/dist/observability/noop.d.ts.map +1 -0
  54. package/dist/observability/noop.js +13 -0
  55. package/dist/observability/noop.js.map +1 -0
  56. package/dist/observability/otel.d.ts +51 -0
  57. package/dist/observability/otel.d.ts.map +1 -0
  58. package/dist/observability/otel.js +93 -0
  59. package/dist/observability/otel.js.map +1 -0
  60. package/dist/observability/prometheus.d.ts +29 -0
  61. package/dist/observability/prometheus.d.ts.map +1 -0
  62. package/dist/observability/prometheus.js +194 -0
  63. package/dist/observability/prometheus.js.map +1 -0
  64. package/dist/providers/anthropic/adapter.d.ts +17 -0
  65. package/dist/providers/anthropic/adapter.d.ts.map +1 -0
  66. package/dist/providers/anthropic/adapter.js +151 -0
  67. package/dist/providers/anthropic/adapter.js.map +1 -0
  68. package/dist/providers/anthropic/index.d.ts +3 -0
  69. package/dist/providers/anthropic/index.d.ts.map +1 -0
  70. package/dist/providers/anthropic/index.js +3 -0
  71. package/dist/providers/anthropic/index.js.map +1 -0
  72. package/dist/providers/anthropic/pagination.d.ts +11 -0
  73. package/dist/providers/anthropic/pagination.d.ts.map +1 -0
  74. package/dist/providers/anthropic/pagination.js +36 -0
  75. package/dist/providers/anthropic/pagination.js.map +1 -0
  76. package/dist/providers/github/adapter.d.ts +18 -0
  77. package/dist/providers/github/adapter.d.ts.map +1 -0
  78. package/dist/providers/github/adapter.js +232 -0
  79. package/dist/providers/github/adapter.js.map +1 -0
  80. package/dist/providers/github/index.d.ts +3 -0
  81. package/dist/providers/github/index.d.ts.map +1 -0
  82. package/dist/providers/github/index.js +3 -0
  83. package/dist/providers/github/index.js.map +1 -0
  84. package/dist/providers/github/pagination.d.ts +11 -0
  85. package/dist/providers/github/pagination.d.ts.map +1 -0
  86. package/dist/providers/github/pagination.js +53 -0
  87. package/dist/providers/github/pagination.js.map +1 -0
  88. package/dist/providers/openai/adapter.d.ts +17 -0
  89. package/dist/providers/openai/adapter.d.ts.map +1 -0
  90. package/dist/providers/openai/adapter.js +178 -0
  91. package/dist/providers/openai/adapter.js.map +1 -0
  92. package/dist/providers/openai/index.d.ts +3 -0
  93. package/dist/providers/openai/index.d.ts.map +1 -0
  94. package/dist/providers/openai/index.js +3 -0
  95. package/dist/providers/openai/index.js.map +1 -0
  96. package/dist/providers/openai/pagination.d.ts +11 -0
  97. package/dist/providers/openai/pagination.d.ts.map +1 -0
  98. package/dist/providers/openai/pagination.js +35 -0
  99. package/dist/providers/openai/pagination.js.map +1 -0
  100. package/dist/providers/stripe/adapter.d.ts +17 -0
  101. package/dist/providers/stripe/adapter.d.ts.map +1 -0
  102. package/dist/providers/stripe/adapter.js +177 -0
  103. package/dist/providers/stripe/adapter.js.map +1 -0
  104. package/dist/providers/stripe/index.d.ts +3 -0
  105. package/dist/providers/stripe/index.d.ts.map +1 -0
  106. package/dist/providers/stripe/index.js +3 -0
  107. package/dist/providers/stripe/index.js.map +1 -0
  108. package/dist/providers/stripe/pagination.d.ts +11 -0
  109. package/dist/providers/stripe/pagination.d.ts.map +1 -0
  110. package/dist/providers/stripe/pagination.js +44 -0
  111. package/dist/providers/stripe/pagination.js.map +1 -0
  112. package/dist/public.d.ts +27 -0
  113. package/dist/public.d.ts.map +1 -0
  114. package/dist/public.js +23 -0
  115. package/dist/public.js.map +1 -0
  116. package/dist/strategies/circuit-breaker.d.ts +22 -0
  117. package/dist/strategies/circuit-breaker.d.ts.map +1 -0
  118. package/dist/strategies/circuit-breaker.js +124 -0
  119. package/dist/strategies/circuit-breaker.js.map +1 -0
  120. package/dist/strategies/idempotency.d.ts +11 -0
  121. package/dist/strategies/idempotency.d.ts.map +1 -0
  122. package/dist/strategies/idempotency.js +55 -0
  123. package/dist/strategies/idempotency.js.map +1 -0
  124. package/dist/strategies/index.d.ts +6 -0
  125. package/dist/strategies/index.d.ts.map +1 -0
  126. package/dist/strategies/index.js +6 -0
  127. package/dist/strategies/index.js.map +1 -0
  128. package/dist/strategies/pagination.d.ts +29 -0
  129. package/dist/strategies/pagination.d.ts.map +1 -0
  130. package/dist/strategies/pagination.js +130 -0
  131. package/dist/strategies/pagination.js.map +1 -0
  132. package/dist/strategies/rate-limit.d.ts +16 -0
  133. package/dist/strategies/rate-limit.d.ts.map +1 -0
  134. package/dist/strategies/rate-limit.js +94 -0
  135. package/dist/strategies/rate-limit.js.map +1 -0
  136. package/dist/strategies/retry.d.ts +13 -0
  137. package/dist/strategies/retry.d.ts.map +1 -0
  138. package/dist/strategies/retry.js +62 -0
  139. package/dist/strategies/retry.js.map +1 -0
  140. package/dist/validation/drift-detector.d.ts +5 -0
  141. package/dist/validation/drift-detector.d.ts.map +1 -0
  142. package/dist/validation/drift-detector.js +79 -0
  143. package/dist/validation/drift-detector.js.map +1 -0
  144. package/dist/validation/index.d.ts +3 -0
  145. package/dist/validation/index.d.ts.map +1 -0
  146. package/dist/validation/index.js +3 -0
  147. package/dist/validation/index.js.map +1 -0
  148. package/dist/validation/schema-storage.d.ts +19 -0
  149. package/dist/validation/schema-storage.d.ts.map +1 -0
  150. package/dist/validation/schema-storage.js +131 -0
  151. package/dist/validation/schema-storage.js.map +1 -0
  152. 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":"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"}
@@ -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":"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"}
@@ -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"}