@pulgueta/epayco-convex 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 (169) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +945 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +222 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +355 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/component/_generated/api.d.ts +78 -0
  12. package/dist/component/_generated/api.d.ts.map +1 -0
  13. package/dist/component/_generated/api.js +31 -0
  14. package/dist/component/_generated/api.js.map +1 -0
  15. package/dist/component/_generated/component.d.ts +580 -0
  16. package/dist/component/_generated/component.d.ts.map +1 -0
  17. package/dist/component/_generated/component.js +11 -0
  18. package/dist/component/_generated/component.js.map +1 -0
  19. package/dist/component/_generated/dataModel.d.ts +46 -0
  20. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  21. package/dist/component/_generated/dataModel.js +11 -0
  22. package/dist/component/_generated/dataModel.js.map +1 -0
  23. package/dist/component/_generated/server.d.ts +121 -0
  24. package/dist/component/_generated/server.d.ts.map +1 -0
  25. package/dist/component/_generated/server.js +78 -0
  26. package/dist/component/_generated/server.js.map +1 -0
  27. package/dist/component/banks.d.ts +14 -0
  28. package/dist/component/banks.d.ts.map +1 -0
  29. package/dist/component/banks.js +37 -0
  30. package/dist/component/banks.js.map +1 -0
  31. package/dist/component/cashApi.d.ts +59 -0
  32. package/dist/component/cashApi.d.ts.map +1 -0
  33. package/dist/component/cashApi.js +88 -0
  34. package/dist/component/cashApi.js.map +1 -0
  35. package/dist/component/chargesApi.d.ts +64 -0
  36. package/dist/component/chargesApi.d.ts.map +1 -0
  37. package/dist/component/chargesApi.js +106 -0
  38. package/dist/component/chargesApi.js.map +1 -0
  39. package/dist/component/convex.config.d.ts +3 -0
  40. package/dist/component/convex.config.d.ts.map +1 -0
  41. package/dist/component/convex.config.js +6 -0
  42. package/dist/component/convex.config.js.map +1 -0
  43. package/dist/component/customers.d.ts +67 -0
  44. package/dist/component/customers.d.ts.map +1 -0
  45. package/dist/component/customers.js +103 -0
  46. package/dist/component/customers.js.map +1 -0
  47. package/dist/component/customersApi.d.ts +99 -0
  48. package/dist/component/customersApi.d.ts.map +1 -0
  49. package/dist/component/customersApi.js +176 -0
  50. package/dist/component/customersApi.js.map +1 -0
  51. package/dist/component/daviplataApi.d.ts +43 -0
  52. package/dist/component/daviplataApi.d.ts.map +1 -0
  53. package/dist/component/daviplataApi.js +103 -0
  54. package/dist/component/daviplataApi.js.map +1 -0
  55. package/dist/component/epaycoClient.d.ts +84 -0
  56. package/dist/component/epaycoClient.d.ts.map +1 -0
  57. package/dist/component/epaycoClient.js +422 -0
  58. package/dist/component/epaycoClient.js.map +1 -0
  59. package/dist/component/payloads.d.ts +34 -0
  60. package/dist/component/payloads.d.ts.map +1 -0
  61. package/dist/component/payloads.js +45 -0
  62. package/dist/component/payloads.js.map +1 -0
  63. package/dist/component/plans.d.ts +47 -0
  64. package/dist/component/plans.d.ts.map +1 -0
  65. package/dist/component/plans.js +83 -0
  66. package/dist/component/plans.js.map +1 -0
  67. package/dist/component/plansApi.d.ts +64 -0
  68. package/dist/component/plansApi.d.ts.map +1 -0
  69. package/dist/component/plansApi.js +121 -0
  70. package/dist/component/plansApi.js.map +1 -0
  71. package/dist/component/pseApi.d.ts +68 -0
  72. package/dist/component/pseApi.d.ts.map +1 -0
  73. package/dist/component/pseApi.js +113 -0
  74. package/dist/component/pseApi.js.map +1 -0
  75. package/dist/component/rateLimits.d.ts +69 -0
  76. package/dist/component/rateLimits.d.ts.map +1 -0
  77. package/dist/component/rateLimits.js +67 -0
  78. package/dist/component/rateLimits.js.map +1 -0
  79. package/dist/component/safetypayApi.d.ts +35 -0
  80. package/dist/component/safetypayApi.d.ts.map +1 -0
  81. package/dist/component/safetypayApi.js +68 -0
  82. package/dist/component/safetypayApi.js.map +1 -0
  83. package/dist/component/schema.d.ts +200 -0
  84. package/dist/component/schema.d.ts.map +1 -0
  85. package/dist/component/schema.js +104 -0
  86. package/dist/component/schema.js.map +1 -0
  87. package/dist/component/signature.d.ts +11 -0
  88. package/dist/component/signature.d.ts.map +1 -0
  89. package/dist/component/signature.js +28 -0
  90. package/dist/component/signature.js.map +1 -0
  91. package/dist/component/status.d.ts +12 -0
  92. package/dist/component/status.d.ts.map +1 -0
  93. package/dist/component/status.js +55 -0
  94. package/dist/component/status.js.map +1 -0
  95. package/dist/component/subscriptions.d.ts +69 -0
  96. package/dist/component/subscriptions.d.ts.map +1 -0
  97. package/dist/component/subscriptions.js +114 -0
  98. package/dist/component/subscriptions.js.map +1 -0
  99. package/dist/component/subscriptionsApi.d.ts +62 -0
  100. package/dist/component/subscriptionsApi.d.ts.map +1 -0
  101. package/dist/component/subscriptionsApi.js +147 -0
  102. package/dist/component/subscriptionsApi.js.map +1 -0
  103. package/dist/component/tokens.d.ts +31 -0
  104. package/dist/component/tokens.d.ts.map +1 -0
  105. package/dist/component/tokens.js +79 -0
  106. package/dist/component/tokens.js.map +1 -0
  107. package/dist/component/tokensApi.d.ts +18 -0
  108. package/dist/component/tokensApi.d.ts.map +1 -0
  109. package/dist/component/tokensApi.js +53 -0
  110. package/dist/component/tokensApi.js.map +1 -0
  111. package/dist/component/transactions.d.ts +103 -0
  112. package/dist/component/transactions.d.ts.map +1 -0
  113. package/dist/component/transactions.js +177 -0
  114. package/dist/component/transactions.js.map +1 -0
  115. package/dist/component/validators.d.ts +571 -0
  116. package/dist/component/validators.d.ts.map +1 -0
  117. package/dist/component/validators.js +203 -0
  118. package/dist/component/validators.js.map +1 -0
  119. package/dist/component/webhooks.d.ts +55 -0
  120. package/dist/component/webhooks.d.ts.map +1 -0
  121. package/dist/component/webhooks.js +172 -0
  122. package/dist/component/webhooks.js.map +1 -0
  123. package/dist/react/index.d.ts +16 -0
  124. package/dist/react/index.d.ts.map +1 -0
  125. package/dist/react/index.js +43 -0
  126. package/dist/react/index.js.map +1 -0
  127. package/package.json +106 -0
  128. package/src/client/_generated/_ignore.ts +1 -0
  129. package/src/client/index.test.ts +66 -0
  130. package/src/client/index.ts +633 -0
  131. package/src/client/setup.test.ts +26 -0
  132. package/src/component/_generated/api.ts +94 -0
  133. package/src/component/_generated/component.ts +809 -0
  134. package/src/component/_generated/dataModel.ts +60 -0
  135. package/src/component/_generated/server.ts +156 -0
  136. package/src/component/banks.ts +41 -0
  137. package/src/component/cashApi.ts +100 -0
  138. package/src/component/chargesApi.ts +119 -0
  139. package/src/component/convex.config.ts +7 -0
  140. package/src/component/customers.test.ts +122 -0
  141. package/src/component/customers.ts +116 -0
  142. package/src/component/customersApi.ts +206 -0
  143. package/src/component/daviplataApi.ts +119 -0
  144. package/src/component/epaycoApi.test.ts +110 -0
  145. package/src/component/epaycoClient.ts +578 -0
  146. package/src/component/payloads.ts +67 -0
  147. package/src/component/plans.test.ts +129 -0
  148. package/src/component/plans.ts +86 -0
  149. package/src/component/plansApi.ts +135 -0
  150. package/src/component/pseApi.ts +125 -0
  151. package/src/component/rateLimits.ts +67 -0
  152. package/src/component/safetypayApi.ts +78 -0
  153. package/src/component/schema.ts +124 -0
  154. package/src/component/setup.test.helper.ts +10 -0
  155. package/src/component/setup.test.ts +22 -0
  156. package/src/component/signature.ts +38 -0
  157. package/src/component/status.ts +71 -0
  158. package/src/component/subscriptions.test.ts +117 -0
  159. package/src/component/subscriptions.ts +128 -0
  160. package/src/component/subscriptionsApi.ts +172 -0
  161. package/src/component/tokens.ts +89 -0
  162. package/src/component/tokensApi.ts +63 -0
  163. package/src/component/transactions.test.ts +227 -0
  164. package/src/component/transactions.ts +200 -0
  165. package/src/component/validators.ts +245 -0
  166. package/src/component/webhooks.test.ts +137 -0
  167. package/src/component/webhooks.ts +229 -0
  168. package/src/react/index.ts +71 -0
  169. package/src/test.ts +13 -0
@@ -0,0 +1,103 @@
1
+ import { v } from "convex/values";
2
+ import { action } from "./_generated/server.js";
3
+ import { internal } from "./_generated/api.js";
4
+ import { epaycoCredentialsValidator, daviplataInfoValidator, } from "./validators.js";
5
+ import { getEpaycoClient, unwrap, dataOf, pick } from "./epaycoClient.js";
6
+ import { statusFromEstado } from "./status.js";
7
+ import { rateLimiter } from "./rateLimits.js";
8
+ /** Start a Daviplata payment. Returns a ref_payco + id_session_token used for OTP confirmation. */
9
+ export const createDaviplataPayment = action({
10
+ args: {
11
+ credentials: epaycoCredentialsValidator,
12
+ userId: v.string(),
13
+ daviplataInfo: daviplataInfoValidator,
14
+ },
15
+ returns: v.any(),
16
+ handler: async (ctx, args) => {
17
+ await rateLimiter.limit(ctx, "createDaviplataPayment", {
18
+ key: args.userId,
19
+ throws: true,
20
+ });
21
+ const info = args.daviplataInfo;
22
+ const epayco = getEpaycoClient(args.credentials);
23
+ const result = unwrap(await epayco.daviplata.create({
24
+ doc_type: info.docType,
25
+ doc_number: info.docNumber,
26
+ name: info.name,
27
+ last_name: info.lastName,
28
+ email: info.email,
29
+ ind_country: info.indCountry ?? "CO",
30
+ phone: info.phone,
31
+ country: info.country ?? "CO",
32
+ ...(info.city ? { city: info.city } : {}),
33
+ ...(info.address ? { address: info.address } : {}),
34
+ ...(info.ip ? { ip: info.ip } : {}),
35
+ currency: info.currency ?? "COP",
36
+ description: info.description,
37
+ value: String(info.value),
38
+ tax: String(info.tax),
39
+ tax_base: String(info.taxBase),
40
+ method_confirmation: info.methodConfirmation ?? "",
41
+ ...(info.urlConfirmation
42
+ ? { url_confirmation: info.urlConfirmation }
43
+ : {}),
44
+ }));
45
+ const data = dataOf(result);
46
+ // The OTP-confirmation session token is a short-lived secret; keep it out of
47
+ // the persisted transaction row (it's still returned to the caller below).
48
+ const safeRawResponse = { ...data };
49
+ delete safeRawResponse.id_session_token;
50
+ delete safeRawResponse.idSessionToken;
51
+ const refPayco = pick(data, ["ref_payco", "refPayco"]);
52
+ if (refPayco) {
53
+ await ctx.runMutation(internal.transactions.upsertTransaction, {
54
+ userId: args.userId,
55
+ epaycoRef: refPayco,
56
+ epaycoTransactionId: pick(data, ["transactionId", "transaction_id"]),
57
+ paymentMethod: "daviplata",
58
+ status: "pending",
59
+ amount: info.value,
60
+ currency: info.currency ?? "COP",
61
+ description: info.description,
62
+ customerEmail: info.email,
63
+ rawResponse: safeRawResponse,
64
+ lastSyncedAt: Date.now(),
65
+ });
66
+ }
67
+ return result;
68
+ },
69
+ });
70
+ /** Confirm a Daviplata payment with the customer's OTP. */
71
+ export const confirmDaviplataPayment = action({
72
+ args: {
73
+ credentials: epaycoCredentialsValidator,
74
+ refPayco: v.string(),
75
+ idSessionToken: v.string(),
76
+ otp: v.string(),
77
+ },
78
+ returns: v.any(),
79
+ handler: async (ctx, args) => {
80
+ // Throttle OTP submissions per payment to limit brute-force guessing.
81
+ await rateLimiter.limit(ctx, "confirmDaviplataPayment", {
82
+ key: args.refPayco,
83
+ throws: true,
84
+ });
85
+ const epayco = getEpaycoClient(args.credentials);
86
+ const result = unwrap(await epayco.daviplata.confirm({
87
+ ref_payco: args.refPayco,
88
+ id_session_token: args.idSessionToken,
89
+ otp: args.otp,
90
+ }));
91
+ const data = dataOf(result);
92
+ const safeRawResponse = { ...data };
93
+ delete safeRawResponse.id_session_token;
94
+ delete safeRawResponse.idSessionToken;
95
+ await ctx.runMutation(internal.transactions.updateTransactionStatus, {
96
+ epaycoRef: args.refPayco,
97
+ status: statusFromEstado(pick(data, ["estado", "x_response", "respuesta"])),
98
+ rawResponse: safeRawResponse,
99
+ });
100
+ return result;
101
+ },
102
+ });
103
+ //# sourceMappingURL=daviplataApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daviplataApi.js","sourceRoot":"","sources":["../../src/component/daviplataApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { EPaycoCredentials } from "./validators.js";
2
+ /**
3
+ * AES-128-CBC encrypt a UTF-8 string with the hex private key and a zero IV,
4
+ * returning Base64 ciphertext. Web Crypto applies PKCS#7 padding by default,
5
+ * matching `crypto-js`'s `Pkcs7`. (A 16-byte/32-hex private key yields a valid
6
+ * AES-128 key.)
7
+ */
8
+ export declare function aesEncrypt(value: string, privateKeyHex: string): Promise<string>;
9
+ export type EpaycoResponse = Record<string, unknown> & {
10
+ success?: boolean;
11
+ status?: boolean | string;
12
+ titleResponse?: string;
13
+ title_response?: string;
14
+ textResponse?: string;
15
+ text_response?: string;
16
+ message?: string;
17
+ error?: string;
18
+ data?: Record<string, unknown>;
19
+ };
20
+ type Payload = Record<string, unknown>;
21
+ export interface EpaycoClient {
22
+ token: {
23
+ create(options: Payload): Promise<EpaycoResponse>;
24
+ };
25
+ customers: {
26
+ create(options: Payload): Promise<EpaycoResponse>;
27
+ get(uid: string): Promise<EpaycoResponse>;
28
+ list(options?: Payload): Promise<EpaycoResponse>;
29
+ update(uid: string, options: Payload): Promise<EpaycoResponse>;
30
+ delete(options: Payload): Promise<EpaycoResponse>;
31
+ addDefaultCard(options: Payload): Promise<EpaycoResponse>;
32
+ addNewToken(options: Payload): Promise<EpaycoResponse>;
33
+ };
34
+ plans: {
35
+ create(options: Payload): Promise<EpaycoResponse>;
36
+ get(uid: string): Promise<EpaycoResponse>;
37
+ list(): Promise<EpaycoResponse>;
38
+ update(uid: string, options: Payload): Promise<EpaycoResponse>;
39
+ delete(uid: string): Promise<EpaycoResponse>;
40
+ };
41
+ subscriptions: {
42
+ create(options: Payload): Promise<EpaycoResponse>;
43
+ get(uid: string): Promise<EpaycoResponse>;
44
+ list(): Promise<EpaycoResponse>;
45
+ cancel(uid: string): Promise<EpaycoResponse>;
46
+ charge(options: Payload): Promise<EpaycoResponse>;
47
+ };
48
+ charge: {
49
+ create(options: Payload): Promise<EpaycoResponse>;
50
+ get(uid: string): Promise<EpaycoResponse>;
51
+ };
52
+ bank: {
53
+ create(options: Payload): Promise<EpaycoResponse>;
54
+ get(uid: string): Promise<EpaycoResponse>;
55
+ getBanks(): Promise<EpaycoResponse>;
56
+ };
57
+ cash: {
58
+ create(type: string, options: Payload): Promise<EpaycoResponse>;
59
+ get(uid: string): Promise<EpaycoResponse>;
60
+ };
61
+ daviplata: {
62
+ create(options: Payload): Promise<EpaycoResponse>;
63
+ confirm(options: Payload): Promise<EpaycoResponse>;
64
+ };
65
+ safetypay: {
66
+ create(options: Payload): Promise<EpaycoResponse>;
67
+ };
68
+ }
69
+ /**
70
+ * Build an ePayco client bound to a set of credentials. Mirrors the resource
71
+ * method surface of `epayco-sdk-node` so the resource action files are written
72
+ * against the same API.
73
+ */
74
+ export declare function getEpaycoClient(credentials: EPaycoCredentials): EpaycoClient;
75
+ /**
76
+ * Normalize ePayco's response into either the raw JSON or a thrown
77
+ * `ConvexError`. ePayco never uses non-2xx for business errors — failures show
78
+ * up as `{ error }` or `{ success: false }` — so we surface those as throws.
79
+ */
80
+ export declare function unwrap(result: EpaycoResponse | null | undefined): EpaycoResponse;
81
+ export declare function dataOf(result: EpaycoResponse): Record<string, unknown>;
82
+ export declare function pick(source: Record<string, unknown>, keys: string[]): string | undefined;
83
+ export {};
84
+ //# sourceMappingURL=epaycoClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epaycoClient.d.ts","sourceRoot":"","sources":["../../src/component/epaycoClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,422 @@
1
+ import { ConvexError } from "convex/values";
2
+ /**
3
+ * Native (V8-runtime) implementation of the ePayco wire protocol.
4
+ *
5
+ * Convex components cannot use the Node.js runtime, so the official
6
+ * `epayco-sdk-node` package (which depends on Node built-ins) cannot run here.
7
+ * This module reproduces that SDK's exact request protocol using only Web
8
+ * platform APIs (`fetch`, Web Crypto, `TextEncoder`):
9
+ *
10
+ * - JWT login (`POST /v1/auth/login`) for `api.secure.payco.co` endpoints,
11
+ * and Basic-auth login (`POST /login`) for `apify.epayco.co` endpoints.
12
+ * - AES-128-CBC encryption (16-byte hex private key, all-zero IV, PKCS#7)
13
+ * for `secure.payco.co/restpagos` (PSE) endpoints, plus the
14
+ * `public_key` / `i` / `p` / `enpruebas` envelope the SDK emits.
15
+ * - Spanish field-name translation (`keylang`) for restpagos endpoints and
16
+ * camelCase translation (`keylang_apify`) for apify endpoints.
17
+ *
18
+ * Ported field-for-field from `epayco-sdk-node@1.4.4` `lib/resources/index.js`.
19
+ */
20
+ const BASE_URL = "https://api.secure.payco.co";
21
+ const SECURE_URL = "https://secure.payco.co";
22
+ const APIFY_URL = "https://apify.epayco.co";
23
+ /** Upper bound for any ePayco API call, so a hung host can't block the action. */
24
+ const REQUEST_TIMEOUT_MS = 30_000;
25
+ /** Tighter bound for the best-effort ipify lookup on the payment hot path. */
26
+ const IP_LOOKUP_TIMEOUT_MS = 5_000;
27
+ /** Base64 of a 16-byte all-zero IV (`i` for the encrypted restpagos envelope). */
28
+ const ZERO_IV_BASE64 = "AAAAAAAAAAAAAAAAAAAAAA==";
29
+ /** Base64 of the ASCII string "0000000000000000" (`i` for the cash envelope). */
30
+ const CASH_IV_BASE64 = "MDAwMDAwMDAwMDAwMDAwMA==";
31
+ // keylang.json — SDK field name -> restpagos (Spanish) wire field name.
32
+ const KEYLANG = {
33
+ bank: "banco",
34
+ invoice: "factura",
35
+ description: "descripcion",
36
+ value: "valor",
37
+ tax: "iva",
38
+ ico: "ico",
39
+ tax_base: "baseiva",
40
+ currency: "moneda",
41
+ type_person: "tipo_persona",
42
+ doc_type: "tipo_doc",
43
+ doc_number: "documento",
44
+ name: "nombres",
45
+ last_name: "apellidos",
46
+ email: "email",
47
+ country: "pais",
48
+ department: "depto",
49
+ city: "ciudad",
50
+ phone: "telefono",
51
+ cell_phone: "celular",
52
+ address: "direccion",
53
+ ip: "ip",
54
+ url_response: "url_respuesta",
55
+ url_confirmation: "url_confirmacion",
56
+ method_confirmation: "method_confirmation",
57
+ metodoconfirmacion: "metodoconfirmacion",
58
+ end_date: "fechaexpiracion",
59
+ };
60
+ // keylang_apify.json — SDK field name -> apify (camelCase) wire field name.
61
+ const KEYLANG_APIFY = {
62
+ cash: "cash",
63
+ end_date: "expirationDate",
64
+ ref_payco: "refPayco",
65
+ id_session_token: "idSessionToken",
66
+ otp: "otp",
67
+ invoice: "invoice",
68
+ description: "description",
69
+ value: "value",
70
+ tax: "tax",
71
+ ico: "ico",
72
+ tax_base: "taxBase",
73
+ currency: "currency",
74
+ doc_type: "docType",
75
+ doc_number: "document",
76
+ name: "name",
77
+ last_name: "lastName",
78
+ email: "email",
79
+ ind_country: "indCountry",
80
+ country: "country",
81
+ city: "city",
82
+ phone: "phone",
83
+ address: "address",
84
+ ip: "ip",
85
+ test: "testMode",
86
+ url_response: "urlResponse",
87
+ url_confirmation: "urlConfirmation",
88
+ method_confirmation: "methodConfirmation",
89
+ };
90
+ function langkey(key) {
91
+ return KEYLANG[key] ?? key;
92
+ }
93
+ function langkeyApify(key) {
94
+ return KEYLANG_APIFY[key] ?? key;
95
+ }
96
+ const B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
97
+ function bytesToBase64(bytes) {
98
+ let out = "";
99
+ let i = 0;
100
+ for (; i + 3 <= bytes.length; i += 3) {
101
+ const n = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
102
+ out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + B64[(n >> 6) & 63] + B64[n & 63];
103
+ }
104
+ const rem = bytes.length - i;
105
+ if (rem === 1) {
106
+ const n = bytes[i] << 16;
107
+ out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + "==";
108
+ }
109
+ else if (rem === 2) {
110
+ const n = (bytes[i] << 16) | (bytes[i + 1] << 8);
111
+ out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + B64[(n >> 6) & 63] + "=";
112
+ }
113
+ return out;
114
+ }
115
+ function hexToBytes(hex) {
116
+ const bytes = new Uint8Array(Math.floor(hex.length / 2));
117
+ for (let i = 0; i < bytes.length; i++) {
118
+ bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
119
+ }
120
+ return bytes;
121
+ }
122
+ function utf8ToBase64(str) {
123
+ return bytesToBase64(new TextEncoder().encode(str));
124
+ }
125
+ /**
126
+ * AES-128-CBC encrypt a UTF-8 string with the hex private key and a zero IV,
127
+ * returning Base64 ciphertext. Web Crypto applies PKCS#7 padding by default,
128
+ * matching `crypto-js`'s `Pkcs7`. (A 16-byte/32-hex private key yields a valid
129
+ * AES-128 key.)
130
+ */
131
+ export async function aesEncrypt(value, privateKeyHex) {
132
+ const key = await crypto.subtle.importKey("raw", hexToBytes(privateKeyHex), { name: "AES-CBC" }, false, ["encrypt"]);
133
+ const ciphertext = await crypto.subtle.encrypt({ name: "AES-CBC", iv: new Uint8Array(16) }, key, new TextEncoder().encode(value));
134
+ return bytesToBase64(new Uint8Array(ciphertext));
135
+ }
136
+ /**
137
+ * Build an ePayco client bound to a set of credentials. Mirrors the resource
138
+ * method surface of `epayco-sdk-node` so the resource action files are written
139
+ * against the same API.
140
+ */
141
+ export function getEpaycoClient(credentials) {
142
+ const apiKey = credentials.apiKey;
143
+ const privateKey = credentials.privateKey;
144
+ const test = credentials.testMode ?? false ? "TRUE" : "FALSE";
145
+ async function authenticate(apify) {
146
+ if (apify) {
147
+ const basic = utf8ToBase64(`${apiKey}:${privateKey}`);
148
+ const res = await fetch(`${APIFY_URL}/login`, {
149
+ method: "POST",
150
+ headers: {
151
+ "Content-Type": "application/json",
152
+ // The trailing ";" is intentional: it matches epayco-sdk-node@1.4.4
153
+ // (lib/resources/index.js) exactly, which the apify host expects.
154
+ Authorization: `Basic ${basic};`,
155
+ },
156
+ body: JSON.stringify({}),
157
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
158
+ });
159
+ const json = (await res.json());
160
+ return String(json.token ?? json.bearer_token ?? "");
161
+ }
162
+ const res = await fetch(`${BASE_URL}/v1/auth/login`, {
163
+ method: "POST",
164
+ headers: { "Content-Type": "application/json" },
165
+ body: JSON.stringify({ public_key: apiKey, private_key: privateKey }),
166
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
167
+ });
168
+ const json = (await res.json());
169
+ return String(json.bearer_token ?? json.token ?? "");
170
+ }
171
+ async function setData(data, cashData, apify) {
172
+ const set = {};
173
+ if (apify) {
174
+ for (const key of Object.keys(data)) {
175
+ set[langkeyApify(key)] = data[key];
176
+ }
177
+ return set;
178
+ }
179
+ if (cashData) {
180
+ for (const key of Object.keys(data)) {
181
+ set[langkey(key)] = data[key];
182
+ }
183
+ set.public_key = apiKey;
184
+ set.i = CASH_IV_BASE64;
185
+ set.enpruebas = test;
186
+ set.lenguaje = "javascript";
187
+ set.p = "";
188
+ return set;
189
+ }
190
+ // Encrypted (PSE) path.
191
+ for (const key of Object.keys(data)) {
192
+ const value = data[key];
193
+ if (key.includes("extras_epayco") && value && typeof value === "object") {
194
+ const extra5 = value.extra5;
195
+ set[langkey(key)] = {
196
+ extra5: await aesEncrypt(String(extra5 ?? ""), privateKey),
197
+ };
198
+ }
199
+ else {
200
+ set[langkey(key)] = await aesEncrypt(String(value), privateKey);
201
+ }
202
+ }
203
+ set.public_key = apiKey;
204
+ set.i = ZERO_IV_BASE64;
205
+ set.enpruebas = await aesEncrypt(test, privateKey);
206
+ set.lenguaje = "javascript";
207
+ set.p = bytesToBase64(hexToBytes(privateKey));
208
+ return set;
209
+ }
210
+ async function request(method, path, data, flags = {}) {
211
+ const { sw = false, cashData = false, card = false, apify = false } = flags;
212
+ const bearer = `Bearer ${await authenticate(apify)}`;
213
+ const headers = {
214
+ "Content-Type": "application/json",
215
+ type: "sdk-jwt",
216
+ lang: "NODE",
217
+ Authorization: bearer,
218
+ };
219
+ const base = apify ? APIFY_URL : sw ? SECURE_URL : BASE_URL;
220
+ const url = base + path;
221
+ if (method === "get") {
222
+ const res = await fetch(url, {
223
+ method: "GET",
224
+ headers,
225
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
226
+ });
227
+ return parseResponse(res);
228
+ }
229
+ let body = { ...data, extras_epayco: { extra5: "P44" } };
230
+ if (!card) {
231
+ body.test = test;
232
+ if (body.ip === undefined) {
233
+ const ip = await fetchServerIp();
234
+ if (ip)
235
+ body.ip = ip;
236
+ }
237
+ }
238
+ if (sw || apify) {
239
+ body = await setData(body, cashData, apify);
240
+ }
241
+ const res = await fetch(url, {
242
+ method: "POST",
243
+ headers,
244
+ body: JSON.stringify(body),
245
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
246
+ });
247
+ return parseResponse(res);
248
+ }
249
+ const txLookup = (uid) => request("get", `/restpagos/transaction/response.json?ref_payco=${encodeURIComponent(uid)}&&public_key=${apiKey}`, {}, { sw: true });
250
+ return {
251
+ token: {
252
+ create: (options) => request("post", "/v1/tokens", options),
253
+ },
254
+ customers: {
255
+ create: (options) => request("post", "/payment/v1/customer/create", options),
256
+ get: (uid) => request("get", `/payment/v1/customer/${apiKey}/${uid}`, {}),
257
+ list: (options) => request("get", buildListUrl("/payment/v1/customers", options), {}, {
258
+ card: true,
259
+ }),
260
+ update: (uid, options) => request("post", `/payment/v1/customer/edit/${apiKey}/${uid}`, options),
261
+ delete: (options) => request("post", "/v1/remove/token", options),
262
+ addDefaultCard: (options) => request("post", "/payment/v1/customer/reasign/card/default", options, {
263
+ card: true,
264
+ }),
265
+ addNewToken: (options) => request("post", "/v1/customer/add/token", options, { card: true }),
266
+ },
267
+ plans: {
268
+ create: (options) => request("post", "/recurring/v1/plan/create", options),
269
+ get: (uid) => request("get", `/recurring/v1/plan/${apiKey}/${uid}`, {}),
270
+ list: () => request("get", `/recurring/v1/plans/${apiKey}`, {}),
271
+ update: (uid, options) => request("post", `/recurring/v1/plan/edit/${uid}`, options),
272
+ delete: (uid) => request("post", `/recurring/v1/plan/remove/${apiKey}/${uid}`, {}),
273
+ },
274
+ subscriptions: {
275
+ create: (options) => request("post", "/recurring/v1/subscription/create", options),
276
+ get: (uid) => request("get", `/recurring/v1/subscription/${uid}/${apiKey}`, {}),
277
+ list: () => request("get", `/recurring/v1/subscriptions/${apiKey}`, {}),
278
+ cancel: (uid) => request("post", "/recurring/v1/subscription/cancel", {
279
+ id: uid,
280
+ public_key: apiKey,
281
+ }),
282
+ charge: (options) => request("post", "/payment/v1/charge/subscription/create", options),
283
+ },
284
+ charge: {
285
+ create: (options) => request("post", "/payment/v1/charge/create", options),
286
+ get: (uid) => txLookup(uid),
287
+ },
288
+ bank: {
289
+ create: (options) => request("post", "/restpagos/pagos/debitos.json", options, { sw: true }),
290
+ get: (uid) => request("get", `/restpagos/pse/transactioninfomation.json?transactionID=${encodeURIComponent(uid)}&&public_key=${apiKey}`, {}, { sw: true }),
291
+ getBanks: () => request("get", `/restpagos/pse/bancos.json?public_key=${apiKey}`, {}, { sw: true, cashData: true }),
292
+ },
293
+ cash: {
294
+ create: (type, options) => request("post", `/restpagos/v2/efectivo/${type}`, options, {
295
+ sw: true,
296
+ cashData: true,
297
+ }),
298
+ get: (uid) => txLookup(uid),
299
+ },
300
+ daviplata: {
301
+ create: (options) => request("post", "/payment/process/daviplata", options, {
302
+ apify: true,
303
+ card: true,
304
+ }),
305
+ confirm: (options) => request("post", "/payment/confirm/daviplata", options, {
306
+ apify: true,
307
+ card: true,
308
+ }),
309
+ },
310
+ safetypay: {
311
+ create: (options) => request("post", "/payment/process/safetypay", options, {
312
+ apify: true,
313
+ card: true,
314
+ }),
315
+ },
316
+ };
317
+ }
318
+ function buildListUrl(path, options) {
319
+ if (!options)
320
+ return path;
321
+ const params = new URLSearchParams();
322
+ for (const [key, value] of Object.entries(options)) {
323
+ if (value !== undefined && value !== null)
324
+ params.set(key, String(value));
325
+ }
326
+ const qs = params.toString();
327
+ return qs ? `${path}?${qs}` : path;
328
+ }
329
+ async function parseResponse(res) {
330
+ const text = await res.text();
331
+ try {
332
+ return JSON.parse(text);
333
+ }
334
+ catch {
335
+ return { error: text || `HTTP ${res.status}` };
336
+ }
337
+ }
338
+ /**
339
+ * Best-effort server IP lookup (matches the SDK's ipify fallback). Used only
340
+ * when the caller doesn't supply `ip`; bounded by a short timeout so the payment
341
+ * hot path can't stall on a slow third party, and failures fall through silently.
342
+ */
343
+ async function fetchServerIp() {
344
+ try {
345
+ const res = await fetch("https://api.ipify.org?format=json", {
346
+ signal: AbortSignal.timeout(IP_LOOKUP_TIMEOUT_MS),
347
+ });
348
+ const json = (await res.json());
349
+ return json.ip;
350
+ }
351
+ catch {
352
+ return undefined;
353
+ }
354
+ }
355
+ /**
356
+ * Normalize ePayco's response into either the raw JSON or a thrown
357
+ * `ConvexError`. ePayco never uses non-2xx for business errors — failures show
358
+ * up as `{ error }` or `{ success: false }` — so we surface those as throws.
359
+ */
360
+ export function unwrap(result) {
361
+ if (result == null) {
362
+ throw new ConvexError({
363
+ code: "EPAYCO_API_ERROR",
364
+ message: "Empty response from ePayco",
365
+ });
366
+ }
367
+ // The SDK-style `{ error }` envelope, or ePayco's bare `{ message }` envelope
368
+ // (returned for account-gated features like recurring plans) — neither
369
+ // carries a success flag, payload, or id, so treat them as failures.
370
+ const hasNoSuccessSignal = result.success === undefined &&
371
+ result.status === undefined &&
372
+ result.data === undefined &&
373
+ result.id === undefined &&
374
+ result.ref_payco === undefined &&
375
+ result.token === undefined;
376
+ if (typeof result.error === "string" && hasNoSuccessSignal) {
377
+ throw new ConvexError({
378
+ code: "EPAYCO_API_ERROR",
379
+ message: result.error,
380
+ raw: result,
381
+ });
382
+ }
383
+ if (typeof result.message === "string" && hasNoSuccessSignal) {
384
+ throw new ConvexError({
385
+ code: "EPAYCO_API_ERROR",
386
+ message: result.message,
387
+ raw: result,
388
+ });
389
+ }
390
+ if (result.success === false || result.status === false) {
391
+ const message = result.text_response ??
392
+ result.textResponse ??
393
+ result.title_response ??
394
+ result.titleResponse ??
395
+ result.message ??
396
+ (typeof result.data === "object" && result.data !== null
397
+ ? result.data.description
398
+ : undefined) ??
399
+ "ePayco request failed";
400
+ throw new ConvexError({
401
+ code: "EPAYCO_API_ERROR",
402
+ message: String(message),
403
+ raw: result,
404
+ });
405
+ }
406
+ return result;
407
+ }
408
+ export function dataOf(result) {
409
+ return typeof result.data === "object" && result.data !== null
410
+ ? result.data
411
+ : {};
412
+ }
413
+ export function pick(source, keys) {
414
+ for (const key of keys) {
415
+ const value = source[key];
416
+ if (value !== undefined && value !== null && value !== "") {
417
+ return String(value);
418
+ }
419
+ }
420
+ return undefined;
421
+ }
422
+ //# sourceMappingURL=epaycoClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epaycoClient.js","sourceRoot":"","sources":["../../src/component/epaycoClient.ts"],"names":[],"mappings":"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"}