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