@elyonar/einvoice-js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/cjs/client/http-client.d.ts +52 -0
- package/dist/cjs/client/http-client.d.ts.map +1 -0
- package/dist/cjs/client/http-client.js +117 -0
- package/dist/cjs/client/http-client.js.map +1 -0
- package/dist/cjs/client/index.d.ts +3 -0
- package/dist/cjs/client/index.d.ts.map +1 -0
- package/dist/cjs/client/index.js +6 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/einvoice.d.ts +69 -0
- package/dist/cjs/einvoice.d.ts.map +1 -0
- package/dist/cjs/einvoice.js +79 -0
- package/dist/cjs/einvoice.js.map +1 -0
- package/dist/cjs/errors.d.ts +74 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +98 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/services/billing.d.ts +75 -0
- package/dist/cjs/services/billing.d.ts.map +1 -0
- package/dist/cjs/services/billing.js +172 -0
- package/dist/cjs/services/billing.js.map +1 -0
- package/dist/cjs/services/buyers.d.ts +57 -0
- package/dist/cjs/services/buyers.d.ts.map +1 -0
- package/dist/cjs/services/buyers.js +110 -0
- package/dist/cjs/services/buyers.js.map +1 -0
- package/dist/cjs/services/index.d.ts +5 -0
- package/dist/cjs/services/index.d.ts.map +1 -0
- package/dist/cjs/services/index.js +12 -0
- package/dist/cjs/services/index.js.map +1 -0
- package/dist/cjs/services/invoices.d.ts +94 -0
- package/dist/cjs/services/invoices.d.ts.map +1 -0
- package/dist/cjs/services/invoices.js +193 -0
- package/dist/cjs/services/invoices.js.map +1 -0
- package/dist/cjs/services/sellers.d.ts +61 -0
- package/dist/cjs/services/sellers.d.ts.map +1 -0
- package/dist/cjs/services/sellers.js +114 -0
- package/dist/cjs/services/sellers.js.map +1 -0
- package/dist/cjs/types/billing.d.ts +174 -0
- package/dist/cjs/types/billing.d.ts.map +1 -0
- package/dist/cjs/types/billing.js +6 -0
- package/dist/cjs/types/billing.js.map +1 -0
- package/dist/cjs/types/common.d.ts +53 -0
- package/dist/cjs/types/common.d.ts.map +1 -0
- package/dist/cjs/types/common.js +6 -0
- package/dist/cjs/types/common.js.map +1 -0
- package/dist/cjs/types/index.d.ts +6 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +3 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/invoice.d.ts +183 -0
- package/dist/cjs/types/invoice.d.ts.map +1 -0
- package/dist/cjs/types/invoice.js +6 -0
- package/dist/cjs/types/invoice.js.map +1 -0
- package/dist/cjs/types/party.d.ts +128 -0
- package/dist/cjs/types/party.d.ts.map +1 -0
- package/dist/cjs/types/party.js +3 -0
- package/dist/cjs/types/party.js.map +1 -0
- package/dist/cjs/types/webhook.d.ts +14 -0
- package/dist/cjs/types/webhook.d.ts.map +1 -0
- package/dist/cjs/types/webhook.js +6 -0
- package/dist/cjs/types/webhook.js.map +1 -0
- package/dist/cjs/webhooks/index.d.ts +3 -0
- package/dist/cjs/webhooks/index.d.ts.map +1 -0
- package/dist/cjs/webhooks/index.js +6 -0
- package/dist/cjs/webhooks/index.js.map +1 -0
- package/dist/cjs/webhooks/verify.d.ts +43 -0
- package/dist/cjs/webhooks/verify.d.ts.map +1 -0
- package/dist/cjs/webhooks/verify.js +92 -0
- package/dist/cjs/webhooks/verify.js.map +1 -0
- package/dist/esm/client/http-client.d.ts +52 -0
- package/dist/esm/client/http-client.d.ts.map +1 -0
- package/dist/esm/client/http-client.js +113 -0
- package/dist/esm/client/http-client.js.map +1 -0
- package/dist/esm/client/index.d.ts +3 -0
- package/dist/esm/client/index.d.ts.map +1 -0
- package/dist/esm/client/index.js +2 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/einvoice.d.ts +69 -0
- package/dist/esm/einvoice.d.ts.map +1 -0
- package/dist/esm/einvoice.js +75 -0
- package/dist/esm/einvoice.js.map +1 -0
- package/dist/esm/errors.d.ts +74 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +89 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +24 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/services/billing.d.ts +75 -0
- package/dist/esm/services/billing.d.ts.map +1 -0
- package/dist/esm/services/billing.js +168 -0
- package/dist/esm/services/billing.js.map +1 -0
- package/dist/esm/services/buyers.d.ts +57 -0
- package/dist/esm/services/buyers.d.ts.map +1 -0
- package/dist/esm/services/buyers.js +106 -0
- package/dist/esm/services/buyers.js.map +1 -0
- package/dist/esm/services/index.d.ts +5 -0
- package/dist/esm/services/index.d.ts.map +1 -0
- package/dist/esm/services/index.js +5 -0
- package/dist/esm/services/index.js.map +1 -0
- package/dist/esm/services/invoices.d.ts +94 -0
- package/dist/esm/services/invoices.d.ts.map +1 -0
- package/dist/esm/services/invoices.js +189 -0
- package/dist/esm/services/invoices.js.map +1 -0
- package/dist/esm/services/sellers.d.ts +61 -0
- package/dist/esm/services/sellers.d.ts.map +1 -0
- package/dist/esm/services/sellers.js +110 -0
- package/dist/esm/services/sellers.js.map +1 -0
- package/dist/esm/types/billing.d.ts +174 -0
- package/dist/esm/types/billing.d.ts.map +1 -0
- package/dist/esm/types/billing.js +5 -0
- package/dist/esm/types/billing.js.map +1 -0
- package/dist/esm/types/common.d.ts +53 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +5 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/index.d.ts +6 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/invoice.d.ts +183 -0
- package/dist/esm/types/invoice.d.ts.map +1 -0
- package/dist/esm/types/invoice.js +5 -0
- package/dist/esm/types/invoice.js.map +1 -0
- package/dist/esm/types/party.d.ts +128 -0
- package/dist/esm/types/party.d.ts.map +1 -0
- package/dist/esm/types/party.js +2 -0
- package/dist/esm/types/party.js.map +1 -0
- package/dist/esm/types/webhook.d.ts +14 -0
- package/dist/esm/types/webhook.d.ts.map +1 -0
- package/dist/esm/types/webhook.js +5 -0
- package/dist/esm/types/webhook.js.map +1 -0
- package/dist/esm/webhooks/index.d.ts +3 -0
- package/dist/esm/webhooks/index.d.ts.map +1 -0
- package/dist/esm/webhooks/index.js +2 -0
- package/dist/esm/webhooks/index.js.map +1 -0
- package/dist/esm/webhooks/verify.d.ts +43 -0
- package/dist/esm/webhooks/verify.d.ts.map +1 -0
- package/dist/esm/webhooks/verify.js +89 -0
- package/dist/esm/webhooks/verify.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/types/webhook.ts"],"names":[],"mappings":";AAAA,8CAA8C;AAC9C,sBAAsB;AACtB,8CAA8C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyWebhook = void 0;
|
|
4
|
+
var verify_js_1 = require("./verify.js");
|
|
5
|
+
Object.defineProperty(exports, "verifyWebhook", { enumerable: true, get: function () { return verify_js_1.verifyWebhook; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":";;;AAAA,yCAA4C;AAAnC,0GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { WebhookEvent, WebhookHeaders } from '../types/webhook.js';
|
|
2
|
+
export interface VerifyWebhookOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Maximum allowed age of the webhook timestamp (in seconds).
|
|
5
|
+
* Prevents replay attacks.
|
|
6
|
+
* @default 300
|
|
7
|
+
*/
|
|
8
|
+
toleranceSeconds?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Verify and parse a webhook event from the E-Invoice platform.
|
|
12
|
+
*
|
|
13
|
+
* Performs HMAC-SHA256 signature verification with timing-safe comparison
|
|
14
|
+
* and replay protection via timestamp validation.
|
|
15
|
+
*
|
|
16
|
+
* @param payload - The raw request body (string or Buffer).
|
|
17
|
+
* @param headers - The webhook request headers (or a plain object with the relevant keys).
|
|
18
|
+
* @param secret - Your webhook signing secret.
|
|
19
|
+
* @param options - Optional verification options.
|
|
20
|
+
* @returns The parsed and verified webhook event.
|
|
21
|
+
* @throws {EInvoiceWebhookError} If verification fails.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { verifyWebhook } from '@elyonar/einvoice-js/webhooks';
|
|
26
|
+
*
|
|
27
|
+
* app.post('/webhooks/einvoice', (req, res) => {
|
|
28
|
+
* try {
|
|
29
|
+
* const event = verifyWebhook(req.body, req.headers, process.env.WEBHOOK_SECRET);
|
|
30
|
+
* switch (event.eventType) {
|
|
31
|
+
* case 'invoice.approved':
|
|
32
|
+
* // Handle approved invoice
|
|
33
|
+
* break;
|
|
34
|
+
* }
|
|
35
|
+
* res.sendStatus(200);
|
|
36
|
+
* } catch (err) {
|
|
37
|
+
* res.sendStatus(400);
|
|
38
|
+
* }
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function verifyWebhook<T = Record<string, unknown>>(payload: string | Buffer, headers: Partial<WebhookHeaders> | Record<string, string | string[] | undefined>, secret: string, options?: VerifyWebhookOptions): WebhookEvent<T>;
|
|
43
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/webhooks/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQxE,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EAChF,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,YAAY,CAAC,CAAC,CAAC,CAgDjB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyWebhook = verifyWebhook;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const errors_js_1 = require("../errors.js");
|
|
6
|
+
/**
|
|
7
|
+
* Maximum age (in seconds) for a webhook timestamp before it's considered stale.
|
|
8
|
+
* Default: 300 seconds (5 minutes).
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_TOLERANCE_SECONDS = 300;
|
|
11
|
+
/**
|
|
12
|
+
* Verify and parse a webhook event from the E-Invoice platform.
|
|
13
|
+
*
|
|
14
|
+
* Performs HMAC-SHA256 signature verification with timing-safe comparison
|
|
15
|
+
* and replay protection via timestamp validation.
|
|
16
|
+
*
|
|
17
|
+
* @param payload - The raw request body (string or Buffer).
|
|
18
|
+
* @param headers - The webhook request headers (or a plain object with the relevant keys).
|
|
19
|
+
* @param secret - Your webhook signing secret.
|
|
20
|
+
* @param options - Optional verification options.
|
|
21
|
+
* @returns The parsed and verified webhook event.
|
|
22
|
+
* @throws {EInvoiceWebhookError} If verification fails.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { verifyWebhook } from '@elyonar/einvoice-js/webhooks';
|
|
27
|
+
*
|
|
28
|
+
* app.post('/webhooks/einvoice', (req, res) => {
|
|
29
|
+
* try {
|
|
30
|
+
* const event = verifyWebhook(req.body, req.headers, process.env.WEBHOOK_SECRET);
|
|
31
|
+
* switch (event.eventType) {
|
|
32
|
+
* case 'invoice.approved':
|
|
33
|
+
* // Handle approved invoice
|
|
34
|
+
* break;
|
|
35
|
+
* }
|
|
36
|
+
* res.sendStatus(200);
|
|
37
|
+
* } catch (err) {
|
|
38
|
+
* res.sendStatus(400);
|
|
39
|
+
* }
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
function verifyWebhook(payload, headers, secret, options) {
|
|
44
|
+
const tolerance = options?.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS;
|
|
45
|
+
// Extract headers (case-insensitive)
|
|
46
|
+
const signature = getHeader(headers, 'x-webhook-signature');
|
|
47
|
+
const timestamp = getHeader(headers, 'x-webhook-timestamp');
|
|
48
|
+
if (!signature) {
|
|
49
|
+
throw new errors_js_1.EInvoiceWebhookError('Missing X-Webhook-Signature header');
|
|
50
|
+
}
|
|
51
|
+
if (!timestamp) {
|
|
52
|
+
throw new errors_js_1.EInvoiceWebhookError('Missing X-Webhook-Timestamp header');
|
|
53
|
+
}
|
|
54
|
+
// Validate timestamp (replay protection)
|
|
55
|
+
const webhookTime = parseInt(timestamp, 10);
|
|
56
|
+
if (isNaN(webhookTime)) {
|
|
57
|
+
throw new errors_js_1.EInvoiceWebhookError('Invalid X-Webhook-Timestamp header');
|
|
58
|
+
}
|
|
59
|
+
const now = Math.floor(Date.now() / 1000);
|
|
60
|
+
if (Math.abs(now - webhookTime) > tolerance) {
|
|
61
|
+
throw new errors_js_1.EInvoiceWebhookError(`Webhook timestamp too old. Received: ${webhookTime}, current: ${now}, tolerance: ${tolerance}s`);
|
|
62
|
+
}
|
|
63
|
+
// Build the signed payload: "{timestamp}.{rawBody}"
|
|
64
|
+
const rawBody = typeof payload === 'string' ? payload : payload.toString('utf-8');
|
|
65
|
+
const signedPayload = `${timestamp}.${rawBody}`;
|
|
66
|
+
// Compute expected signature
|
|
67
|
+
const expectedSignature = `sha256=${(0, node_crypto_1.createHmac)('sha256', secret).update(signedPayload).digest('hex')}`;
|
|
68
|
+
// Timing-safe comparison
|
|
69
|
+
const sigBuffer = Buffer.from(signature, 'utf-8');
|
|
70
|
+
const expectedBuffer = Buffer.from(expectedSignature, 'utf-8');
|
|
71
|
+
if (sigBuffer.length !== expectedBuffer.length || !(0, node_crypto_1.timingSafeEqual)(sigBuffer, expectedBuffer)) {
|
|
72
|
+
throw new errors_js_1.EInvoiceWebhookError('Webhook signature verification failed');
|
|
73
|
+
}
|
|
74
|
+
// Parse and return the event
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(rawBody);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new errors_js_1.EInvoiceWebhookError('Failed to parse webhook payload as JSON');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract a header value, handling case insensitivity and arrays.
|
|
84
|
+
*/
|
|
85
|
+
function getHeader(headers, key) {
|
|
86
|
+
// Try exact match first, then lowercase
|
|
87
|
+
const value = headers[key] ?? headers[key.toLowerCase()];
|
|
88
|
+
if (Array.isArray(value))
|
|
89
|
+
return value[0];
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/webhooks/verify.ts"],"names":[],"mappings":";;AAmDA,sCAqDC;AAxGD,6CAA0D;AAC1D,4CAAoD;AAGpD;;;GAGG;AACH,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAWtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,SAAgB,aAAa,CAC3B,OAAwB,EACxB,OAAgF,EAChF,MAAc,EACd,OAA8B;IAE9B,MAAM,SAAS,GAAG,OAAO,EAAE,gBAAgB,IAAI,yBAAyB,CAAC;IAEzE,qCAAqC;IACrC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAE5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,gCAAoB,CAAC,oCAAoC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,gCAAoB,CAAC,oCAAoC,CAAC,CAAC;IACvE,CAAC;IAED,yCAAyC;IACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,gCAAoB,CAAC,oCAAoC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,SAAS,EAAE,CAAC;QAC5C,MAAM,IAAI,gCAAoB,CAC5B,wCAAwC,WAAW,cAAc,GAAG,gBAAgB,SAAS,GAAG,CACjG,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;IAEhD,6BAA6B;IAC7B,MAAM,iBAAiB,GAAG,UAAU,IAAA,wBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAEvG,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAE/D,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,IAAI,CAAC,IAAA,6BAAe,EAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,gCAAoB,CAAC,uCAAuC,CAAC,CAAC;IAC1E,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAAC,yCAAyC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,OAAsD,EACtD,GAAW;IAEX,wCAAwC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ApiResponse, RequestOptions as PerRequestOptions } from '../types/common.js';
|
|
2
|
+
export interface HttpClientConfig {
|
|
3
|
+
/**
|
|
4
|
+
* API key for authentication. Must start with `sk_live_` or `sk_test_`.
|
|
5
|
+
*/
|
|
6
|
+
apiKey: string;
|
|
7
|
+
/**
|
|
8
|
+
* Base URL of the E-Invoice API gateway.
|
|
9
|
+
* @default 'https://api.einvoice.ng'
|
|
10
|
+
*/
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Request timeout in milliseconds.
|
|
14
|
+
* @default 30000
|
|
15
|
+
*/
|
|
16
|
+
timeout?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of retry attempts for failed requests.
|
|
19
|
+
* Only 5xx errors and 429 rate limits are retried.
|
|
20
|
+
* @default 3
|
|
21
|
+
*/
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Base delay for exponential backoff (in milliseconds).
|
|
25
|
+
* @default 1000
|
|
26
|
+
*/
|
|
27
|
+
retryBaseDelay?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface InternalRequestOptions {
|
|
30
|
+
method: 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
31
|
+
path: string;
|
|
32
|
+
body?: unknown;
|
|
33
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
34
|
+
requestOptions?: PerRequestOptions;
|
|
35
|
+
}
|
|
36
|
+
export declare class HttpClient {
|
|
37
|
+
private readonly baseUrl;
|
|
38
|
+
private readonly apiKey;
|
|
39
|
+
private readonly timeout;
|
|
40
|
+
private readonly maxRetries;
|
|
41
|
+
private readonly retryBaseDelay;
|
|
42
|
+
constructor(config: HttpClientConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Make an authenticated HTTP request to the E-Invoice API.
|
|
45
|
+
*/
|
|
46
|
+
request<T>(options: InternalRequestOptions): Promise<ApiResponse<T>>;
|
|
47
|
+
private doFetch;
|
|
48
|
+
private buildUrl;
|
|
49
|
+
private calculateBackoff;
|
|
50
|
+
private sleep;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/client/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY3F,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9D,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,EAAE,gBAAgB;IAYpC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YA2D5D,OAAO;IAgCrB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { EInvoiceApiError, EInvoiceRateLimitError, EInvoiceTimeoutError, EInvoiceConfigError, } from '../errors.js';
|
|
2
|
+
// ═══════════════════════════════════════════
|
|
3
|
+
// HTTP Client
|
|
4
|
+
// ═══════════════════════════════════════════
|
|
5
|
+
export class HttpClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
apiKey;
|
|
8
|
+
timeout;
|
|
9
|
+
maxRetries;
|
|
10
|
+
retryBaseDelay;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
if (!config.apiKey) {
|
|
13
|
+
throw new EInvoiceConfigError('API key is required. Pass `apiKey` to the client constructor.');
|
|
14
|
+
}
|
|
15
|
+
this.baseUrl = (config.baseUrl ?? 'https://api.einvoice.ng').replace(/\/$/, '');
|
|
16
|
+
this.apiKey = config.apiKey;
|
|
17
|
+
this.timeout = config.timeout ?? 30_000;
|
|
18
|
+
this.maxRetries = config.maxRetries ?? 3;
|
|
19
|
+
this.retryBaseDelay = config.retryBaseDelay ?? 1000;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Make an authenticated HTTP request to the E-Invoice API.
|
|
23
|
+
*/
|
|
24
|
+
async request(options) {
|
|
25
|
+
const url = this.buildUrl(options.path, options.query);
|
|
26
|
+
const timeout = options.requestOptions?.timeout ?? this.timeout;
|
|
27
|
+
let lastError;
|
|
28
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
29
|
+
if (attempt > 0) {
|
|
30
|
+
const delay = this.calculateBackoff(attempt);
|
|
31
|
+
await this.sleep(delay);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const response = await this.doFetch(url, options, timeout);
|
|
35
|
+
// Handle rate limiting
|
|
36
|
+
if (response.status === 429) {
|
|
37
|
+
const retryAfter = parseInt(response.headers.get('retry-after') ?? '5', 10);
|
|
38
|
+
if (attempt < this.maxRetries) {
|
|
39
|
+
await this.sleep(retryAfter * 1000);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
throw new EInvoiceRateLimitError('Rate limit exceeded', retryAfter);
|
|
43
|
+
}
|
|
44
|
+
const body = await response.json();
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
const meta = body?.meta;
|
|
47
|
+
throw new EInvoiceApiError(meta?.message ?? `HTTP ${response.status}`, response.status, meta?.errors?.[0]?.code, meta?.errors ?? []);
|
|
48
|
+
}
|
|
49
|
+
return body;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Convert AbortError to timeout error
|
|
53
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
54
|
+
throw new EInvoiceTimeoutError(timeout);
|
|
55
|
+
}
|
|
56
|
+
lastError = error;
|
|
57
|
+
// Don't retry client errors (4xx except 429, which is handled above)
|
|
58
|
+
if (error instanceof EInvoiceApiError && error.statusCode < 500) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
if (attempt === this.maxRetries) {
|
|
62
|
+
throw lastError;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw lastError ?? new Error('Request failed after retries');
|
|
67
|
+
}
|
|
68
|
+
async doFetch(url, options, timeout) {
|
|
69
|
+
const headers = {
|
|
70
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
'Accept': 'application/json',
|
|
73
|
+
...options.requestOptions?.headers,
|
|
74
|
+
};
|
|
75
|
+
const controller = new AbortController();
|
|
76
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
77
|
+
// If the caller provided an AbortSignal, wire it up
|
|
78
|
+
if (options.requestOptions?.signal) {
|
|
79
|
+
options.requestOptions.signal.addEventListener('abort', () => controller.abort());
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return await fetch(url, {
|
|
83
|
+
method: options.method,
|
|
84
|
+
headers,
|
|
85
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
86
|
+
signal: controller.signal,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
clearTimeout(timeoutId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
buildUrl(path, query) {
|
|
94
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
95
|
+
if (query) {
|
|
96
|
+
for (const [key, value] of Object.entries(query)) {
|
|
97
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
98
|
+
url.searchParams.set(key, String(value));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return url.toString();
|
|
103
|
+
}
|
|
104
|
+
calculateBackoff(attempt) {
|
|
105
|
+
const base = this.retryBaseDelay * Math.pow(2, attempt - 1);
|
|
106
|
+
const jitter = Math.random() * base * 0.1;
|
|
107
|
+
return base + jitter;
|
|
108
|
+
}
|
|
109
|
+
sleep(ms) {
|
|
110
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/client/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { HttpClientConfig } from './client/http-client.js';
|
|
2
|
+
import { InvoiceService } from './services/invoices.js';
|
|
3
|
+
import { SellerService } from './services/sellers.js';
|
|
4
|
+
import { BuyerService } from './services/buyers.js';
|
|
5
|
+
import { BillingService } from './services/billing.js';
|
|
6
|
+
/**
|
|
7
|
+
* The main E-Invoice SDK client.
|
|
8
|
+
*
|
|
9
|
+
* Provides access to all E-Invoice platform APIs through typed service objects.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { EInvoice } from '@elyonar/einvoice-js';
|
|
14
|
+
*
|
|
15
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
16
|
+
*
|
|
17
|
+
* // Invoices
|
|
18
|
+
* const invoice = await client.invoices.create({ ... });
|
|
19
|
+
* await client.invoices.submit(invoice.data.id);
|
|
20
|
+
*
|
|
21
|
+
* // Sellers & Buyers
|
|
22
|
+
* const sellers = await client.sellers.list();
|
|
23
|
+
* const buyers = await client.buyers.search('Acme');
|
|
24
|
+
*
|
|
25
|
+
* // Billing
|
|
26
|
+
* const balance = await client.billing.getAccount();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class EInvoice {
|
|
30
|
+
/** @internal */
|
|
31
|
+
private readonly httpClient;
|
|
32
|
+
/**
|
|
33
|
+
* Invoice management: create, submit, validate, download, and more.
|
|
34
|
+
*/
|
|
35
|
+
readonly invoices: InvoiceService;
|
|
36
|
+
/**
|
|
37
|
+
* Seller management: register, update, verify TIN.
|
|
38
|
+
*/
|
|
39
|
+
readonly sellers: SellerService;
|
|
40
|
+
/**
|
|
41
|
+
* Buyer management: register, update, verify TIN.
|
|
42
|
+
*/
|
|
43
|
+
readonly buyers: BuyerService;
|
|
44
|
+
/**
|
|
45
|
+
* Billing management: account, credits, subscriptions, payments, analytics.
|
|
46
|
+
*/
|
|
47
|
+
readonly billing: BillingService;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new E-Invoice SDK client.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Client configuration. At minimum, `apiKey` is required.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* // Minimal configuration
|
|
56
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
57
|
+
*
|
|
58
|
+
* // Full configuration
|
|
59
|
+
* const client = new EInvoice({
|
|
60
|
+
* apiKey: 'sk_live_...',
|
|
61
|
+
* baseUrl: 'https://api.einvoice.ng',
|
|
62
|
+
* timeout: 15000,
|
|
63
|
+
* maxRetries: 2,
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
constructor(config: HttpClientConfig);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=einvoice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einvoice.d.ts","sourceRoot":"","sources":["../../src/einvoice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;IACnB,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IAExC;;OAEG;IACH,SAAgB,QAAQ,EAAE,cAAc,CAAC;IAEzC;;OAEG;IACH,SAAgB,OAAO,EAAE,aAAa,CAAC;IAEvC;;OAEG;IACH,SAAgB,MAAM,EAAE,YAAY,CAAC;IAErC;;OAEG;IACH,SAAgB,OAAO,EAAE,cAAc,CAAC;IAExC;;;;;;;;;;;;;;;;;;OAkBG;gBACS,MAAM,EAAE,gBAAgB;CAQrC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { HttpClient } from './client/http-client.js';
|
|
2
|
+
import { InvoiceService } from './services/invoices.js';
|
|
3
|
+
import { SellerService } from './services/sellers.js';
|
|
4
|
+
import { BuyerService } from './services/buyers.js';
|
|
5
|
+
import { BillingService } from './services/billing.js';
|
|
6
|
+
/**
|
|
7
|
+
* The main E-Invoice SDK client.
|
|
8
|
+
*
|
|
9
|
+
* Provides access to all E-Invoice platform APIs through typed service objects.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { EInvoice } from '@elyonar/einvoice-js';
|
|
14
|
+
*
|
|
15
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
16
|
+
*
|
|
17
|
+
* // Invoices
|
|
18
|
+
* const invoice = await client.invoices.create({ ... });
|
|
19
|
+
* await client.invoices.submit(invoice.data.id);
|
|
20
|
+
*
|
|
21
|
+
* // Sellers & Buyers
|
|
22
|
+
* const sellers = await client.sellers.list();
|
|
23
|
+
* const buyers = await client.buyers.search('Acme');
|
|
24
|
+
*
|
|
25
|
+
* // Billing
|
|
26
|
+
* const balance = await client.billing.getAccount();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class EInvoice {
|
|
30
|
+
/** @internal */
|
|
31
|
+
httpClient;
|
|
32
|
+
/**
|
|
33
|
+
* Invoice management: create, submit, validate, download, and more.
|
|
34
|
+
*/
|
|
35
|
+
invoices;
|
|
36
|
+
/**
|
|
37
|
+
* Seller management: register, update, verify TIN.
|
|
38
|
+
*/
|
|
39
|
+
sellers;
|
|
40
|
+
/**
|
|
41
|
+
* Buyer management: register, update, verify TIN.
|
|
42
|
+
*/
|
|
43
|
+
buyers;
|
|
44
|
+
/**
|
|
45
|
+
* Billing management: account, credits, subscriptions, payments, analytics.
|
|
46
|
+
*/
|
|
47
|
+
billing;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new E-Invoice SDK client.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Client configuration. At minimum, `apiKey` is required.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* // Minimal configuration
|
|
56
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
57
|
+
*
|
|
58
|
+
* // Full configuration
|
|
59
|
+
* const client = new EInvoice({
|
|
60
|
+
* apiKey: 'sk_live_...',
|
|
61
|
+
* baseUrl: 'https://api.einvoice.ng',
|
|
62
|
+
* timeout: 15000,
|
|
63
|
+
* maxRetries: 2,
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
constructor(config) {
|
|
68
|
+
this.httpClient = new HttpClient(config);
|
|
69
|
+
this.invoices = new InvoiceService(this.httpClient);
|
|
70
|
+
this.sellers = new SellerService(this.httpClient);
|
|
71
|
+
this.buyers = new BuyerService(this.httpClient);
|
|
72
|
+
this.billing = new BillingService(this.httpClient);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=einvoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einvoice.js","sourceRoot":"","sources":["../../src/einvoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,QAAQ;IACnB,gBAAgB;IACC,UAAU,CAAa;IAExC;;OAEG;IACa,QAAQ,CAAiB;IAEzC;;OAEG;IACa,OAAO,CAAgB;IAEvC;;OAEG;IACa,MAAM,CAAe;IAErC;;OAEG;IACa,OAAO,CAAiB;IAExC;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAAY,MAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all E-Invoice SDK errors.
|
|
3
|
+
*/
|
|
4
|
+
export declare class EInvoiceError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Represents an API error response from the E-Invoice platform.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* try {
|
|
13
|
+
* await client.invoices.get('inv_123');
|
|
14
|
+
* } catch (err) {
|
|
15
|
+
* if (err instanceof EInvoiceApiError) {
|
|
16
|
+
* console.log(err.statusCode); // 404
|
|
17
|
+
* console.log(err.errorCode); // 'INVOICE_NOT_FOUND'
|
|
18
|
+
* console.log(err.errors); // [{ field: 'id', message: 'Invoice not found' }]
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class EInvoiceApiError extends EInvoiceError {
|
|
24
|
+
readonly statusCode: number;
|
|
25
|
+
readonly errorCode?: string | undefined;
|
|
26
|
+
readonly errors: Array<{
|
|
27
|
+
field?: string;
|
|
28
|
+
message: string;
|
|
29
|
+
code?: string;
|
|
30
|
+
}>;
|
|
31
|
+
constructor(message: string, statusCode: number, errorCode?: string | undefined, errors?: Array<{
|
|
32
|
+
field?: string;
|
|
33
|
+
message: string;
|
|
34
|
+
code?: string;
|
|
35
|
+
}>);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Thrown when the API returns HTTP 429 (Too Many Requests).
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* try {
|
|
43
|
+
* await client.invoices.list();
|
|
44
|
+
* } catch (err) {
|
|
45
|
+
* if (err instanceof EInvoiceRateLimitError) {
|
|
46
|
+
* console.log(`Retry after ${err.retryAfter} seconds`);
|
|
47
|
+
* }
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class EInvoiceRateLimitError extends EInvoiceApiError {
|
|
52
|
+
readonly retryAfter: number;
|
|
53
|
+
constructor(message: string, retryAfter: number);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Thrown when a request times out.
|
|
57
|
+
*/
|
|
58
|
+
export declare class EInvoiceTimeoutError extends EInvoiceError {
|
|
59
|
+
readonly timeoutMs: number;
|
|
60
|
+
constructor(timeoutMs: number);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Thrown when the SDK is misconfigured (e.g. missing API key).
|
|
64
|
+
*/
|
|
65
|
+
export declare class EInvoiceConfigError extends EInvoiceError {
|
|
66
|
+
constructor(message: string);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Thrown when webhook signature verification fails.
|
|
70
|
+
*/
|
|
71
|
+
export declare class EInvoiceWebhookError extends EInvoiceError {
|
|
72
|
+
constructor(message: string);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAiB,SAAQ,aAAa;aAG/B,UAAU,EAAE,MAAM;aAClB,SAAS,CAAC,EAAE,MAAM;aAClB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;gBAHjF,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,MAAM,GAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAM;CAKzF;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAuB,SAAQ,gBAAgB;aAGxC,UAAU,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM;CAKrC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;aACzB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAI9C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;gBACzC,OAAO,EAAE,MAAM;CAI5B"}
|