@pagci/node 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/client.d.ts +65 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +149 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/crypto/CryptoProvider.d.ts +25 -0
- package/dist/cjs/crypto/CryptoProvider.d.ts.map +1 -0
- package/dist/cjs/crypto/CryptoProvider.js +3 -0
- package/dist/cjs/crypto/CryptoProvider.js.map +1 -0
- package/dist/cjs/crypto/NodeCryptoProvider.d.ts +16 -0
- package/dist/cjs/crypto/NodeCryptoProvider.d.ts.map +1 -0
- package/dist/cjs/crypto/NodeCryptoProvider.js +36 -0
- package/dist/cjs/crypto/NodeCryptoProvider.js.map +1 -0
- package/dist/cjs/errors.d.ts +91 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +171 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/idempotency.d.ts +14 -0
- package/dist/cjs/idempotency.d.ts.map +1 -0
- package/dist/cjs/idempotency.js +26 -0
- package/dist/cjs/idempotency.js.map +1 -0
- package/dist/cjs/index.d.ts +20 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +48 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/net/HttpClient.d.ts +17 -0
- package/dist/cjs/net/HttpClient.d.ts.map +1 -0
- package/dist/cjs/net/HttpClient.js +3 -0
- package/dist/cjs/net/HttpClient.js.map +1 -0
- package/dist/cjs/net/NodeHttpClient.d.ts +13 -0
- package/dist/cjs/net/NodeHttpClient.d.ts.map +1 -0
- package/dist/cjs/net/NodeHttpClient.js +132 -0
- package/dist/cjs/net/NodeHttpClient.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/pagination.d.ts +53 -0
- package/dist/cjs/pagination.d.ts.map +1 -0
- package/dist/cjs/pagination.js +99 -0
- package/dist/cjs/pagination.js.map +1 -0
- package/dist/cjs/querystring.d.ts +8 -0
- package/dist/cjs/querystring.d.ts.map +1 -0
- package/dist/cjs/querystring.js +20 -0
- package/dist/cjs/querystring.js.map +1 -0
- package/dist/cjs/requestSender.d.ts +40 -0
- package/dist/cjs/requestSender.d.ts.map +1 -0
- package/dist/cjs/requestSender.js +127 -0
- package/dist/cjs/requestSender.js.map +1 -0
- package/dist/cjs/resources/balance.d.ts +14 -0
- package/dist/cjs/resources/balance.d.ts.map +1 -0
- package/dist/cjs/resources/balance.js +31 -0
- package/dist/cjs/resources/balance.js.map +1 -0
- package/dist/cjs/resources/debts.d.ts +17 -0
- package/dist/cjs/resources/debts.d.ts.map +1 -0
- package/dist/cjs/resources/debts.js +35 -0
- package/dist/cjs/resources/debts.js.map +1 -0
- package/dist/cjs/resources/payments.d.ts +44 -0
- package/dist/cjs/resources/payments.d.ts.map +1 -0
- package/dist/cjs/resources/payments.js +66 -0
- package/dist/cjs/resources/payments.js.map +1 -0
- package/dist/cjs/resources/tokens.d.ts +22 -0
- package/dist/cjs/resources/tokens.d.ts.map +1 -0
- package/dist/cjs/resources/tokens.js +40 -0
- package/dist/cjs/resources/tokens.js.map +1 -0
- package/dist/cjs/resources/webhookEndpoints.d.ts +27 -0
- package/dist/cjs/resources/webhookEndpoints.d.ts.map +1 -0
- package/dist/cjs/resources/webhookEndpoints.js +55 -0
- package/dist/cjs/resources/webhookEndpoints.js.map +1 -0
- package/dist/cjs/resources/withdrawals.d.ts +23 -0
- package/dist/cjs/resources/withdrawals.d.ts.map +1 -0
- package/dist/cjs/resources/withdrawals.js +46 -0
- package/dist/cjs/resources/withdrawals.js.map +1 -0
- package/dist/cjs/retry.d.ts +34 -0
- package/dist/cjs/retry.d.ts.map +1 -0
- package/dist/cjs/retry.js +72 -0
- package/dist/cjs/retry.js.map +1 -0
- package/dist/cjs/types/balance.d.ts +35 -0
- package/dist/cjs/types/balance.d.ts.map +1 -0
- package/dist/cjs/types/balance.js +5 -0
- package/dist/cjs/types/balance.js.map +1 -0
- package/dist/cjs/types/common.d.ts +57 -0
- package/dist/cjs/types/common.d.ts.map +1 -0
- package/dist/cjs/types/common.js +5 -0
- package/dist/cjs/types/common.js.map +1 -0
- package/dist/cjs/types/debt.d.ts +49 -0
- package/dist/cjs/types/debt.d.ts.map +1 -0
- package/dist/cjs/types/debt.js +5 -0
- package/dist/cjs/types/debt.js.map +1 -0
- package/dist/cjs/types/error.d.ts +112 -0
- package/dist/cjs/types/error.d.ts.map +1 -0
- package/dist/cjs/types/error.js +132 -0
- package/dist/cjs/types/error.js.map +1 -0
- package/dist/cjs/types/index.d.ts +10 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +9 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/payment.d.ts +246 -0
- package/dist/cjs/types/payment.d.ts.map +1 -0
- package/dist/cjs/types/payment.js +5 -0
- package/dist/cjs/types/payment.js.map +1 -0
- package/dist/cjs/types/token.d.ts +39 -0
- package/dist/cjs/types/token.d.ts.map +1 -0
- package/dist/cjs/types/token.js +5 -0
- package/dist/cjs/types/token.js.map +1 -0
- package/dist/cjs/types/webhook.d.ts +102 -0
- package/dist/cjs/types/webhook.d.ts.map +1 -0
- package/dist/cjs/types/webhook.js +18 -0
- package/dist/cjs/types/webhook.js.map +1 -0
- package/dist/cjs/types/withdrawal.d.ts +89 -0
- package/dist/cjs/types/withdrawal.d.ts.map +1 -0
- package/dist/cjs/types/withdrawal.js +5 -0
- package/dist/cjs/types/withdrawal.js.map +1 -0
- package/dist/esm/client.d.ts +65 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +145 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/crypto/CryptoProvider.d.ts +25 -0
- package/dist/esm/crypto/CryptoProvider.d.ts.map +1 -0
- package/dist/esm/crypto/CryptoProvider.js +2 -0
- package/dist/esm/crypto/CryptoProvider.js.map +1 -0
- package/dist/esm/crypto/NodeCryptoProvider.d.ts +16 -0
- package/dist/esm/crypto/NodeCryptoProvider.d.ts.map +1 -0
- package/dist/esm/crypto/NodeCryptoProvider.js +32 -0
- package/dist/esm/crypto/NodeCryptoProvider.js.map +1 -0
- package/dist/esm/errors.d.ts +91 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +155 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/idempotency.d.ts +14 -0
- package/dist/esm/idempotency.d.ts.map +1 -0
- package/dist/esm/idempotency.js +23 -0
- package/dist/esm/idempotency.js.map +1 -0
- package/dist/esm/index.d.ts +20 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/net/HttpClient.d.ts +17 -0
- package/dist/esm/net/HttpClient.d.ts.map +1 -0
- package/dist/esm/net/HttpClient.js +2 -0
- package/dist/esm/net/HttpClient.js.map +1 -0
- package/dist/esm/net/NodeHttpClient.d.ts +13 -0
- package/dist/esm/net/NodeHttpClient.d.ts.map +1 -0
- package/dist/esm/net/NodeHttpClient.js +95 -0
- package/dist/esm/net/NodeHttpClient.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/pagination.d.ts +53 -0
- package/dist/esm/pagination.d.ts.map +1 -0
- package/dist/esm/pagination.js +95 -0
- package/dist/esm/pagination.js.map +1 -0
- package/dist/esm/querystring.d.ts +8 -0
- package/dist/esm/querystring.d.ts.map +1 -0
- package/dist/esm/querystring.js +17 -0
- package/dist/esm/querystring.js.map +1 -0
- package/dist/esm/requestSender.d.ts +40 -0
- package/dist/esm/requestSender.d.ts.map +1 -0
- package/dist/esm/requestSender.js +123 -0
- package/dist/esm/requestSender.js.map +1 -0
- package/dist/esm/resources/balance.d.ts +14 -0
- package/dist/esm/resources/balance.d.ts.map +1 -0
- package/dist/esm/resources/balance.js +27 -0
- package/dist/esm/resources/balance.js.map +1 -0
- package/dist/esm/resources/debts.d.ts +17 -0
- package/dist/esm/resources/debts.d.ts.map +1 -0
- package/dist/esm/resources/debts.js +31 -0
- package/dist/esm/resources/debts.js.map +1 -0
- package/dist/esm/resources/payments.d.ts +44 -0
- package/dist/esm/resources/payments.d.ts.map +1 -0
- package/dist/esm/resources/payments.js +62 -0
- package/dist/esm/resources/payments.js.map +1 -0
- package/dist/esm/resources/tokens.d.ts +22 -0
- package/dist/esm/resources/tokens.d.ts.map +1 -0
- package/dist/esm/resources/tokens.js +36 -0
- package/dist/esm/resources/tokens.js.map +1 -0
- package/dist/esm/resources/webhookEndpoints.d.ts +27 -0
- package/dist/esm/resources/webhookEndpoints.d.ts.map +1 -0
- package/dist/esm/resources/webhookEndpoints.js +51 -0
- package/dist/esm/resources/webhookEndpoints.js.map +1 -0
- package/dist/esm/resources/withdrawals.d.ts +23 -0
- package/dist/esm/resources/withdrawals.d.ts.map +1 -0
- package/dist/esm/resources/withdrawals.js +42 -0
- package/dist/esm/resources/withdrawals.js.map +1 -0
- package/dist/esm/retry.d.ts +34 -0
- package/dist/esm/retry.d.ts.map +1 -0
- package/dist/esm/retry.js +66 -0
- package/dist/esm/retry.js.map +1 -0
- package/dist/esm/types/balance.d.ts +35 -0
- package/dist/esm/types/balance.d.ts.map +1 -0
- package/dist/esm/types/balance.js +4 -0
- package/dist/esm/types/balance.js.map +1 -0
- package/dist/esm/types/common.d.ts +57 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +4 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/debt.d.ts +49 -0
- package/dist/esm/types/debt.d.ts.map +1 -0
- package/dist/esm/types/debt.js +4 -0
- package/dist/esm/types/debt.js.map +1 -0
- package/dist/esm/types/error.d.ts +112 -0
- package/dist/esm/types/error.d.ts.map +1 -0
- package/dist/esm/types/error.js +129 -0
- package/dist/esm/types/error.js.map +1 -0
- package/dist/esm/types/index.d.ts +10 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/payment.d.ts +246 -0
- package/dist/esm/types/payment.d.ts.map +1 -0
- package/dist/esm/types/payment.js +4 -0
- package/dist/esm/types/payment.js.map +1 -0
- package/dist/esm/types/token.d.ts +39 -0
- package/dist/esm/types/token.d.ts.map +1 -0
- package/dist/esm/types/token.js +4 -0
- package/dist/esm/types/token.js.map +1 -0
- package/dist/esm/types/webhook.d.ts +102 -0
- package/dist/esm/types/webhook.d.ts.map +1 -0
- package/dist/esm/types/webhook.js +15 -0
- package/dist/esm/types/webhook.js.map +1 -0
- package/dist/esm/types/withdrawal.d.ts +89 -0
- package/dist/esm/types/withdrawal.d.ts.map +1 -0
- package/dist/esm/types/withdrawal.js +4 -0
- package/dist/esm/types/withdrawal.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../../src/net/HttpClient.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as https from 'node:https';
|
|
2
|
+
import * as http from 'node:http';
|
|
3
|
+
import type { HttpClient, HttpClientResponse } from './HttpClient.js';
|
|
4
|
+
/**
|
|
5
|
+
* Node.js native HTTPS client. Zero runtime dependencies.
|
|
6
|
+
* Uses `node:https` with TCP keep-alive by default.
|
|
7
|
+
*/
|
|
8
|
+
export declare class NodeHttpClient implements HttpClient {
|
|
9
|
+
private readonly agent;
|
|
10
|
+
constructor(agent?: https.Agent | http.Agent);
|
|
11
|
+
request(method: string, url: string, headers: Record<string, string>, body?: string, timeout?: number): Promise<HttpClientResponse>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=NodeHttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHttpClient.d.ts","sourceRoot":"","sources":["../../../src/net/NodeHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAatE;;;GAGG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;gBAErC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;IAI5C,OAAO,CACL,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC;CAgE/B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as https from 'node:https';
|
|
2
|
+
import * as http from 'node:http';
|
|
3
|
+
/**
|
|
4
|
+
* Default keep-alive agent — TCP connections stay warm between requests.
|
|
5
|
+
* Singleton: created once, shared across all NodeHttpClient instances
|
|
6
|
+
* unless the caller provides a custom agent.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_AGENT = new https.Agent({
|
|
9
|
+
keepAlive: true,
|
|
10
|
+
keepAliveMsecs: 60_000,
|
|
11
|
+
maxSockets: 50,
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Node.js native HTTPS client. Zero runtime dependencies.
|
|
15
|
+
* Uses `node:https` with TCP keep-alive by default.
|
|
16
|
+
*/
|
|
17
|
+
export class NodeHttpClient {
|
|
18
|
+
agent;
|
|
19
|
+
constructor(agent) {
|
|
20
|
+
this.agent = agent ?? DEFAULT_AGENT;
|
|
21
|
+
}
|
|
22
|
+
request(method, url, headers, body, timeout) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const parsed = new URL(url);
|
|
25
|
+
const isHttps = parsed.protocol === 'https:';
|
|
26
|
+
const transport = isHttps ? https : http;
|
|
27
|
+
const options = {
|
|
28
|
+
method,
|
|
29
|
+
hostname: parsed.hostname,
|
|
30
|
+
port: parsed.port || (isHttps ? 443 : 80),
|
|
31
|
+
path: parsed.pathname + parsed.search,
|
|
32
|
+
headers,
|
|
33
|
+
agent: this.agent,
|
|
34
|
+
};
|
|
35
|
+
const req = transport.request(options, (res) => {
|
|
36
|
+
const chunks = [];
|
|
37
|
+
res.on('data', (chunk) => {
|
|
38
|
+
chunks.push(chunk);
|
|
39
|
+
});
|
|
40
|
+
res.on('end', () => {
|
|
41
|
+
// Normalize header keys to lowercase for consistent access
|
|
42
|
+
const responseHeaders = {};
|
|
43
|
+
for (const [key, value] of Object.entries(res.headers)) {
|
|
44
|
+
if (value !== undefined) {
|
|
45
|
+
responseHeaders[key.toLowerCase()] = Array.isArray(value)
|
|
46
|
+
? value.join(', ')
|
|
47
|
+
: value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
resolve({
|
|
51
|
+
status: res.statusCode ?? 0,
|
|
52
|
+
headers: responseHeaders,
|
|
53
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
res.on('error', (err) => {
|
|
57
|
+
reject(wrapConnectionError(err));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
if (timeout !== undefined && timeout > 0) {
|
|
61
|
+
req.setTimeout(timeout, () => {
|
|
62
|
+
req.destroy(new Error(`Request timed out after ${timeout}ms`));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
req.on('error', (err) => {
|
|
66
|
+
reject(wrapConnectionError(err));
|
|
67
|
+
});
|
|
68
|
+
if (body !== undefined) {
|
|
69
|
+
req.write(body, 'utf8');
|
|
70
|
+
}
|
|
71
|
+
req.end();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
76
|
+
const RETRIABLE_CODES = new Set([
|
|
77
|
+
'ECONNRESET',
|
|
78
|
+
'ECONNREFUSED',
|
|
79
|
+
'EPIPE',
|
|
80
|
+
'ETIMEDOUT',
|
|
81
|
+
'EHOSTUNREACH',
|
|
82
|
+
'EAI_AGAIN',
|
|
83
|
+
]);
|
|
84
|
+
/**
|
|
85
|
+
* Annotate connection-level errors with a `retriable` flag so the
|
|
86
|
+
* retry layer can make decisions without inspecting error messages.
|
|
87
|
+
*/
|
|
88
|
+
function wrapConnectionError(err) {
|
|
89
|
+
const code = err.code;
|
|
90
|
+
if (code && RETRIABLE_CODES.has(code)) {
|
|
91
|
+
err.retriable = true;
|
|
92
|
+
}
|
|
93
|
+
return err;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=NodeHttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHttpClient.js","sourceRoot":"","sources":["../../../src/net/NodeHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ListMeta, ListResponse } from './types/common.js';
|
|
2
|
+
type Fetcher<T> = (cursor?: string) => Promise<ListResponse<T>>;
|
|
3
|
+
/**
|
|
4
|
+
* A lazy, async-iterable page of results.
|
|
5
|
+
*
|
|
6
|
+
* Supports three consumption patterns:
|
|
7
|
+
*
|
|
8
|
+
* 1. **Manual page-by-page:**
|
|
9
|
+
* ```ts
|
|
10
|
+
* let page = pagci.payments.list({ per_page: 10 });
|
|
11
|
+
* const first = await page.getData();
|
|
12
|
+
* if (page.hasNextPage()) page = await page.getNextPage();
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* 2. **for-await (all items across pages):**
|
|
16
|
+
* ```ts
|
|
17
|
+
* for await (const payment of pagci.payments.list()) {
|
|
18
|
+
* console.log(payment.id);
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* 3. **Collect into array (with safety limit):**
|
|
23
|
+
* ```ts
|
|
24
|
+
* const all = await pagci.payments.list().autoPagingToArray({ limit: 500 });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class Page<T> implements AsyncIterable<T> {
|
|
28
|
+
private readonly fetcher;
|
|
29
|
+
/** Current page data (empty until first fetch). */
|
|
30
|
+
data: T[];
|
|
31
|
+
/** Current page metadata. */
|
|
32
|
+
meta: ListMeta;
|
|
33
|
+
private loaded;
|
|
34
|
+
constructor(fetcher: Fetcher<T>);
|
|
35
|
+
private ensureLoaded;
|
|
36
|
+
/** Get current page data (fetches first page if not yet loaded). */
|
|
37
|
+
getData(): Promise<T[]>;
|
|
38
|
+
/** Whether there is a next page available. */
|
|
39
|
+
hasNextPage(): boolean;
|
|
40
|
+
/** Fetch the next page. Returns a new Page positioned at the next cursor. */
|
|
41
|
+
getNextPage(): Promise<Page<T>>;
|
|
42
|
+
[Symbol.asyncIterator](): AsyncGenerator<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Collect items across pages into an array.
|
|
45
|
+
*
|
|
46
|
+
* @param opts.limit - Maximum number of items to collect (required as safety guard).
|
|
47
|
+
*/
|
|
48
|
+
autoPagingToArray(opts: {
|
|
49
|
+
limit: number;
|
|
50
|
+
}): Promise<T[]>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/pagination.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhE,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,IAAI,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IASlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,mDAAmD;IACnD,IAAI,EAAE,CAAC,EAAE,CAAM;IAEf,6BAA6B;IAC7B,IAAI,EAAE,QAAQ,CAAoB;IAElC,OAAO,CAAC,MAAM,CAAS;gBAEM,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAIlC,YAAY;IAQ1B,oEAAoE;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAO7B,8CAA8C;IAC9C,WAAW,IAAI,OAAO;IAItB,6EAA6E;IACvE,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAe9B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;IAclD;;;;OAIG;IACG,iBAAiB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAQ/D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ── Cursor-based auto-pagination ────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* A lazy, async-iterable page of results.
|
|
4
|
+
*
|
|
5
|
+
* Supports three consumption patterns:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Manual page-by-page:**
|
|
8
|
+
* ```ts
|
|
9
|
+
* let page = pagci.payments.list({ per_page: 10 });
|
|
10
|
+
* const first = await page.getData();
|
|
11
|
+
* if (page.hasNextPage()) page = await page.getNextPage();
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* 2. **for-await (all items across pages):**
|
|
15
|
+
* ```ts
|
|
16
|
+
* for await (const payment of pagci.payments.list()) {
|
|
17
|
+
* console.log(payment.id);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* 3. **Collect into array (with safety limit):**
|
|
22
|
+
* ```ts
|
|
23
|
+
* const all = await pagci.payments.list().autoPagingToArray({ limit: 500 });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class Page {
|
|
27
|
+
fetcher;
|
|
28
|
+
/** Current page data (empty until first fetch). */
|
|
29
|
+
data = [];
|
|
30
|
+
/** Current page metadata. */
|
|
31
|
+
meta = { per_page: 20 };
|
|
32
|
+
loaded = false;
|
|
33
|
+
constructor(fetcher) {
|
|
34
|
+
this.fetcher = fetcher;
|
|
35
|
+
}
|
|
36
|
+
// ── Lazy first-page load ────────────────────────────────────────
|
|
37
|
+
async ensureLoaded() {
|
|
38
|
+
if (this.loaded)
|
|
39
|
+
return;
|
|
40
|
+
const res = await this.fetcher(undefined);
|
|
41
|
+
this.data = res.data;
|
|
42
|
+
this.meta = res.meta;
|
|
43
|
+
this.loaded = true;
|
|
44
|
+
}
|
|
45
|
+
/** Get current page data (fetches first page if not yet loaded). */
|
|
46
|
+
async getData() {
|
|
47
|
+
await this.ensureLoaded();
|
|
48
|
+
return this.data;
|
|
49
|
+
}
|
|
50
|
+
// ── Manual navigation ───────────────────────────────────────────
|
|
51
|
+
/** Whether there is a next page available. */
|
|
52
|
+
hasNextPage() {
|
|
53
|
+
return this.meta.next_cursor !== undefined && this.meta.next_cursor !== '';
|
|
54
|
+
}
|
|
55
|
+
/** Fetch the next page. Returns a new Page positioned at the next cursor. */
|
|
56
|
+
async getNextPage() {
|
|
57
|
+
await this.ensureLoaded();
|
|
58
|
+
if (!this.hasNextPage()) {
|
|
59
|
+
throw new Error('No next page available. Check hasNextPage() first.');
|
|
60
|
+
}
|
|
61
|
+
const next = new Page(this.fetcher);
|
|
62
|
+
const res = await this.fetcher(this.meta.next_cursor);
|
|
63
|
+
next.data = res.data;
|
|
64
|
+
next.meta = res.meta;
|
|
65
|
+
next.loaded = true;
|
|
66
|
+
return next;
|
|
67
|
+
}
|
|
68
|
+
// ── AsyncIterable — iterates ALL items across ALL pages ─────────
|
|
69
|
+
async *[Symbol.asyncIterator]() {
|
|
70
|
+
await this.ensureLoaded();
|
|
71
|
+
yield* this.data;
|
|
72
|
+
let cursor = this.meta.next_cursor;
|
|
73
|
+
while (cursor) {
|
|
74
|
+
const res = await this.fetcher(cursor);
|
|
75
|
+
yield* res.data;
|
|
76
|
+
cursor = res.meta.next_cursor;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ── Collect into array ──────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Collect items across pages into an array.
|
|
82
|
+
*
|
|
83
|
+
* @param opts.limit - Maximum number of items to collect (required as safety guard).
|
|
84
|
+
*/
|
|
85
|
+
async autoPagingToArray(opts) {
|
|
86
|
+
const result = [];
|
|
87
|
+
for await (const item of this) {
|
|
88
|
+
result.push(item);
|
|
89
|
+
if (result.length >= opts.limit)
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/pagination.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAMvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,IAAI;IASc;IAR7B,mDAAmD;IACnD,IAAI,GAAQ,EAAE,CAAC;IAEf,6BAA6B;IAC7B,IAAI,GAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAE1B,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAEpD,mEAAmE;IAE3D,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,mEAAmE;IAEnE,8CAA8C;IAC9C,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC;IAC7E,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEjB,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,MAAM,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACvC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QAChC,CAAC;IACH,CAAC;IAED,mEAAmE;IAEnE;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAuB;QAC7C,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a query string from an object of key-value pairs.
|
|
3
|
+
* Omits undefined/null values. Returns empty string if no params.
|
|
4
|
+
*
|
|
5
|
+
* @returns Query string WITH leading '?' (or empty string).
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildQueryString(params: Record<string, string | number | boolean | undefined | null>): string;
|
|
8
|
+
//# sourceMappingURL=querystring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"querystring.d.ts","sourceRoot":"","sources":["../../src/querystring.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GACnE,MAAM,CASR"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// ── Query string builder ────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Build a query string from an object of key-value pairs.
|
|
4
|
+
* Omits undefined/null values. Returns empty string if no params.
|
|
5
|
+
*
|
|
6
|
+
* @returns Query string WITH leading '?' (or empty string).
|
|
7
|
+
*/
|
|
8
|
+
export function buildQueryString(params) {
|
|
9
|
+
const parts = [];
|
|
10
|
+
for (const [key, value] of Object.entries(params)) {
|
|
11
|
+
if (value === undefined || value === null || value === '')
|
|
12
|
+
continue;
|
|
13
|
+
parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
|
|
14
|
+
}
|
|
15
|
+
return parts.length > 0 ? `?${parts.join('&')}` : '';
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=querystring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"querystring.js","sourceRoot":"","sources":["../../src/querystring.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAoE;IAEpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACpE,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { HttpClient } from './net/HttpClient.js';
|
|
2
|
+
import type { RetryConfig } from './retry.js';
|
|
3
|
+
export interface RequestOptions {
|
|
4
|
+
/** Idempotency key for mutating requests. Reused across retries. */
|
|
5
|
+
idempotencyKey?: string;
|
|
6
|
+
/** Per-request timeout override (ms). */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
/** Per-request max retries override. */
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
}
|
|
11
|
+
/** Response metadata attached to every successful API result. */
|
|
12
|
+
export interface ResponseMeta {
|
|
13
|
+
status: number;
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
requestId: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Successful API response — the deserialized body `T` extended with
|
|
19
|
+
* non-enumerable `_response` metadata.
|
|
20
|
+
*/
|
|
21
|
+
export type ApiResponse<T> = T & {
|
|
22
|
+
_response: ResponseMeta;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Core HTTP engine. Handles:
|
|
26
|
+
* - Header construction (auth, content-type, idempotency)
|
|
27
|
+
* - JSON serialization / deserialization
|
|
28
|
+
* - Retry loop with exponential backoff + jitter
|
|
29
|
+
* - Error mapping (HTTP status → PagciError subclass)
|
|
30
|
+
*/
|
|
31
|
+
export declare class RequestSender {
|
|
32
|
+
private readonly apiKey;
|
|
33
|
+
private readonly baseUrl;
|
|
34
|
+
private readonly httpClient;
|
|
35
|
+
private readonly retryConfig;
|
|
36
|
+
private readonly defaultTimeout;
|
|
37
|
+
constructor(apiKey: string, baseUrl: string, httpClient: HttpClient, retryConfig: RetryConfig, defaultTimeout: number);
|
|
38
|
+
request<T>(method: string, path: string, body?: unknown, options?: RequestOptions): Promise<ApiResponse<T>>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=requestSender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestSender.d.ts","sourceRoot":"","sources":["../../src/requestSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAQ7D;;;;;;GAMG;AACH,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAJd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM;IAGnC,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CA8H3B"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { shouldRetry, isRetriableConnectionError, retryDelay, } from './retry.js';
|
|
2
|
+
import { errorFromResponse, ConnectionError, TimeoutError, PagciError, } from './errors.js';
|
|
3
|
+
// ── SDK version (injected as User-Agent) ─────────────────────────────
|
|
4
|
+
const SDK_VERSION = '0.1.0';
|
|
5
|
+
// ── RequestSender ────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Core HTTP engine. Handles:
|
|
8
|
+
* - Header construction (auth, content-type, idempotency)
|
|
9
|
+
* - JSON serialization / deserialization
|
|
10
|
+
* - Retry loop with exponential backoff + jitter
|
|
11
|
+
* - Error mapping (HTTP status → PagciError subclass)
|
|
12
|
+
*/
|
|
13
|
+
export class RequestSender {
|
|
14
|
+
apiKey;
|
|
15
|
+
baseUrl;
|
|
16
|
+
httpClient;
|
|
17
|
+
retryConfig;
|
|
18
|
+
defaultTimeout;
|
|
19
|
+
constructor(apiKey, baseUrl, httpClient, retryConfig, defaultTimeout) {
|
|
20
|
+
this.apiKey = apiKey;
|
|
21
|
+
this.baseUrl = baseUrl;
|
|
22
|
+
this.httpClient = httpClient;
|
|
23
|
+
this.retryConfig = retryConfig;
|
|
24
|
+
this.defaultTimeout = defaultTimeout;
|
|
25
|
+
}
|
|
26
|
+
async request(method, path, body, options) {
|
|
27
|
+
const url = `${this.baseUrl}${path}`;
|
|
28
|
+
const timeout = options?.timeout ?? this.defaultTimeout;
|
|
29
|
+
const maxRetries = options?.maxRetries ?? this.retryConfig.maxRetries;
|
|
30
|
+
const idempotencyKey = options?.idempotencyKey;
|
|
31
|
+
const headers = {
|
|
32
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
33
|
+
Accept: 'application/json',
|
|
34
|
+
'User-Agent': `pagci-node/${SDK_VERSION}`,
|
|
35
|
+
};
|
|
36
|
+
let serializedBody;
|
|
37
|
+
if (body !== undefined) {
|
|
38
|
+
headers['Content-Type'] = 'application/json';
|
|
39
|
+
serializedBody = JSON.stringify(body);
|
|
40
|
+
}
|
|
41
|
+
if (idempotencyKey) {
|
|
42
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
43
|
+
}
|
|
44
|
+
// ── Retry loop ─────────────────────────────────────────────────
|
|
45
|
+
let lastError;
|
|
46
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
47
|
+
// Wait before retries (not before the first attempt)
|
|
48
|
+
if (attempt > 0) {
|
|
49
|
+
const delay = retryDelay(attempt - 1, lastError?.status === 429
|
|
50
|
+
? lastError.rawResponse?.['retry-after']
|
|
51
|
+
: undefined, this.retryConfig);
|
|
52
|
+
await sleep(delay);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const res = await this.httpClient.request(method, url, headers, serializedBody, timeout);
|
|
56
|
+
// ── Success ──────────────────────────────────────────────
|
|
57
|
+
if (res.status >= 200 && res.status < 300) {
|
|
58
|
+
const parsed = (res.body.length > 0 ? JSON.parse(res.body) : {});
|
|
59
|
+
const response = Object.assign(parsed, {
|
|
60
|
+
_response: {
|
|
61
|
+
status: res.status,
|
|
62
|
+
headers: res.headers,
|
|
63
|
+
requestId: res.headers['x-request-id'] ?? '',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
// ── Error response ───────────────────────────────────────
|
|
69
|
+
let parsedBody;
|
|
70
|
+
try {
|
|
71
|
+
parsedBody = res.body.length > 0 ? JSON.parse(res.body) : {};
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
parsedBody = { detail: res.body };
|
|
75
|
+
}
|
|
76
|
+
const apiErr = errorFromResponse(res.status, parsedBody, res.headers);
|
|
77
|
+
if (attempt < maxRetries &&
|
|
78
|
+
shouldRetry(res.status, method, idempotencyKey !== undefined)) {
|
|
79
|
+
// Use Retry-After from response headers for delay calc
|
|
80
|
+
lastError = apiErr;
|
|
81
|
+
// Store retry-after on the error for delay calculation
|
|
82
|
+
if (res.headers['retry-after']) {
|
|
83
|
+
lastError._retryAfter =
|
|
84
|
+
res.headers['retry-after'];
|
|
85
|
+
}
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
throw apiErr;
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// Re-throw PagciError subclasses (already mapped)
|
|
92
|
+
if (err instanceof PagciError) {
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
// Connection / timeout errors
|
|
96
|
+
const error = err;
|
|
97
|
+
const isTimeout = error.code === 'ETIMEDOUT' ||
|
|
98
|
+
error.message?.includes('timed out');
|
|
99
|
+
if (isTimeout) {
|
|
100
|
+
const timeoutErr = new TimeoutError(timeout);
|
|
101
|
+
if (attempt < maxRetries) {
|
|
102
|
+
lastError = timeoutErr;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
throw timeoutErr;
|
|
106
|
+
}
|
|
107
|
+
if (isRetriableConnectionError(err) && attempt < maxRetries) {
|
|
108
|
+
lastError = new ConnectionError(error.message, error);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
throw new ConnectionError(error.message ?? 'Unknown error', error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Should be unreachable — the loop always throws or returns.
|
|
115
|
+
// But satisfy the compiler:
|
|
116
|
+
throw lastError ?? new ConnectionError('Request failed after retries');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
120
|
+
function sleep(ms) {
|
|
121
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=requestSender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestSender.js","sourceRoot":"","sources":["../../src/requestSender.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,GACX,MAAM,aAAa,CAAC;AA0BrB,wEAAwE;AAExE,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,wEAAwE;AAExE;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAEL;IACA;IACA;IACA;IACA;IALnB,YACmB,MAAc,EACd,OAAe,EACf,UAAsB,EACtB,WAAwB,EACxB,cAAsB;QAJtB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAY;QACtB,gBAAW,GAAX,WAAW,CAAa;QACxB,mBAAc,GAAd,cAAc,CAAQ;IACtC,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,IAAc,EACd,OAAwB;QAExB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QACtE,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,CAAC;QAE/C,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,cAAc,WAAW,EAAE;SAC1C,CAAC;QAEF,IAAI,cAAkC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC;QAC9C,CAAC;QAED,kEAAkE;QAElE,IAAI,SAAiC,CAAC;QAEtC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,qDAAqD;YACrD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,UAAU,CACtB,OAAO,GAAG,CAAC,EACX,SAAS,EAAE,MAAM,KAAK,GAAG;oBACvB,CAAC,CAAE,SAAS,CAAC,WAAkD,EAAE,CAC7D,aAAa,CACd;oBACH,CAAC,CAAC,SAAS,EACb,IAAI,CAAC,WAAW,CACjB,CAAC;gBACF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CACvC,MAAM,EACN,GAAG,EACH,OAAO,EACP,cAAc,EACd,OAAO,CACR,CAAC;gBAEF,4DAA4D;gBAC5D,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC1C,MAAM,MAAM,GAAG,CACb,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC;oBAEP,MAAM,QAAQ,GAAmB,MAAM,CAAC,MAAM,CAAC,MAAgB,EAAE;wBAC/D,SAAS,EAAE;4BACT,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,OAAO,EAAE,GAAG,CAAC,OAAO;4BACpB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE;yBAC7C;qBACF,CAAmB,CAAC;oBAErB,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,4DAA4D;gBAC5D,IAAI,UAAmB,CAAC;gBACxB,IAAI,CAAC;oBACH,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpC,CAAC;gBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEtE,IACE,OAAO,GAAG,UAAU;oBACpB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,SAAS,CAAC,EAC7D,CAAC;oBACD,uDAAuD;oBACvD,SAAS,GAAG,MAAM,CAAC;oBACnB,uDAAuD;oBACvD,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC9B,SAAmD,CAAC,WAAW;4BAC9D,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC/B,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,kDAAkD;gBAClD,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;oBAC9B,MAAM,GAAG,CAAC;gBACZ,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,KAAK,GAAG,GAAqD,CAAC;gBACpE,MAAM,SAAS,GACb,KAAK,CAAC,IAAI,KAAK,WAAW;oBAC1B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAEvC,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;oBAC7C,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;wBACzB,SAAS,GAAG,UAAU,CAAC;wBACvB,SAAS;oBACX,CAAC;oBACD,MAAM,UAAU,CAAC;gBACnB,CAAC;gBAED,IAAI,0BAA0B,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBAC5D,SAAS,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACtD,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,4BAA4B;QAC5B,MAAM,SAAS,IAAI,IAAI,eAAe,CAAC,8BAA8B,CAAC,CAAC;IACzE,CAAC;CACF;AAED,wEAAwE;AAExE,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RequestSender, ApiResponse, RequestOptions } from '../requestSender.js';
|
|
2
|
+
import type { Balance, TotalBalance, WalletListParams } from '../types/index.js';
|
|
3
|
+
import { Page } from '../pagination.js';
|
|
4
|
+
export declare class BalanceResource {
|
|
5
|
+
private readonly sender;
|
|
6
|
+
constructor(sender: RequestSender);
|
|
7
|
+
/** Get account-level total balance (sum across all wallets). */
|
|
8
|
+
getTotal(options?: RequestOptions): Promise<ApiResponse<TotalBalance>>;
|
|
9
|
+
/** Get balance for a specific wallet. */
|
|
10
|
+
getWallet(walletId: string, options?: RequestOptions): Promise<ApiResponse<Balance>>;
|
|
11
|
+
/** List all wallets with their balances. */
|
|
12
|
+
listWallets(params?: WalletListParams): Page<Balance>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=balance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/resources/balance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAElD,gEAAgE;IAC1D,QAAQ,CACZ,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IASrC,yCAAyC;IACnC,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAShC,4CAA4C;IAC5C,WAAW,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;CAQtD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// ── Balance resource ────────────────────────────────────────────────
|
|
2
|
+
import { Page } from '../pagination.js';
|
|
3
|
+
import { buildQueryString } from '../querystring.js';
|
|
4
|
+
export class BalanceResource {
|
|
5
|
+
sender;
|
|
6
|
+
constructor(sender) {
|
|
7
|
+
this.sender = sender;
|
|
8
|
+
}
|
|
9
|
+
/** Get account-level total balance (sum across all wallets). */
|
|
10
|
+
async getTotal(options) {
|
|
11
|
+
return this.sender.request('GET', '/user/balance', undefined, options);
|
|
12
|
+
}
|
|
13
|
+
/** Get balance for a specific wallet. */
|
|
14
|
+
async getWallet(walletId, options) {
|
|
15
|
+
return this.sender.request('GET', `/user/wallets/${walletId}/balance`, undefined, options);
|
|
16
|
+
}
|
|
17
|
+
/** List all wallets with their balances. */
|
|
18
|
+
listWallets(params) {
|
|
19
|
+
return new Page((cursor) => {
|
|
20
|
+
const query = buildQueryString({ ...params, cursor });
|
|
21
|
+
return this.sender
|
|
22
|
+
.request('GET', `/user/wallets${query}`)
|
|
23
|
+
.then((res) => res);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/resources/balance.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAKvE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,gEAAgE;IAChE,KAAK,CAAC,QAAQ,CACZ,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,KAAK,EACL,eAAe,EACf,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,SAAS,CACb,QAAgB,EAChB,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,KAAK,EACL,iBAAiB,QAAQ,UAAU,EACnC,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,WAAW,CAAC,MAAyB;QACnC,OAAO,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,MAAM;iBACf,OAAO,CAAwB,KAAK,EAAE,gBAAgB,KAAK,EAAE,CAAC;iBAC9D,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAA4B,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RequestSender, ApiResponse, RequestOptions } from '../requestSender.js';
|
|
2
|
+
import type { CreateDebtParams, CreateDebtResponse, DebtListItem, DebtListParams } from '../types/index.js';
|
|
3
|
+
import type { StatusResponse } from '../types/common.js';
|
|
4
|
+
import { Page } from '../pagination.js';
|
|
5
|
+
export declare class DebtsResource {
|
|
6
|
+
private readonly sender;
|
|
7
|
+
constructor(sender: RequestSender);
|
|
8
|
+
/** Create a new debt. */
|
|
9
|
+
create(params: CreateDebtParams, options?: RequestOptions): Promise<ApiResponse<CreateDebtResponse>>;
|
|
10
|
+
/** List debts with cursor-based pagination. */
|
|
11
|
+
list(params?: DebtListParams): Page<DebtListItem>;
|
|
12
|
+
/** Cancel a pending debt. */
|
|
13
|
+
cancel(id: string, options?: RequestOptions): Promise<ApiResponse<StatusResponse>>;
|
|
14
|
+
/** Reverse a paid debt. */
|
|
15
|
+
reverse(id: string, options?: RequestOptions): Promise<ApiResponse<StatusResponse>>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=debts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debts.d.ts","sourceRoot":"","sources":["../../../src/resources/debts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAElD,yBAAyB;IACnB,MAAM,CACV,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAS3C,+CAA+C;IAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC;IASjD,6BAA6B;IACvB,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IASvC,2BAA2B;IACrB,OAAO,CACX,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;CAQxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// ── Debts resource ──────────────────────────────────────────────────
|
|
2
|
+
import { Page } from '../pagination.js';
|
|
3
|
+
import { buildQueryString } from '../querystring.js';
|
|
4
|
+
export class DebtsResource {
|
|
5
|
+
sender;
|
|
6
|
+
constructor(sender) {
|
|
7
|
+
this.sender = sender;
|
|
8
|
+
}
|
|
9
|
+
/** Create a new debt. */
|
|
10
|
+
async create(params, options) {
|
|
11
|
+
return this.sender.request('POST', '/debts', params, options);
|
|
12
|
+
}
|
|
13
|
+
/** List debts with cursor-based pagination. */
|
|
14
|
+
list(params) {
|
|
15
|
+
return new Page((cursor) => {
|
|
16
|
+
const query = buildQueryString({ ...params, cursor });
|
|
17
|
+
return this.sender
|
|
18
|
+
.request('GET', `/debts${query}`)
|
|
19
|
+
.then((res) => res);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Cancel a pending debt. */
|
|
23
|
+
async cancel(id, options) {
|
|
24
|
+
return this.sender.request('DELETE', `/debts/${id}`, undefined, options);
|
|
25
|
+
}
|
|
26
|
+
/** Reverse a paid debt. */
|
|
27
|
+
async reverse(id, options) {
|
|
28
|
+
return this.sender.request('POST', `/debts/${id}/reverse`, undefined, options);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=debts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debts.js","sourceRoot":"","sources":["../../../src/resources/debts.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAUvE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,yBAAyB;IACzB,KAAK,CAAC,MAAM,CACV,MAAwB,EACxB,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,CACR,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,MAAuB;QAC1B,OAAO,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,MAAM;iBACf,OAAO,CAA6B,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;iBAC5D,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAiC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,MAAM,CACV,EAAU,EACV,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,QAAQ,EACR,UAAU,EAAE,EAAE,EACd,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,OAAO,CACX,EAAU,EACV,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,MAAM,EACN,UAAU,EAAE,UAAU,EACtB,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;CACF"}
|