@fedpulse/sdk 1.0.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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +331 -0
  3. package/dist/cjs/client.cjs +138 -0
  4. package/dist/cjs/errors.cjs +200 -0
  5. package/dist/cjs/http.cjs +449 -0
  6. package/dist/cjs/index.cjs +65 -0
  7. package/dist/cjs/resources/analytics.cjs +134 -0
  8. package/dist/cjs/resources/assistance.cjs +101 -0
  9. package/dist/cjs/resources/entities.cjs +149 -0
  10. package/dist/cjs/resources/exclusions.cjs +135 -0
  11. package/dist/cjs/resources/intelligence.cjs +96 -0
  12. package/dist/cjs/resources/opportunities.cjs +170 -0
  13. package/dist/cjs/resources/webhooks.cjs +262 -0
  14. package/dist/cjs/types/analytics.cjs +5 -0
  15. package/dist/cjs/types/assistance.cjs +5 -0
  16. package/dist/cjs/types/common.cjs +5 -0
  17. package/dist/cjs/types/entities.cjs +5 -0
  18. package/dist/cjs/types/exclusions.cjs +5 -0
  19. package/dist/cjs/types/index.cjs +5 -0
  20. package/dist/cjs/types/intelligence.cjs +5 -0
  21. package/dist/cjs/types/opportunities.cjs +5 -0
  22. package/dist/cjs/types/webhooks.cjs +5 -0
  23. package/dist/cjs/webhooks-verify.cjs +184 -0
  24. package/dist/esm/client.js +135 -0
  25. package/dist/esm/client.js.map +1 -0
  26. package/dist/esm/errors.js +187 -0
  27. package/dist/esm/errors.js.map +1 -0
  28. package/dist/esm/http.js +445 -0
  29. package/dist/esm/http.js.map +1 -0
  30. package/dist/esm/index.js +40 -0
  31. package/dist/esm/index.js.map +1 -0
  32. package/dist/esm/resources/analytics.js +131 -0
  33. package/dist/esm/resources/analytics.js.map +1 -0
  34. package/dist/esm/resources/assistance.js +98 -0
  35. package/dist/esm/resources/assistance.js.map +1 -0
  36. package/dist/esm/resources/entities.js +146 -0
  37. package/dist/esm/resources/entities.js.map +1 -0
  38. package/dist/esm/resources/exclusions.js +132 -0
  39. package/dist/esm/resources/exclusions.js.map +1 -0
  40. package/dist/esm/resources/intelligence.js +93 -0
  41. package/dist/esm/resources/intelligence.js.map +1 -0
  42. package/dist/esm/resources/opportunities.js +167 -0
  43. package/dist/esm/resources/opportunities.js.map +1 -0
  44. package/dist/esm/resources/webhooks.js +259 -0
  45. package/dist/esm/resources/webhooks.js.map +1 -0
  46. package/dist/esm/types/analytics.js +5 -0
  47. package/dist/esm/types/analytics.js.map +1 -0
  48. package/dist/esm/types/assistance.js +5 -0
  49. package/dist/esm/types/assistance.js.map +1 -0
  50. package/dist/esm/types/common.js +5 -0
  51. package/dist/esm/types/common.js.map +1 -0
  52. package/dist/esm/types/entities.js +5 -0
  53. package/dist/esm/types/entities.js.map +1 -0
  54. package/dist/esm/types/exclusions.js +5 -0
  55. package/dist/esm/types/exclusions.js.map +1 -0
  56. package/dist/esm/types/index.js +5 -0
  57. package/dist/esm/types/index.js.map +1 -0
  58. package/dist/esm/types/intelligence.js +5 -0
  59. package/dist/esm/types/intelligence.js.map +1 -0
  60. package/dist/esm/types/opportunities.js +5 -0
  61. package/dist/esm/types/opportunities.js.map +1 -0
  62. package/dist/esm/types/webhooks.js +5 -0
  63. package/dist/esm/types/webhooks.js.map +1 -0
  64. package/dist/esm/webhooks-verify.js +179 -0
  65. package/dist/esm/webhooks-verify.js.map +1 -0
  66. package/dist/types/client.d.cts +136 -0
  67. package/dist/types/client.d.ts +136 -0
  68. package/dist/types/client.d.ts.map +1 -0
  69. package/dist/types/errors.d.cts +139 -0
  70. package/dist/types/errors.d.ts +139 -0
  71. package/dist/types/errors.d.ts.map +1 -0
  72. package/dist/types/http.d.cts +137 -0
  73. package/dist/types/http.d.ts +137 -0
  74. package/dist/types/http.d.ts.map +1 -0
  75. package/dist/types/index.d.cts +39 -0
  76. package/dist/types/index.d.ts +39 -0
  77. package/dist/types/index.d.ts.map +1 -0
  78. package/dist/types/resources/analytics.d.cts +94 -0
  79. package/dist/types/resources/analytics.d.ts +94 -0
  80. package/dist/types/resources/analytics.d.ts.map +1 -0
  81. package/dist/types/resources/assistance.d.cts +66 -0
  82. package/dist/types/resources/assistance.d.ts +66 -0
  83. package/dist/types/resources/assistance.d.ts.map +1 -0
  84. package/dist/types/resources/entities.d.cts +101 -0
  85. package/dist/types/resources/entities.d.ts +101 -0
  86. package/dist/types/resources/entities.d.ts.map +1 -0
  87. package/dist/types/resources/exclusions.d.cts +84 -0
  88. package/dist/types/resources/exclusions.d.ts +84 -0
  89. package/dist/types/resources/exclusions.d.ts.map +1 -0
  90. package/dist/types/resources/intelligence.d.cts +66 -0
  91. package/dist/types/resources/intelligence.d.ts +66 -0
  92. package/dist/types/resources/intelligence.d.ts.map +1 -0
  93. package/dist/types/resources/opportunities.d.cts +116 -0
  94. package/dist/types/resources/opportunities.d.ts +116 -0
  95. package/dist/types/resources/opportunities.d.ts.map +1 -0
  96. package/dist/types/resources/webhooks.d.cts +180 -0
  97. package/dist/types/resources/webhooks.d.ts +180 -0
  98. package/dist/types/resources/webhooks.d.ts.map +1 -0
  99. package/dist/types/types/analytics.d.cts +85 -0
  100. package/dist/types/types/analytics.d.ts +85 -0
  101. package/dist/types/types/analytics.d.ts.map +1 -0
  102. package/dist/types/types/assistance.d.cts +55 -0
  103. package/dist/types/types/assistance.d.ts +55 -0
  104. package/dist/types/types/assistance.d.ts.map +1 -0
  105. package/dist/types/types/common.d.cts +58 -0
  106. package/dist/types/types/common.d.ts +58 -0
  107. package/dist/types/types/common.d.ts.map +1 -0
  108. package/dist/types/types/entities.d.cts +85 -0
  109. package/dist/types/types/entities.d.ts +85 -0
  110. package/dist/types/types/entities.d.ts.map +1 -0
  111. package/dist/types/types/exclusions.d.cts +81 -0
  112. package/dist/types/types/exclusions.d.ts +81 -0
  113. package/dist/types/types/exclusions.d.ts.map +1 -0
  114. package/dist/types/types/index.d.cts +12 -0
  115. package/dist/types/types/index.d.ts +12 -0
  116. package/dist/types/types/index.d.ts.map +1 -0
  117. package/dist/types/types/intelligence.d.cts +104 -0
  118. package/dist/types/types/intelligence.d.ts +104 -0
  119. package/dist/types/types/intelligence.d.ts.map +1 -0
  120. package/dist/types/types/opportunities.d.cts +149 -0
  121. package/dist/types/types/opportunities.d.ts +149 -0
  122. package/dist/types/types/opportunities.d.ts.map +1 -0
  123. package/dist/types/types/webhooks.d.cts +106 -0
  124. package/dist/types/types/webhooks.d.ts +106 -0
  125. package/dist/types/types/webhooks.d.ts.map +1 -0
  126. package/dist/types/webhooks-verify.d.cts +102 -0
  127. package/dist/types/webhooks-verify.d.ts +102 -0
  128. package/dist/types/webhooks-verify.d.ts.map +1 -0
  129. package/package.json +62 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * FedPulse SDK error classes.
3
+ *
4
+ * All errors thrown by the SDK extend FedPulseError so callers can use
5
+ * `instanceof FedPulseError` to distinguish SDK errors from other exceptions.
6
+ */
7
+ // ── Base error ─────────────────────────────────────────────────────────────────
8
+ /**
9
+ * Base class for all FedPulse SDK errors.
10
+ */
11
+ export class FedPulseError extends Error {
12
+ /** HTTP status code returned by the API, or 0 for network errors. */
13
+ status;
14
+ /** Machine-readable error code from the API (e.g. NOT_FOUND, RATE_LIMIT_EXCEEDED). */
15
+ code;
16
+ /** Request ID for debugging — correlates with API logs. */
17
+ requestId;
18
+ /** Additional structured details from the API response. */
19
+ details;
20
+ constructor({ message, status, code, requestId, details, }) {
21
+ super(message);
22
+ this.name = 'FedPulseError';
23
+ this.status = status;
24
+ this.code = code;
25
+ this.requestId = requestId;
26
+ this.details = details;
27
+ // Restore prototype chain after `extends Error` in transpiled output.
28
+ Object.setPrototypeOf(this, new.target.prototype);
29
+ }
30
+ }
31
+ // ── Specific error subtypes ────────────────────────────────────────────────────
32
+ /**
33
+ * Thrown when the API returns 401 Unauthorized.
34
+ * Usually caused by missing, invalid, or revoked API key / JWT.
35
+ */
36
+ export class AuthenticationError extends FedPulseError {
37
+ constructor(params) {
38
+ super({ ...params, status: 401, code: 'UNAUTHORIZED' });
39
+ this.name = 'AuthenticationError';
40
+ Object.setPrototypeOf(this, new.target.prototype);
41
+ }
42
+ }
43
+ /**
44
+ * Thrown when the API returns 403 Forbidden.
45
+ * Usually caused by insufficient plan permissions or missing key scope.
46
+ */
47
+ export class PermissionError extends FedPulseError {
48
+ constructor(params) {
49
+ super({ ...params, status: 403, code: params.code ?? 'FORBIDDEN' });
50
+ this.name = 'PermissionError';
51
+ Object.setPrototypeOf(this, new.target.prototype);
52
+ }
53
+ }
54
+ /**
55
+ * Thrown when the API returns 404 Not Found.
56
+ */
57
+ export class NotFoundError extends FedPulseError {
58
+ constructor(params) {
59
+ super({ ...params, status: 404, code: 'NOT_FOUND' });
60
+ this.name = 'NotFoundError';
61
+ Object.setPrototypeOf(this, new.target.prototype);
62
+ }
63
+ }
64
+ /**
65
+ * Thrown when the API returns 422 Unprocessable Entity or 400 Bad Request
66
+ * due to invalid request parameters or body.
67
+ */
68
+ export class ValidationError extends FedPulseError {
69
+ constructor(params) {
70
+ super({ ...params, status: params.status ?? 422, code: 'VALIDATION_ERROR' });
71
+ this.name = 'ValidationError';
72
+ Object.setPrototypeOf(this, new.target.prototype);
73
+ }
74
+ }
75
+ /**
76
+ * Thrown when the API returns 429 Too Many Requests.
77
+ * The `retryAfter` property indicates when the rate limit resets (Unix seconds).
78
+ */
79
+ export class RateLimitError extends FedPulseError {
80
+ /** Unix epoch seconds when the rate limit window resets. */
81
+ retryAfter;
82
+ constructor(params) {
83
+ super({ ...params, status: 429, code: 'RATE_LIMIT_EXCEEDED' });
84
+ this.name = 'RateLimitError';
85
+ this.retryAfter = params.retryAfter;
86
+ Object.setPrototypeOf(this, new.target.prototype);
87
+ }
88
+ }
89
+ /**
90
+ * Thrown when the API returns a 5xx server error.
91
+ */
92
+ export class ServerError extends FedPulseError {
93
+ constructor(params) {
94
+ super({ ...params, status: params.status ?? 500, code: params.code ?? 'INTERNAL_ERROR' });
95
+ this.name = 'ServerError';
96
+ Object.setPrototypeOf(this, new.target.prototype);
97
+ }
98
+ }
99
+ /**
100
+ * Thrown when a network-level failure occurs (DNS, TCP, timeout, ECONNREFUSED).
101
+ * The `cause` property contains the original error.
102
+ */
103
+ export class NetworkError extends FedPulseError {
104
+ /** The underlying network error. */
105
+ cause;
106
+ constructor(params) {
107
+ super({ ...params, status: 0, code: 'NETWORK_ERROR' });
108
+ this.name = 'NetworkError';
109
+ this.cause = params.cause;
110
+ Object.setPrototypeOf(this, new.target.prototype);
111
+ }
112
+ }
113
+ /**
114
+ * Thrown when a request exceeds the configured timeout.
115
+ */
116
+ export class TimeoutError extends FedPulseError {
117
+ constructor(params) {
118
+ super({ ...params, status: 0, code: 'REQUEST_TIMEOUT' });
119
+ this.name = 'TimeoutError';
120
+ Object.setPrototypeOf(this, new.target.prototype);
121
+ }
122
+ }
123
+ /**
124
+ * Thrown when the SDK's retry budget is exhausted.
125
+ * The `lastError` property contains the final underlying error.
126
+ */
127
+ export class RetryExhaustedError extends FedPulseError {
128
+ lastError;
129
+ attempts;
130
+ constructor(params) {
131
+ super({
132
+ message: `Request failed after ${params.attempts} attempt(s): ${params.lastError.message}`,
133
+ status: params.lastError.status,
134
+ code: 'RETRY_EXHAUSTED',
135
+ requestId: params.lastError.requestId,
136
+ });
137
+ this.name = 'RetryExhaustedError';
138
+ this.lastError = params.lastError;
139
+ this.attempts = params.attempts;
140
+ Object.setPrototypeOf(this, new.target.prototype);
141
+ }
142
+ }
143
+ /**
144
+ * Factory — parses a raw API error response object into the correct error subtype.
145
+ *
146
+ * @param status HTTP response status code.
147
+ * @param body Parsed JSON body (may be the error envelope or anything).
148
+ * @param headers Response headers map (used for Retry-After).
149
+ */
150
+ export function createApiError(status, body, headers) {
151
+ // Extract standardised error fields from the envelope.
152
+ const envelope = body != null && typeof body === 'object' ? body : {};
153
+ const errObj = envelope['error'] ?? {};
154
+ const message = typeof errObj['message'] === 'string'
155
+ ? errObj['message']
156
+ : typeof envelope['message'] === 'string'
157
+ ? envelope['message']
158
+ : `HTTP ${status}`;
159
+ const code = typeof errObj['code'] === 'string' ? errObj['code'] : undefined;
160
+ const requestId = typeof envelope['meta']?.['requestId'] === 'string'
161
+ ? envelope['meta']['requestId']
162
+ : undefined;
163
+ const details = errObj['details'] ?? undefined;
164
+ switch (status) {
165
+ case 400:
166
+ return new ValidationError({ message, status: 400, requestId, details });
167
+ case 401:
168
+ return new AuthenticationError({ message, requestId, details });
169
+ case 403:
170
+ return new PermissionError({ message, code, requestId, details });
171
+ case 404:
172
+ return new NotFoundError({ message, requestId, details });
173
+ case 422:
174
+ return new ValidationError({ message, status: 422, requestId, details });
175
+ case 429: {
176
+ const retryAfterHeader = headers['retry-after'] ?? headers['x-ratelimit-reset'];
177
+ const retryAfter = retryAfterHeader != null ? Number(retryAfterHeader) : undefined;
178
+ return new RateLimitError({ message, retryAfter: Number.isFinite(retryAfter) ? retryAfter : undefined, requestId, details });
179
+ }
180
+ default:
181
+ if (status >= 500) {
182
+ return new ServerError({ message, status, code, requestId, details });
183
+ }
184
+ return new FedPulseError({ message, status, code: code ?? 'UNKNOWN_ERROR', requestId, details });
185
+ }
186
+ }
187
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Core HTTP client for the FedPulse SDK.
3
+ *
4
+ * Features:
5
+ * - Native fetch (Node 18+) — zero runtime dependencies
6
+ * - Configurable timeout via AbortController
7
+ * - Automatic retry with exponential back-off + full jitter for transient errors
8
+ * - In-memory LRU cache for GET requests with per-entry TTL
9
+ * - Rate-limit header tracking (X-RateLimit-*)
10
+ * - Standard API envelope parsing + typed error creation
11
+ * - Array query-parameter serialisation (repeated keys)
12
+ */
13
+ import { FedPulseError, AuthenticationError, NetworkError, TimeoutError, RetryExhaustedError, RateLimitError, createApiError, } from './errors.js';
14
+ // ── Constants ──────────────────────────────────────────────────────────────────
15
+ const DEFAULT_BASE_URL = 'https://api.fedpulse.dev';
16
+ const DEFAULT_TIMEOUT_MS = 30_000;
17
+ const DEFAULT_MAX_RETRIES = 3;
18
+ const DEFAULT_CACHE_SIZE = 256;
19
+ const DEFAULT_CACHE_TTL_MS = 60_000;
20
+ /** HTTP status codes that are safe to retry (transient server-side errors). */
21
+ const RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);
22
+ /**
23
+ * Least-recently-used cache with per-entry TTL.
24
+ * Implemented with a doubly-linked list + Map for O(1) get and set.
25
+ *
26
+ * @template T Cached value type.
27
+ */
28
+ class LruCache {
29
+ capacity;
30
+ defaultTtlMs;
31
+ map = new Map();
32
+ // Sentinel nodes avoid null-checks on boundary operations.
33
+ head;
34
+ tail;
35
+ constructor(capacity, defaultTtlMs) {
36
+ this.capacity = capacity;
37
+ this.defaultTtlMs = defaultTtlMs;
38
+ this.head = { value: null, expiresAt: 0, key: '__head', prev: null, next: null };
39
+ this.tail = { value: null, expiresAt: 0, key: '__tail', prev: null, next: null };
40
+ this.head.next = this.tail;
41
+ this.tail.prev = this.head;
42
+ }
43
+ /**
44
+ * Retrieve a cached value. Returns undefined on miss or expiry.
45
+ */
46
+ get(key) {
47
+ const entry = this.map.get(key);
48
+ if (entry === undefined)
49
+ return undefined;
50
+ if (Date.now() > entry.expiresAt) {
51
+ this.remove(entry);
52
+ this.map.delete(key);
53
+ return undefined;
54
+ }
55
+ // Move to front (most-recently-used).
56
+ this.remove(entry);
57
+ this.insertFront(entry);
58
+ return entry.value;
59
+ }
60
+ /**
61
+ * Store a value. Returns the evicted key if capacity was exceeded.
62
+ */
63
+ set(key, value, ttlMs) {
64
+ // Evict stale entry for the same key first.
65
+ const existing = this.map.get(key);
66
+ if (existing !== undefined) {
67
+ this.remove(existing);
68
+ }
69
+ const entry = {
70
+ key,
71
+ value,
72
+ expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs),
73
+ prev: null,
74
+ next: null,
75
+ };
76
+ this.map.set(key, entry);
77
+ this.insertFront(entry);
78
+ // Evict LRU entry if over capacity.
79
+ if (this.map.size > this.capacity) {
80
+ // LRU entry is just before the tail sentinel.
81
+ const lru = this.tail.prev;
82
+ if (lru !== this.head) {
83
+ this.remove(lru);
84
+ this.map.delete(lru.key);
85
+ }
86
+ }
87
+ }
88
+ /** Delete a specific key from the cache. */
89
+ delete(key) {
90
+ const entry = this.map.get(key);
91
+ if (entry !== undefined) {
92
+ this.remove(entry);
93
+ this.map.delete(key);
94
+ }
95
+ }
96
+ /** Remove all entries. */
97
+ clear() {
98
+ this.map.clear();
99
+ this.head.next = this.tail;
100
+ this.tail.prev = this.head;
101
+ }
102
+ /** Number of entries currently in the cache. */
103
+ get size() {
104
+ return this.map.size;
105
+ }
106
+ insertFront(entry) {
107
+ entry.prev = this.head;
108
+ entry.next = this.head.next;
109
+ this.head.next.prev = entry;
110
+ this.head.next = entry;
111
+ }
112
+ remove(entry) {
113
+ entry.prev.next = entry.next;
114
+ entry.next.prev = entry.prev;
115
+ }
116
+ }
117
+ // ── Query string serialisation ─────────────────────────────────────────────────
118
+ /**
119
+ * Serialise a plain-object params map to a URLSearchParams instance.
120
+ *
121
+ * Arrays are serialised as repeated keys: `{ naics: ['11', '21'] }` →
122
+ * `?naics=11&naics=21`.
123
+ *
124
+ * Undefined and null values are omitted.
125
+ */
126
+ export function buildQueryParams(params) {
127
+ const qs = new URLSearchParams();
128
+ for (const [key, value] of Object.entries(params)) {
129
+ if (value === undefined || value === null)
130
+ continue;
131
+ if (Array.isArray(value)) {
132
+ for (const item of value) {
133
+ if (item !== undefined && item !== null) {
134
+ qs.append(key, String(item));
135
+ }
136
+ }
137
+ }
138
+ else {
139
+ qs.set(key, String(value));
140
+ }
141
+ }
142
+ return qs;
143
+ }
144
+ // ── HttpClient ─────────────────────────────────────────────────────────────────
145
+ /**
146
+ * Low-level HTTP client used by all domain resources.
147
+ *
148
+ * You should not need to instantiate this directly — use `FedPulse` instead.
149
+ */
150
+ export class HttpClient {
151
+ apiKey;
152
+ baseUrl;
153
+ timeoutMs;
154
+ maxRetries;
155
+ cache;
156
+ defaultCacheTtlMs;
157
+ fetchFn;
158
+ /** Most recent rate-limit info observed across all requests. */
159
+ lastRateLimit = null;
160
+ constructor(options) {
161
+ if (!options.apiKey || typeof options.apiKey !== 'string' || options.apiKey.trim() === '') {
162
+ throw new AuthenticationError({
163
+ message: 'API key is required and must be a non-empty string. ' +
164
+ 'Generate one at https://app.fedpulse.dev/dashboard.',
165
+ });
166
+ }
167
+ this.apiKey = options.apiKey.trim();
168
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
169
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
170
+ this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
171
+ this.defaultCacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
172
+ this.fetchFn = options.fetchFn ?? globalThis.fetch;
173
+ const cacheSize = options.cacheSize ?? DEFAULT_CACHE_SIZE;
174
+ this.cache = cacheSize > 0 ? new LruCache(cacheSize, this.defaultCacheTtlMs) : null;
175
+ }
176
+ // ── Public request methods ───────────────────────────────────────────────────
177
+ /**
178
+ * Perform a GET request. Results are cached unless `cacheTtlMs` is 0.
179
+ *
180
+ * @param path API path (e.g. `/v1/opportunities`).
181
+ * @param params Query parameters — arrays serialised as repeated keys.
182
+ * @param options Per-request overrides.
183
+ */
184
+ async get(path, params = {}, options) {
185
+ const qs = buildQueryParams(params);
186
+ const qsStr = qs.toString();
187
+ const url = `${this.baseUrl}${path}${qsStr ? `?${qsStr}` : ''}`;
188
+ const ttl = options?.cacheTtlMs ?? this.defaultCacheTtlMs;
189
+ const shouldCache = this.cache !== null && ttl > 0;
190
+ if (shouldCache) {
191
+ const cached = this.cache.get(url);
192
+ if (cached !== undefined) {
193
+ return { ...cached, fromCache: true };
194
+ }
195
+ }
196
+ const result = await this.executeWithRetry('GET', url, undefined, options);
197
+ if (shouldCache) {
198
+ this.cache.set(url, result, ttl);
199
+ }
200
+ return result;
201
+ }
202
+ /**
203
+ * Perform a POST request (never cached).
204
+ *
205
+ * @param path API path.
206
+ * @param body JSON-serialisable request body.
207
+ * @param options Per-request overrides.
208
+ */
209
+ async post(path, body, options) {
210
+ const url = `${this.baseUrl}${path}`;
211
+ return this.executeWithRetry('POST', url, body, options);
212
+ }
213
+ /**
214
+ * Perform a PATCH request (never cached).
215
+ */
216
+ async patch(path, body, options) {
217
+ const url = `${this.baseUrl}${path}`;
218
+ return this.executeWithRetry('PATCH', url, body, options);
219
+ }
220
+ /**
221
+ * Perform a DELETE request (never cached).
222
+ */
223
+ async del(path, options) {
224
+ const url = `${this.baseUrl}${path}`;
225
+ return this.executeWithRetry('DELETE', url, undefined, options);
226
+ }
227
+ /**
228
+ * Clear all cached responses.
229
+ */
230
+ clearCache() {
231
+ this.cache?.clear();
232
+ }
233
+ // ── Internal methods ─────────────────────────────────────────────────────────
234
+ /**
235
+ * Execute a request, retrying on transient failures with exponential back-off
236
+ * and full jitter.
237
+ */
238
+ async executeWithRetry(method, url, body, options) {
239
+ let lastError = null;
240
+ const maxAttempts = this.maxRetries + 1;
241
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
242
+ try {
243
+ return await this.executeOnce(method, url, body, options);
244
+ }
245
+ catch (err) {
246
+ if (!(err instanceof FedPulseError)) {
247
+ // Should not happen, but guard defensively.
248
+ throw err;
249
+ }
250
+ lastError = err;
251
+ // Do not retry 4xx errors (except 429).
252
+ const isRetryable = err instanceof NetworkError ||
253
+ err instanceof TimeoutError ||
254
+ RETRYABLE_STATUSES.has(err.status);
255
+ if (!isRetryable) {
256
+ // Non-retryable (4xx): throw the specific error type immediately.
257
+ throw err;
258
+ }
259
+ if (attempt >= maxAttempts) {
260
+ // Retryable but no more attempts available.
261
+ break;
262
+ }
263
+ // Calculate delay: exponential back-off (base 500ms) with full jitter.
264
+ let delayMs;
265
+ if (err instanceof RateLimitError && err.retryAfter !== undefined) {
266
+ // Honour API-provided Retry-After header.
267
+ const waitUntil = err.retryAfter * 1000;
268
+ delayMs = Math.max(0, waitUntil - Date.now());
269
+ }
270
+ else {
271
+ const baseMs = 500 * Math.pow(2, attempt - 1); // 500, 1000, 2000 …
272
+ const capMs = 30_000;
273
+ delayMs = Math.random() * Math.min(baseMs, capMs);
274
+ }
275
+ await sleep(delayMs);
276
+ }
277
+ }
278
+ // Only use RetryExhaustedError when we actually retried (maxAttempts > 1).
279
+ // With maxRetries=0 the caller gets the specific error type directly.
280
+ if (maxAttempts > 1) {
281
+ throw new RetryExhaustedError({ lastError: lastError, attempts: maxAttempts });
282
+ }
283
+ throw lastError;
284
+ }
285
+ /**
286
+ * Execute a single HTTP request (no retry logic).
287
+ * Handles timeout, response parsing, header extraction, and error creation.
288
+ */
289
+ async executeOnce(method, url, body, options) {
290
+ const controller = new AbortController();
291
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
292
+ const headers = {
293
+ Authorization: `Bearer ${this.apiKey}`,
294
+ Accept: 'application/json',
295
+ 'User-Agent': '@fedpulse/sdk/1.0.0 (node)',
296
+ ...(options?.headers ?? {}),
297
+ };
298
+ if (body !== undefined && body !== null) {
299
+ headers['Content-Type'] = 'application/json';
300
+ }
301
+ let response;
302
+ try {
303
+ response = await this.fetchFn(url, {
304
+ method,
305
+ headers,
306
+ body: body !== undefined && body !== null ? JSON.stringify(body) : undefined,
307
+ signal: controller.signal,
308
+ });
309
+ }
310
+ catch (err) {
311
+ clearTimeout(timeoutId);
312
+ if (err != null && typeof err === 'object' && 'name' in err && err.name === 'AbortError') {
313
+ throw new TimeoutError({
314
+ message: `Request timed out after ${this.timeoutMs}ms: ${method} ${url}`,
315
+ });
316
+ }
317
+ const cause = err instanceof Error ? err : new Error(String(err));
318
+ throw new NetworkError({
319
+ message: `Network error: ${cause.message}`,
320
+ cause,
321
+ });
322
+ }
323
+ finally {
324
+ clearTimeout(timeoutId);
325
+ }
326
+ // Extract headers for rate limit tracking and error context.
327
+ const headerMap = {
328
+ 'x-ratelimit-limit': response.headers.get('x-ratelimit-limit'),
329
+ 'x-ratelimit-remaining': response.headers.get('x-ratelimit-remaining'),
330
+ 'x-ratelimit-reset': response.headers.get('x-ratelimit-reset'),
331
+ 'retry-after': response.headers.get('retry-after'),
332
+ };
333
+ const rateLimit = parseRateLimitHeaders(headerMap);
334
+ if (rateLimit !== null) {
335
+ this.lastRateLimit = rateLimit;
336
+ }
337
+ // Parse body — always attempt JSON; fall back to text for error messages.
338
+ let parsedBody;
339
+ const contentType = response.headers.get('content-type') ?? '';
340
+ if (contentType.includes('application/json')) {
341
+ try {
342
+ parsedBody = await response.json();
343
+ }
344
+ catch {
345
+ parsedBody = null;
346
+ }
347
+ }
348
+ else {
349
+ // Non-JSON body (e.g. download streams or plain-text errors).
350
+ parsedBody = null;
351
+ }
352
+ if (!response.ok) {
353
+ throw createApiError(response.status, parsedBody, headerMap);
354
+ }
355
+ // Unwrap the standard success envelope.
356
+ const envelope = parsedBody;
357
+ if (envelope === null || typeof envelope !== 'object' || !('data' in envelope)) {
358
+ // Unexpected response shape — treat as server error.
359
+ throw createApiError(500, { error: { message: 'Unexpected response format from API' } }, headerMap);
360
+ }
361
+ const meta = (envelope.meta ?? { requestId: '' });
362
+ return {
363
+ data: envelope.data,
364
+ pagination: envelope.pagination ?? null,
365
+ meta,
366
+ rateLimit,
367
+ fromCache: false,
368
+ };
369
+ }
370
+ /**
371
+ * Perform a raw fetch that returns the full Response (for streaming downloads).
372
+ * No retry, no envelope parsing.
373
+ *
374
+ * @param path API path.
375
+ * @param params Query parameters.
376
+ */
377
+ async rawGet(path, params = {}) {
378
+ const qs = buildQueryParams(params);
379
+ const qsStr = qs.toString();
380
+ const url = `${this.baseUrl}${path}${qsStr ? `?${qsStr}` : ''}`;
381
+ const controller = new AbortController();
382
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
383
+ try {
384
+ const response = await this.fetchFn(url, {
385
+ method: 'GET',
386
+ headers: {
387
+ Authorization: `Bearer ${this.apiKey}`,
388
+ 'User-Agent': '@fedpulse/sdk/1.0.0 (node)',
389
+ },
390
+ signal: controller.signal,
391
+ });
392
+ if (!response.ok) {
393
+ let body = null;
394
+ try {
395
+ body = await response.json();
396
+ }
397
+ catch { /* ignore */ }
398
+ throw createApiError(response.status, body, {
399
+ 'retry-after': response.headers.get('retry-after'),
400
+ 'x-ratelimit-reset': response.headers.get('x-ratelimit-reset'),
401
+ 'x-ratelimit-limit': response.headers.get('x-ratelimit-limit'),
402
+ 'x-ratelimit-remaining': response.headers.get('x-ratelimit-remaining'),
403
+ });
404
+ }
405
+ return response;
406
+ }
407
+ catch (err) {
408
+ if (err instanceof FedPulseError)
409
+ throw err;
410
+ if (err != null && typeof err === 'object' && 'name' in err && err.name === 'AbortError') {
411
+ throw new TimeoutError({ message: `Request timed out after ${this.timeoutMs}ms` });
412
+ }
413
+ const cause = err instanceof Error ? err : new Error(String(err));
414
+ throw new NetworkError({ message: `Network error: ${cause.message}`, cause });
415
+ }
416
+ finally {
417
+ clearTimeout(timeoutId);
418
+ }
419
+ }
420
+ }
421
+ // ── Helpers ───────────────────────────────────────────────────────────────────
422
+ /**
423
+ * Parse X-RateLimit-* response headers into a typed object.
424
+ * Returns null if none of the headers are present.
425
+ */
426
+ function parseRateLimitHeaders(headers) {
427
+ const limit = headers['x-ratelimit-limit'];
428
+ const remaining = headers['x-ratelimit-remaining'];
429
+ const reset = headers['x-ratelimit-reset'];
430
+ if (limit === null && remaining === null && reset === null)
431
+ return null;
432
+ return {
433
+ limit: limit !== null ? Number(limit) : 0,
434
+ remaining: remaining !== null ? Number(remaining) : 0,
435
+ reset: reset !== null ? Number(reset) : 0,
436
+ };
437
+ }
438
+ /**
439
+ * Promise-based sleep helper.
440
+ * @param ms Milliseconds to wait.
441
+ */
442
+ function sleep(ms) {
443
+ return new Promise((resolve) => setTimeout(resolve, ms));
444
+ }
445
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}