@payzcore/node 1.0.1
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.
Potentially problematic release.
This version of @payzcore/node might be problematic. Click here for more details.
- package/README.md +188 -0
- package/dist/index.d.mts +231 -0
- package/dist/index.d.ts +231 -0
- package/dist/index.js +400 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +364 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
AuthenticationError: () => AuthenticationError,
|
|
24
|
+
ForbiddenError: () => ForbiddenError,
|
|
25
|
+
NotFoundError: () => NotFoundError,
|
|
26
|
+
PayzCore: () => PayzCore,
|
|
27
|
+
PayzCoreError: () => PayzCoreError,
|
|
28
|
+
RateLimitError: () => RateLimitError,
|
|
29
|
+
ValidationError: () => ValidationError,
|
|
30
|
+
WebhookSignatureError: () => WebhookSignatureError,
|
|
31
|
+
constructEvent: () => constructEvent,
|
|
32
|
+
default: () => index_default,
|
|
33
|
+
verifyWebhookSignature: () => verifyWebhookSignature
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(index_exports);
|
|
36
|
+
|
|
37
|
+
// src/errors.ts
|
|
38
|
+
var PayzCoreError = class extends Error {
|
|
39
|
+
status;
|
|
40
|
+
code;
|
|
41
|
+
details;
|
|
42
|
+
constructor(message, status, code, details) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = "PayzCoreError";
|
|
45
|
+
this.status = status;
|
|
46
|
+
this.code = code;
|
|
47
|
+
this.details = details;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var AuthenticationError = class extends PayzCoreError {
|
|
51
|
+
constructor(message = "Invalid or missing API key") {
|
|
52
|
+
super(message, 401, "authentication_error");
|
|
53
|
+
this.name = "AuthenticationError";
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
var ForbiddenError = class extends PayzCoreError {
|
|
57
|
+
constructor(message = "Access denied") {
|
|
58
|
+
super(message, 403, "forbidden");
|
|
59
|
+
this.name = "ForbiddenError";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var NotFoundError = class extends PayzCoreError {
|
|
63
|
+
constructor(message = "Resource not found") {
|
|
64
|
+
super(message, 404, "not_found");
|
|
65
|
+
this.name = "NotFoundError";
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var ValidationError = class extends PayzCoreError {
|
|
69
|
+
constructor(message, details) {
|
|
70
|
+
super(message, 400, "validation_error", details);
|
|
71
|
+
this.name = "ValidationError";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var RateLimitError = class extends PayzCoreError {
|
|
75
|
+
retryAfter;
|
|
76
|
+
isDaily;
|
|
77
|
+
constructor(message, retryAfter = null, isDaily = false) {
|
|
78
|
+
super(message, 429, "rate_limit_error");
|
|
79
|
+
this.name = "RateLimitError";
|
|
80
|
+
this.retryAfter = retryAfter;
|
|
81
|
+
this.isDaily = isDaily;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var WebhookSignatureError = class extends Error {
|
|
85
|
+
constructor(message = "Webhook signature verification failed") {
|
|
86
|
+
super(message);
|
|
87
|
+
this.name = "WebhookSignatureError";
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/client.ts
|
|
92
|
+
var DEFAULT_BASE_URL = "https://api.payzcore.com";
|
|
93
|
+
var DEFAULT_TIMEOUT = 3e4;
|
|
94
|
+
var DEFAULT_MAX_RETRIES = 2;
|
|
95
|
+
var RETRY_BASE_MS = 200;
|
|
96
|
+
var HttpClient = class {
|
|
97
|
+
apiKey;
|
|
98
|
+
baseUrl;
|
|
99
|
+
timeout;
|
|
100
|
+
maxRetries;
|
|
101
|
+
useMasterKey;
|
|
102
|
+
constructor(apiKey, options = {}) {
|
|
103
|
+
this.apiKey = apiKey;
|
|
104
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
105
|
+
this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
106
|
+
this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
107
|
+
this.useMasterKey = options.masterKey ?? false;
|
|
108
|
+
}
|
|
109
|
+
async request(method, path, body) {
|
|
110
|
+
const url = `${this.baseUrl}${path}`;
|
|
111
|
+
const headers = {
|
|
112
|
+
"Content-Type": "application/json",
|
|
113
|
+
"User-Agent": "@payzcore/node/1.0.0"
|
|
114
|
+
};
|
|
115
|
+
if (this.useMasterKey) {
|
|
116
|
+
headers["x-master-key"] = this.apiKey;
|
|
117
|
+
} else {
|
|
118
|
+
headers["x-api-key"] = this.apiKey;
|
|
119
|
+
}
|
|
120
|
+
let lastError = null;
|
|
121
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
122
|
+
if (attempt > 0) {
|
|
123
|
+
await sleep(RETRY_BASE_MS * 2 ** (attempt - 1));
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const response = await fetch(url, {
|
|
127
|
+
method,
|
|
128
|
+
headers,
|
|
129
|
+
body: body != null ? JSON.stringify(body) : void 0,
|
|
130
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
131
|
+
});
|
|
132
|
+
if (response.ok) {
|
|
133
|
+
return await response.json();
|
|
134
|
+
}
|
|
135
|
+
if (response.status < 500 && response.status !== 429) {
|
|
136
|
+
await throwApiError(response);
|
|
137
|
+
}
|
|
138
|
+
if (response.status === 429) {
|
|
139
|
+
await throwApiError(response);
|
|
140
|
+
}
|
|
141
|
+
lastError = await buildApiError(response);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
if (err instanceof PayzCoreError || err instanceof AuthenticationError || err instanceof ForbiddenError || err instanceof NotFoundError || err instanceof ValidationError || err instanceof RateLimitError) {
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw lastError ?? new PayzCoreError("Request failed after retries", 0, "network_error");
|
|
150
|
+
}
|
|
151
|
+
get(path) {
|
|
152
|
+
return this.request("GET", path);
|
|
153
|
+
}
|
|
154
|
+
post(path, body) {
|
|
155
|
+
return this.request("POST", path, body);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
function sleep(ms) {
|
|
159
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
|
+
}
|
|
161
|
+
async function throwApiError(response) {
|
|
162
|
+
throw await buildApiError(response);
|
|
163
|
+
}
|
|
164
|
+
async function buildApiError(response) {
|
|
165
|
+
let body;
|
|
166
|
+
try {
|
|
167
|
+
body = await response.json();
|
|
168
|
+
} catch {
|
|
169
|
+
body = { error: response.statusText || "Unknown error" };
|
|
170
|
+
}
|
|
171
|
+
const message = body.error ?? "Unknown error";
|
|
172
|
+
switch (response.status) {
|
|
173
|
+
case 400:
|
|
174
|
+
return new ValidationError(message, body.details);
|
|
175
|
+
case 401:
|
|
176
|
+
return new AuthenticationError(message);
|
|
177
|
+
case 403:
|
|
178
|
+
return new ForbiddenError(message);
|
|
179
|
+
case 404:
|
|
180
|
+
return new NotFoundError(message);
|
|
181
|
+
case 429: {
|
|
182
|
+
const resetHeader = response.headers.get("X-RateLimit-Reset");
|
|
183
|
+
const dailyHeader = response.headers.get("X-RateLimit-Daily");
|
|
184
|
+
const retryAfter = resetHeader ? parseInt(resetHeader, 10) : null;
|
|
185
|
+
const isDaily = dailyHeader === "true";
|
|
186
|
+
return new RateLimitError(message, retryAfter, isDaily);
|
|
187
|
+
}
|
|
188
|
+
default:
|
|
189
|
+
return new PayzCoreError(message, response.status, "api_error");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/resources/payments.ts
|
|
194
|
+
function mapPayment(raw) {
|
|
195
|
+
return {
|
|
196
|
+
id: raw.id,
|
|
197
|
+
address: raw.address,
|
|
198
|
+
amount: raw.amount,
|
|
199
|
+
chain: raw.chain,
|
|
200
|
+
token: raw.token ?? "USDT",
|
|
201
|
+
status: raw.status,
|
|
202
|
+
expiresAt: raw.expires_at,
|
|
203
|
+
externalOrderId: raw.external_order_id,
|
|
204
|
+
qrCode: raw.qr_code
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function mapPaymentListItem(raw) {
|
|
208
|
+
return {
|
|
209
|
+
id: raw.id,
|
|
210
|
+
externalRef: raw.external_ref,
|
|
211
|
+
externalOrderId: raw.external_order_id,
|
|
212
|
+
chain: raw.chain,
|
|
213
|
+
token: raw.token ?? "USDT",
|
|
214
|
+
address: raw.address,
|
|
215
|
+
expectedAmount: raw.expected_amount,
|
|
216
|
+
paidAmount: raw.paid_amount,
|
|
217
|
+
status: raw.status,
|
|
218
|
+
txHash: raw.tx_hash,
|
|
219
|
+
expiresAt: raw.expires_at,
|
|
220
|
+
paidAt: raw.paid_at,
|
|
221
|
+
createdAt: raw.created_at
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function mapPaymentDetail(raw) {
|
|
225
|
+
const txs = raw.transactions;
|
|
226
|
+
return {
|
|
227
|
+
id: raw.id,
|
|
228
|
+
status: raw.status,
|
|
229
|
+
expectedAmount: raw.expected_amount,
|
|
230
|
+
paidAmount: raw.paid_amount,
|
|
231
|
+
address: raw.address,
|
|
232
|
+
chain: raw.chain,
|
|
233
|
+
token: raw.token ?? "USDT",
|
|
234
|
+
txHash: raw.tx_hash,
|
|
235
|
+
expiresAt: raw.expires_at,
|
|
236
|
+
transactions: (txs ?? []).map((t) => ({
|
|
237
|
+
txHash: t.tx_hash,
|
|
238
|
+
amount: t.amount,
|
|
239
|
+
from: t.from,
|
|
240
|
+
confirmed: t.confirmed
|
|
241
|
+
}))
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
var Payments = class {
|
|
245
|
+
constructor(client) {
|
|
246
|
+
this.client = client;
|
|
247
|
+
}
|
|
248
|
+
async create(params) {
|
|
249
|
+
const body = {
|
|
250
|
+
amount: params.amount,
|
|
251
|
+
chain: params.chain,
|
|
252
|
+
token: params.token,
|
|
253
|
+
external_ref: params.externalRef,
|
|
254
|
+
external_order_id: params.externalOrderId,
|
|
255
|
+
expires_in: params.expiresIn,
|
|
256
|
+
metadata: params.metadata
|
|
257
|
+
};
|
|
258
|
+
const raw = await this.client.post("/api/v1/payments", body);
|
|
259
|
+
return {
|
|
260
|
+
success: true,
|
|
261
|
+
existing: raw.existing,
|
|
262
|
+
payment: mapPayment(raw.payment)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
async list(params = {}) {
|
|
266
|
+
const searchParams = new URLSearchParams();
|
|
267
|
+
if (params.status) searchParams.set("status", params.status);
|
|
268
|
+
if (params.limit != null) searchParams.set("limit", String(params.limit));
|
|
269
|
+
if (params.offset != null) searchParams.set("offset", String(params.offset));
|
|
270
|
+
const qs = searchParams.toString();
|
|
271
|
+
const path = `/api/v1/payments${qs ? `?${qs}` : ""}`;
|
|
272
|
+
const raw = await this.client.get(path);
|
|
273
|
+
const payments = raw.payments;
|
|
274
|
+
return {
|
|
275
|
+
success: true,
|
|
276
|
+
payments: payments.map(mapPaymentListItem)
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async get(id) {
|
|
280
|
+
const raw = await this.client.get(`/api/v1/payments/${encodeURIComponent(id)}`);
|
|
281
|
+
return {
|
|
282
|
+
success: true,
|
|
283
|
+
payment: mapPaymentDetail(raw.payment)
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
// src/resources/projects.ts
|
|
289
|
+
function mapProject(raw) {
|
|
290
|
+
return {
|
|
291
|
+
id: raw.id,
|
|
292
|
+
name: raw.name,
|
|
293
|
+
slug: raw.slug,
|
|
294
|
+
apiKey: raw.api_key,
|
|
295
|
+
webhookSecret: raw.webhook_secret,
|
|
296
|
+
webhookUrl: raw.webhook_url,
|
|
297
|
+
createdAt: raw.created_at
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function mapProjectListItem(raw) {
|
|
301
|
+
return {
|
|
302
|
+
id: raw.id,
|
|
303
|
+
name: raw.name,
|
|
304
|
+
slug: raw.slug,
|
|
305
|
+
apiKey: raw.api_key,
|
|
306
|
+
webhookUrl: raw.webhook_url,
|
|
307
|
+
isActive: raw.is_active,
|
|
308
|
+
createdAt: raw.created_at
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
var Projects = class {
|
|
312
|
+
constructor(client) {
|
|
313
|
+
this.client = client;
|
|
314
|
+
}
|
|
315
|
+
async create(params) {
|
|
316
|
+
const body = {
|
|
317
|
+
name: params.name,
|
|
318
|
+
slug: params.slug,
|
|
319
|
+
webhook_url: params.webhookUrl,
|
|
320
|
+
metadata: params.metadata
|
|
321
|
+
};
|
|
322
|
+
const raw = await this.client.post("/api/v1/projects", body);
|
|
323
|
+
return {
|
|
324
|
+
success: true,
|
|
325
|
+
project: mapProject(raw.project)
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
async list() {
|
|
329
|
+
const raw = await this.client.get("/api/v1/projects");
|
|
330
|
+
const projects = raw.projects;
|
|
331
|
+
return {
|
|
332
|
+
success: true,
|
|
333
|
+
projects: projects.map(mapProjectListItem)
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// src/webhook.ts
|
|
339
|
+
var import_crypto = require("crypto");
|
|
340
|
+
function verifyWebhookSignature(body, signature, secret) {
|
|
341
|
+
const expected = (0, import_crypto.createHmac)("sha256", secret).update(body).digest("hex");
|
|
342
|
+
if (signature.length !== expected.length) return false;
|
|
343
|
+
return (0, import_crypto.timingSafeEqual)(Buffer.from(signature), Buffer.from(expected));
|
|
344
|
+
}
|
|
345
|
+
function constructEvent(body, signature, secret) {
|
|
346
|
+
if (!verifyWebhookSignature(body, signature, secret)) {
|
|
347
|
+
throw new WebhookSignatureError();
|
|
348
|
+
}
|
|
349
|
+
let raw;
|
|
350
|
+
try {
|
|
351
|
+
raw = JSON.parse(body);
|
|
352
|
+
} catch {
|
|
353
|
+
throw new WebhookSignatureError("Invalid webhook payload");
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
event: raw.event,
|
|
357
|
+
paymentId: raw.payment_id,
|
|
358
|
+
externalRef: raw.external_ref,
|
|
359
|
+
externalOrderId: raw.external_order_id,
|
|
360
|
+
chain: raw.chain,
|
|
361
|
+
token: raw.token ?? "USDT",
|
|
362
|
+
address: raw.address,
|
|
363
|
+
expectedAmount: raw.expected_amount,
|
|
364
|
+
paidAmount: raw.paid_amount,
|
|
365
|
+
txHash: raw.tx_hash,
|
|
366
|
+
status: raw.status,
|
|
367
|
+
paidAt: raw.paid_at,
|
|
368
|
+
metadata: raw.metadata ?? {},
|
|
369
|
+
timestamp: raw.timestamp
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// src/index.ts
|
|
374
|
+
var PayzCore = class {
|
|
375
|
+
payments;
|
|
376
|
+
projects;
|
|
377
|
+
constructor(apiKey, options = {}) {
|
|
378
|
+
if (!apiKey) {
|
|
379
|
+
throw new Error("PayzCore API key is required. Pass your pk_live_xxx or mk_xxx key.");
|
|
380
|
+
}
|
|
381
|
+
const client = new HttpClient(apiKey, options);
|
|
382
|
+
this.payments = new Payments(client);
|
|
383
|
+
this.projects = new Projects(client);
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
var index_default = PayzCore;
|
|
387
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
388
|
+
0 && (module.exports = {
|
|
389
|
+
AuthenticationError,
|
|
390
|
+
ForbiddenError,
|
|
391
|
+
NotFoundError,
|
|
392
|
+
PayzCore,
|
|
393
|
+
PayzCoreError,
|
|
394
|
+
RateLimitError,
|
|
395
|
+
ValidationError,
|
|
396
|
+
WebhookSignatureError,
|
|
397
|
+
constructEvent,
|
|
398
|
+
verifyWebhookSignature
|
|
399
|
+
});
|
|
400
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/resources/payments.ts","../src/resources/projects.ts","../src/webhook.ts"],"sourcesContent":["import { HttpClient } from './client'\nimport { Payments } from './resources/payments'\nimport { Projects } from './resources/projects'\nimport type { PayzCoreOptions } from './types'\n\nexport class PayzCore {\n readonly payments: Payments\n readonly projects: Projects\n\n constructor(apiKey: string, options: PayzCoreOptions = {}) {\n if (!apiKey) {\n throw new Error('PayzCore API key is required. Pass your pk_live_xxx or mk_xxx key.')\n }\n\n const client = new HttpClient(apiKey, options)\n this.payments = new Payments(client)\n this.projects = new Projects(client)\n }\n}\n\nexport default PayzCore\n\n// Webhook utilities\nexport { verifyWebhookSignature, constructEvent } from './webhook'\n\n// Error classes\nexport {\n PayzCoreError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ValidationError,\n RateLimitError,\n WebhookSignatureError,\n} from './errors'\n\n// Types\nexport type {\n Chain,\n Token,\n PaymentStatus,\n WebhookEventType,\n PayzCoreOptions,\n CreatePaymentParams,\n Payment,\n CreatePaymentResponse,\n PaymentListItem,\n ListPaymentsParams,\n ListPaymentsResponse,\n Transaction,\n PaymentDetail,\n GetPaymentResponse,\n CreateProjectParams,\n Project,\n CreateProjectResponse,\n ProjectListItem,\n ListProjectsResponse,\n WebhookPayload,\n} from './types'\n","import type { ApiErrorBody } from './types'\n\nexport class PayzCoreError extends Error {\n readonly status: number\n readonly code: string\n readonly details?: Array<{ code: string; path?: string[]; message: string }>\n\n constructor(message: string, status: number, code: string, details?: ApiErrorBody['details']) {\n super(message)\n this.name = 'PayzCoreError'\n this.status = status\n this.code = code\n this.details = details\n }\n}\n\nexport class AuthenticationError extends PayzCoreError {\n constructor(message = 'Invalid or missing API key') {\n super(message, 401, 'authentication_error')\n this.name = 'AuthenticationError'\n }\n}\n\nexport class ForbiddenError extends PayzCoreError {\n constructor(message = 'Access denied') {\n super(message, 403, 'forbidden')\n this.name = 'ForbiddenError'\n }\n}\n\nexport class NotFoundError extends PayzCoreError {\n constructor(message = 'Resource not found') {\n super(message, 404, 'not_found')\n this.name = 'NotFoundError'\n }\n}\n\nexport class ValidationError extends PayzCoreError {\n constructor(\n message: string,\n details?: ApiErrorBody['details'],\n ) {\n super(message, 400, 'validation_error', details)\n this.name = 'ValidationError'\n }\n}\n\nexport class RateLimitError extends PayzCoreError {\n readonly retryAfter: number | null\n readonly isDaily: boolean\n\n constructor(message: string, retryAfter: number | null = null, isDaily = false) {\n super(message, 429, 'rate_limit_error')\n this.name = 'RateLimitError'\n this.retryAfter = retryAfter\n this.isDaily = isDaily\n }\n}\n\nexport class WebhookSignatureError extends Error {\n constructor(message = 'Webhook signature verification failed') {\n super(message)\n this.name = 'WebhookSignatureError'\n }\n}\n","import type { ApiErrorBody, PayzCoreOptions } from './types'\nimport {\n PayzCoreError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ValidationError,\n RateLimitError,\n} from './errors'\n\nconst DEFAULT_BASE_URL = 'https://api.payzcore.com'\nconst DEFAULT_TIMEOUT = 30_000\nconst DEFAULT_MAX_RETRIES = 2\nconst RETRY_BASE_MS = 200\n\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly useMasterKey: boolean\n\n constructor(apiKey: string, options: PayzCoreOptions = {}) {\n this.apiKey = apiKey\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES\n this.useMasterKey = options.masterKey ?? false\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': '@payzcore/node/1.0.0',\n }\n\n if (this.useMasterKey) {\n headers['x-master-key'] = this.apiKey\n } else {\n headers['x-api-key'] = this.apiKey\n }\n\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await sleep(RETRY_BASE_MS * 2 ** (attempt - 1))\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body != null ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n })\n\n if (response.ok) {\n return (await response.json()) as T\n }\n\n // Non-retryable errors — throw immediately\n if (response.status < 500 && response.status !== 429) {\n await throwApiError(response)\n }\n\n // 429 — don't retry\n if (response.status === 429) {\n await throwApiError(response)\n }\n\n // 5xx — retry if attempts remain\n lastError = await buildApiError(response)\n } catch (err) {\n if (\n err instanceof PayzCoreError ||\n err instanceof AuthenticationError ||\n err instanceof ForbiddenError ||\n err instanceof NotFoundError ||\n err instanceof ValidationError ||\n err instanceof RateLimitError\n ) {\n throw err\n }\n\n // Network / timeout errors — retry\n lastError = err instanceof Error ? err : new Error(String(err))\n }\n }\n\n throw lastError ?? new PayzCoreError('Request failed after retries', 0, 'network_error')\n }\n\n get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path)\n }\n\n post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>('POST', path, body)\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function throwApiError(response: Response): Promise<never> {\n throw await buildApiError(response)\n}\n\nasync function buildApiError(response: Response): Promise<PayzCoreError> {\n let body: ApiErrorBody\n try {\n body = (await response.json()) as ApiErrorBody\n } catch {\n body = { error: response.statusText || 'Unknown error' }\n }\n\n const message = body.error ?? 'Unknown error'\n\n switch (response.status) {\n case 400:\n return new ValidationError(message, body.details)\n case 401:\n return new AuthenticationError(message)\n case 403:\n return new ForbiddenError(message)\n case 404:\n return new NotFoundError(message)\n case 429: {\n const resetHeader = response.headers.get('X-RateLimit-Reset')\n const dailyHeader = response.headers.get('X-RateLimit-Daily')\n const retryAfter = resetHeader ? parseInt(resetHeader, 10) : null\n const isDaily = dailyHeader === 'true'\n return new RateLimitError(message, retryAfter, isDaily)\n }\n default:\n return new PayzCoreError(message, response.status, 'api_error')\n }\n}\n","import type { HttpClient } from '../client'\nimport type {\n CreatePaymentParams,\n CreatePaymentResponse,\n ListPaymentsParams,\n ListPaymentsResponse,\n GetPaymentResponse,\n} from '../types'\n\n// Map snake_case API response to camelCase SDK types\nfunction mapPayment(raw: Record<string, unknown>) {\n return {\n id: raw.id,\n address: raw.address,\n amount: raw.amount,\n chain: raw.chain,\n token: raw.token ?? 'USDT',\n status: raw.status,\n expiresAt: raw.expires_at,\n externalOrderId: raw.external_order_id,\n qrCode: raw.qr_code,\n }\n}\n\nfunction mapPaymentListItem(raw: Record<string, unknown>) {\n return {\n id: raw.id,\n externalRef: raw.external_ref,\n externalOrderId: raw.external_order_id,\n chain: raw.chain,\n token: raw.token ?? 'USDT',\n address: raw.address,\n expectedAmount: raw.expected_amount,\n paidAmount: raw.paid_amount,\n status: raw.status,\n txHash: raw.tx_hash,\n expiresAt: raw.expires_at,\n paidAt: raw.paid_at,\n createdAt: raw.created_at,\n }\n}\n\nfunction mapPaymentDetail(raw: Record<string, unknown>) {\n const txs = raw.transactions as Array<Record<string, unknown>> | undefined\n return {\n id: raw.id,\n status: raw.status,\n expectedAmount: raw.expected_amount,\n paidAmount: raw.paid_amount,\n address: raw.address,\n chain: raw.chain,\n token: raw.token ?? 'USDT',\n txHash: raw.tx_hash,\n expiresAt: raw.expires_at,\n transactions: (txs ?? []).map((t) => ({\n txHash: t.tx_hash,\n amount: t.amount,\n from: t.from,\n confirmed: t.confirmed,\n })),\n }\n}\n\nexport class Payments {\n constructor(private readonly client: HttpClient) {}\n\n async create(params: CreatePaymentParams): Promise<CreatePaymentResponse> {\n const body = {\n amount: params.amount,\n chain: params.chain,\n token: params.token,\n external_ref: params.externalRef,\n external_order_id: params.externalOrderId,\n expires_in: params.expiresIn,\n metadata: params.metadata,\n }\n\n const raw = await this.client.post<Record<string, unknown>>('/api/v1/payments', body)\n return {\n success: true,\n existing: raw.existing as boolean,\n payment: mapPayment(raw.payment as Record<string, unknown>),\n } as CreatePaymentResponse\n }\n\n async list(params: ListPaymentsParams = {}): Promise<ListPaymentsResponse> {\n const searchParams = new URLSearchParams()\n if (params.status) searchParams.set('status', params.status)\n if (params.limit != null) searchParams.set('limit', String(params.limit))\n if (params.offset != null) searchParams.set('offset', String(params.offset))\n\n const qs = searchParams.toString()\n const path = `/api/v1/payments${qs ? `?${qs}` : ''}`\n const raw = await this.client.get<Record<string, unknown>>(path)\n const payments = raw.payments as Array<Record<string, unknown>>\n\n return {\n success: true,\n payments: payments.map(mapPaymentListItem),\n } as ListPaymentsResponse\n }\n\n async get(id: string): Promise<GetPaymentResponse> {\n const raw = await this.client.get<Record<string, unknown>>(`/api/v1/payments/${encodeURIComponent(id)}`)\n return {\n success: true,\n payment: mapPaymentDetail(raw.payment as Record<string, unknown>),\n } as GetPaymentResponse\n }\n}\n","import type { HttpClient } from '../client'\nimport type {\n CreateProjectParams,\n CreateProjectResponse,\n ListProjectsResponse,\n} from '../types'\n\nfunction mapProject(raw: Record<string, unknown>) {\n return {\n id: raw.id,\n name: raw.name,\n slug: raw.slug,\n apiKey: raw.api_key,\n webhookSecret: raw.webhook_secret,\n webhookUrl: raw.webhook_url,\n createdAt: raw.created_at,\n }\n}\n\nfunction mapProjectListItem(raw: Record<string, unknown>) {\n return {\n id: raw.id,\n name: raw.name,\n slug: raw.slug,\n apiKey: raw.api_key,\n webhookUrl: raw.webhook_url,\n isActive: raw.is_active,\n createdAt: raw.created_at,\n }\n}\n\nexport class Projects {\n constructor(private readonly client: HttpClient) {}\n\n async create(params: CreateProjectParams): Promise<CreateProjectResponse> {\n const body = {\n name: params.name,\n slug: params.slug,\n webhook_url: params.webhookUrl,\n metadata: params.metadata,\n }\n\n const raw = await this.client.post<Record<string, unknown>>('/api/v1/projects', body)\n return {\n success: true,\n project: mapProject(raw.project as Record<string, unknown>),\n } as CreateProjectResponse\n }\n\n async list(): Promise<ListProjectsResponse> {\n const raw = await this.client.get<Record<string, unknown>>('/api/v1/projects')\n const projects = raw.projects as Array<Record<string, unknown>>\n\n return {\n success: true,\n projects: projects.map(mapProjectListItem),\n } as ListProjectsResponse\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto'\nimport { WebhookSignatureError } from './errors'\nimport type { WebhookPayload, Chain, PaymentStatus, WebhookEventType } from './types'\n\n/**\n * Verify a webhook signature from PayzCore.\n *\n * @param body - Raw request body string\n * @param signature - Value of X-PayzCore-Signature header\n * @param secret - Webhook secret from project creation (whsec_xxx)\n * @returns true if signature is valid\n */\nexport function verifyWebhookSignature(\n body: string,\n signature: string,\n secret: string,\n): boolean {\n const expected = createHmac('sha256', secret).update(body).digest('hex')\n if (signature.length !== expected.length) return false\n return timingSafeEqual(Buffer.from(signature), Buffer.from(expected))\n}\n\n/**\n * Verify signature and parse the webhook payload.\n * Throws WebhookSignatureError if signature is invalid.\n *\n * @param body - Raw request body string\n * @param signature - Value of X-PayzCore-Signature header\n * @param secret - Webhook secret from project creation (whsec_xxx)\n * @returns Parsed and typed webhook payload\n */\nexport function constructEvent(\n body: string,\n signature: string,\n secret: string,\n): WebhookPayload {\n if (!verifyWebhookSignature(body, signature, secret)) {\n throw new WebhookSignatureError()\n }\n\n let raw: Record<string, unknown>\n try {\n raw = JSON.parse(body) as Record<string, unknown>\n } catch {\n throw new WebhookSignatureError('Invalid webhook payload')\n }\n\n return {\n event: raw.event as WebhookEventType,\n paymentId: raw.payment_id as string,\n externalRef: raw.external_ref as string,\n externalOrderId: raw.external_order_id as string | undefined,\n chain: raw.chain as Chain,\n token: (raw.token as string) ?? 'USDT',\n address: raw.address as string,\n expectedAmount: raw.expected_amount as string,\n paidAmount: raw.paid_amount as string,\n txHash: raw.tx_hash as string | null,\n status: raw.status as PaymentStatus,\n paidAt: raw.paid_at as string | null,\n metadata: (raw.metadata as Record<string, unknown>) ?? {},\n timestamp: raw.timestamp as string,\n }\n}\n"],"mappings":"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","names":[]}
|