meridianjs 0.2.4 → 0.2.7

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 (120) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +155 -530
  3. package/dist/analytics/collector.d.ts +16 -0
  4. package/dist/analytics/collector.d.ts.map +1 -1
  5. package/dist/analytics/collector.js +20 -0
  6. package/dist/analytics/collector.js.map +1 -1
  7. package/dist/capabilities/registry.d.ts.map +1 -1
  8. package/dist/capabilities/registry.js +7 -0
  9. package/dist/capabilities/registry.js.map +1 -1
  10. package/dist/core/pipeline.d.ts.map +1 -1
  11. package/dist/core/pipeline.js +18 -1
  12. package/dist/core/pipeline.js.map +1 -1
  13. package/dist/core/types.d.ts +9 -4
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/core/types.js +1 -1
  16. package/dist/core/types.js.map +1 -1
  17. package/dist/generator/index.d.ts +2 -0
  18. package/dist/generator/index.d.ts.map +1 -1
  19. package/dist/generator/index.js +2 -1
  20. package/dist/generator/index.js.map +1 -1
  21. package/dist/generator/openapi-export.d.ts +51 -0
  22. package/dist/generator/openapi-export.d.ts.map +1 -0
  23. package/dist/generator/openapi-export.js +95 -0
  24. package/dist/generator/openapi-export.js.map +1 -0
  25. package/dist/generator/templates.d.ts.map +1 -1
  26. package/dist/generator/templates.js +89 -18
  27. package/dist/generator/templates.js.map +1 -1
  28. package/dist/index.d.ts +7 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +15 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/policies/builtin.d.ts +16 -0
  33. package/dist/policies/builtin.d.ts.map +1 -1
  34. package/dist/policies/builtin.js +92 -0
  35. package/dist/policies/builtin.js.map +1 -1
  36. package/dist/policies/index.d.ts +1 -1
  37. package/dist/policies/index.d.ts.map +1 -1
  38. package/dist/policies/index.js +1 -1
  39. package/dist/policies/index.js.map +1 -1
  40. package/dist/providers/billdesk/adapter.d.ts +36 -0
  41. package/dist/providers/billdesk/adapter.d.ts.map +1 -0
  42. package/dist/providers/billdesk/adapter.js +212 -0
  43. package/dist/providers/billdesk/adapter.js.map +1 -0
  44. package/dist/providers/billdesk/index.d.ts +3 -0
  45. package/dist/providers/billdesk/index.d.ts.map +1 -0
  46. package/dist/providers/billdesk/index.js +3 -0
  47. package/dist/providers/billdesk/index.js.map +1 -0
  48. package/dist/providers/billdesk/pagination.d.ts +15 -0
  49. package/dist/providers/billdesk/pagination.d.ts.map +1 -0
  50. package/dist/providers/billdesk/pagination.js +51 -0
  51. package/dist/providers/billdesk/pagination.js.map +1 -0
  52. package/dist/providers/ccavenue/adapter.d.ts +38 -0
  53. package/dist/providers/ccavenue/adapter.d.ts.map +1 -0
  54. package/dist/providers/ccavenue/adapter.js +181 -0
  55. package/dist/providers/ccavenue/adapter.js.map +1 -0
  56. package/dist/providers/ccavenue/index.d.ts +3 -0
  57. package/dist/providers/ccavenue/index.d.ts.map +1 -0
  58. package/dist/providers/ccavenue/index.js +3 -0
  59. package/dist/providers/ccavenue/index.js.map +1 -0
  60. package/dist/providers/ccavenue/pagination.d.ts +16 -0
  61. package/dist/providers/ccavenue/pagination.d.ts.map +1 -0
  62. package/dist/providers/ccavenue/pagination.js +20 -0
  63. package/dist/providers/ccavenue/pagination.js.map +1 -0
  64. package/dist/providers/datadog/adapter.d.ts +30 -0
  65. package/dist/providers/datadog/adapter.d.ts.map +1 -0
  66. package/dist/providers/datadog/adapter.js +163 -0
  67. package/dist/providers/datadog/adapter.js.map +1 -0
  68. package/dist/providers/datadog/index.d.ts +3 -0
  69. package/dist/providers/datadog/index.d.ts.map +1 -0
  70. package/dist/providers/datadog/index.js +3 -0
  71. package/dist/providers/datadog/index.js.map +1 -0
  72. package/dist/providers/datadog/pagination.d.ts +16 -0
  73. package/dist/providers/datadog/pagination.d.ts.map +1 -0
  74. package/dist/providers/datadog/pagination.js +41 -0
  75. package/dist/providers/datadog/pagination.js.map +1 -0
  76. package/dist/providers/s3/adapter.d.ts +37 -0
  77. package/dist/providers/s3/adapter.d.ts.map +1 -0
  78. package/dist/providers/s3/adapter.js +206 -0
  79. package/dist/providers/s3/adapter.js.map +1 -0
  80. package/dist/providers/s3/index.d.ts +4 -0
  81. package/dist/providers/s3/index.d.ts.map +1 -0
  82. package/dist/providers/s3/index.js +4 -0
  83. package/dist/providers/s3/index.js.map +1 -0
  84. package/dist/providers/s3/pagination.d.ts +18 -0
  85. package/dist/providers/s3/pagination.d.ts.map +1 -0
  86. package/dist/providers/s3/pagination.js +58 -0
  87. package/dist/providers/s3/pagination.js.map +1 -0
  88. package/dist/providers/s3/sigv4.d.ts +29 -0
  89. package/dist/providers/s3/sigv4.d.ts.map +1 -0
  90. package/dist/providers/s3/sigv4.js +101 -0
  91. package/dist/providers/s3/sigv4.js.map +1 -0
  92. package/dist/providers/sentry/adapter.d.ts +29 -0
  93. package/dist/providers/sentry/adapter.d.ts.map +1 -0
  94. package/dist/providers/sentry/adapter.js +154 -0
  95. package/dist/providers/sentry/adapter.js.map +1 -0
  96. package/dist/providers/sentry/index.d.ts +3 -0
  97. package/dist/providers/sentry/index.d.ts.map +1 -0
  98. package/dist/providers/sentry/index.js +3 -0
  99. package/dist/providers/sentry/index.js.map +1 -0
  100. package/dist/providers/sentry/pagination.d.ts +17 -0
  101. package/dist/providers/sentry/pagination.d.ts.map +1 -0
  102. package/dist/providers/sentry/pagination.js +54 -0
  103. package/dist/providers/sentry/pagination.js.map +1 -0
  104. package/dist/public.d.ts +14 -2
  105. package/dist/public.d.ts.map +1 -1
  106. package/dist/public.js +10 -2
  107. package/dist/public.js.map +1 -1
  108. package/dist/schema/monitor.d.ts +14 -1
  109. package/dist/schema/monitor.d.ts.map +1 -1
  110. package/dist/schema/monitor.js +24 -0
  111. package/dist/schema/monitor.js.map +1 -1
  112. package/dist/services/service-client.d.ts +8 -1
  113. package/dist/services/service-client.d.ts.map +1 -1
  114. package/dist/services/service-client.js +87 -0
  115. package/dist/services/service-client.js.map +1 -1
  116. package/dist/upi/index.d.ts +43 -0
  117. package/dist/upi/index.d.ts.map +1 -0
  118. package/dist/upi/index.js +57 -0
  119. package/dist/upi/index.js.map +1 -0
  120. package/package.json +9 -2
@@ -0,0 +1,30 @@
1
+ import type { AdapterInput, AuthConfig, AuthToken, BuiltRequest, IdempotencyConfig, NormalizedResponse, PaginationStrategy, ProviderAdapter, RateLimitInfo, RawResponse } from "../../core/types.js";
2
+ import { MeridianError } from "../../core/types.js";
3
+ /**
4
+ * Datadog's API authenticates every request with a pair of headers —
5
+ * `DD-API-KEY` (account-level) and `DD-APPLICATION-KEY` (user-level, required
6
+ * for most read endpoints) — rather than a bearer token. Rate limits surface
7
+ * via `X-RateLimit-Limit` / `-Remaining` / `-Reset` / `-Period` headers, and
8
+ * v2 search APIs paginate with a `meta.page.after` cursor.
9
+ */
10
+ export declare class DatadogAdapter implements ProviderAdapter {
11
+ private baseUrl;
12
+ constructor(baseUrl?: string);
13
+ buildRequest(input: AdapterInput): BuiltRequest;
14
+ parseResponse(raw: RawResponse): NormalizedResponse;
15
+ parseError(raw: unknown): MeridianError;
16
+ private parseHttpError;
17
+ authStrategy(config: AuthConfig): Promise<AuthToken>;
18
+ rateLimitPolicy(headers: Headers): RateLimitInfo;
19
+ paginationStrategy(): PaginationStrategy;
20
+ getIdempotencyConfig(): IdempotencyConfig;
21
+ /**
22
+ * Verifies a Datadog webhook signature: an HMAC-SHA256 digest of the raw
23
+ * request body, hex-encoded, sent in the `X-Datadog-Signature` header and
24
+ * keyed by the webhook's shared secret.
25
+ */
26
+ verifyWebhook(payload: string | Buffer, signature: string, secret: string): boolean;
27
+ private createMeridianError;
28
+ private extractRetryAfter;
29
+ }
30
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/datadog/adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAyB,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAOxF;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAmC;IAItD,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY;IAkC/C,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;IAOnD,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa;IAkCvC,OAAO,CAAC,cAAc;IAkGhB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAmB1D,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa;IAchD,kBAAkB,IAAI,kBAAkB;IAIxC,oBAAoB,IAAI,iBAAiB;IAOzC;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAYnF,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,iBAAiB;CAY1B"}
@@ -0,0 +1,163 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ import { parseRetryAfter } from "../../core/header-parser.js";
3
+ import { ResponseNormalizer } from "../../core/normalizer.js";
4
+ import { MeridianError, SDK_VERSION } from "../../core/types.js";
5
+ import { DatadogPaginationStrategy } from "./pagination.js";
6
+ /**
7
+ * Datadog's API authenticates every request with a pair of headers —
8
+ * `DD-API-KEY` (account-level) and `DD-APPLICATION-KEY` (user-level, required
9
+ * for most read endpoints) — rather than a bearer token. Rate limits surface
10
+ * via `X-RateLimit-Limit` / `-Remaining` / `-Reset` / `-Period` headers, and
11
+ * v2 search APIs paginate with a `meta.page.after` cursor.
12
+ */
13
+ export class DatadogAdapter {
14
+ baseUrl;
15
+ constructor(baseUrl = "https://api.datadoghq.com/api/") {
16
+ this.baseUrl = baseUrl;
17
+ }
18
+ buildRequest(input) {
19
+ const { endpoint, options, authToken, baseUrl } = input;
20
+ const effectiveBaseUrl = baseUrl ?? this.baseUrl;
21
+ const url = new URL(endpoint.replace(/^\//, ""), effectiveBaseUrl);
22
+ if (options.query) {
23
+ for (const [key, value] of Object.entries(options.query)) {
24
+ url.searchParams.set(key, String(value));
25
+ }
26
+ }
27
+ const [apiKey, appKey] = authToken.token.split("|DD|");
28
+ const headers = {
29
+ "User-Agent": `Meridian-SDK/${SDK_VERSION}`,
30
+ ...options.headers,
31
+ };
32
+ if (apiKey)
33
+ headers["DD-API-KEY"] = apiKey;
34
+ if (appKey)
35
+ headers["DD-APPLICATION-KEY"] = appKey;
36
+ let body;
37
+ const method = options.method ?? "GET";
38
+ if (options.body && method !== "GET" && method !== "HEAD") {
39
+ body = JSON.stringify(options.body);
40
+ headers["Content-Type"] = "application/json";
41
+ }
42
+ const built = { url: url.toString(), method, headers };
43
+ if (body !== undefined) {
44
+ built.body = body;
45
+ }
46
+ return built;
47
+ }
48
+ parseResponse(raw) {
49
+ const rateLimitInfo = this.rateLimitPolicy(raw.headers);
50
+ const paginationStrategy = this.paginationStrategy();
51
+ const paginationInfo = ResponseNormalizer.extractPaginationInfo(raw, paginationStrategy);
52
+ return ResponseNormalizer.normalize(raw, "datadog", rateLimitInfo, paginationInfo, [], "1.0.0");
53
+ }
54
+ parseError(raw) {
55
+ if (raw instanceof Error) {
56
+ const msg = raw.message.toLowerCase();
57
+ if (msg.includes("fetch") ||
58
+ msg.includes("network") ||
59
+ msg.includes("econnreset") ||
60
+ msg.includes("etimedout") ||
61
+ msg.includes("enotfound") ||
62
+ msg.includes("timeout")) {
63
+ return this.createMeridianError("network", true, "Network request failed. Check your connection and try again.", { originalError: raw.message });
64
+ }
65
+ }
66
+ if (typeof raw === "object" &&
67
+ raw !== null &&
68
+ "status" in raw &&
69
+ typeof raw.status === "number") {
70
+ return this.parseHttpError(raw);
71
+ }
72
+ return this.createMeridianError("provider", false, "An unexpected error occurred", { raw });
73
+ }
74
+ parseHttpError(error) {
75
+ const { status, body, headers } = error;
76
+ const errorBody = body;
77
+ const errorMessage = errorBody?.errors?.join("; ");
78
+ if (status === 401) {
79
+ return this.createMeridianError("auth", false, errorMessage ?? "Authentication failed. Check your Datadog API key.", { datadogErrors: errorBody?.errors }, undefined, 401);
80
+ }
81
+ if (status === 403) {
82
+ return this.createMeridianError("auth", false, errorMessage ??
83
+ "Permission denied. Check that your Application key has the required scopes.", { datadogErrors: errorBody?.errors }, undefined, 403);
84
+ }
85
+ if (status === 404) {
86
+ return this.createMeridianError("validation", false, errorMessage ?? "Resource not found.", { datadogErrors: errorBody?.errors }, undefined, 404);
87
+ }
88
+ if (status === 429) {
89
+ const retryAfter = this.extractRetryAfter(headers);
90
+ return this.createMeridianError("rate_limit", true, errorMessage ?? "Rate limit exceeded. Please wait before retrying.", { retryAfter: retryAfter?.toISOString() }, retryAfter, 429);
91
+ }
92
+ if (status === 400 || status === 422) {
93
+ return this.createMeridianError("validation", false, errorMessage ?? "Request validation failed.", { datadogErrors: errorBody?.errors }, undefined, status);
94
+ }
95
+ if (status >= 500) {
96
+ return this.createMeridianError("provider", true, errorMessage ?? `Datadog API returned error ${status}. This may be temporary.`, { status }, undefined, status);
97
+ }
98
+ if (status >= 400) {
99
+ return this.createMeridianError("validation", false, errorMessage ?? `Request failed with status ${status}.`, { status }, undefined, status);
100
+ }
101
+ return this.createMeridianError("provider", false, `Unexpected response status ${status}.`, { status }, undefined, status);
102
+ }
103
+ async authStrategy(config) {
104
+ const apiKey = config.apiKey ?? config.username;
105
+ const appKey = config.clientSecret ?? config.apiSecret ?? config.password;
106
+ if (!apiKey) {
107
+ throw this.createMeridianError("auth", false, "Datadog authentication requires an API key. Set auth.apiKey (account API key), " +
108
+ "and optionally auth.apiSecret/auth.clientSecret (Application key) for read endpoints.", {}, undefined, 401);
109
+ }
110
+ return { token: appKey ? `${apiKey}|DD|${appKey}` : apiKey };
111
+ }
112
+ rateLimitPolicy(headers) {
113
+ const limit = headers.get("X-RateLimit-Limit");
114
+ const remaining = headers.get("X-RateLimit-Remaining");
115
+ const reset = headers.get("X-RateLimit-Reset");
116
+ return {
117
+ limit: limit ? Number.parseInt(limit, 10) : 100,
118
+ remaining: remaining ? Number.parseInt(remaining, 10) : 100,
119
+ reset: reset
120
+ ? new Date(Date.now() + Number.parseInt(reset, 10) * 1000)
121
+ : new Date(Date.now() + 60_000),
122
+ };
123
+ }
124
+ paginationStrategy() {
125
+ return new DatadogPaginationStrategy();
126
+ }
127
+ getIdempotencyConfig() {
128
+ return {
129
+ defaultSafeOperations: new Set(["GET", "HEAD", "OPTIONS"]),
130
+ operationOverrides: new Map(),
131
+ };
132
+ }
133
+ /**
134
+ * Verifies a Datadog webhook signature: an HMAC-SHA256 digest of the raw
135
+ * request body, hex-encoded, sent in the `X-Datadog-Signature` header and
136
+ * keyed by the webhook's shared secret.
137
+ */
138
+ verifyWebhook(payload, signature, secret) {
139
+ const expected = createHmac("sha256", secret).update(payload).digest("hex");
140
+ try {
141
+ const a = Buffer.from(expected);
142
+ const b = Buffer.from(signature);
143
+ if (a.length !== b.length)
144
+ return false;
145
+ return timingSafeEqual(a, b);
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ createMeridianError(category, retryable, message, metadata, retryAfter, status) {
152
+ return new MeridianError(message, category, "datadog", retryable, "", metadata, retryAfter, status);
153
+ }
154
+ extractRetryAfter(headers) {
155
+ if (!headers)
156
+ return undefined;
157
+ const value = headers instanceof Headers
158
+ ? headers.get("retry-after")
159
+ : (Object.entries(headers).find(([k]) => k.toLowerCase() === "retry-after")?.[1] ?? null);
160
+ return parseRetryAfter(value) ?? undefined;
161
+ }
162
+ }
163
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/datadog/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/datadog/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/datadog/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { PaginationStrategy, RawResponse, RequestOptions } from "../../core/types.js";
2
+ /**
3
+ * Datadog's v2 search APIs (Logs, Events, Spans, ...) return a cursor for the
4
+ * next page at `meta.page.after`, which callers feed back as `page[cursor]`.
5
+ */
6
+ export declare class DatadogPaginationStrategy implements PaginationStrategy {
7
+ extractCursor(response: RawResponse): string | null;
8
+ extractTotal(_response: RawResponse): number | null;
9
+ hasNext(response: RawResponse): boolean;
10
+ buildNextRequest(endpoint: string, options: RequestOptions, cursor: string): {
11
+ endpoint: string;
12
+ options: RequestOptions;
13
+ };
14
+ private readAfterCursor;
15
+ }
16
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/providers/datadog/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3F;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IAClE,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAKnD,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAKnD,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAIvC,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE;IAahD,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Datadog's v2 search APIs (Logs, Events, Spans, ...) return a cursor for the
3
+ * next page at `meta.page.after`, which callers feed back as `page[cursor]`.
4
+ */
5
+ export class DatadogPaginationStrategy {
6
+ extractCursor(response) {
7
+ const cursor = this.readAfterCursor(response);
8
+ return cursor ?? null;
9
+ }
10
+ extractTotal(_response) {
11
+ // Datadog search APIs do not return a total result count.
12
+ return null;
13
+ }
14
+ hasNext(response) {
15
+ return this.readAfterCursor(response) !== null;
16
+ }
17
+ buildNextRequest(endpoint, options, cursor) {
18
+ return {
19
+ endpoint,
20
+ options: {
21
+ ...options,
22
+ query: {
23
+ ...options.query,
24
+ "page[cursor]": cursor,
25
+ },
26
+ },
27
+ };
28
+ }
29
+ readAfterCursor(response) {
30
+ if (typeof response.body !== "object" || response.body === null)
31
+ return null;
32
+ const body = response.body;
33
+ const meta = body.meta;
34
+ const page = meta?.page;
35
+ if (page && typeof page.after === "string" && page.after.length > 0) {
36
+ return page.after;
37
+ }
38
+ return null;
39
+ }
40
+ }
41
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/providers/datadog/pagination.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IACpC,aAAa,CAAC,QAAqB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,SAAsB;QACjC,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,QAAqB;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACjD,CAAC;IAED,gBAAgB,CACd,QAAgB,EAChB,OAAuB,EACvB,MAAc;QAEd,OAAO;YACL,QAAQ;YACR,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,KAAK,EAAE;oBACL,GAAG,OAAO,CAAC,KAAK;oBAChB,cAAc,EAAE,MAAM;iBACvB;aACF;SACF,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,QAAqB;QAC3C,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAA2C,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,EAAE,IAA2C,CAAC;QAC/D,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import type { AdapterInput, AuthConfig, AuthToken, BuiltRequest, IdempotencyConfig, NormalizedResponse, PaginationStrategy, ProviderAdapter, RateLimitInfo, RawResponse } from "../../core/types.js";
2
+ import { MeridianError } from "../../core/types.js";
3
+ /**
4
+ * S3-compatible object storage (AWS S3, Cloudflare R2, and other S3-API stores)
5
+ * authenticates every request with AWS Signature Version 4 — there's no bearer
6
+ * token or static API key header. Each call is signed in `buildRequest` using
7
+ * the access key / secret key (and, for R2, region `"auto"`) supplied via
8
+ * `auth.custom`. Responses are XML, not JSON; pagination and error parsing
9
+ * extract the handful of fields they need from that XML directly.
10
+ *
11
+ * Configure with `auth.username`/`auth.password` (access key / secret key) and
12
+ * `auth.custom = { region, endpoint?, sessionToken? }`. For R2, set
13
+ * `auth.custom.region = "auto"` and `auth.custom.endpoint` to your account's
14
+ * `https://<account_id>.r2.cloudflarestorage.com` URL (or pass it as `baseUrl`
15
+ * in the provider config).
16
+ */
17
+ export declare class S3Adapter implements ProviderAdapter {
18
+ private baseUrl;
19
+ constructor(baseUrl?: string);
20
+ buildRequest(input: AdapterInput): BuiltRequest;
21
+ parseResponse(raw: RawResponse): NormalizedResponse;
22
+ parseError(raw: unknown): MeridianError;
23
+ private parseHttpError;
24
+ authStrategy(config: AuthConfig): Promise<AuthToken>;
25
+ rateLimitPolicy(_headers: Headers): RateLimitInfo;
26
+ paginationStrategy(): PaginationStrategy;
27
+ getIdempotencyConfig(): IdempotencyConfig;
28
+ /**
29
+ * Verifies an S3 Event Notification delivered via SNS/EventBridge webhook —
30
+ * an HMAC-SHA256 digest of the raw request body, hex-encoded, keyed by a
31
+ * shared secret configured on the destination (S3 itself does not sign
32
+ * notifications; this supports the common "shared secret" relay pattern).
33
+ */
34
+ verifyWebhook(payload: string | Buffer, signature: string, secret: string): boolean;
35
+ private createMeridianError;
36
+ }
37
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/s3/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAoB,aAAa,EAAe,MAAM,qBAAqB,CAAC;AA+CnF;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAU,YAAW,eAAe;IAC/C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAA8B;IAIjD,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY;IAqC/C,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;IAOnD,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa;IAkCvC,OAAO,CAAC,cAAc;IAkGhB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA8B1D,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa;IASjD,kBAAkB,IAAI,kBAAkB;IAIxC,oBAAoB,IAAI,iBAAiB;IAOzC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAYnF,OAAO,CAAC,mBAAmB;CAU5B"}
@@ -0,0 +1,206 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ import { ResponseNormalizer } from "../../core/normalizer.js";
3
+ import { IdempotencyLevel, MeridianError, SDK_VERSION } from "../../core/types.js";
4
+ import { S3PaginationStrategy } from "./pagination.js";
5
+ import { signSigV4 } from "./sigv4.js";
6
+ function extractXmlField(xml, tag) {
7
+ const match = xml.match(new RegExp(`<${tag}>([^<]*)</${tag}>`));
8
+ return match?.[1] ?? null;
9
+ }
10
+ /**
11
+ * The auth token carries SigV4 credentials JSON-encoded (see `authStrategy`).
12
+ * Falls back to treating an opaque token string as the access key ID — this
13
+ * keeps `buildRequest` resilient to non-JSON tokens (e.g. generic contract
14
+ * tests that pass a placeholder string) without producing a usable signature.
15
+ */
16
+ function parseSigV4Credentials(token) {
17
+ try {
18
+ return JSON.parse(token);
19
+ }
20
+ catch {
21
+ return { accessKeyId: token, secretAccessKey: "", region: "us-east-1", service: "s3" };
22
+ }
23
+ }
24
+ /** Parses S3/R2's XML error body into a plain object, when present. */
25
+ function parseS3ErrorXml(body) {
26
+ if (typeof body !== "string" || !body.includes("<Error>")) {
27
+ return typeof body === "object" && body !== null ? body : undefined;
28
+ }
29
+ const result = {};
30
+ const code = extractXmlField(body, "Code");
31
+ const message = extractXmlField(body, "Message");
32
+ const requestId = extractXmlField(body, "RequestId");
33
+ const resource = extractXmlField(body, "Resource");
34
+ if (code !== null)
35
+ result.Code = code;
36
+ if (message !== null)
37
+ result.Message = message;
38
+ if (requestId !== null)
39
+ result.RequestId = requestId;
40
+ if (resource !== null)
41
+ result.Resource = resource;
42
+ return result;
43
+ }
44
+ /**
45
+ * S3-compatible object storage (AWS S3, Cloudflare R2, and other S3-API stores)
46
+ * authenticates every request with AWS Signature Version 4 — there's no bearer
47
+ * token or static API key header. Each call is signed in `buildRequest` using
48
+ * the access key / secret key (and, for R2, region `"auto"`) supplied via
49
+ * `auth.custom`. Responses are XML, not JSON; pagination and error parsing
50
+ * extract the handful of fields they need from that XML directly.
51
+ *
52
+ * Configure with `auth.username`/`auth.password` (access key / secret key) and
53
+ * `auth.custom = { region, endpoint?, sessionToken? }`. For R2, set
54
+ * `auth.custom.region = "auto"` and `auth.custom.endpoint` to your account's
55
+ * `https://<account_id>.r2.cloudflarestorage.com` URL (or pass it as `baseUrl`
56
+ * in the provider config).
57
+ */
58
+ export class S3Adapter {
59
+ baseUrl;
60
+ constructor(baseUrl = "https://s3.amazonaws.com/") {
61
+ this.baseUrl = baseUrl;
62
+ }
63
+ buildRequest(input) {
64
+ const { endpoint, options, authToken, baseUrl } = input;
65
+ const effectiveBaseUrl = baseUrl ?? this.baseUrl;
66
+ const url = new URL(endpoint.replace(/^\//, ""), effectiveBaseUrl);
67
+ if (options.query) {
68
+ for (const [key, value] of Object.entries(options.query)) {
69
+ url.searchParams.set(key, String(value));
70
+ }
71
+ }
72
+ const credentials = parseSigV4Credentials(authToken.token);
73
+ const method = options.method ?? "GET";
74
+ let body;
75
+ const baseHeaders = {
76
+ "User-Agent": `Meridian-SDK/${SDK_VERSION}`,
77
+ ...options.headers,
78
+ };
79
+ if (options.body && method !== "GET" && method !== "HEAD") {
80
+ body = typeof options.body === "string" ? options.body : JSON.stringify(options.body);
81
+ baseHeaders["Content-Type"] ??= "application/octet-stream";
82
+ }
83
+ const signed = signSigV4(body !== undefined
84
+ ? { method, url, headers: baseHeaders, body, credentials }
85
+ : { method, url, headers: baseHeaders, credentials });
86
+ const built = { url: url.toString(), method, headers: signed.headers };
87
+ if (body !== undefined) {
88
+ built.body = body;
89
+ }
90
+ return built;
91
+ }
92
+ parseResponse(raw) {
93
+ const rateLimitInfo = this.rateLimitPolicy(raw.headers);
94
+ const paginationStrategy = this.paginationStrategy();
95
+ const paginationInfo = ResponseNormalizer.extractPaginationInfo(raw, paginationStrategy);
96
+ return ResponseNormalizer.normalize(raw, "s3", rateLimitInfo, paginationInfo, [], "1.0.0");
97
+ }
98
+ parseError(raw) {
99
+ if (raw instanceof Error) {
100
+ const msg = raw.message.toLowerCase();
101
+ if (msg.includes("fetch") ||
102
+ msg.includes("network") ||
103
+ msg.includes("econnreset") ||
104
+ msg.includes("etimedout") ||
105
+ msg.includes("enotfound") ||
106
+ msg.includes("timeout")) {
107
+ return this.createMeridianError("network", true, "Network request failed. Check your connection and try again.", { originalError: raw.message });
108
+ }
109
+ }
110
+ if (typeof raw === "object" &&
111
+ raw !== null &&
112
+ "status" in raw &&
113
+ typeof raw.status === "number") {
114
+ return this.parseHttpError(raw);
115
+ }
116
+ return this.createMeridianError("provider", false, "An unexpected error occurred", { raw });
117
+ }
118
+ parseHttpError(error) {
119
+ const { status } = error;
120
+ const errorBody = parseS3ErrorXml(error.body);
121
+ const errorMessage = errorBody?.Message;
122
+ const metadata = { code: errorBody?.Code, requestId: errorBody?.RequestId };
123
+ if (status === 401 || status === 403) {
124
+ return this.createMeridianError("auth", false, errorMessage ??
125
+ "Authentication failed. Check your access key ID, secret access key, and signing region.", metadata, undefined, status);
126
+ }
127
+ if (status === 404) {
128
+ return this.createMeridianError("validation", false, errorMessage ?? "Bucket or object not found.", metadata, undefined, 404);
129
+ }
130
+ if (status === 409 || status === 412 || status === 422) {
131
+ return this.createMeridianError("validation", false, errorMessage ?? "Request validation failed.", metadata, undefined, status);
132
+ }
133
+ if (status === 429 || (status === 503 && errorBody?.Code === "SlowDown")) {
134
+ return this.createMeridianError("rate_limit", true, errorMessage ?? "Request rate exceeded. Please slow down and retry.", metadata, undefined, status);
135
+ }
136
+ if (status === 400) {
137
+ return this.createMeridianError("validation", false, errorMessage ?? "Request validation failed.", metadata, undefined, 400);
138
+ }
139
+ if (status >= 500) {
140
+ return this.createMeridianError("provider", true, errorMessage ?? `S3 API returned error ${status}. This may be temporary.`, metadata, undefined, status);
141
+ }
142
+ if (status >= 400) {
143
+ return this.createMeridianError("validation", false, errorMessage ?? `Request failed with status ${status}.`, metadata, undefined, status);
144
+ }
145
+ return this.createMeridianError("provider", false, `Unexpected response status ${status}.`, metadata, undefined, status);
146
+ }
147
+ async authStrategy(config) {
148
+ const accessKeyId = config.username ?? config.apiKey ?? config.clientId;
149
+ const secretAccessKey = config.password ?? config.apiSecret ?? config.clientSecret;
150
+ const region = config.custom?.region ?? "us-east-1";
151
+ const sessionToken = config.custom?.sessionToken ?? config.refreshToken;
152
+ if (!accessKeyId || !secretAccessKey) {
153
+ throw this.createMeridianError("auth", false, "S3 authentication requires an access key ID and secret access key. " +
154
+ "Set auth.username (access key ID) + auth.password (secret access key), " +
155
+ 'and optionally auth.custom = { region, sessionToken } (use region: "auto" for R2).', {}, undefined, 401);
156
+ }
157
+ const credentials = {
158
+ accessKeyId,
159
+ secretAccessKey,
160
+ region,
161
+ service: "s3",
162
+ ...(sessionToken ? { sessionToken } : {}),
163
+ };
164
+ return { token: JSON.stringify(credentials) };
165
+ }
166
+ rateLimitPolicy(_headers) {
167
+ // S3 does not publish rate-limit headers; it signals throttling via 503 SlowDown.
168
+ return {
169
+ limit: 100,
170
+ remaining: 100,
171
+ reset: new Date(Date.now() + 60_000),
172
+ };
173
+ }
174
+ paginationStrategy() {
175
+ return new S3PaginationStrategy();
176
+ }
177
+ getIdempotencyConfig() {
178
+ return {
179
+ defaultSafeOperations: new Set(["GET", "HEAD", "OPTIONS"]),
180
+ operationOverrides: new Map([["PUT", IdempotencyLevel.IDEMPOTENT]]),
181
+ };
182
+ }
183
+ /**
184
+ * Verifies an S3 Event Notification delivered via SNS/EventBridge webhook —
185
+ * an HMAC-SHA256 digest of the raw request body, hex-encoded, keyed by a
186
+ * shared secret configured on the destination (S3 itself does not sign
187
+ * notifications; this supports the common "shared secret" relay pattern).
188
+ */
189
+ verifyWebhook(payload, signature, secret) {
190
+ const expected = createHmac("sha256", secret).update(payload).digest("hex");
191
+ try {
192
+ const a = Buffer.from(expected);
193
+ const b = Buffer.from(signature);
194
+ if (a.length !== b.length)
195
+ return false;
196
+ return timingSafeEqual(a, b);
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ }
202
+ createMeridianError(category, retryable, message, metadata, retryAfter, status) {
203
+ return new MeridianError(message, category, "s3", retryable, "", metadata, retryAfter, status);
204
+ }
205
+ }
206
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/s3/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ export * from "./sigv4.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/s3/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ export * from "./sigv4.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/s3/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { PaginationStrategy, RawResponse, RequestOptions } from "../../core/types.js";
2
+ /**
3
+ * S3 / R2's `ListObjectsV2` returns XML with `IsTruncated` and, when there are
4
+ * more results, a `NextContinuationToken` — fed back as the `continuation-token`
5
+ * query parameter. The SDK's HTTP layer hands us the raw XML string as the body
6
+ * for non-JSON responses.
7
+ */
8
+ export declare class S3PaginationStrategy implements PaginationStrategy {
9
+ extractCursor(response: RawResponse): string | null;
10
+ extractTotal(response: RawResponse): number | null;
11
+ hasNext(response: RawResponse): boolean;
12
+ buildNextRequest(endpoint: string, options: RequestOptions, cursor: string): {
13
+ endpoint: string;
14
+ options: RequestOptions;
15
+ };
16
+ private bodyAsXml;
17
+ }
18
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/providers/s3/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAY3F;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAMnD,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IASlD,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAMvC,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE;IAahD,OAAO,CAAC,SAAS;CAMlB"}