@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.
Files changed (219) hide show
  1. package/dist/cjs/client.d.ts +65 -0
  2. package/dist/cjs/client.d.ts.map +1 -0
  3. package/dist/cjs/client.js +149 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/crypto/CryptoProvider.d.ts +25 -0
  6. package/dist/cjs/crypto/CryptoProvider.d.ts.map +1 -0
  7. package/dist/cjs/crypto/CryptoProvider.js +3 -0
  8. package/dist/cjs/crypto/CryptoProvider.js.map +1 -0
  9. package/dist/cjs/crypto/NodeCryptoProvider.d.ts +16 -0
  10. package/dist/cjs/crypto/NodeCryptoProvider.d.ts.map +1 -0
  11. package/dist/cjs/crypto/NodeCryptoProvider.js +36 -0
  12. package/dist/cjs/crypto/NodeCryptoProvider.js.map +1 -0
  13. package/dist/cjs/errors.d.ts +91 -0
  14. package/dist/cjs/errors.d.ts.map +1 -0
  15. package/dist/cjs/errors.js +171 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/idempotency.d.ts +14 -0
  18. package/dist/cjs/idempotency.d.ts.map +1 -0
  19. package/dist/cjs/idempotency.js +26 -0
  20. package/dist/cjs/idempotency.js.map +1 -0
  21. package/dist/cjs/index.d.ts +20 -0
  22. package/dist/cjs/index.d.ts.map +1 -0
  23. package/dist/cjs/index.js +48 -0
  24. package/dist/cjs/index.js.map +1 -0
  25. package/dist/cjs/net/HttpClient.d.ts +17 -0
  26. package/dist/cjs/net/HttpClient.d.ts.map +1 -0
  27. package/dist/cjs/net/HttpClient.js +3 -0
  28. package/dist/cjs/net/HttpClient.js.map +1 -0
  29. package/dist/cjs/net/NodeHttpClient.d.ts +13 -0
  30. package/dist/cjs/net/NodeHttpClient.d.ts.map +1 -0
  31. package/dist/cjs/net/NodeHttpClient.js +132 -0
  32. package/dist/cjs/net/NodeHttpClient.js.map +1 -0
  33. package/dist/cjs/package.json +1 -0
  34. package/dist/cjs/pagination.d.ts +53 -0
  35. package/dist/cjs/pagination.d.ts.map +1 -0
  36. package/dist/cjs/pagination.js +99 -0
  37. package/dist/cjs/pagination.js.map +1 -0
  38. package/dist/cjs/querystring.d.ts +8 -0
  39. package/dist/cjs/querystring.d.ts.map +1 -0
  40. package/dist/cjs/querystring.js +20 -0
  41. package/dist/cjs/querystring.js.map +1 -0
  42. package/dist/cjs/requestSender.d.ts +40 -0
  43. package/dist/cjs/requestSender.d.ts.map +1 -0
  44. package/dist/cjs/requestSender.js +127 -0
  45. package/dist/cjs/requestSender.js.map +1 -0
  46. package/dist/cjs/resources/balance.d.ts +14 -0
  47. package/dist/cjs/resources/balance.d.ts.map +1 -0
  48. package/dist/cjs/resources/balance.js +31 -0
  49. package/dist/cjs/resources/balance.js.map +1 -0
  50. package/dist/cjs/resources/debts.d.ts +17 -0
  51. package/dist/cjs/resources/debts.d.ts.map +1 -0
  52. package/dist/cjs/resources/debts.js +35 -0
  53. package/dist/cjs/resources/debts.js.map +1 -0
  54. package/dist/cjs/resources/payments.d.ts +44 -0
  55. package/dist/cjs/resources/payments.d.ts.map +1 -0
  56. package/dist/cjs/resources/payments.js +66 -0
  57. package/dist/cjs/resources/payments.js.map +1 -0
  58. package/dist/cjs/resources/tokens.d.ts +22 -0
  59. package/dist/cjs/resources/tokens.d.ts.map +1 -0
  60. package/dist/cjs/resources/tokens.js +40 -0
  61. package/dist/cjs/resources/tokens.js.map +1 -0
  62. package/dist/cjs/resources/webhookEndpoints.d.ts +27 -0
  63. package/dist/cjs/resources/webhookEndpoints.d.ts.map +1 -0
  64. package/dist/cjs/resources/webhookEndpoints.js +55 -0
  65. package/dist/cjs/resources/webhookEndpoints.js.map +1 -0
  66. package/dist/cjs/resources/withdrawals.d.ts +23 -0
  67. package/dist/cjs/resources/withdrawals.d.ts.map +1 -0
  68. package/dist/cjs/resources/withdrawals.js +46 -0
  69. package/dist/cjs/resources/withdrawals.js.map +1 -0
  70. package/dist/cjs/retry.d.ts +34 -0
  71. package/dist/cjs/retry.d.ts.map +1 -0
  72. package/dist/cjs/retry.js +72 -0
  73. package/dist/cjs/retry.js.map +1 -0
  74. package/dist/cjs/types/balance.d.ts +35 -0
  75. package/dist/cjs/types/balance.d.ts.map +1 -0
  76. package/dist/cjs/types/balance.js +5 -0
  77. package/dist/cjs/types/balance.js.map +1 -0
  78. package/dist/cjs/types/common.d.ts +57 -0
  79. package/dist/cjs/types/common.d.ts.map +1 -0
  80. package/dist/cjs/types/common.js +5 -0
  81. package/dist/cjs/types/common.js.map +1 -0
  82. package/dist/cjs/types/debt.d.ts +49 -0
  83. package/dist/cjs/types/debt.d.ts.map +1 -0
  84. package/dist/cjs/types/debt.js +5 -0
  85. package/dist/cjs/types/debt.js.map +1 -0
  86. package/dist/cjs/types/error.d.ts +112 -0
  87. package/dist/cjs/types/error.d.ts.map +1 -0
  88. package/dist/cjs/types/error.js +132 -0
  89. package/dist/cjs/types/error.js.map +1 -0
  90. package/dist/cjs/types/index.d.ts +10 -0
  91. package/dist/cjs/types/index.d.ts.map +1 -0
  92. package/dist/cjs/types/index.js +9 -0
  93. package/dist/cjs/types/index.js.map +1 -0
  94. package/dist/cjs/types/payment.d.ts +246 -0
  95. package/dist/cjs/types/payment.d.ts.map +1 -0
  96. package/dist/cjs/types/payment.js +5 -0
  97. package/dist/cjs/types/payment.js.map +1 -0
  98. package/dist/cjs/types/token.d.ts +39 -0
  99. package/dist/cjs/types/token.d.ts.map +1 -0
  100. package/dist/cjs/types/token.js +5 -0
  101. package/dist/cjs/types/token.js.map +1 -0
  102. package/dist/cjs/types/webhook.d.ts +102 -0
  103. package/dist/cjs/types/webhook.d.ts.map +1 -0
  104. package/dist/cjs/types/webhook.js +18 -0
  105. package/dist/cjs/types/webhook.js.map +1 -0
  106. package/dist/cjs/types/withdrawal.d.ts +89 -0
  107. package/dist/cjs/types/withdrawal.d.ts.map +1 -0
  108. package/dist/cjs/types/withdrawal.js +5 -0
  109. package/dist/cjs/types/withdrawal.js.map +1 -0
  110. package/dist/esm/client.d.ts +65 -0
  111. package/dist/esm/client.d.ts.map +1 -0
  112. package/dist/esm/client.js +145 -0
  113. package/dist/esm/client.js.map +1 -0
  114. package/dist/esm/crypto/CryptoProvider.d.ts +25 -0
  115. package/dist/esm/crypto/CryptoProvider.d.ts.map +1 -0
  116. package/dist/esm/crypto/CryptoProvider.js +2 -0
  117. package/dist/esm/crypto/CryptoProvider.js.map +1 -0
  118. package/dist/esm/crypto/NodeCryptoProvider.d.ts +16 -0
  119. package/dist/esm/crypto/NodeCryptoProvider.d.ts.map +1 -0
  120. package/dist/esm/crypto/NodeCryptoProvider.js +32 -0
  121. package/dist/esm/crypto/NodeCryptoProvider.js.map +1 -0
  122. package/dist/esm/errors.d.ts +91 -0
  123. package/dist/esm/errors.d.ts.map +1 -0
  124. package/dist/esm/errors.js +155 -0
  125. package/dist/esm/errors.js.map +1 -0
  126. package/dist/esm/idempotency.d.ts +14 -0
  127. package/dist/esm/idempotency.d.ts.map +1 -0
  128. package/dist/esm/idempotency.js +23 -0
  129. package/dist/esm/idempotency.js.map +1 -0
  130. package/dist/esm/index.d.ts +20 -0
  131. package/dist/esm/index.d.ts.map +1 -0
  132. package/dist/esm/index.js +19 -0
  133. package/dist/esm/index.js.map +1 -0
  134. package/dist/esm/net/HttpClient.d.ts +17 -0
  135. package/dist/esm/net/HttpClient.d.ts.map +1 -0
  136. package/dist/esm/net/HttpClient.js +2 -0
  137. package/dist/esm/net/HttpClient.js.map +1 -0
  138. package/dist/esm/net/NodeHttpClient.d.ts +13 -0
  139. package/dist/esm/net/NodeHttpClient.d.ts.map +1 -0
  140. package/dist/esm/net/NodeHttpClient.js +95 -0
  141. package/dist/esm/net/NodeHttpClient.js.map +1 -0
  142. package/dist/esm/package.json +1 -0
  143. package/dist/esm/pagination.d.ts +53 -0
  144. package/dist/esm/pagination.d.ts.map +1 -0
  145. package/dist/esm/pagination.js +95 -0
  146. package/dist/esm/pagination.js.map +1 -0
  147. package/dist/esm/querystring.d.ts +8 -0
  148. package/dist/esm/querystring.d.ts.map +1 -0
  149. package/dist/esm/querystring.js +17 -0
  150. package/dist/esm/querystring.js.map +1 -0
  151. package/dist/esm/requestSender.d.ts +40 -0
  152. package/dist/esm/requestSender.d.ts.map +1 -0
  153. package/dist/esm/requestSender.js +123 -0
  154. package/dist/esm/requestSender.js.map +1 -0
  155. package/dist/esm/resources/balance.d.ts +14 -0
  156. package/dist/esm/resources/balance.d.ts.map +1 -0
  157. package/dist/esm/resources/balance.js +27 -0
  158. package/dist/esm/resources/balance.js.map +1 -0
  159. package/dist/esm/resources/debts.d.ts +17 -0
  160. package/dist/esm/resources/debts.d.ts.map +1 -0
  161. package/dist/esm/resources/debts.js +31 -0
  162. package/dist/esm/resources/debts.js.map +1 -0
  163. package/dist/esm/resources/payments.d.ts +44 -0
  164. package/dist/esm/resources/payments.d.ts.map +1 -0
  165. package/dist/esm/resources/payments.js +62 -0
  166. package/dist/esm/resources/payments.js.map +1 -0
  167. package/dist/esm/resources/tokens.d.ts +22 -0
  168. package/dist/esm/resources/tokens.d.ts.map +1 -0
  169. package/dist/esm/resources/tokens.js +36 -0
  170. package/dist/esm/resources/tokens.js.map +1 -0
  171. package/dist/esm/resources/webhookEndpoints.d.ts +27 -0
  172. package/dist/esm/resources/webhookEndpoints.d.ts.map +1 -0
  173. package/dist/esm/resources/webhookEndpoints.js +51 -0
  174. package/dist/esm/resources/webhookEndpoints.js.map +1 -0
  175. package/dist/esm/resources/withdrawals.d.ts +23 -0
  176. package/dist/esm/resources/withdrawals.d.ts.map +1 -0
  177. package/dist/esm/resources/withdrawals.js +42 -0
  178. package/dist/esm/resources/withdrawals.js.map +1 -0
  179. package/dist/esm/retry.d.ts +34 -0
  180. package/dist/esm/retry.d.ts.map +1 -0
  181. package/dist/esm/retry.js +66 -0
  182. package/dist/esm/retry.js.map +1 -0
  183. package/dist/esm/types/balance.d.ts +35 -0
  184. package/dist/esm/types/balance.d.ts.map +1 -0
  185. package/dist/esm/types/balance.js +4 -0
  186. package/dist/esm/types/balance.js.map +1 -0
  187. package/dist/esm/types/common.d.ts +57 -0
  188. package/dist/esm/types/common.d.ts.map +1 -0
  189. package/dist/esm/types/common.js +4 -0
  190. package/dist/esm/types/common.js.map +1 -0
  191. package/dist/esm/types/debt.d.ts +49 -0
  192. package/dist/esm/types/debt.d.ts.map +1 -0
  193. package/dist/esm/types/debt.js +4 -0
  194. package/dist/esm/types/debt.js.map +1 -0
  195. package/dist/esm/types/error.d.ts +112 -0
  196. package/dist/esm/types/error.d.ts.map +1 -0
  197. package/dist/esm/types/error.js +129 -0
  198. package/dist/esm/types/error.js.map +1 -0
  199. package/dist/esm/types/index.d.ts +10 -0
  200. package/dist/esm/types/index.d.ts.map +1 -0
  201. package/dist/esm/types/index.js +4 -0
  202. package/dist/esm/types/index.js.map +1 -0
  203. package/dist/esm/types/payment.d.ts +246 -0
  204. package/dist/esm/types/payment.d.ts.map +1 -0
  205. package/dist/esm/types/payment.js +4 -0
  206. package/dist/esm/types/payment.js.map +1 -0
  207. package/dist/esm/types/token.d.ts +39 -0
  208. package/dist/esm/types/token.d.ts.map +1 -0
  209. package/dist/esm/types/token.js +4 -0
  210. package/dist/esm/types/token.js.map +1 -0
  211. package/dist/esm/types/webhook.d.ts +102 -0
  212. package/dist/esm/types/webhook.d.ts.map +1 -0
  213. package/dist/esm/types/webhook.js +15 -0
  214. package/dist/esm/types/webhook.js.map +1 -0
  215. package/dist/esm/types/withdrawal.d.ts +89 -0
  216. package/dist/esm/types/withdrawal.d.ts.map +1 -0
  217. package/dist/esm/types/withdrawal.js +4 -0
  218. package/dist/esm/types/withdrawal.js.map +1 -0
  219. package/package.json +49 -0
@@ -0,0 +1,65 @@
1
+ import { PaymentsResource } from './resources/payments.js';
2
+ import { WithdrawalsResource } from './resources/withdrawals.js';
3
+ import { DebtsResource } from './resources/debts.js';
4
+ import { BalanceResource } from './resources/balance.js';
5
+ import { WebhookEndpointsResource } from './resources/webhookEndpoints.js';
6
+ import { TokensResource } from './resources/tokens.js';
7
+ export interface PagciConfig {
8
+ /** API base URL (default: 'https://api.pagci.com'). */
9
+ baseUrl?: string;
10
+ /** Maximum automatic retries on transient failures (default: 2). */
11
+ maxRetries?: number;
12
+ /** Default request timeout in ms (default: 30 000). */
13
+ timeout?: number;
14
+ /** Custom HTTP agent (e.g. for proxies or custom TLS). */
15
+ httpAgent?: unknown;
16
+ }
17
+ export interface WebhookEvent {
18
+ /** Verified, parsed webhook payload. */
19
+ payload: unknown;
20
+ /** Signature header value. */
21
+ signature: string;
22
+ /** Timestamp from the webhook header. */
23
+ timestamp: string;
24
+ }
25
+ /**
26
+ * Main entry point for the PAGCI Node.js SDK.
27
+ *
28
+ * ```ts
29
+ * const pagci = new Pagci('sk_live_...');
30
+ * const payment = await pagci.payments.create({ ... });
31
+ * ```
32
+ */
33
+ export declare class Pagci {
34
+ private readonly _sender;
35
+ private readonly _crypto;
36
+ private _payments?;
37
+ get payments(): PaymentsResource;
38
+ private _withdrawals?;
39
+ get withdrawals(): WithdrawalsResource;
40
+ private _debts?;
41
+ get debts(): DebtsResource;
42
+ private _balance?;
43
+ get balance(): BalanceResource;
44
+ private _webhookEndpoints?;
45
+ get webhookEndpoints(): WebhookEndpointsResource;
46
+ private _tokens?;
47
+ get tokens(): TokensResource;
48
+ get webhooks(): {
49
+ /**
50
+ * Verify webhook signature and return the parsed event (sync).
51
+ *
52
+ * @param rawBody - The raw request body as a string.
53
+ * @param signature - Value of the `X-Webhook-Signature` header.
54
+ * @param secret - Your webhook signing secret (`whsec_...`).
55
+ * @param tolerance - Max age of the event in seconds (default 300 = 5 min).
56
+ */
57
+ constructEvent(rawBody: string, signature: string, secret: string, tolerance?: number): WebhookEvent;
58
+ /**
59
+ * Async variant of constructEvent (for future WebCrypto compat).
60
+ */
61
+ constructEventAsync(rawBody: string, signature: string, secret: string, tolerance?: number): Promise<WebhookEvent>;
62
+ };
63
+ constructor(apiKey: string, config?: PagciConfig);
64
+ }
65
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;;GAOG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IAIzC,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;IAED,OAAO,CAAC,YAAY,CAAC,CAAsB;IAC3C,IAAI,WAAW,IAAI,mBAAmB,CAErC;IAED,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,IAAI,KAAK,IAAI,aAAa,CAEzB;IAED,OAAO,CAAC,QAAQ,CAAC,CAAkB;IACnC,IAAI,OAAO,IAAI,eAAe,CAE7B;IAED,OAAO,CAAC,iBAAiB,CAAC,CAA2B;IACrD,IAAI,gBAAgB,IAAI,wBAAwB,CAI/C;IAED,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAID,IAAI,QAAQ;QAIR;;;;;;;WAOG;gCAEQ,MAAM,aACJ,MAAM,UACT,MAAM,uBAEb,YAAY;QAIf;;WAEG;qCAEQ,MAAM,aACJ,MAAM,UACT,MAAM,uBAEb,OAAO,CAAC,YAAY,CAAC;MA0B3B;gBAIW,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;CAwBjD"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Pagci = void 0;
4
+ const NodeCryptoProvider_js_1 = require("./crypto/NodeCryptoProvider.js");
5
+ const NodeHttpClient_js_1 = require("./net/NodeHttpClient.js");
6
+ const requestSender_js_1 = require("./requestSender.js");
7
+ const retry_js_1 = require("./retry.js");
8
+ const errors_js_1 = require("./errors.js");
9
+ // ── Resource classes ─────────────────────────────────────────────────
10
+ const payments_js_1 = require("./resources/payments.js");
11
+ const withdrawals_js_1 = require("./resources/withdrawals.js");
12
+ const debts_js_1 = require("./resources/debts.js");
13
+ const balance_js_1 = require("./resources/balance.js");
14
+ const webhookEndpoints_js_1 = require("./resources/webhookEndpoints.js");
15
+ const tokens_js_1 = require("./resources/tokens.js");
16
+ // ── Client ───────────────────────────────────────────────────────────
17
+ const DEFAULT_BASE_URL = 'https://api.pagci.com';
18
+ const DEFAULT_TIMEOUT = 30_000;
19
+ /**
20
+ * Main entry point for the PAGCI Node.js SDK.
21
+ *
22
+ * ```ts
23
+ * const pagci = new Pagci('sk_live_...');
24
+ * const payment = await pagci.payments.create({ ... });
25
+ * ```
26
+ */
27
+ class Pagci {
28
+ _sender;
29
+ _crypto;
30
+ // ── Lazy resource singletons (Square / Fern pattern) ─────────────
31
+ _payments;
32
+ get payments() {
33
+ return (this._payments ??= new payments_js_1.PaymentsResource(this._sender));
34
+ }
35
+ _withdrawals;
36
+ get withdrawals() {
37
+ return (this._withdrawals ??= new withdrawals_js_1.WithdrawalsResource(this._sender));
38
+ }
39
+ _debts;
40
+ get debts() {
41
+ return (this._debts ??= new debts_js_1.DebtsResource(this._sender));
42
+ }
43
+ _balance;
44
+ get balance() {
45
+ return (this._balance ??= new balance_js_1.BalanceResource(this._sender));
46
+ }
47
+ _webhookEndpoints;
48
+ get webhookEndpoints() {
49
+ return (this._webhookEndpoints ??= new webhookEndpoints_js_1.WebhookEndpointsResource(this._sender));
50
+ }
51
+ _tokens;
52
+ get tokens() {
53
+ return (this._tokens ??= new tokens_js_1.TokensResource(this._sender));
54
+ }
55
+ // ── Webhook verification (utility, not a REST resource) ──────────
56
+ get webhooks() {
57
+ const crypto = this._crypto;
58
+ return {
59
+ /**
60
+ * Verify webhook signature and return the parsed event (sync).
61
+ *
62
+ * @param rawBody - The raw request body as a string.
63
+ * @param signature - Value of the `X-Webhook-Signature` header.
64
+ * @param secret - Your webhook signing secret (`whsec_...`).
65
+ * @param tolerance - Max age of the event in seconds (default 300 = 5 min).
66
+ */
67
+ constructEvent(rawBody, signature, secret, tolerance = 300) {
68
+ return verifyAndParse(crypto, rawBody, signature, secret, tolerance);
69
+ },
70
+ /**
71
+ * Async variant of constructEvent (for future WebCrypto compat).
72
+ */
73
+ async constructEventAsync(rawBody, signature, secret, tolerance = 300) {
74
+ // Parse header parts first (sync)
75
+ const { timestamp, sig } = parseSignatureHeader(signature);
76
+ // Verify age
77
+ assertTimestampWithinTolerance(timestamp, tolerance);
78
+ // Async HMAC
79
+ const expectedSig = await crypto.computeHmacSha256Async(secret, `${timestamp}.${rawBody}`);
80
+ if (!crypto.timingSafeEqual(sig, expectedSig)) {
81
+ throw new errors_js_1.SignatureVerificationError('Webhook signature verification failed');
82
+ }
83
+ return {
84
+ payload: JSON.parse(rawBody),
85
+ signature: sig,
86
+ timestamp,
87
+ };
88
+ },
89
+ };
90
+ }
91
+ // ── Constructor ──────────────────────────────────────────────────
92
+ constructor(apiKey, config) {
93
+ if (!apiKey || typeof apiKey !== 'string') {
94
+ throw new Error('API key is required. Pass it as the first argument: new Pagci("sk_live_...")');
95
+ }
96
+ const baseUrl = (config?.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, '');
97
+ const timeout = config?.timeout ?? DEFAULT_TIMEOUT;
98
+ const maxRetries = config?.maxRetries ?? retry_js_1.DEFAULT_RETRY_CONFIG.maxRetries;
99
+ const httpClient = new NodeHttpClient_js_1.NodeHttpClient(config?.httpAgent);
100
+ this._crypto = new NodeCryptoProvider_js_1.NodeCryptoProvider();
101
+ this._sender = new requestSender_js_1.RequestSender(apiKey, baseUrl, httpClient, { ...retry_js_1.DEFAULT_RETRY_CONFIG, maxRetries }, timeout);
102
+ }
103
+ }
104
+ exports.Pagci = Pagci;
105
+ // ── Webhook verification internals ───────────────────────────────────
106
+ /**
107
+ * Expected header format: `t=<unix_timestamp>,v1=<hex_signature>`
108
+ */
109
+ function parseSignatureHeader(header) {
110
+ const parts = header.split(',');
111
+ let timestamp = '';
112
+ let sig = '';
113
+ for (const part of parts) {
114
+ const [key, value] = part.split('=', 2);
115
+ if (key === 't')
116
+ timestamp = value ?? '';
117
+ if (key === 'v1')
118
+ sig = value ?? '';
119
+ }
120
+ if (!timestamp || !sig) {
121
+ throw new errors_js_1.SignatureVerificationError('Invalid webhook signature header format. Expected "t=<timestamp>,v1=<signature>".');
122
+ }
123
+ return { timestamp, sig };
124
+ }
125
+ function assertTimestampWithinTolerance(timestamp, toleranceSeconds) {
126
+ const ts = Number(timestamp);
127
+ if (Number.isNaN(ts)) {
128
+ throw new errors_js_1.SignatureVerificationError('Invalid timestamp in webhook signature header.');
129
+ }
130
+ const age = Math.abs(Math.floor(Date.now() / 1000) - ts);
131
+ if (age > toleranceSeconds) {
132
+ throw new errors_js_1.SignatureVerificationError(`Webhook timestamp too old (${age}s > ${toleranceSeconds}s tolerance). ` +
133
+ 'This may indicate a replay attack.');
134
+ }
135
+ }
136
+ function verifyAndParse(crypto, rawBody, signatureHeader, secret, tolerance) {
137
+ const { timestamp, sig } = parseSignatureHeader(signatureHeader);
138
+ assertTimestampWithinTolerance(timestamp, tolerance);
139
+ const expectedSig = crypto.computeHmacSha256(secret, `${timestamp}.${rawBody}`);
140
+ if (!crypto.timingSafeEqual(sig, expectedSig)) {
141
+ throw new errors_js_1.SignatureVerificationError('Webhook signature verification failed');
142
+ }
143
+ return {
144
+ payload: JSON.parse(rawBody),
145
+ signature: sig,
146
+ timestamp,
147
+ };
148
+ }
149
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Abstract interface for cryptographic operations.
3
+ * Allows swapping implementations (Node.js native, WebCrypto, etc.)
4
+ * without changing consuming code.
5
+ */
6
+ export interface CryptoProvider {
7
+ /**
8
+ * Compute HMAC-SHA256 synchronously.
9
+ * @returns hex-encoded digest
10
+ */
11
+ computeHmacSha256(key: string, data: string): string;
12
+ /**
13
+ * Compute HMAC-SHA256 asynchronously.
14
+ * Identical result to sync variant — exists for API consistency
15
+ * and future WebCrypto compatibility (SubtleCrypto is async-only).
16
+ * @returns hex-encoded digest
17
+ */
18
+ computeHmacSha256Async(key: string, data: string): Promise<string>;
19
+ /**
20
+ * Constant-time string comparison to prevent timing attacks.
21
+ * Both strings MUST be compared in their entirety regardless of length.
22
+ */
23
+ timingSafeEqual(a: string, b: string): boolean;
24
+ }
25
+ //# sourceMappingURL=CryptoProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CryptoProvider.d.ts","sourceRoot":"","sources":["../../../src/crypto/CryptoProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAErD;;;;;OAKG;IACH,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnE;;;OAGG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAChD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=CryptoProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CryptoProvider.js","sourceRoot":"","sources":["../../../src/crypto/CryptoProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { CryptoProvider } from './CryptoProvider.js';
2
+ /**
3
+ * Node.js native implementation of CryptoProvider using `node:crypto`.
4
+ * Zero runtime dependencies — uses only built-in modules.
5
+ */
6
+ export declare class NodeCryptoProvider implements CryptoProvider {
7
+ computeHmacSha256(key: string, data: string): string;
8
+ computeHmacSha256Async(key: string, data: string): Promise<string>;
9
+ /**
10
+ * Constant-time comparison. If lengths differ, we still compare
11
+ * fixed-size HMAC digests of both strings to avoid leaking length
12
+ * information through timing.
13
+ */
14
+ timingSafeEqual(a: string, b: string): boolean;
15
+ }
16
+ //# sourceMappingURL=NodeCryptoProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeCryptoProvider.d.ts","sourceRoot":"","sources":["../../../src/crypto/NodeCryptoProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAIpD,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlE;;;;OAIG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;CAe/C"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NodeCryptoProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ /**
6
+ * Node.js native implementation of CryptoProvider using `node:crypto`.
7
+ * Zero runtime dependencies — uses only built-in modules.
8
+ */
9
+ class NodeCryptoProvider {
10
+ computeHmacSha256(key, data) {
11
+ return (0, node_crypto_1.createHmac)('sha256', key).update(data, 'utf8').digest('hex');
12
+ }
13
+ computeHmacSha256Async(key, data) {
14
+ return Promise.resolve(this.computeHmacSha256(key, data));
15
+ }
16
+ /**
17
+ * Constant-time comparison. If lengths differ, we still compare
18
+ * fixed-size HMAC digests of both strings to avoid leaking length
19
+ * information through timing.
20
+ */
21
+ timingSafeEqual(a, b) {
22
+ const bufA = Buffer.from(a, 'utf8');
23
+ const bufB = Buffer.from(b, 'utf8');
24
+ if (bufA.length !== bufB.length) {
25
+ // Derive fixed-size digests so the comparison always runs
26
+ // in constant time, even with different-length inputs.
27
+ const hmacA = (0, node_crypto_1.createHmac)('sha256', 'len-guard').update(bufA).digest();
28
+ const hmacB = (0, node_crypto_1.createHmac)('sha256', 'len-guard').update(bufB).digest();
29
+ (0, node_crypto_1.timingSafeEqual)(hmacA, hmacB);
30
+ return false;
31
+ }
32
+ return (0, node_crypto_1.timingSafeEqual)(bufA, bufB);
33
+ }
34
+ }
35
+ exports.NodeCryptoProvider = NodeCryptoProvider;
36
+ //# sourceMappingURL=NodeCryptoProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeCryptoProvider.js","sourceRoot":"","sources":["../../../src/crypto/NodeCryptoProvider.ts"],"names":[],"mappings":";;;AAAA,6CAAmF;AAGnF;;;GAGG;AACH,MAAa,kBAAkB;IAC7B,iBAAiB,CAAC,GAAW,EAAE,IAAY;QACzC,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,sBAAsB,CAAC,GAAW,EAAE,IAAY;QAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,CAAS,EAAE,CAAS;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,0DAA0D;YAC1D,uDAAuD;YACvD,MAAM,KAAK,GAAG,IAAA,wBAAU,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,IAAA,wBAAU,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACtE,IAAA,6BAAqB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAA,6BAAqB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF;AA7BD,gDA6BC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Base error for every error surfaced by the PAGCI SDK.
3
+ * Mirrors the RFC 9457 Problem Details structure returned by the API.
4
+ */
5
+ export declare class PagciError extends Error {
6
+ /** RFC 9457 `type` URI identifying the error category. */
7
+ readonly type: string;
8
+ /** RFC 9457 human-readable title. */
9
+ readonly title: string;
10
+ /** HTTP status code (0 for network-level errors). */
11
+ readonly status: number;
12
+ /** Machine-readable error code (e.g. "invalid_amount"). */
13
+ readonly code: string;
14
+ /** Field that triggered the error, if applicable. */
15
+ readonly field?: string;
16
+ /** Server-assigned request ID for support correlation. */
17
+ readonly requestId?: string;
18
+ /** Raw deserialized response body for debugging. */
19
+ readonly rawResponse?: unknown;
20
+ constructor(params: {
21
+ message: string;
22
+ type?: string;
23
+ title?: string;
24
+ status: number;
25
+ code?: string;
26
+ field?: string;
27
+ requestId?: string;
28
+ rawResponse?: unknown;
29
+ });
30
+ }
31
+ /** 401 — Missing or invalid API key. */
32
+ export declare class AuthenticationError extends PagciError {
33
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
34
+ }
35
+ /** 403 — Valid credentials but insufficient permissions. */
36
+ export declare class ForbiddenError extends PagciError {
37
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
38
+ }
39
+ /** 404 — Resource not found. */
40
+ export declare class NotFoundError extends PagciError {
41
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
42
+ }
43
+ /** 400 — Validation failure (bad input). */
44
+ export declare class ValidationError extends PagciError {
45
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
46
+ }
47
+ /** 409 — Conflict (e.g. duplicate idempotency key with different params). */
48
+ export declare class ConflictError extends PagciError {
49
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
50
+ }
51
+ /** 422 — Business rule violation (e.g. insufficient wallet balance). */
52
+ export declare class InsufficientBalanceError extends PagciError {
53
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
54
+ }
55
+ /** 429 — Rate limit exceeded. */
56
+ export declare class RateLimitError extends PagciError {
57
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
58
+ }
59
+ /** 500+ — Unexpected server error. */
60
+ export declare class ApiError extends PagciError {
61
+ constructor(params: ConstructorParameters<typeof PagciError>[0]);
62
+ }
63
+ /** Network-level failure (ECONNRESET, ECONNREFUSED, etc.). */
64
+ export declare class ConnectionError extends PagciError {
65
+ constructor(message: string, cause?: Error);
66
+ }
67
+ /** Request exceeded the configured timeout. */
68
+ export declare class TimeoutError extends PagciError {
69
+ constructor(timeout: number);
70
+ }
71
+ /** Webhook signature verification failed — reject the payload. */
72
+ export declare class SignatureVerificationError extends PagciError {
73
+ constructor(message: string);
74
+ }
75
+ /**
76
+ * Build the appropriate PagciError subclass from an HTTP response.
77
+ *
78
+ * The response body is expected to follow RFC 9457 Problem Details:
79
+ * ```json
80
+ * {
81
+ * "type": "https://api.pagci.com/errors/validation",
82
+ * "title": "Validation Error",
83
+ * "status": 400,
84
+ * "detail": "amount must be positive",
85
+ * "code": "invalid_amount",
86
+ * "field": "amount"
87
+ * }
88
+ * ```
89
+ */
90
+ export declare function errorFromResponse(status: number, body: unknown, headers: Record<string, string>): PagciError;
91
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;gBAEnB,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;CAcF;AAID,wCAAwC;AACxC,qBAAa,mBAAoB,SAAQ,UAAU;gBACrC,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,4DAA4D;AAC5D,qBAAa,cAAe,SAAQ,UAAU;gBAChC,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,gCAAgC;AAChC,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,4CAA4C;AAC5C,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,6EAA6E;AAC7E,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,wEAAwE;AACxE,qBAAa,wBAAyB,SAAQ,UAAU;gBAC1C,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,iCAAiC;AACjC,qBAAa,cAAe,SAAQ,UAAU;gBAChC,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,sCAAsC;AACtC,qBAAa,QAAS,SAAQ,UAAU;gBAC1B,MAAM,EAAE,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;CAGhE;AAED,8DAA8D;AAC9D,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAI3C;AAED,+CAA+C;AAC/C,qBAAa,YAAa,SAAQ,UAAU;gBAC9B,OAAO,EAAE,MAAM;CAO5B;AAED,kEAAkE;AAClE,qBAAa,0BAA2B,SAAQ,UAAU;gBAC5C,OAAO,EAAE,MAAM;CAG5B;AAeD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,UAAU,CA2BZ"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ // ── Base error ───────────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SignatureVerificationError = exports.TimeoutError = exports.ConnectionError = exports.ApiError = exports.RateLimitError = exports.InsufficientBalanceError = exports.ConflictError = exports.ValidationError = exports.NotFoundError = exports.ForbiddenError = exports.AuthenticationError = exports.PagciError = void 0;
5
+ exports.errorFromResponse = errorFromResponse;
6
+ /**
7
+ * Base error for every error surfaced by the PAGCI SDK.
8
+ * Mirrors the RFC 9457 Problem Details structure returned by the API.
9
+ */
10
+ class PagciError extends Error {
11
+ /** RFC 9457 `type` URI identifying the error category. */
12
+ type;
13
+ /** RFC 9457 human-readable title. */
14
+ title;
15
+ /** HTTP status code (0 for network-level errors). */
16
+ status;
17
+ /** Machine-readable error code (e.g. "invalid_amount"). */
18
+ code;
19
+ /** Field that triggered the error, if applicable. */
20
+ field;
21
+ /** Server-assigned request ID for support correlation. */
22
+ requestId;
23
+ /** Raw deserialized response body for debugging. */
24
+ rawResponse;
25
+ constructor(params) {
26
+ super(params.message);
27
+ this.name = this.constructor.name;
28
+ this.type = params.type ?? 'about:blank';
29
+ this.title = params.title ?? params.message;
30
+ this.status = params.status;
31
+ this.code = params.code ?? 'unknown';
32
+ this.field = params.field;
33
+ this.requestId = params.requestId;
34
+ this.rawResponse = params.rawResponse;
35
+ // Maintain proper prototype chain for instanceof checks
36
+ Object.setPrototypeOf(this, new.target.prototype);
37
+ }
38
+ }
39
+ exports.PagciError = PagciError;
40
+ // ── HTTP-status subclasses ───────────────────────────────────────────
41
+ /** 401 — Missing or invalid API key. */
42
+ class AuthenticationError extends PagciError {
43
+ constructor(params) {
44
+ super(params);
45
+ }
46
+ }
47
+ exports.AuthenticationError = AuthenticationError;
48
+ /** 403 — Valid credentials but insufficient permissions. */
49
+ class ForbiddenError extends PagciError {
50
+ constructor(params) {
51
+ super(params);
52
+ }
53
+ }
54
+ exports.ForbiddenError = ForbiddenError;
55
+ /** 404 — Resource not found. */
56
+ class NotFoundError extends PagciError {
57
+ constructor(params) {
58
+ super(params);
59
+ }
60
+ }
61
+ exports.NotFoundError = NotFoundError;
62
+ /** 400 — Validation failure (bad input). */
63
+ class ValidationError extends PagciError {
64
+ constructor(params) {
65
+ super(params);
66
+ }
67
+ }
68
+ exports.ValidationError = ValidationError;
69
+ /** 409 — Conflict (e.g. duplicate idempotency key with different params). */
70
+ class ConflictError extends PagciError {
71
+ constructor(params) {
72
+ super(params);
73
+ }
74
+ }
75
+ exports.ConflictError = ConflictError;
76
+ /** 422 — Business rule violation (e.g. insufficient wallet balance). */
77
+ class InsufficientBalanceError extends PagciError {
78
+ constructor(params) {
79
+ super(params);
80
+ }
81
+ }
82
+ exports.InsufficientBalanceError = InsufficientBalanceError;
83
+ /** 429 — Rate limit exceeded. */
84
+ class RateLimitError extends PagciError {
85
+ constructor(params) {
86
+ super(params);
87
+ }
88
+ }
89
+ exports.RateLimitError = RateLimitError;
90
+ /** 500+ — Unexpected server error. */
91
+ class ApiError extends PagciError {
92
+ constructor(params) {
93
+ super(params);
94
+ }
95
+ }
96
+ exports.ApiError = ApiError;
97
+ /** Network-level failure (ECONNRESET, ECONNREFUSED, etc.). */
98
+ class ConnectionError extends PagciError {
99
+ constructor(message, cause) {
100
+ super({ message, status: 0, code: 'connection_error' });
101
+ if (cause)
102
+ this.cause = cause;
103
+ }
104
+ }
105
+ exports.ConnectionError = ConnectionError;
106
+ /** Request exceeded the configured timeout. */
107
+ class TimeoutError extends PagciError {
108
+ constructor(timeout) {
109
+ super({
110
+ message: `Request timed out after ${timeout}ms`,
111
+ status: 0,
112
+ code: 'timeout',
113
+ });
114
+ }
115
+ }
116
+ exports.TimeoutError = TimeoutError;
117
+ /** Webhook signature verification failed — reject the payload. */
118
+ class SignatureVerificationError extends PagciError {
119
+ constructor(message) {
120
+ super({ message, status: 0, code: 'signature_verification_failed' });
121
+ }
122
+ }
123
+ exports.SignatureVerificationError = SignatureVerificationError;
124
+ // ── Factory ──────────────────────────────────────────────────────────
125
+ /** Status → PagciError subclass mapping. */
126
+ const STATUS_MAP = {
127
+ 400: ValidationError,
128
+ 401: AuthenticationError,
129
+ 403: ForbiddenError,
130
+ 404: NotFoundError,
131
+ 409: ConflictError,
132
+ 422: InsufficientBalanceError,
133
+ 429: RateLimitError,
134
+ };
135
+ /**
136
+ * Build the appropriate PagciError subclass from an HTTP response.
137
+ *
138
+ * The response body is expected to follow RFC 9457 Problem Details:
139
+ * ```json
140
+ * {
141
+ * "type": "https://api.pagci.com/errors/validation",
142
+ * "title": "Validation Error",
143
+ * "status": 400,
144
+ * "detail": "amount must be positive",
145
+ * "code": "invalid_amount",
146
+ * "field": "amount"
147
+ * }
148
+ * ```
149
+ */
150
+ function errorFromResponse(status, body, headers) {
151
+ // Parse RFC 9457 fields (defensive — body may not be an object)
152
+ const obj = (typeof body === 'object' && body !== null ? body : {});
153
+ const message = typeof obj['detail'] === 'string'
154
+ ? obj['detail']
155
+ : typeof obj['message'] === 'string'
156
+ ? obj['message']
157
+ : `Request failed with status ${status}`;
158
+ const params = {
159
+ message,
160
+ type: typeof obj['type'] === 'string' ? obj['type'] : undefined,
161
+ title: typeof obj['title'] === 'string' ? obj['title'] : undefined,
162
+ status,
163
+ code: typeof obj['code'] === 'string' ? obj['code'] : undefined,
164
+ field: typeof obj['field'] === 'string' ? obj['field'] : undefined,
165
+ requestId: headers['x-request-id'] ?? undefined,
166
+ rawResponse: body,
167
+ };
168
+ const ErrorClass = STATUS_MAP[status] ?? ApiError;
169
+ return new ErrorClass(params);
170
+ }
171
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Generate a unique, timestamp-sortable idempotency key.
3
+ *
4
+ * Format: `idem_{base36_timestamp_8}{base36_random_18}` (32 chars total)
5
+ *
6
+ * The timestamp prefix (ms since epoch in base-36, zero-padded to 8 chars)
7
+ * ensures keys sort chronologically. The random suffix (12 random bytes
8
+ * encoded as base-36, truncated to 18 chars) ensures uniqueness.
9
+ *
10
+ * This key must be generated ONCE per logical create() call and reused
11
+ * across retries of that same call.
12
+ */
13
+ export declare function generateIdempotencyKey(): string;
14
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/idempotency.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAU/C"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateIdempotencyKey = generateIdempotencyKey;
4
+ const node_crypto_1 = require("node:crypto");
5
+ /**
6
+ * Generate a unique, timestamp-sortable idempotency key.
7
+ *
8
+ * Format: `idem_{base36_timestamp_8}{base36_random_18}` (32 chars total)
9
+ *
10
+ * The timestamp prefix (ms since epoch in base-36, zero-padded to 8 chars)
11
+ * ensures keys sort chronologically. The random suffix (12 random bytes
12
+ * encoded as base-36, truncated to 18 chars) ensures uniqueness.
13
+ *
14
+ * This key must be generated ONCE per logical create() call and reused
15
+ * across retries of that same call.
16
+ */
17
+ function generateIdempotencyKey() {
18
+ // Timestamp component: milliseconds since epoch in base-36
19
+ const ts = Date.now().toString(36).padStart(8, '0');
20
+ // Random component: 12 bytes → base-36 string → first 18 chars
21
+ const rand = (0, node_crypto_1.randomBytes)(12)
22
+ .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '')
23
+ .slice(0, 18);
24
+ return `idem_${ts}${rand}`;
25
+ }
26
+ //# sourceMappingURL=idempotency.js.map