@sardis/sdk 0.2.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 (146) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +439 -0
  4. package/dist/browser/index.js +7049 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/browser/sardis.umd.js +7071 -0
  7. package/dist/browser/sardis.umd.js.map +1 -0
  8. package/dist/cjs/client.js +644 -0
  9. package/dist/cjs/client.js.map +1 -0
  10. package/dist/cjs/demo.js +699 -0
  11. package/dist/cjs/demo.js.map +1 -0
  12. package/dist/cjs/errors.js +630 -0
  13. package/dist/cjs/errors.js.map +1 -0
  14. package/dist/cjs/index.js +131 -0
  15. package/dist/cjs/index.js.map +1 -0
  16. package/dist/cjs/integrations/index.js +21 -0
  17. package/dist/cjs/integrations/index.js.map +1 -0
  18. package/dist/cjs/integrations/langchain.js +339 -0
  19. package/dist/cjs/integrations/langchain.js.map +1 -0
  20. package/dist/cjs/integrations/openai.js +505 -0
  21. package/dist/cjs/integrations/openai.js.map +1 -0
  22. package/dist/cjs/integrations/vercel-ai.js +198 -0
  23. package/dist/cjs/integrations/vercel-ai.js.map +1 -0
  24. package/dist/cjs/resources/a2a.js +158 -0
  25. package/dist/cjs/resources/a2a.js.map +1 -0
  26. package/dist/cjs/resources/agents.js +142 -0
  27. package/dist/cjs/resources/agents.js.map +1 -0
  28. package/dist/cjs/resources/base.js +124 -0
  29. package/dist/cjs/resources/base.js.map +1 -0
  30. package/dist/cjs/resources/cards.js +43 -0
  31. package/dist/cjs/resources/cards.js.map +1 -0
  32. package/dist/cjs/resources/holds.js +64 -0
  33. package/dist/cjs/resources/holds.js.map +1 -0
  34. package/dist/cjs/resources/index.js +31 -0
  35. package/dist/cjs/resources/index.js.map +1 -0
  36. package/dist/cjs/resources/ledger.js +43 -0
  37. package/dist/cjs/resources/ledger.js.map +1 -0
  38. package/dist/cjs/resources/marketplace.js +88 -0
  39. package/dist/cjs/resources/marketplace.js.map +1 -0
  40. package/dist/cjs/resources/payments.js +33 -0
  41. package/dist/cjs/resources/payments.js.map +1 -0
  42. package/dist/cjs/resources/policies.js +31 -0
  43. package/dist/cjs/resources/policies.js.map +1 -0
  44. package/dist/cjs/resources/transactions.js +37 -0
  45. package/dist/cjs/resources/transactions.js.map +1 -0
  46. package/dist/cjs/resources/ucp.js +133 -0
  47. package/dist/cjs/resources/ucp.js.map +1 -0
  48. package/dist/cjs/resources/wallets.js +109 -0
  49. package/dist/cjs/resources/wallets.js.map +1 -0
  50. package/dist/cjs/resources/webhooks.js +81 -0
  51. package/dist/cjs/resources/webhooks.js.map +1 -0
  52. package/dist/cjs/types.js +11 -0
  53. package/dist/cjs/types.js.map +1 -0
  54. package/dist/client.d.ts +419 -0
  55. package/dist/client.d.ts.map +1 -0
  56. package/dist/client.js +637 -0
  57. package/dist/client.js.map +1 -0
  58. package/dist/demo.d.ts +335 -0
  59. package/dist/demo.d.ts.map +1 -0
  60. package/dist/demo.js +694 -0
  61. package/dist/demo.js.map +1 -0
  62. package/dist/errors.d.ts +522 -0
  63. package/dist/errors.d.ts.map +1 -0
  64. package/dist/errors.js +612 -0
  65. package/dist/errors.js.map +1 -0
  66. package/dist/index.d.ts +83 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +85 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/integrations/index.d.ts +4 -0
  71. package/dist/integrations/index.d.ts.map +1 -0
  72. package/dist/integrations/index.js +5 -0
  73. package/dist/integrations/index.js.map +1 -0
  74. package/dist/integrations/langchain.d.ts +68 -0
  75. package/dist/integrations/langchain.d.ts.map +1 -0
  76. package/dist/integrations/langchain.js +335 -0
  77. package/dist/integrations/langchain.js.map +1 -0
  78. package/dist/integrations/openai.d.ts +97 -0
  79. package/dist/integrations/openai.d.ts.map +1 -0
  80. package/dist/integrations/openai.js +467 -0
  81. package/dist/integrations/openai.js.map +1 -0
  82. package/dist/integrations/vercel-ai.d.ts +180 -0
  83. package/dist/integrations/vercel-ai.d.ts.map +1 -0
  84. package/dist/integrations/vercel-ai.js +194 -0
  85. package/dist/integrations/vercel-ai.js.map +1 -0
  86. package/dist/resources/a2a.d.ts +254 -0
  87. package/dist/resources/a2a.d.ts.map +1 -0
  88. package/dist/resources/a2a.js +154 -0
  89. package/dist/resources/a2a.js.map +1 -0
  90. package/dist/resources/agents.d.ts +111 -0
  91. package/dist/resources/agents.d.ts.map +1 -0
  92. package/dist/resources/agents.js +138 -0
  93. package/dist/resources/agents.js.map +1 -0
  94. package/dist/resources/base.d.ts +115 -0
  95. package/dist/resources/base.d.ts.map +1 -0
  96. package/dist/resources/base.js +120 -0
  97. package/dist/resources/base.js.map +1 -0
  98. package/dist/resources/cards.d.ts +19 -0
  99. package/dist/resources/cards.d.ts.map +1 -0
  100. package/dist/resources/cards.js +39 -0
  101. package/dist/resources/cards.js.map +1 -0
  102. package/dist/resources/holds.d.ts +44 -0
  103. package/dist/resources/holds.d.ts.map +1 -0
  104. package/dist/resources/holds.js +60 -0
  105. package/dist/resources/holds.js.map +1 -0
  106. package/dist/resources/index.d.ts +16 -0
  107. package/dist/resources/index.d.ts.map +1 -0
  108. package/dist/resources/index.js +16 -0
  109. package/dist/resources/index.js.map +1 -0
  110. package/dist/resources/ledger.d.ts +38 -0
  111. package/dist/resources/ledger.d.ts.map +1 -0
  112. package/dist/resources/ledger.js +39 -0
  113. package/dist/resources/ledger.js.map +1 -0
  114. package/dist/resources/marketplace.d.ts +60 -0
  115. package/dist/resources/marketplace.d.ts.map +1 -0
  116. package/dist/resources/marketplace.js +84 -0
  117. package/dist/resources/marketplace.js.map +1 -0
  118. package/dist/resources/payments.d.ts +24 -0
  119. package/dist/resources/payments.d.ts.map +1 -0
  120. package/dist/resources/payments.js +29 -0
  121. package/dist/resources/payments.js.map +1 -0
  122. package/dist/resources/policies.d.ts +23 -0
  123. package/dist/resources/policies.d.ts.map +1 -0
  124. package/dist/resources/policies.js +27 -0
  125. package/dist/resources/policies.js.map +1 -0
  126. package/dist/resources/transactions.d.ts +32 -0
  127. package/dist/resources/transactions.d.ts.map +1 -0
  128. package/dist/resources/transactions.js +33 -0
  129. package/dist/resources/transactions.js.map +1 -0
  130. package/dist/resources/ucp.d.ts +218 -0
  131. package/dist/resources/ucp.d.ts.map +1 -0
  132. package/dist/resources/ucp.js +129 -0
  133. package/dist/resources/ucp.js.map +1 -0
  134. package/dist/resources/wallets.d.ts +71 -0
  135. package/dist/resources/wallets.d.ts.map +1 -0
  136. package/dist/resources/wallets.js +105 -0
  137. package/dist/resources/wallets.js.map +1 -0
  138. package/dist/resources/webhooks.d.ts +57 -0
  139. package/dist/resources/webhooks.d.ts.map +1 -0
  140. package/dist/resources/webhooks.js +77 -0
  141. package/dist/resources/webhooks.js.map +1 -0
  142. package/dist/types.d.ts +1045 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +10 -0
  145. package/dist/types.js.map +1 -0
  146. package/package.json +114 -0
package/dist/client.js ADDED
@@ -0,0 +1,637 @@
1
+ /**
2
+ * Sardis TypeScript SDK Client
3
+ *
4
+ * Production-grade client for the Sardis stablecoin execution layer API.
5
+ * Features include:
6
+ * - Request cancellation via AbortController
7
+ * - Request/response interceptors
8
+ * - Automatic retry with exponential backoff
9
+ * - Automatic token refresh
10
+ * - Configurable timeouts
11
+ * - Comprehensive error handling
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import axios from 'axios';
16
+ import { APIError, AuthenticationError, RateLimitError, TimeoutError, AbortError, NetworkError, SardisErrorCode, } from './errors.js';
17
+ import { PaymentsResource } from './resources/payments.js';
18
+ import { HoldsResource } from './resources/holds.js';
19
+ import { WebhooksResource } from './resources/webhooks.js';
20
+ import { MarketplaceResource } from './resources/marketplace.js';
21
+ import { TransactionsResource } from './resources/transactions.js';
22
+ import { LedgerResource } from './resources/ledger.js';
23
+ import { WalletsResource } from './resources/wallets.js';
24
+ import { AgentsResource } from './resources/agents.js';
25
+ import { CardsResource } from './resources/cards.js';
26
+ import { PoliciesResource } from './resources/policies.js';
27
+ import { UCPResource } from './resources/ucp.js';
28
+ import { A2AResource } from './resources/a2a.js';
29
+ /** Default API base URL */
30
+ const DEFAULT_BASE_URL = 'https://api.sardis.network';
31
+ /** Default request timeout in milliseconds */
32
+ const DEFAULT_TIMEOUT = 30000;
33
+ /** Default connection timeout in milliseconds */
34
+ const DEFAULT_CONNECT_TIMEOUT = 10000;
35
+ /** Default maximum retry attempts */
36
+ const DEFAULT_MAX_RETRIES = 3;
37
+ /** Default retry delay in milliseconds */
38
+ const DEFAULT_RETRY_DELAY = 1000;
39
+ /** SDK version for User-Agent header */
40
+ const SDK_VERSION = '0.2.0';
41
+ /**
42
+ * Sardis API Client
43
+ *
44
+ * The main entry point for interacting with the Sardis API. Provides access
45
+ * to all API resources through typed methods and handles authentication,
46
+ * retries, and error handling.
47
+ *
48
+ * @example Basic usage
49
+ * ```typescript
50
+ * import { SardisClient } from '@sardis/sdk';
51
+ *
52
+ * const client = new SardisClient({
53
+ * apiKey: 'your-api-key',
54
+ * });
55
+ *
56
+ * // Execute a payment
57
+ * const result = await client.payments.executeMandate(mandate);
58
+ *
59
+ * // Create a hold
60
+ * const hold = await client.holds.create({
61
+ * wallet_id: 'wallet_123',
62
+ * amount: '100.00',
63
+ * });
64
+ * ```
65
+ *
66
+ * @example With request cancellation
67
+ * ```typescript
68
+ * const controller = new AbortController();
69
+ *
70
+ * // Cancel after 5 seconds
71
+ * setTimeout(() => controller.abort(), 5000);
72
+ *
73
+ * try {
74
+ * const result = await client.payments.executeMandate(mandate, {
75
+ * signal: controller.signal,
76
+ * });
77
+ * } catch (error) {
78
+ * if (error instanceof AbortError) {
79
+ * console.log('Request was cancelled');
80
+ * }
81
+ * }
82
+ * ```
83
+ *
84
+ * @example With interceptors
85
+ * ```typescript
86
+ * const client = new SardisClient({ apiKey: 'your-api-key' });
87
+ *
88
+ * // Add request logging
89
+ * client.addRequestInterceptor({
90
+ * onRequest: (config) => {
91
+ * console.log(`Requesting ${config.method} ${config.url}`);
92
+ * return config;
93
+ * },
94
+ * });
95
+ *
96
+ * // Add response logging
97
+ * client.addResponseInterceptor({
98
+ * onResponse: (response) => {
99
+ * console.log(`Response: ${response.status}`);
100
+ * return response;
101
+ * },
102
+ * });
103
+ * ```
104
+ */
105
+ export class SardisClient {
106
+ /**
107
+ * Creates a new SardisClient instance.
108
+ *
109
+ * @param options - Client configuration options
110
+ * @throws {Error} If API key is not provided
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const client = new SardisClient({
115
+ * apiKey: process.env.SARDIS_API_KEY,
116
+ * timeout: 60000, // 60 second timeout
117
+ * maxRetries: 5,
118
+ * retryDelay: 2000,
119
+ * });
120
+ * ```
121
+ */
122
+ constructor(options) {
123
+ /** @internal Request interceptors */
124
+ this.requestInterceptors = [];
125
+ /** @internal Response interceptors */
126
+ this.responseInterceptors = [];
127
+ if (!options.apiKey) {
128
+ throw new Error('API key is required');
129
+ }
130
+ this.apiKey = options.apiKey;
131
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
132
+ this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
133
+ this.connectTimeout = options.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT;
134
+ // Configure retry settings
135
+ this.retryConfig = {
136
+ maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
137
+ retryDelay: options.retryDelay ?? DEFAULT_RETRY_DELAY,
138
+ maxRetryDelay: options.maxRetryDelay ?? 30000,
139
+ retryOn: options.retryOn ?? [408, 429, 500, 502, 503, 504],
140
+ retryOnNetworkError: options.retryOnNetworkError ?? true,
141
+ };
142
+ // Configure token refresh
143
+ this.tokenRefreshConfig = options.tokenRefresh;
144
+ // Create axios instance
145
+ this.http = axios.create({
146
+ baseURL: this.baseUrl,
147
+ timeout: this.timeout,
148
+ headers: {
149
+ 'X-API-Key': this.apiKey,
150
+ 'Content-Type': 'application/json',
151
+ 'User-Agent': `@sardis/sdk/${SDK_VERSION}`,
152
+ },
153
+ });
154
+ // Initialize resources
155
+ this.payments = new PaymentsResource(this);
156
+ this.holds = new HoldsResource(this);
157
+ this.cards = new CardsResource(this);
158
+ this.policies = new PoliciesResource(this);
159
+ this.webhooks = new WebhooksResource(this);
160
+ this.marketplace = new MarketplaceResource(this);
161
+ this.transactions = new TransactionsResource(this);
162
+ this.ledger = new LedgerResource(this);
163
+ this.wallets = new WalletsResource(this);
164
+ this.agents = new AgentsResource(this);
165
+ this.ucp = new UCPResource(this);
166
+ this.a2a = new A2AResource(this);
167
+ }
168
+ /**
169
+ * Adds a request interceptor.
170
+ *
171
+ * Request interceptors are called before each request is sent and can
172
+ * modify the request configuration or throw an error to cancel the request.
173
+ *
174
+ * @param interceptor - The interceptor to add
175
+ * @returns A function to remove the interceptor
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * const removeInterceptor = client.addRequestInterceptor({
180
+ * onRequest: (config) => {
181
+ * config.headers['X-Custom-Header'] = 'value';
182
+ * return config;
183
+ * },
184
+ * onError: (error) => {
185
+ * console.error('Request interceptor error:', error);
186
+ * throw error;
187
+ * },
188
+ * });
189
+ *
190
+ * // Later, remove the interceptor
191
+ * removeInterceptor();
192
+ * ```
193
+ */
194
+ addRequestInterceptor(interceptor) {
195
+ this.requestInterceptors.push(interceptor);
196
+ return () => {
197
+ const index = this.requestInterceptors.indexOf(interceptor);
198
+ if (index !== -1) {
199
+ this.requestInterceptors.splice(index, 1);
200
+ }
201
+ };
202
+ }
203
+ /**
204
+ * Adds a response interceptor.
205
+ *
206
+ * Response interceptors are called after each response is received and can
207
+ * modify the response or throw an error.
208
+ *
209
+ * @param interceptor - The interceptor to add
210
+ * @returns A function to remove the interceptor
211
+ *
212
+ * @example
213
+ * ```typescript
214
+ * const removeInterceptor = client.addResponseInterceptor({
215
+ * onResponse: (response) => {
216
+ * // Log all responses
217
+ * console.log(`${response.config.method} ${response.config.url}: ${response.status}`);
218
+ * return response;
219
+ * },
220
+ * onError: (error) => {
221
+ * // Transform errors
222
+ * if (error.response?.status === 404) {
223
+ * throw new NotFoundError('Resource', 'unknown');
224
+ * }
225
+ * throw error;
226
+ * },
227
+ * });
228
+ * ```
229
+ */
230
+ addResponseInterceptor(interceptor) {
231
+ this.responseInterceptors.push(interceptor);
232
+ return () => {
233
+ const index = this.responseInterceptors.indexOf(interceptor);
234
+ if (index !== -1) {
235
+ this.responseInterceptors.splice(index, 1);
236
+ }
237
+ };
238
+ }
239
+ /**
240
+ * Updates the API key used for authentication.
241
+ *
242
+ * @param apiKey - The new API key
243
+ *
244
+ * @example
245
+ * ```typescript
246
+ * // Update API key after token refresh
247
+ * client.setApiKey(newApiKey);
248
+ * ```
249
+ */
250
+ setApiKey(apiKey) {
251
+ this.apiKey = apiKey;
252
+ // Update the default headers on the axios instance
253
+ this.http.defaults.headers['X-API-Key'] = apiKey;
254
+ }
255
+ /**
256
+ * Gets the current API key.
257
+ *
258
+ * @returns The current API key
259
+ */
260
+ getApiKey() {
261
+ return this.apiKey;
262
+ }
263
+ /**
264
+ * Makes an HTTP request with retry logic, interceptors, and cancellation support.
265
+ *
266
+ * @typeParam T - The expected response type
267
+ * @param method - HTTP method
268
+ * @param path - API path
269
+ * @param options - Request options including params, data, and signal
270
+ * @returns The response data
271
+ *
272
+ * @throws {AuthenticationError} If authentication fails
273
+ * @throws {RateLimitError} If rate limit is exceeded
274
+ * @throws {TimeoutError} If request times out
275
+ * @throws {AbortError} If request is cancelled
276
+ * @throws {NetworkError} If network error occurs
277
+ * @throws {APIError} If API returns an error response
278
+ *
279
+ * @example
280
+ * ```typescript
281
+ * const result = await client.request<PaymentResponse>('POST', '/payments', {
282
+ * data: paymentData,
283
+ * signal: abortController.signal,
284
+ * });
285
+ * ```
286
+ */
287
+ async request(method, path, options) {
288
+ const config = {
289
+ method,
290
+ url: path,
291
+ params: options?.params,
292
+ data: options?.data,
293
+ signal: options?.signal,
294
+ timeout: options?.timeout ?? this.timeout,
295
+ headers: {
296
+ 'X-API-Key': this.apiKey,
297
+ },
298
+ _retryCount: 0,
299
+ _startTime: Date.now(),
300
+ };
301
+ // Apply request interceptors
302
+ let processedConfig = config;
303
+ for (const interceptor of this.requestInterceptors) {
304
+ try {
305
+ if (interceptor.onRequest) {
306
+ processedConfig = await interceptor.onRequest(processedConfig);
307
+ }
308
+ }
309
+ catch (error) {
310
+ if (interceptor.onError) {
311
+ await interceptor.onError(error);
312
+ }
313
+ throw error;
314
+ }
315
+ }
316
+ return this.executeWithRetry(processedConfig);
317
+ }
318
+ /**
319
+ * Executes a request with retry logic.
320
+ * @internal
321
+ */
322
+ async executeWithRetry(config) {
323
+ const retryCount = config._retryCount ?? 0;
324
+ try {
325
+ // Check for abort signal
326
+ if (config.signal?.aborted) {
327
+ throw new AbortError();
328
+ }
329
+ const response = await this.http.request(config);
330
+ // Apply response interceptors
331
+ let processedResponse = response;
332
+ for (const interceptor of this.responseInterceptors) {
333
+ try {
334
+ if (interceptor.onResponse) {
335
+ processedResponse = await interceptor.onResponse(processedResponse);
336
+ }
337
+ }
338
+ catch (error) {
339
+ if (interceptor.onError) {
340
+ await interceptor.onError(error);
341
+ }
342
+ throw error;
343
+ }
344
+ }
345
+ return processedResponse.data;
346
+ }
347
+ catch (error) {
348
+ // Handle abort
349
+ if (axios.isCancel(error) || error.name === 'AbortError') {
350
+ throw new AbortError();
351
+ }
352
+ // Check if signal was aborted during request
353
+ if (config.signal?.aborted) {
354
+ throw new AbortError();
355
+ }
356
+ if (axios.isAxiosError(error)) {
357
+ const axiosError = error;
358
+ // Handle rate limiting
359
+ if (axiosError.response?.status === 429) {
360
+ const retryAfter = this.parseRetryAfter(axiosError.response.headers);
361
+ const resetAt = axiosError.response.headers['x-ratelimit-reset']
362
+ ? new Date(parseInt(axiosError.response.headers['x-ratelimit-reset']) * 1000)
363
+ : undefined;
364
+ if (retryCount < this.retryConfig.maxRetries) {
365
+ const delay = retryAfter ? retryAfter * 1000 : this.calculateRetryDelay(retryCount);
366
+ await this.sleep(delay);
367
+ return this.executeWithRetry({
368
+ ...config,
369
+ _retryCount: retryCount + 1,
370
+ });
371
+ }
372
+ throw new RateLimitError('Rate limit exceeded', retryAfter, parseInt(axiosError.response.headers['x-ratelimit-limit']), parseInt(axiosError.response.headers['x-ratelimit-remaining']), resetAt);
373
+ }
374
+ // Handle authentication errors
375
+ if (axiosError.response?.status === 401) {
376
+ // Try token refresh if configured
377
+ if (this.tokenRefreshConfig && retryCount === 0) {
378
+ try {
379
+ const newToken = await this.tokenRefreshConfig.refreshToken();
380
+ this.setApiKey(newToken);
381
+ // Update the request config headers with the new token
382
+ const updatedConfig = {
383
+ ...config,
384
+ headers: {
385
+ ...config.headers,
386
+ 'X-API-Key': newToken,
387
+ },
388
+ _retryCount: retryCount + 1,
389
+ };
390
+ return this.executeWithRetry(updatedConfig);
391
+ }
392
+ catch {
393
+ throw new AuthenticationError('Token refresh failed', SardisErrorCode.TOKEN_REFRESH_FAILED);
394
+ }
395
+ }
396
+ throw new AuthenticationError();
397
+ }
398
+ // Handle timeout
399
+ if (axiosError.code === 'ECONNABORTED' || axiosError.code === 'ETIMEDOUT') {
400
+ if (retryCount < this.retryConfig.maxRetries) {
401
+ const delay = this.calculateRetryDelay(retryCount);
402
+ await this.sleep(delay);
403
+ return this.executeWithRetry({
404
+ ...config,
405
+ _retryCount: retryCount + 1,
406
+ });
407
+ }
408
+ throw new TimeoutError('Request timed out', config.timeout);
409
+ }
410
+ // Handle other API errors
411
+ if (axiosError.response?.status && axiosError.response.status >= 400) {
412
+ // Check if should retry
413
+ if (this.retryConfig.retryOn.includes(axiosError.response.status) &&
414
+ retryCount < this.retryConfig.maxRetries) {
415
+ const delay = this.calculateRetryDelay(retryCount);
416
+ await this.sleep(delay);
417
+ return this.executeWithRetry({
418
+ ...config,
419
+ _retryCount: retryCount + 1,
420
+ });
421
+ }
422
+ const headers = {};
423
+ Object.entries(axiosError.response.headers).forEach(([key, value]) => {
424
+ if (typeof value === 'string') {
425
+ headers[key] = value;
426
+ }
427
+ });
428
+ throw APIError.fromResponse(axiosError.response.status, axiosError.response.data || {}, headers);
429
+ }
430
+ // Handle network errors
431
+ if (!axiosError.response) {
432
+ if (this.retryConfig.retryOnNetworkError && retryCount < this.retryConfig.maxRetries) {
433
+ const delay = this.calculateRetryDelay(retryCount);
434
+ await this.sleep(delay);
435
+ return this.executeWithRetry({
436
+ ...config,
437
+ _retryCount: retryCount + 1,
438
+ });
439
+ }
440
+ throw new NetworkError(axiosError.message || 'Network error occurred', axiosError, SardisErrorCode.NETWORK_ERROR);
441
+ }
442
+ }
443
+ throw error;
444
+ }
445
+ }
446
+ /**
447
+ * Parses the Retry-After header value.
448
+ * @internal
449
+ */
450
+ parseRetryAfter(headers) {
451
+ const retryAfter = headers['retry-after'];
452
+ if (!retryAfter)
453
+ return undefined;
454
+ // Check if it's a number (seconds)
455
+ const seconds = parseInt(retryAfter, 10);
456
+ if (!isNaN(seconds)) {
457
+ return seconds;
458
+ }
459
+ // Check if it's an HTTP date
460
+ const date = Date.parse(retryAfter);
461
+ if (!isNaN(date)) {
462
+ return Math.max(0, Math.ceil((date - Date.now()) / 1000));
463
+ }
464
+ return undefined;
465
+ }
466
+ /**
467
+ * Calculates retry delay with exponential backoff and jitter.
468
+ * @internal
469
+ */
470
+ calculateRetryDelay(retryCount) {
471
+ // Exponential backoff with jitter
472
+ const exponentialDelay = this.retryConfig.retryDelay * Math.pow(2, retryCount);
473
+ const jitter = Math.random() * 0.3 * exponentialDelay;
474
+ const delay = exponentialDelay + jitter;
475
+ return Math.min(delay, this.retryConfig.maxRetryDelay);
476
+ }
477
+ /**
478
+ * Creates an async iterator for paginated responses.
479
+ *
480
+ * @typeParam T - The item type in the paginated response
481
+ * @param fetchPage - Function to fetch a page of results
482
+ * @param options - Pagination options
483
+ * @returns An async iterator that yields items from all pages
484
+ *
485
+ * @example
486
+ * ```typescript
487
+ * const iterator = client.paginate<Agent>(
488
+ * async (params) => {
489
+ * const response = await client.agents.list(params);
490
+ * return {
491
+ * data: response,
492
+ * hasMore: response.length === params.limit,
493
+ * nextCursor: response[response.length - 1]?.id,
494
+ * };
495
+ * },
496
+ * { limit: 100 }
497
+ * );
498
+ *
499
+ * for await (const agent of iterator) {
500
+ * console.log(agent.name);
501
+ * }
502
+ * ```
503
+ */
504
+ async *paginate(fetchPage, options = {}) {
505
+ let cursor = options.cursor;
506
+ let hasMore = true;
507
+ const limit = options.limit ?? 100;
508
+ while (hasMore) {
509
+ const response = await fetchPage({ ...options, limit, cursor });
510
+ for (const item of response.data) {
511
+ yield item;
512
+ }
513
+ hasMore = response.hasMore;
514
+ cursor = response.nextCursor;
515
+ if (!cursor) {
516
+ hasMore = false;
517
+ }
518
+ }
519
+ }
520
+ /**
521
+ * Creates an async iterator that collects all paginated results into an array.
522
+ *
523
+ * @typeParam T - The item type in the paginated response
524
+ * @param fetchPage - Function to fetch a page of results
525
+ * @param options - Pagination options
526
+ * @returns Promise that resolves to an array of all items
527
+ *
528
+ * @example
529
+ * ```typescript
530
+ * const allAgents = await client.paginateAll<Agent>(
531
+ * async (params) => {
532
+ * const response = await client.agents.list(params);
533
+ * return {
534
+ * data: response,
535
+ * hasMore: response.length === params.limit,
536
+ * nextCursor: response[response.length - 1]?.id,
537
+ * };
538
+ * }
539
+ * );
540
+ * console.log(`Found ${allAgents.length} agents`);
541
+ * ```
542
+ */
543
+ async paginateAll(fetchPage, options = {}) {
544
+ const results = [];
545
+ for await (const item of this.paginate(fetchPage, options)) {
546
+ results.push(item);
547
+ }
548
+ return results;
549
+ }
550
+ /**
551
+ * Checks API health status.
552
+ *
553
+ * @param options - Request options
554
+ * @returns Health status response
555
+ *
556
+ * @example
557
+ * ```typescript
558
+ * const health = await client.health();
559
+ * console.log(`API status: ${health.status}, version: ${health.version}`);
560
+ * ```
561
+ */
562
+ async health(options) {
563
+ return this.request('GET', '/health', options);
564
+ }
565
+ /**
566
+ * Executes multiple operations in a batch.
567
+ *
568
+ * @typeParam T - The response type for each operation
569
+ * @param operations - Array of operations to execute
570
+ * @param options - Batch options
571
+ * @returns Array of results (either success or error for each operation)
572
+ *
573
+ * @example
574
+ * ```typescript
575
+ * const results = await client.batch([
576
+ * { method: 'GET', path: '/api/v2/wallets/wallet_1' },
577
+ * { method: 'GET', path: '/api/v2/wallets/wallet_2' },
578
+ * { method: 'GET', path: '/api/v2/wallets/wallet_3' },
579
+ * ], { concurrency: 3 });
580
+ *
581
+ * results.forEach((result, i) => {
582
+ * if (result.success) {
583
+ * console.log(`Operation ${i}: ${result.data}`);
584
+ * } else {
585
+ * console.error(`Operation ${i} failed: ${result.error}`);
586
+ * }
587
+ * });
588
+ * ```
589
+ */
590
+ async batch(operations, options) {
591
+ const concurrency = options?.concurrency ?? 5;
592
+ const stopOnError = options?.stopOnError ?? false;
593
+ const signal = options?.signal;
594
+ const results = [];
595
+ let stopped = false;
596
+ // Process in chunks
597
+ for (let i = 0; i < operations.length && !stopped; i += concurrency) {
598
+ if (signal?.aborted) {
599
+ throw new AbortError();
600
+ }
601
+ const chunk = operations.slice(i, i + concurrency);
602
+ const chunkResults = await Promise.all(chunk.map(async (op) => {
603
+ if (stopped) {
604
+ return { success: false, error: new AbortError('Batch stopped') };
605
+ }
606
+ try {
607
+ const data = await this.request(op.method, op.path, {
608
+ params: op.params,
609
+ data: op.data,
610
+ signal,
611
+ });
612
+ return { success: true, data };
613
+ }
614
+ catch (error) {
615
+ // If any request was aborted due to signal, throw immediately
616
+ if (error instanceof AbortError && signal?.aborted) {
617
+ throw error;
618
+ }
619
+ if (stopOnError) {
620
+ stopped = true;
621
+ }
622
+ return { success: false, error: error };
623
+ }
624
+ }));
625
+ results.push(...chunkResults);
626
+ }
627
+ return results;
628
+ }
629
+ /**
630
+ * Sleep utility for retry delays.
631
+ * @internal
632
+ */
633
+ sleep(ms) {
634
+ return new Promise((resolve) => setTimeout(resolve, ms));
635
+ }
636
+ }
637
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}