@emitia/node 0.1.0 → 0.2.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/README.md +1 -1
- package/dist/index.d.ts +579 -2285
- package/dist/index.js +97 -11
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -71,6 +71,11 @@ var ValidationError = class extends EmitiaError {
|
|
|
71
71
|
__name(this, "ValidationError");
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
|
+
var InvalidRequestError = class extends EmitiaError {
|
|
75
|
+
static {
|
|
76
|
+
__name(this, "InvalidRequestError");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
74
79
|
var RateLimitError = class extends EmitiaError {
|
|
75
80
|
static {
|
|
76
81
|
__name(this, "RateLimitError");
|
|
@@ -86,11 +91,6 @@ var DianRejectedError = class extends EmitiaError {
|
|
|
86
91
|
__name(this, "DianRejectedError");
|
|
87
92
|
}
|
|
88
93
|
};
|
|
89
|
-
var DianUnavailableError = class extends EmitiaError {
|
|
90
|
-
static {
|
|
91
|
-
__name(this, "DianUnavailableError");
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
94
|
var CertificateError = class extends EmitiaError {
|
|
95
95
|
static {
|
|
96
96
|
__name(this, "CertificateError");
|
|
@@ -109,14 +109,16 @@ var ApiError = class extends EmitiaError {
|
|
|
109
109
|
var TYPE_TO_CLASS = {
|
|
110
110
|
authentication_error: AuthenticationError,
|
|
111
111
|
permission_error: PermissionError,
|
|
112
|
-
|
|
112
|
+
not_found: NotFoundError,
|
|
113
113
|
validation_error: ValidationError,
|
|
114
|
-
|
|
114
|
+
invalid_request: InvalidRequestError,
|
|
115
|
+
rate_limited: RateLimitError,
|
|
115
116
|
idempotency_error: IdempotencyError,
|
|
116
117
|
dian_rejected: DianRejectedError,
|
|
117
|
-
dian_unavailable: DianUnavailableError,
|
|
118
118
|
certificate_error: CertificateError,
|
|
119
|
-
numbering_error: NumberingError
|
|
119
|
+
numbering_error: NumberingError,
|
|
120
|
+
internal_error: ApiError,
|
|
121
|
+
api_error: ApiError
|
|
120
122
|
};
|
|
121
123
|
var HTTP_STATUS_TO_CLASS = {
|
|
122
124
|
401: AuthenticationError,
|
|
@@ -149,7 +151,7 @@ function fromPayload(envelope, httpStatus, requestId) {
|
|
|
149
151
|
__name(fromPayload, "fromPayload");
|
|
150
152
|
|
|
151
153
|
// src/version.ts
|
|
152
|
-
var SDK_VERSION = "0.
|
|
154
|
+
var SDK_VERSION = "0.2.0";
|
|
153
155
|
|
|
154
156
|
// src/http.ts
|
|
155
157
|
var RETRY_BASE_MS = 500;
|
|
@@ -777,6 +779,87 @@ var TestResource = class extends BaseResource {
|
|
|
777
779
|
}
|
|
778
780
|
};
|
|
779
781
|
|
|
782
|
+
// src/resources/webhook-endpoints.ts
|
|
783
|
+
var WebhookEndpointsResource = class extends BaseResource {
|
|
784
|
+
static {
|
|
785
|
+
__name(this, "WebhookEndpointsResource");
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* POST /v1/webhook-endpoints — Create a webhook endpoint.
|
|
789
|
+
* Returns 201. Auto-generates idempotency-key (R03).
|
|
790
|
+
* The signing secret (whsec_...) is returned ONCE in the response — store it immediately.
|
|
791
|
+
*/
|
|
792
|
+
create(body, opts) {
|
|
793
|
+
return this._http.request({
|
|
794
|
+
method: "POST",
|
|
795
|
+
path: "/v1/webhook-endpoints",
|
|
796
|
+
body,
|
|
797
|
+
idempotencyKey: opts?.idempotencyKey,
|
|
798
|
+
autoIdempotency: opts?.idempotencyKey === void 0
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* GET /v1/webhook-endpoints
|
|
803
|
+
* Returns a cursor-paginated list of webhook endpoints.
|
|
804
|
+
* The signing secret is NEVER included in list responses.
|
|
805
|
+
*/
|
|
806
|
+
list(params) {
|
|
807
|
+
const query = {};
|
|
808
|
+
if (params?.limit !== void 0) query["limit"] = params.limit;
|
|
809
|
+
if (params?.starting_after !== void 0) query["starting_after"] = params.starting_after;
|
|
810
|
+
return this._http.request({
|
|
811
|
+
method: "GET",
|
|
812
|
+
path: "/v1/webhook-endpoints",
|
|
813
|
+
query: Object.keys(query).length > 0 ? query : void 0
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* GET /v1/webhook-endpoints/{id}
|
|
818
|
+
* Returns a webhook endpoint by public ID.
|
|
819
|
+
* 404 if not found or belongs to a different tenant.
|
|
820
|
+
* The signing secret is NEVER included in get responses.
|
|
821
|
+
*/
|
|
822
|
+
retrieve(id) {
|
|
823
|
+
return this._http.request({
|
|
824
|
+
method: "GET",
|
|
825
|
+
path: `/v1/webhook-endpoints/${id}`
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* PATCH /v1/webhook-endpoints/{id} — Partially update a webhook endpoint.
|
|
830
|
+
* Returns 200 with updated WebhookEndpointResponse. No idempotency-key.
|
|
831
|
+
* The signing secret is NEVER included in update responses.
|
|
832
|
+
*/
|
|
833
|
+
update(id, body) {
|
|
834
|
+
return this._http.request({
|
|
835
|
+
method: "PATCH",
|
|
836
|
+
path: `/v1/webhook-endpoints/${id}`,
|
|
837
|
+
body
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* DELETE /v1/webhook-endpoints/{id} — Hard-delete a webhook endpoint.
|
|
842
|
+
* Returns 200 with { id, object, deleted: true }. No idempotency-key.
|
|
843
|
+
*/
|
|
844
|
+
del(id) {
|
|
845
|
+
return this._http.request({
|
|
846
|
+
method: "DELETE",
|
|
847
|
+
path: `/v1/webhook-endpoints/${id}`
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
/**
|
|
851
|
+
* POST /v1/webhook-endpoints/{id}/rotate-secret
|
|
852
|
+
* Generates a new signing secret (ADR-2: instant rotation, no grace period).
|
|
853
|
+
* The new whsec_ is returned ONCE — store it immediately. No idempotency-key.
|
|
854
|
+
*/
|
|
855
|
+
rotateSecret(id) {
|
|
856
|
+
return this._http.request({
|
|
857
|
+
method: "POST",
|
|
858
|
+
path: `/v1/webhook-endpoints/${id}/rotate-secret`
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
};
|
|
862
|
+
|
|
780
863
|
// src/client.ts
|
|
781
864
|
var Emitia = class {
|
|
782
865
|
static {
|
|
@@ -801,6 +884,8 @@ var Emitia = class {
|
|
|
801
884
|
debitNotes;
|
|
802
885
|
// ── Test resource (PR3b) ──────────────────────────────────────────────────────
|
|
803
886
|
test;
|
|
887
|
+
// ── Webhook endpoints (PR3) ───────────────────────────────────────────────────
|
|
888
|
+
webhookEndpoints;
|
|
804
889
|
constructor(apiKey, opts) {
|
|
805
890
|
const config = validateConfig(apiKey, opts);
|
|
806
891
|
this.#http = new HttpClient(config);
|
|
@@ -814,6 +899,7 @@ var Emitia = class {
|
|
|
814
899
|
this.creditNotes = new CreditNotesResource(this.#http);
|
|
815
900
|
this.debitNotes = new DebitNotesResource(this.#http);
|
|
816
901
|
this.test = new TestResource(this.#http);
|
|
902
|
+
this.webhookEndpoints = new WebhookEndpointsResource(this.#http);
|
|
817
903
|
}
|
|
818
904
|
};
|
|
819
905
|
var SignatureVerificationError = class extends Error {
|
|
@@ -883,6 +969,6 @@ function constructEvent(payload, signatureHeader, secret, toleranceSec = 300, no
|
|
|
883
969
|
}
|
|
884
970
|
__name(constructEvent, "constructEvent");
|
|
885
971
|
|
|
886
|
-
export { ApiError, AuthenticationError, CertificateError, DianRejectedError,
|
|
972
|
+
export { ApiError, AuthenticationError, CertificateError, DianRejectedError, Emitia, EmitiaError, IdempotencyError, InvalidRequestError, NotFoundError, NumberingError, PermissionError, RateLimitError, SDK_VERSION, SignatureVerificationError, ValidationError, constructEvent, fromPayload, isErrorEnvelope };
|
|
887
973
|
//# sourceMappingURL=index.js.map
|
|
888
974
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/version.ts","../src/http.ts","../src/resources/base.ts","../src/resources/account.ts","../src/resources/balance.ts","../src/resources/catalogs.ts","../src/resources/certificates.ts","../src/resources/credit-notes.ts","../src/resources/customers.ts","../src/resources/debit-notes.ts","../src/resources/invoices.ts","../src/resources/numbering-resolutions.ts","../src/resources/test-resource.ts","../src/client.ts","../src/webhooks.ts"],"names":["DEFAULT_BASE_URL","validateConfig","apiKey","opts","startsWith","Error","slice","baseURL","timeout","maxRetries","fetch","isErrorEnvelope","value","v","inner","e","EmitiaError","type","code","requestId","statusCode","docUrl","details","message","name","Object","setPrototypeOf","prototype","AuthenticationError","PermissionError","NotFoundError","ValidationError","RateLimitError","IdempotencyError","DianRejectedError","DianUnavailableError","CertificateError","NumberingError","ApiError","TYPE_TO_CLASS","authentication_error","permission_error","not_found_error","validation_error","rate_limit_error","idempotency_error","dian_rejected","dian_unavailable","certificate_error","numbering_error","HTTP_STATUS_TO_CLASS","fromPayload","envelope","httpStatus","doc_url","error","ByType","undefined","ByStatus","SDK_VERSION","RETRY_BASE_MS","RETRY_CAP_MS","sleep","ms","signal","Promise","resolve","reject","aborted","id","setTimeout","onAbort","clearTimeout","addEventListener","once","jitteredDelay","attempt","exp","capped","Math","min","floor","random","parseRetryAfter","header","nowMs","asSeconds","Number","isFinite","max","asDate","Date","parse","isNaN","shouldRetry","status","HttpClient","config","request","fetchFn","globalThis","bind","idempotencyKey","autoIdempotency","crypto","randomUUID","lastError","url","buildUrl","path","query","headers","authorization","process","version","accept","body","response","method","JSON","stringify","get","ok","json","bodyText","text","parsedBody","length","responseError","retryAfter","now","delayMs","base","replace","keys","params","URLSearchParams","key","entries","set","String","toString","BaseResource","_http","http","AccountResource","retrieve","BalanceResource","CatalogsResource","slug","municipios","department","CertificatesResource","list","limit","starting_after","create","del","activate","CreditNotesResource","sendEmail","emailContent","listEmails","CustomersResource","update","DebitNotesResource","InvoicesResource","customer","number_prefix","cufe","NumberingResolutionsResource","TestResource","triggerEvent","Emitia","account","balance","catalogs","certificates","numberingResolutions","customers","invoices","creditNotes","debitNotes","test","SignatureVerificationError","reason","parseSignatureHeader","parts","split","t","v1Values","part","trimmed","trim","raw","push","constructEvent","payload","signatureHeader","secret","toleranceSec","nowSec","parsed","drift","abs","payloadString","Buffer","isBuffer","signedPayload","expectedHmac","createHmac","digest","matched","some","v1","v1Buffer","from","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SDK configuration types and validation.\n *\n * R01: Client construction validates apiKey prefix (sk_test_ | sk_live_).\n * Any other prefix → synchronous throw before any HTTP call.\n */\n\nexport const DEFAULT_BASE_URL = 'https://api.emitia.co';\n\n/** Resolved, validated SDK configuration. All fields are present. */\nexport interface EmitiaConfig {\n apiKey: string;\n baseURL: string;\n timeout: number;\n maxRetries: number;\n /**\n * Injectable fetch implementation (default: globalThis.fetch).\n * Used in tests to inject a mock without patching globals.\n * ADR-2: native fetch only — nothing is loaded at runtime. (The package's\n * single dependency, zod, exists solely so the published .d.ts can derive\n * types from its schemas; the compiled .js never imports it.)\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Validates apiKey and merges caller options with defaults.\n * Throws synchronously for invalid apiKey — no HTTP call is ever made.\n */\nexport function validateConfig(apiKey: string, opts?: Partial<EmitiaConfig>): EmitiaConfig {\n if (!apiKey.startsWith('sk_test_') && !apiKey.startsWith('sk_live_')) {\n throw new Error(\n `Invalid API key \"${apiKey.slice(0, 10)}...\": must start with \"sk_test_\" or \"sk_live_\".`,\n );\n }\n\n return {\n apiKey,\n baseURL: opts?.baseURL ?? DEFAULT_BASE_URL,\n timeout: opts?.timeout ?? 30_000,\n maxRetries: opts?.maxRetries ?? 2,\n fetch: opts?.fetch,\n };\n}\n","/**\n * Typed error hierarchy for the @emitia/node SDK.\n *\n * R05: Every non-2xx response → typed subclass of EmitiaError.\n *\n * Design: SDK redeclares its own hierarchy. Does NOT import @emitia/shared\n * at runtime — @emitia/shared is a backend-private package.\n *\n * Mapping:\n * 401 → AuthenticationError\n * 403 → PermissionError\n * 404 → NotFoundError\n * 422 → ValidationError\n * 429 → RateLimitError\n * 409 + type=idempotency_error → IdempotencyError\n * type=dian_rejected → DianRejectedError (any status)\n * all others → ApiError\n */\n\n// ── ErrorEnvelope type (matches backend shape) ────────────────────────────────\n\ninterface ErrorPayloadInner {\n type: string;\n code: string;\n message: string;\n doc_url?: string;\n request_id?: string;\n details?: unknown;\n}\n\ninterface ErrorEnvelope {\n error: ErrorPayloadInner;\n}\n\n/** Narrows an unknown value to an ErrorEnvelope. No `!` usage. */\nexport function isErrorEnvelope(value: unknown): value is ErrorEnvelope {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n const inner = v['error'];\n if (inner === null || typeof inner !== 'object') return false;\n const e = inner as Record<string, unknown>;\n return (\n typeof e['type'] === 'string' &&\n typeof e['code'] === 'string' &&\n typeof e['message'] === 'string'\n );\n}\n\n// ── Base class ────────────────────────────────────────────────────────────────\n\nexport class EmitiaError extends Error {\n readonly type: string;\n readonly code: string;\n readonly requestId: string;\n readonly statusCode: number;\n readonly docUrl: string | undefined;\n readonly details: unknown;\n\n constructor(opts: {\n type: string;\n code: string;\n message: string;\n requestId: string;\n statusCode: number;\n docUrl?: string;\n details?: unknown;\n }) {\n super(opts.message);\n this.name = this.constructor.name;\n this.type = opts.type;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.statusCode = opts.statusCode;\n this.docUrl = opts.docUrl;\n this.details = opts.details;\n // Maintain proper prototype chain for instanceof checks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ── Subclasses ────────────────────────────────────────────────────────────────\n\nexport class AuthenticationError extends EmitiaError {}\nexport class PermissionError extends EmitiaError {}\nexport class NotFoundError extends EmitiaError {}\nexport class ValidationError extends EmitiaError {}\nexport class RateLimitError extends EmitiaError {}\nexport class IdempotencyError extends EmitiaError {}\nexport class DianRejectedError extends EmitiaError {}\nexport class DianUnavailableError extends EmitiaError {}\nexport class CertificateError extends EmitiaError {}\nexport class NumberingError extends EmitiaError {}\n/** Fallback for any type not explicitly mapped. */\nexport class ApiError extends EmitiaError {}\n\n// ── TYPE_TO_CLASS map ─────────────────────────────────────────────────────────\n\ntype ErrorConstructor = new (opts: ConstructorParameters<typeof EmitiaError>[0]) => EmitiaError;\n\nconst TYPE_TO_CLASS: Readonly<Record<string, ErrorConstructor>> = {\n authentication_error: AuthenticationError,\n permission_error: PermissionError,\n not_found_error: NotFoundError,\n validation_error: ValidationError,\n rate_limit_error: RateLimitError,\n idempotency_error: IdempotencyError,\n dian_rejected: DianRejectedError,\n dian_unavailable: DianUnavailableError,\n certificate_error: CertificateError,\n numbering_error: NumberingError,\n};\n\nconst HTTP_STATUS_TO_CLASS: Readonly<Record<number, ErrorConstructor>> = {\n 401: AuthenticationError,\n 403: PermissionError,\n 404: NotFoundError,\n 422: ValidationError,\n 429: RateLimitError,\n};\n\n/**\n * Build a typed error from an API error envelope + HTTP metadata.\n *\n * Resolution order:\n * 1. error.type in TYPE_TO_CLASS → use that class\n * 2. httpStatus in HTTP_STATUS_TO_CLASS → use that class\n * 3. fallback → ApiError\n *\n * requestId comes from the `X-Request-Id` response header (passed as parameter).\n */\nexport function fromPayload(\n envelope: ErrorEnvelope,\n httpStatus: number,\n requestId: string,\n): EmitiaError {\n const { type, code, message, doc_url, details } = envelope.error;\n\n const opts = {\n type,\n code,\n message,\n requestId,\n statusCode: httpStatus,\n docUrl: doc_url,\n details,\n };\n\n const ByType = TYPE_TO_CLASS[type];\n if (ByType !== undefined) {\n return new ByType(opts);\n }\n\n const ByStatus = HTTP_STATUS_TO_CLASS[httpStatus];\n if (ByStatus !== undefined) {\n return new ByStatus(opts);\n }\n\n return new ApiError(opts);\n}\n","/**\n * SDK version constant.\n *\n * ADR-5: Declared as a plain string constant matching package.json#version.\n * Not imported via import JSON (fragile ESM) — kept in sync by a test guard\n * (src/__tests__/version.test.ts) that fails if they diverge.\n */\nexport const SDK_VERSION = '0.1.0';\n","/**\n * HTTP transport for the @emitia/node SDK.\n *\n * R02: Authorization + User-Agent on every request.\n * R03: Idempotency-key auto-generation (UUID v4 via crypto.randomUUID) for flagged POSTs.\n * R04: Retry 429/5xx with exponential backoff + full jitter; Retry-After defensive.\n * AbortSignal respected. Same idempotency-key reused across retries.\n * No `!` non-null assertions in runtime code.\n */\n\nimport type { EmitiaConfig } from './config.js';\nimport { fromPayload, isErrorEnvelope } from './errors.js';\nimport { SDK_VERSION } from './version.js';\n\ninterface RequestOptions {\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n path: string;\n query?: Record<string, string | number | boolean>;\n body?: unknown;\n idempotencyKey?: string;\n /** When true, a UUID v4 idempotency-key is generated automatically. */\n autoIdempotency?: boolean;\n signal?: AbortSignal;\n}\n\nconst RETRY_BASE_MS = 500;\nconst RETRY_CAP_MS = 8_000;\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted === true) {\n reject(new Error('AbortError'));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(new Error('AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction jitteredDelay(attempt: number): number {\n const exp = RETRY_BASE_MS * 2 ** attempt;\n const capped = Math.min(exp, RETRY_CAP_MS);\n return Math.floor(Math.random() * capped);\n}\n\n/**\n * Parse a `Retry-After` header (RFC 7231: delay-seconds or HTTP-date) into ms,\n * capped at RETRY_CAP_MS so a hostile/erroneous large value cannot hang the\n * client. Returns null when the header is absent or unparseable (caller falls\n * back to jittered backoff). `nowMs` is injectable for deterministic tests.\n */\nfunction parseRetryAfter(header: string | null, nowMs: number): number | null {\n if (header === null) return null;\n const asSeconds = Number(header);\n if (Number.isFinite(asSeconds)) {\n return Math.min(Math.max(asSeconds, 0) * 1_000, RETRY_CAP_MS);\n }\n const asDate = Date.parse(header);\n if (Number.isNaN(asDate)) return null;\n return Math.min(Math.max(asDate - nowMs, 0), RETRY_CAP_MS);\n}\n\nfunction shouldRetry(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nexport class HttpClient {\n private readonly config: EmitiaConfig;\n\n constructor(config: EmitiaConfig) {\n this.config = config;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n // Bind the global fetch to globalThis so an unbound reference can't trip a\n // polyfill that relies on `this`. An injected fetch is used as-is.\n const fetchFn = this.config.fetch ?? globalThis.fetch.bind(globalThis);\n\n // Generate idempotency key once — reused on retries (R03).\n const idempotencyKey: string | undefined =\n opts.idempotencyKey ?? (opts.autoIdempotency === true ? crypto.randomUUID() : undefined);\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n const url = this.buildUrl(opts.path, opts.query);\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.config.apiKey}`,\n 'user-agent': `emitia-node/${SDK_VERSION} node/${process.version}`,\n accept: 'application/json',\n };\n\n if (opts.body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n if (idempotencyKey !== undefined) {\n headers['idempotency-key'] = idempotencyKey;\n }\n\n // Network errors and aborts propagate directly: PR1 retries only HTTP\n // 429/5xx responses, never transport-level failures.\n const response: Response = await fetchFn(url, {\n method: opts.method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts.signal,\n });\n\n const requestId = response.headers.get('x-request-id') ?? '';\n\n if (response.ok) {\n return (await response.json()) as T;\n }\n\n // Parse error body\n let bodyText: string;\n try {\n bodyText = await response.text();\n } catch {\n bodyText = '';\n }\n\n let parsedBody: unknown;\n try {\n parsedBody = bodyText.length > 0 ? JSON.parse(bodyText) : {};\n } catch {\n parsedBody = {};\n }\n\n // Build the error we'd throw for this response (used for both retry and final throw).\n const responseError = isErrorEnvelope(parsedBody)\n ? fromPayload(parsedBody, response.status, requestId)\n : new Error(`HTTP ${response.status}: ${bodyText}`);\n\n if (shouldRetry(response.status) && attempt < this.config.maxRetries) {\n // Respect Retry-After header (defensive — not documented in openapi.json),\n // capped so a hostile/erroneous value cannot hang the client.\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'), Date.now());\n const delayMs = retryAfter ?? jitteredDelay(attempt);\n\n // May throw if aborted — propagate immediately without storing as lastError.\n await sleep(delayMs, opts.signal);\n lastError = responseError;\n continue;\n }\n\n // Non-retriable or retries exhausted — throw immediately.\n throw responseError;\n }\n\n throw lastError ?? new Error('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean>): string {\n const base = this.config.baseURL.replace(/\\/$/, '');\n const url = `${base}${path}`;\n if (query === undefined || Object.keys(query).length === 0) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n params.set(key, String(value));\n }\n return `${url}?${params.toString()}`;\n }\n}\n","/**\n * BaseResource — shared base class for all SDK resource namespaces.\n *\n * Holds a reference to the HttpClient so resource subclasses can call\n * this._http.request<T>(...) without re-wiring the transport.\n */\n\nimport type { HttpClient } from '../http.js';\n\nexport abstract class BaseResource {\n protected readonly _http: HttpClient;\n\n constructor(http: HttpClient) {\n this._http = http;\n }\n}\n","/**\n * AccountResource — GET /v1/account\n *\n * R06: Read-only resource. Returns tenant info for the authenticated API key.\n */\n\nimport type { AccountInfo } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class AccountResource extends BaseResource {\n retrieve(): Promise<AccountInfo> {\n return this._http.request<AccountInfo>({ method: 'GET', path: '/v1/account' });\n }\n}\n","/**\n * BalanceResource — GET /v1/balance\n *\n * R06: Read-only resource. Returns document usage counts for the current period.\n */\n\nimport type { BalanceResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class BalanceResource extends BaseResource {\n retrieve(): Promise<BalanceResponse> {\n return this._http.request<BalanceResponse>({ method: 'GET', path: '/v1/balance' });\n }\n}\n","/**\n * CatalogsResource — GET /v1/catalogs/{slug} and GET /v1/catalogs/municipios\n *\n * R06: Read-only resource (public endpoints, no auth required by the API — but\n * the SDK sends Authorization anyway as it's always present).\n *\n * Response types are inferred via z.infer from the @emitia/openapi Zod SSOT\n * (CatalogListResponseSchema / MunicipioListResponseSchema) — zero drift with\n * the actual API contract.\n */\n\nimport type { CatalogListResponse, MunicipioListResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface MunicipiosQuery {\n /** 2-digit DANE department code (e.g. \"11\" for Bogotá D.C.). */\n department?: string;\n}\n\nexport class CatalogsResource extends BaseResource {\n /**\n * GET /v1/catalogs/{slug}\n * Returns all items in a named DIAN catalog.\n */\n retrieve(slug: string): Promise<CatalogListResponse> {\n return this._http.request<CatalogListResponse>({\n method: 'GET',\n path: `/v1/catalogs/${slug}`,\n });\n }\n\n /**\n * GET /v1/catalogs/municipios\n * Returns Colombian municipalities. Optionally filtered by 2-digit department code.\n */\n municipios(query?: MunicipiosQuery): Promise<MunicipioListResponse> {\n return this._http.request<MunicipioListResponse>({\n method: 'GET',\n path: '/v1/catalogs/municipios',\n query: query?.department !== undefined ? { department: query.department } : undefined,\n });\n }\n}\n","/**\n * CertificatesResource — read + write methods for /v1/certificates\n *\n * R06: retrieve(id), list(params?), create(body, opts?), del(id), activate(id).\n * R03: create() does NOT auto-generate idempotency-key (openapi.json: no Idempotency-Key header on POST /v1/certificates).\n * Override via opts.idempotencyKey is still accepted.\n * del() and activate() carry no idempotency-key.\n */\n\nimport type {\n CertificateListResponse,\n CertificateResponse,\n CreateCertificateRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface CertificateListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination. */\n starting_after?: string;\n}\n\nexport interface CertificateCreateOpts {\n /** Optional explicit idempotency key (NOT auto-generated — openapi.json does not require it). */\n idempotencyKey?: string;\n}\n\nexport class CertificatesResource extends BaseResource {\n /**\n * GET /v1/certificates/{id}\n * Returns certificate metadata by ID. 404 if not found or cross-tenant.\n */\n retrieve(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'GET',\n path: `/v1/certificates/${id}`,\n });\n }\n\n /**\n * GET /v1/certificates\n * Returns a cursor-paginated list of certificate metadata.\n * Soft-deleted certificates are excluded.\n */\n list(params?: CertificateListParams): Promise<CertificateListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<CertificateListResponse>({\n method: 'GET',\n path: '/v1/certificates',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/certificates — Upload a new .p12 certificate.\n * Returns 201. No auto-idempotency (openapi.json: no Idempotency-Key header required).\n * Explicit override accepted via opts.idempotencyKey.\n */\n create(\n body: CreateCertificateRequest,\n opts?: CertificateCreateOpts,\n ): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'POST',\n path: '/v1/certificates',\n body,\n idempotencyKey: opts?.idempotencyKey,\n });\n }\n\n /**\n * DELETE /v1/certificates/{id} — Soft-delete a certificate.\n * Returns 200 with the deleted CertificateResponse (not 204). No idempotency-key.\n */\n del(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'DELETE',\n path: `/v1/certificates/${id}`,\n });\n }\n\n /**\n * POST /v1/certificates/{id}/activate — Set this certificate as the active signing cert.\n * Returns 200 with updated CertificateResponse. No idempotency-key.\n */\n activate(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'POST',\n path: `/v1/certificates/${id}/activate`,\n });\n }\n}\n","/**\n * CreditNotesResource — full CRUD + email methods for /v1/credit-notes\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateCreditNoteRequest,\n CreditNoteDetailResponse,\n CreditNoteListResponse,\n CreditNoteResponse,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\ntype NoteStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface CreditNoteListParams {\n /** Max items to return (1–100). */\n limit?: number;\n /** Cursor from previous page. */\n starting_after?: string;\n /** Filter by credit note status. */\n status?: NoteStatus;\n /** ISO-8601 date/datetime — include notes created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include notes created before. */\n 'created[lt]'?: string;\n}\n\nexport interface CreditNoteCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class CreditNotesResource extends BaseResource {\n /**\n * POST /v1/credit-notes — Create a draft credit note.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateCreditNoteRequest, opts?: CreditNoteCreateOpts): Promise<CreditNoteResponse> {\n return this._http.request<CreditNoteResponse>({\n method: 'POST',\n path: '/v1/credit-notes',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id} — Retrieve credit note by ID (detail including DIAN response).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<CreditNoteDetailResponse> {\n return this._http.request<CreditNoteDetailResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}`,\n });\n }\n\n /**\n * GET /v1/credit-notes — List credit notes (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: CreditNoteListParams): Promise<CreditNoteListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n return this._http.request<CreditNoteListResponse>({\n method: 'GET',\n path: '/v1/credit-notes',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/credit-notes/{id}/send-email — Manually resend the credit note email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/credit-notes/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id}/email-content — Get email content.\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}/emails`,\n });\n }\n}\n","/**\n * CustomersResource — read + write methods for /v1/customers\n *\n * R06: retrieve(id), list(params?), create(body, opts?), update(id, body), del(id).\n * R03: create() is a billable POST — auto-generates idempotency-key (Idempotency-Key required per openapi.json).\n * PATCH and DELETE do NOT carry idempotency-key.\n */\n\nimport type {\n CreateCustomerRequest,\n CustomerListResponse,\n CustomerResponse,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface CustomerListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination (ID of the last item from the previous page). */\n starting_after?: string;\n}\n\nexport interface CustomerCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated (R03). */\n idempotencyKey?: string;\n}\n\nexport class CustomersResource extends BaseResource {\n /**\n * GET /v1/customers/{id}\n * Returns a customer by public ID. 404 if not found or soft-deleted.\n */\n retrieve(id: string): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'GET',\n path: `/v1/customers/${id}`,\n });\n }\n\n /**\n * GET /v1/customers\n * Returns a cursor-paginated list of customers.\n */\n list(params?: CustomerListParams): Promise<CustomerListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<CustomerListResponse>({\n method: 'GET',\n path: '/v1/customers',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/customers — Create a customer.\n * Returns 201. Auto-generates idempotency-key (R03 — openapi.json marks Idempotency-Key required).\n */\n create(body: CreateCustomerRequest, opts?: CustomerCreateOpts): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'POST',\n path: '/v1/customers',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * PATCH /v1/customers/{id} — Update a customer.\n * Returns 200 with updated CustomerResponse. No idempotency-key.\n */\n update(id: string, body: Partial<CreateCustomerRequest>): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'PATCH',\n path: `/v1/customers/${id}`,\n body,\n });\n }\n\n /**\n * DELETE /v1/customers/{id} — Soft-delete a customer.\n * Returns 200 with the deleted CustomerResponse (not 204). No idempotency-key.\n */\n del(id: string): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'DELETE',\n path: `/v1/customers/${id}`,\n });\n }\n}\n","/**\n * DebitNotesResource — full CRUD + email methods for /v1/debit-notes\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateDebitNoteRequest,\n DebitNoteDetailResponse,\n DebitNoteListResponse,\n DebitNoteResponse,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\ntype NoteStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface DebitNoteListParams {\n /** Max items to return (1–100). */\n limit?: number;\n /** Cursor from previous page. */\n starting_after?: string;\n /** Filter by debit note status. */\n status?: NoteStatus;\n /** ISO-8601 date/datetime — include notes created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include notes created before. */\n 'created[lt]'?: string;\n}\n\nexport interface DebitNoteCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class DebitNotesResource extends BaseResource {\n /**\n * POST /v1/debit-notes — Create a draft debit note.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateDebitNoteRequest, opts?: DebitNoteCreateOpts): Promise<DebitNoteResponse> {\n return this._http.request<DebitNoteResponse>({\n method: 'POST',\n path: '/v1/debit-notes',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id} — Retrieve debit note by ID (detail including DIAN response).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<DebitNoteDetailResponse> {\n return this._http.request<DebitNoteDetailResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}`,\n });\n }\n\n /**\n * GET /v1/debit-notes — List debit notes (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: DebitNoteListParams): Promise<DebitNoteListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n return this._http.request<DebitNoteListResponse>({\n method: 'GET',\n path: '/v1/debit-notes',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/debit-notes/{id}/send-email — Manually resend the debit note email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/debit-notes/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id}/email-content — Get email content.\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}/emails`,\n });\n }\n}\n","/**\n * InvoicesResource — full CRUD + email methods for /v1/invoices\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateInvoiceRequest,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n InvoiceDetailResponse,\n InvoiceListResponse,\n InvoiceResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\n/** Status values for the list filter. */\ntype InvoiceStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface InvoiceListParams {\n /** Max items to return (1–100, default 20). */\n limit?: number;\n /** Cursor from previous page (next_cursor field). */\n starting_after?: string;\n /** Filter by invoice status. */\n status?: InvoiceStatus;\n /** Filter by customer_id. */\n customer?: string;\n /** ISO-8601 date/datetime — include invoices created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include invoices created before. */\n 'created[lt]'?: string;\n /** Filter by numbering prefix (e.g. \"FE\"). */\n number_prefix?: string;\n /** Filter by exact CUFE value. */\n cufe?: string;\n}\n\nexport interface InvoiceCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class InvoicesResource extends BaseResource {\n /**\n * POST /v1/invoices — Create a draft invoice.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateInvoiceRequest, opts?: InvoiceCreateOpts): Promise<InvoiceResponse> {\n return this._http.request<InvoiceResponse>({\n method: 'POST',\n path: '/v1/invoices',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/invoices/{id} — Retrieve invoice by ID (detail including lines).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<InvoiceDetailResponse> {\n return this._http.request<InvoiceDetailResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}`,\n });\n }\n\n /**\n * GET /v1/invoices — List invoices (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: InvoiceListParams): Promise<InvoiceListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.customer !== undefined) query['customer'] = params.customer;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n if (params?.number_prefix !== undefined) query['number_prefix'] = params.number_prefix;\n if (params?.cufe !== undefined) query['cufe'] = params.cufe;\n return this._http.request<InvoiceListResponse>({\n method: 'GET',\n path: '/v1/invoices',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/invoices/{id}/send-email — Manually resend the invoice email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/invoices/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/invoices/{id}/email-content — Get email content (recipient, subject, AttachedDoc).\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/invoices/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}/emails`,\n });\n }\n}\n","/**\n * NumberingResolutionsResource — read + write methods for /v1/numbering-resolutions\n *\n * R06: retrieve(id), list(params?), create(body, opts?), activate(id).\n * R03: create() auto-generates idempotency-key (openapi.json: Idempotency-Key required on POST /v1/numbering-resolutions).\n * activate() carries no idempotency-key (openapi.json: no header on POST /{id}/activate).\n */\n\nimport type {\n CreateNumberingResolutionRequest,\n NumberingResolutionListResponse,\n NumberingResolutionResponse,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface NumberingResolutionListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination. */\n starting_after?: string;\n}\n\nexport interface NumberingResolutionCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated (R03). */\n idempotencyKey?: string;\n}\n\nexport class NumberingResolutionsResource extends BaseResource {\n /**\n * GET /v1/numbering-resolutions/{id}\n * Returns a numbering resolution by ID. 404 if not found or cross-tenant.\n */\n retrieve(id: string): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'GET',\n path: `/v1/numbering-resolutions/${id}`,\n });\n }\n\n /**\n * GET /v1/numbering-resolutions\n * Returns a cursor-paginated list of numbering resolutions.\n */\n list(params?: NumberingResolutionListParams): Promise<NumberingResolutionListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<NumberingResolutionListResponse>({\n method: 'GET',\n path: '/v1/numbering-resolutions',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/numbering-resolutions — Register a new DIAN resolution.\n * Returns 201. Auto-generates idempotency-key (R03 — openapi.json marks Idempotency-Key required).\n */\n create(\n body: CreateNumberingResolutionRequest,\n opts?: NumberingResolutionCreateOpts,\n ): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'POST',\n path: '/v1/numbering-resolutions',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * POST /v1/numbering-resolutions/{id}/activate — Mark this resolution as active.\n * Returns 200 with updated NumberingResolutionResponse. No idempotency-key.\n */\n activate(id: string): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'POST',\n path: `/v1/numbering-resolutions/${id}/activate`,\n });\n }\n}\n","/**\n * TestResource — methods for /v1/test/* (test-mode only).\n *\n * R06: triggerEvent(body) → POST /v1/test/trigger-event.\n * R03: No auto-idempotency (openapi.json: no Idempotency-Key header on this endpoint).\n *\n * 403 PermissionError is thrown automatically by the HTTP transport when the API\n * key is a live key — no special handling needed here.\n */\n\nimport type { TriggerEventBody, TriggerEventResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class TestResource extends BaseResource {\n /**\n * POST /v1/test/trigger-event — Manually fire a webhook event in test mode.\n * Returns 201 with TriggerEventResponse.\n * Throws PermissionError (403) if called with a live API key.\n * No idempotency-key.\n */\n triggerEvent(body: TriggerEventBody): Promise<TriggerEventResponse> {\n return this._http.request<TriggerEventResponse>({\n method: 'POST',\n path: '/v1/test/trigger-event',\n body,\n });\n }\n}\n","/**\n * Emitia SDK client.\n *\n * R01: Constructor validates apiKey and merges opts. Throws synchronously on invalid key.\n * R02: HttpClient attaches Authorization + User-Agent to every request.\n *\n * Resource namespaces are readonly properties, instantiated in the constructor\n * with the private #http field. No getter stubs, no _transport leakage.\n *\n * PR2 auditor fix: removed _transport getter. #http is passed directly to each\n * resource in the constructor body — a class private field is accessible within\n * the class scope, so no public exposure is needed.\n *\n * PR3a: invoices, creditNotes, debitNotes wired as real readonly properties.\n * PR3b: customers write methods added; TestResource replaces test stub.\n */\n\nimport { type EmitiaConfig, validateConfig } from './config.js';\nimport { HttpClient } from './http.js';\nimport { AccountResource } from './resources/account.js';\nimport { BalanceResource } from './resources/balance.js';\nimport { CatalogsResource } from './resources/catalogs.js';\nimport { CertificatesResource } from './resources/certificates.js';\nimport { CreditNotesResource } from './resources/credit-notes.js';\nimport { CustomersResource } from './resources/customers.js';\nimport { DebitNotesResource } from './resources/debit-notes.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { NumberingResolutionsResource } from './resources/numbering-resolutions.js';\nimport { TestResource } from './resources/test-resource.js';\n\n/** Options accepted by the Emitia constructor (all optional). */\nexport type EmitiaOptions = Partial<Omit<EmitiaConfig, 'apiKey'>>;\n\nexport class Emitia {\n /**\n * Private HTTP transport.\n * Using a true private field (#http) so it cannot be accessed externally.\n */\n readonly #http: HttpClient;\n\n // ── Read-only resources (PR2 — fully wired) ───────────────────────────────────\n readonly account: AccountResource;\n readonly balance: BalanceResource;\n readonly catalogs: CatalogsResource;\n\n // ── Write resources (PR3b — read + write fully wired) ────────────────────────\n readonly certificates: CertificatesResource;\n readonly numberingResolutions: NumberingResolutionsResource;\n readonly customers: CustomersResource;\n\n // ── Document resources (PR3a — fully wired) ──────────────────────────────────\n readonly invoices: InvoicesResource;\n readonly creditNotes: CreditNotesResource;\n readonly debitNotes: DebitNotesResource;\n\n // ── Test resource (PR3b) ──────────────────────────────────────────────────────\n readonly test: TestResource;\n\n constructor(apiKey: string, opts?: EmitiaOptions) {\n const config = validateConfig(apiKey, opts);\n this.#http = new HttpClient(config);\n\n this.account = new AccountResource(this.#http);\n this.balance = new BalanceResource(this.#http);\n this.catalogs = new CatalogsResource(this.#http);\n this.certificates = new CertificatesResource(this.#http);\n this.numberingResolutions = new NumberingResolutionsResource(this.#http);\n this.customers = new CustomersResource(this.#http);\n this.invoices = new InvoicesResource(this.#http);\n this.creditNotes = new CreditNotesResource(this.#http);\n this.debitNotes = new DebitNotesResource(this.#http);\n this.test = new TestResource(this.#http);\n }\n}\n","/**\n * Webhook signature verification for @emitia/node.\n *\n * R08: constructEvent() parses and validates the Emitia-Signature header,\n * verifies the HMAC-SHA256 signature timing-safely, checks timestamp freshness,\n * and returns the parsed event.\n *\n * Algorithm (source: apps/worker/src/processors/webhook-deliver.processor.ts L136–158):\n * t = Math.floor(Date.now() / 1000) — unix seconds\n * signed = `${t}.${rawBody}` — concatenate timestamp + raw body\n * v1 = HMAC-SHA256(secret, signed).digest('hex')\n * header = `t=${t},v1=${v1}` — Emitia-Signature header value\n *\n * Additional headers sent by worker (informational, NOT part of signature):\n * Emitia-Event-Id, Emitia-Event-Type\n *\n * Security notes:\n * - timingSafeEqual is used for HMAC comparison to prevent timing attacks.\n * - Length pre-check before timingSafeEqual: if lengths differ we reject\n * immediately (before calling timingSafeEqual which would throw on unequal\n * lengths) to prevent RangeError from leaking information.\n * - JSON.parse is called ONLY after signature verification — never on\n * unverified input first.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\n// ── Event shape ───────────────────────────────────────────────────────────────\n\n/**\n * Emitia webhook event shape.\n *\n * Matches the canonical body built in webhook-deliver.processor.ts L137–143:\n * { id, type, api_version, created: tSeconds (number), data }\n *\n * NOTE: There is no shared schema in @emitia/openapi for the event envelope —\n * it is built inline in the worker. This type mirrors that shape exactly.\n */\nexport interface EmitiaEvent {\n /** Event ID (e.g. \"evt_01HX...\"). */\n id: string;\n /** Event type (e.g. \"invoice.accepted\"). */\n type: string;\n /** API version that generated this event (e.g. \"2024-01-01\"). */\n api_version: string;\n /** Unix timestamp (seconds) when the event was created. */\n created: number;\n /** Event-specific payload. Shape depends on event.type. */\n data: unknown;\n}\n\n// ── Error ─────────────────────────────────────────────────────────────────────\n\n/** Reason codes for SignatureVerificationError. */\nexport type SignatureVerificationReason =\n | 'no_signature' /** Header missing, empty, or unparseable. */\n | 'timestamp_out_of_tolerance' /** |now - t| > toleranceSec. */\n | 'signature_mismatch' /** HMAC does not match any v1 value in header. */\n | 'invalid_payload'; /** Signature verified, but the body is not valid JSON. */\n\n/**\n * Thrown when constructEvent() cannot verify the webhook signature.\n *\n * Design: NOT a subclass of EmitiaError (which models HTTP API errors).\n * This error models a local crypto verification failure — no HTTP involved.\n */\nexport class SignatureVerificationError extends Error {\n readonly reason: SignatureVerificationReason;\n\n constructor(reason: SignatureVerificationReason, message: string) {\n super(message);\n this.name = 'SignatureVerificationError';\n this.reason = reason;\n // Maintain proper prototype chain for instanceof checks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ── Header parsing ────────────────────────────────────────────────────────────\n\ninterface ParsedHeader {\n t: number;\n v1Values: string[];\n}\n\n/**\n * Parse an Emitia-Signature header value.\n *\n * Format: `t=<unix_seconds>,v1=<hex_hmac>[,v1=<hex_hmac2>...]`\n * Multiple v1 values are supported (rotation scenario).\n *\n * Returns null if the header is missing, empty, or does not contain\n * a valid numeric `t=` and at least one `v1=` value.\n */\nfunction parseSignatureHeader(header: string): ParsedHeader | null {\n if (!header) return null;\n\n const parts = header.split(',');\n let t: number | undefined;\n const v1Values: string[] = [];\n\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.startsWith('t=')) {\n const raw = trimmed.slice(2);\n // Strictly decimal unix seconds — reject empty, signs, scientific/hex\n // notation, or whitespace (Number() would accept \"1e3\", \"0x10\", \" 10 \").\n if (!/^\\d+$/.test(raw)) {\n return null;\n }\n t = Number(raw);\n } else if (trimmed.startsWith('v1=')) {\n const value = trimmed.slice(3);\n if (value) v1Values.push(value);\n }\n }\n\n if (t === undefined || v1Values.length === 0) return null;\n\n return { t, v1Values };\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Verify an Emitia webhook signature and return the parsed event.\n *\n * @param payload Raw request body — string or Buffer. Do NOT parse JSON first.\n * @param signatureHeader Value of the `Emitia-Signature` header (e.g. `t=...,v1=...`).\n * @param secret Webhook endpoint signing secret.\n * @param toleranceSec Maximum allowed age of the event in seconds (default: 300).\n * @param nowSec Injectable clock (returns current unix seconds). Defaults to\n * Math.floor(Date.now() / 1000). Exposed for deterministic tests.\n * @returns Parsed and verified {@link EmitiaEvent}.\n * @throws {SignatureVerificationError} When the header is invalid, the timestamp is\n * out of tolerance, or the signature does not match.\n */\nexport function constructEvent(\n payload: string | Buffer,\n signatureHeader: string,\n secret: string,\n toleranceSec = 300,\n nowSec: () => number = () => Math.floor(Date.now() / 1000),\n): EmitiaEvent {\n // Step 1: Parse the signature header.\n const parsed = parseSignatureHeader(signatureHeader);\n if (parsed === null) {\n throw new SignatureVerificationError(\n 'no_signature',\n `Invalid or missing Emitia-Signature header: \"${signatureHeader}\". Expected format: t=<unix_seconds>,v1=<hex_hmac>`,\n );\n }\n\n const { t, v1Values } = parsed;\n\n // Step 2: Check timestamp tolerance (replay protection).\n const now = nowSec();\n const drift = Math.abs(now - t);\n if (drift > toleranceSec) {\n throw new SignatureVerificationError(\n 'timestamp_out_of_tolerance',\n `Webhook timestamp is too old or too far in the future. Timestamp: ${t}, now: ${now}, drift: ${drift}s, tolerance: ${toleranceSec}s. Ensure your server clock is synchronized and that this event is not a replay.`,\n );\n }\n\n // Step 3: Recompute HMAC-SHA256 over `${t}.${payload}`.\n const payloadString = Buffer.isBuffer(payload) ? payload.toString('utf8') : payload;\n const signedPayload = `${t}.${payloadString}`;\n const expectedHmac = createHmac('sha256', secret).update(signedPayload).digest();\n\n // Step 4: Timing-safe comparison against all v1 values.\n // - Pre-check length BEFORE calling timingSafeEqual (which throws on unequal lengths).\n // - If lengths differ, reject immediately without leaking timing.\n const matched = v1Values.some((v1) => {\n const v1Buffer = Buffer.from(v1, 'hex');\n // If the hex string was malformed (e.g. odd-length) or different length, reject.\n if (v1Buffer.length !== expectedHmac.length) return false;\n return timingSafeEqual(v1Buffer, expectedHmac);\n });\n\n if (!matched) {\n throw new SignatureVerificationError(\n 'signature_mismatch',\n 'Webhook signature verification failed. The computed HMAC does not match any ' +\n 'v1 signature in the header. Verify you are using the correct signing secret ' +\n 'and that the raw (unparsed) request body is passed to constructEvent().',\n );\n }\n\n // Step 5: Parse JSON ONLY after verification. A signed-but-malformed body is\n // improbable (forging requires the secret) but must surface as a typed error,\n // not a raw SyntaxError, so a single `catch (SignatureVerificationError)` holds.\n try {\n return JSON.parse(payloadString) as EmitiaEvent;\n } catch {\n throw new SignatureVerificationError(\n 'invalid_payload',\n 'Webhook signature verified, but the request body is not valid JSON.',\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/version.ts","../src/http.ts","../src/resources/base.ts","../src/resources/account.ts","../src/resources/balance.ts","../src/resources/catalogs.ts","../src/resources/certificates.ts","../src/resources/credit-notes.ts","../src/resources/customers.ts","../src/resources/debit-notes.ts","../src/resources/invoices.ts","../src/resources/numbering-resolutions.ts","../src/resources/test-resource.ts","../src/resources/webhook-endpoints.ts","../src/client.ts","../src/webhooks.ts"],"names":["DEFAULT_BASE_URL","validateConfig","apiKey","opts","startsWith","Error","slice","baseURL","timeout","maxRetries","fetch","isErrorEnvelope","value","v","inner","e","EmitiaError","type","code","requestId","statusCode","docUrl","details","message","name","Object","setPrototypeOf","prototype","AuthenticationError","PermissionError","NotFoundError","ValidationError","InvalidRequestError","RateLimitError","IdempotencyError","DianRejectedError","CertificateError","NumberingError","ApiError","TYPE_TO_CLASS","authentication_error","permission_error","not_found","validation_error","invalid_request","rate_limited","idempotency_error","dian_rejected","certificate_error","numbering_error","internal_error","api_error","HTTP_STATUS_TO_CLASS","fromPayload","envelope","httpStatus","doc_url","error","ByType","undefined","ByStatus","SDK_VERSION","RETRY_BASE_MS","RETRY_CAP_MS","sleep","ms","signal","Promise","resolve","reject","aborted","id","setTimeout","onAbort","clearTimeout","addEventListener","once","jitteredDelay","attempt","exp","capped","Math","min","floor","random","parseRetryAfter","header","nowMs","asSeconds","Number","isFinite","max","asDate","Date","parse","isNaN","shouldRetry","status","HttpClient","config","request","fetchFn","globalThis","bind","idempotencyKey","autoIdempotency","crypto","randomUUID","lastError","url","buildUrl","path","query","headers","authorization","process","version","accept","body","response","method","JSON","stringify","get","ok","json","bodyText","text","parsedBody","length","responseError","retryAfter","now","delayMs","base","replace","keys","params","URLSearchParams","key","entries","set","String","toString","BaseResource","_http","http","AccountResource","retrieve","BalanceResource","CatalogsResource","slug","municipios","department","CertificatesResource","list","limit","starting_after","create","del","activate","CreditNotesResource","sendEmail","emailContent","listEmails","CustomersResource","update","DebitNotesResource","InvoicesResource","customer","number_prefix","cufe","NumberingResolutionsResource","TestResource","triggerEvent","WebhookEndpointsResource","rotateSecret","Emitia","account","balance","catalogs","certificates","numberingResolutions","customers","invoices","creditNotes","debitNotes","test","webhookEndpoints","SignatureVerificationError","reason","parseSignatureHeader","parts","split","t","v1Values","part","trimmed","trim","raw","push","constructEvent","payload","signatureHeader","secret","toleranceSec","nowSec","parsed","drift","abs","payloadString","Buffer","isBuffer","signedPayload","expectedHmac","createHmac","digest","matched","some","v1","v1Buffer","from","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SDK configuration types and validation.\n *\n * R01: Client construction validates apiKey prefix (sk_test_ | sk_live_).\n * Any other prefix → synchronous throw before any HTTP call.\n */\n\nexport const DEFAULT_BASE_URL = 'https://api.emitia.co';\n\n/** Resolved, validated SDK configuration. All fields are present. */\nexport interface EmitiaConfig {\n apiKey: string;\n baseURL: string;\n timeout: number;\n maxRetries: number;\n /**\n * Injectable fetch implementation (default: globalThis.fetch).\n * Used in tests to inject a mock without patching globals.\n * ADR-2: native fetch only — nothing is loaded at runtime. (The package's\n * single dependency, zod, exists solely so the published .d.ts can derive\n * types from its schemas; the compiled .js never imports it.)\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Validates apiKey and merges caller options with defaults.\n * Throws synchronously for invalid apiKey — no HTTP call is ever made.\n */\nexport function validateConfig(apiKey: string, opts?: Partial<EmitiaConfig>): EmitiaConfig {\n if (!apiKey.startsWith('sk_test_') && !apiKey.startsWith('sk_live_')) {\n throw new Error(\n `Invalid API key \"${apiKey.slice(0, 10)}...\": must start with \"sk_test_\" or \"sk_live_\".`,\n );\n }\n\n return {\n apiKey,\n baseURL: opts?.baseURL ?? DEFAULT_BASE_URL,\n timeout: opts?.timeout ?? 30_000,\n maxRetries: opts?.maxRetries ?? 2,\n fetch: opts?.fetch,\n };\n}\n","/**\n * Typed error hierarchy for the @emitia/node SDK.\n *\n * R05: Every non-2xx response → typed subclass of EmitiaError.\n *\n * Design: SDK redeclares its own hierarchy. Does NOT import @emitia/shared\n * at runtime — @emitia/shared is a backend-private package.\n *\n * Mapping keys are the `error.type` strings the API actually emits (see\n * `EmitiaErrorType` in @emitia/shared/errors.ts). The SDK redeclares them as plain\n * strings — it does NOT import @emitia/shared at runtime (backend-private package).\n *\n * Mapping (1:1 with the `type`s the API emits — see EmitiaErrorType in @emitia/shared):\n * type=authentication_error → AuthenticationError (401)\n * type=permission_error → PermissionError (403)\n * type=not_found → NotFoundError (404)\n * type=validation_error → ValidationError (400; schema/format)\n * type=invalid_request → InvalidRequestError (400/409/422; unprocessable state)\n * type=numbering_error → NumberingError (422)\n * type=certificate_error → CertificateError (400)\n * type=rate_limited → RateLimitError (429)\n * type=idempotency_error → IdempotencyError (409; Idempotency-Key reuse only)\n * type=dian_rejected → DianRejectedError (reserved)\n * type=internal_error → ApiError (500)\n * type=api_error → ApiError (503)\n * unknown type → HTTP-status class → ApiError\n *\n * \"reserved\" = present in the EmitiaErrorType union but surfaced asynchronously\n * (DIAN rejections arrive via document status + webhook events, not as a synchronous\n * HTTP error), mapped here for forward-compatibility. `err.statusCode` always carries\n * the real HTTP status, so internal_error (500) vs api_error (503) stay distinguishable.\n */\n\n// ── ErrorEnvelope type (matches backend shape) ────────────────────────────────\n\ninterface ErrorPayloadInner {\n type: string;\n code: string;\n message: string;\n doc_url?: string;\n request_id?: string;\n details?: unknown;\n}\n\ninterface ErrorEnvelope {\n error: ErrorPayloadInner;\n}\n\n/** Narrows an unknown value to an ErrorEnvelope. No `!` usage. */\nexport function isErrorEnvelope(value: unknown): value is ErrorEnvelope {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n const inner = v['error'];\n if (inner === null || typeof inner !== 'object') return false;\n const e = inner as Record<string, unknown>;\n return (\n typeof e['type'] === 'string' &&\n typeof e['code'] === 'string' &&\n typeof e['message'] === 'string'\n );\n}\n\n// ── Base class ────────────────────────────────────────────────────────────────\n\nexport class EmitiaError extends Error {\n readonly type: string;\n readonly code: string;\n readonly requestId: string;\n readonly statusCode: number;\n readonly docUrl: string | undefined;\n readonly details: unknown;\n\n constructor(opts: {\n type: string;\n code: string;\n message: string;\n requestId: string;\n statusCode: number;\n docUrl?: string;\n details?: unknown;\n }) {\n super(opts.message);\n this.name = this.constructor.name;\n this.type = opts.type;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.statusCode = opts.statusCode;\n this.docUrl = opts.docUrl;\n this.details = opts.details;\n // Maintain proper prototype chain for instanceof checks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ── Subclasses ────────────────────────────────────────────────────────────────\n\nexport class AuthenticationError extends EmitiaError {}\nexport class PermissionError extends EmitiaError {}\nexport class NotFoundError extends EmitiaError {}\n/** Schema/format validation failure (type=validation_error). */\nexport class ValidationError extends EmitiaError {}\n/** Valid request, unprocessable by resource state / business precondition (type=invalid_request). */\nexport class InvalidRequestError extends EmitiaError {}\nexport class RateLimitError extends EmitiaError {}\nexport class IdempotencyError extends EmitiaError {}\nexport class DianRejectedError extends EmitiaError {}\nexport class CertificateError extends EmitiaError {}\nexport class NumberingError extends EmitiaError {}\n/** Fallback for any type not explicitly mapped. */\nexport class ApiError extends EmitiaError {}\n\n// ── TYPE_TO_CLASS map ─────────────────────────────────────────────────────────\n\ntype ErrorConstructor = new (opts: ConstructorParameters<typeof EmitiaError>[0]) => EmitiaError;\n\nconst TYPE_TO_CLASS: Readonly<Record<string, ErrorConstructor>> = {\n authentication_error: AuthenticationError,\n permission_error: PermissionError,\n not_found: NotFoundError,\n validation_error: ValidationError,\n invalid_request: InvalidRequestError,\n rate_limited: RateLimitError,\n idempotency_error: IdempotencyError,\n dian_rejected: DianRejectedError,\n certificate_error: CertificateError,\n numbering_error: NumberingError,\n internal_error: ApiError,\n api_error: ApiError,\n};\n\nconst HTTP_STATUS_TO_CLASS: Readonly<Record<number, ErrorConstructor>> = {\n 401: AuthenticationError,\n 403: PermissionError,\n 404: NotFoundError,\n 422: ValidationError,\n 429: RateLimitError,\n};\n\n/**\n * Build a typed error from an API error envelope + HTTP metadata.\n *\n * Resolution order:\n * 1. error.type in TYPE_TO_CLASS → use that class\n * 2. httpStatus in HTTP_STATUS_TO_CLASS → use that class\n * 3. fallback → ApiError\n *\n * requestId comes from the `X-Request-Id` response header (passed as parameter).\n */\nexport function fromPayload(\n envelope: ErrorEnvelope,\n httpStatus: number,\n requestId: string,\n): EmitiaError {\n const { type, code, message, doc_url, details } = envelope.error;\n\n const opts = {\n type,\n code,\n message,\n requestId,\n statusCode: httpStatus,\n docUrl: doc_url,\n details,\n };\n\n const ByType = TYPE_TO_CLASS[type];\n if (ByType !== undefined) {\n return new ByType(opts);\n }\n\n const ByStatus = HTTP_STATUS_TO_CLASS[httpStatus];\n if (ByStatus !== undefined) {\n return new ByStatus(opts);\n }\n\n return new ApiError(opts);\n}\n","/**\n * SDK version constant.\n *\n * ADR-5: Declared as a plain string constant matching package.json#version.\n * Not imported via import JSON (fragile ESM) — kept in sync by a test guard\n * (src/__tests__/version.test.ts) that fails if they diverge.\n */\nexport const SDK_VERSION = '0.2.0';\n","/**\n * HTTP transport for the @emitia/node SDK.\n *\n * R02: Authorization + User-Agent on every request.\n * R03: Idempotency-key auto-generation (UUID v4 via crypto.randomUUID) for flagged POSTs.\n * R04: Retry 429/5xx with exponential backoff + full jitter; Retry-After defensive.\n * AbortSignal respected. Same idempotency-key reused across retries.\n * No `!` non-null assertions in runtime code.\n */\n\nimport type { EmitiaConfig } from './config.js';\nimport { fromPayload, isErrorEnvelope } from './errors.js';\nimport { SDK_VERSION } from './version.js';\n\ninterface RequestOptions {\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n path: string;\n query?: Record<string, string | number | boolean>;\n body?: unknown;\n idempotencyKey?: string;\n /** When true, a UUID v4 idempotency-key is generated automatically. */\n autoIdempotency?: boolean;\n signal?: AbortSignal;\n}\n\nconst RETRY_BASE_MS = 500;\nconst RETRY_CAP_MS = 8_000;\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted === true) {\n reject(new Error('AbortError'));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(new Error('AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction jitteredDelay(attempt: number): number {\n const exp = RETRY_BASE_MS * 2 ** attempt;\n const capped = Math.min(exp, RETRY_CAP_MS);\n return Math.floor(Math.random() * capped);\n}\n\n/**\n * Parse a `Retry-After` header (RFC 7231: delay-seconds or HTTP-date) into ms,\n * capped at RETRY_CAP_MS so a hostile/erroneous large value cannot hang the\n * client. Returns null when the header is absent or unparseable (caller falls\n * back to jittered backoff). `nowMs` is injectable for deterministic tests.\n */\nfunction parseRetryAfter(header: string | null, nowMs: number): number | null {\n if (header === null) return null;\n const asSeconds = Number(header);\n if (Number.isFinite(asSeconds)) {\n return Math.min(Math.max(asSeconds, 0) * 1_000, RETRY_CAP_MS);\n }\n const asDate = Date.parse(header);\n if (Number.isNaN(asDate)) return null;\n return Math.min(Math.max(asDate - nowMs, 0), RETRY_CAP_MS);\n}\n\nfunction shouldRetry(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nexport class HttpClient {\n private readonly config: EmitiaConfig;\n\n constructor(config: EmitiaConfig) {\n this.config = config;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n // Bind the global fetch to globalThis so an unbound reference can't trip a\n // polyfill that relies on `this`. An injected fetch is used as-is.\n const fetchFn = this.config.fetch ?? globalThis.fetch.bind(globalThis);\n\n // Generate idempotency key once — reused on retries (R03).\n const idempotencyKey: string | undefined =\n opts.idempotencyKey ?? (opts.autoIdempotency === true ? crypto.randomUUID() : undefined);\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n const url = this.buildUrl(opts.path, opts.query);\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.config.apiKey}`,\n 'user-agent': `emitia-node/${SDK_VERSION} node/${process.version}`,\n accept: 'application/json',\n };\n\n if (opts.body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n if (idempotencyKey !== undefined) {\n headers['idempotency-key'] = idempotencyKey;\n }\n\n // Network errors and aborts propagate directly: PR1 retries only HTTP\n // 429/5xx responses, never transport-level failures.\n const response: Response = await fetchFn(url, {\n method: opts.method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts.signal,\n });\n\n const requestId = response.headers.get('x-request-id') ?? '';\n\n if (response.ok) {\n return (await response.json()) as T;\n }\n\n // Parse error body\n let bodyText: string;\n try {\n bodyText = await response.text();\n } catch {\n bodyText = '';\n }\n\n let parsedBody: unknown;\n try {\n parsedBody = bodyText.length > 0 ? JSON.parse(bodyText) : {};\n } catch {\n parsedBody = {};\n }\n\n // Build the error we'd throw for this response (used for both retry and final throw).\n const responseError = isErrorEnvelope(parsedBody)\n ? fromPayload(parsedBody, response.status, requestId)\n : new Error(`HTTP ${response.status}: ${bodyText}`);\n\n if (shouldRetry(response.status) && attempt < this.config.maxRetries) {\n // Respect Retry-After header (defensive — not documented in openapi.json),\n // capped so a hostile/erroneous value cannot hang the client.\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'), Date.now());\n const delayMs = retryAfter ?? jitteredDelay(attempt);\n\n // May throw if aborted — propagate immediately without storing as lastError.\n await sleep(delayMs, opts.signal);\n lastError = responseError;\n continue;\n }\n\n // Non-retriable or retries exhausted — throw immediately.\n throw responseError;\n }\n\n throw lastError ?? new Error('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean>): string {\n const base = this.config.baseURL.replace(/\\/$/, '');\n const url = `${base}${path}`;\n if (query === undefined || Object.keys(query).length === 0) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n params.set(key, String(value));\n }\n return `${url}?${params.toString()}`;\n }\n}\n","/**\n * BaseResource — shared base class for all SDK resource namespaces.\n *\n * Holds a reference to the HttpClient so resource subclasses can call\n * this._http.request<T>(...) without re-wiring the transport.\n */\n\nimport type { HttpClient } from '../http.js';\n\nexport abstract class BaseResource {\n protected readonly _http: HttpClient;\n\n constructor(http: HttpClient) {\n this._http = http;\n }\n}\n","/**\n * AccountResource — GET /v1/account\n *\n * R06: Read-only resource. Returns tenant info for the authenticated API key.\n */\n\nimport type { AccountInfo } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class AccountResource extends BaseResource {\n retrieve(): Promise<AccountInfo> {\n return this._http.request<AccountInfo>({ method: 'GET', path: '/v1/account' });\n }\n}\n","/**\n * BalanceResource — GET /v1/balance\n *\n * R06: Read-only resource. Returns document usage counts for the current period.\n */\n\nimport type { BalanceResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class BalanceResource extends BaseResource {\n retrieve(): Promise<BalanceResponse> {\n return this._http.request<BalanceResponse>({ method: 'GET', path: '/v1/balance' });\n }\n}\n","/**\n * CatalogsResource — GET /v1/catalogs/{slug} and GET /v1/catalogs/municipios\n *\n * R06: Read-only resource (public endpoints, no auth required by the API — but\n * the SDK sends Authorization anyway as it's always present).\n *\n * Response types are inferred via z.infer from the @emitia/openapi Zod SSOT\n * (CatalogListResponseSchema / MunicipioListResponseSchema) — zero drift with\n * the actual API contract.\n */\n\nimport type { CatalogListResponse, MunicipioListResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface MunicipiosQuery {\n /** 2-digit DANE department code (e.g. \"11\" for Bogotá D.C.). */\n department?: string;\n}\n\nexport class CatalogsResource extends BaseResource {\n /**\n * GET /v1/catalogs/{slug}\n * Returns all items in a named DIAN catalog.\n */\n retrieve(slug: string): Promise<CatalogListResponse> {\n return this._http.request<CatalogListResponse>({\n method: 'GET',\n path: `/v1/catalogs/${slug}`,\n });\n }\n\n /**\n * GET /v1/catalogs/municipios\n * Returns Colombian municipalities. Optionally filtered by 2-digit department code.\n */\n municipios(query?: MunicipiosQuery): Promise<MunicipioListResponse> {\n return this._http.request<MunicipioListResponse>({\n method: 'GET',\n path: '/v1/catalogs/municipios',\n query: query?.department !== undefined ? { department: query.department } : undefined,\n });\n }\n}\n","/**\n * CertificatesResource — read + write methods for /v1/certificates\n *\n * R06: retrieve(id), list(params?), create(body, opts?), del(id), activate(id).\n * R03: create() does NOT auto-generate idempotency-key (openapi.json: no Idempotency-Key header on POST /v1/certificates).\n * Override via opts.idempotencyKey is still accepted.\n * del() and activate() carry no idempotency-key.\n */\n\nimport type {\n CertificateListResponse,\n CertificateResponse,\n CreateCertificateRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface CertificateListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination. */\n starting_after?: string;\n}\n\nexport interface CertificateCreateOpts {\n /** Optional explicit idempotency key (NOT auto-generated — openapi.json does not require it). */\n idempotencyKey?: string;\n}\n\nexport class CertificatesResource extends BaseResource {\n /**\n * GET /v1/certificates/{id}\n * Returns certificate metadata by ID. 404 if not found or cross-tenant.\n */\n retrieve(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'GET',\n path: `/v1/certificates/${id}`,\n });\n }\n\n /**\n * GET /v1/certificates\n * Returns a cursor-paginated list of certificate metadata.\n * Soft-deleted certificates are excluded.\n */\n list(params?: CertificateListParams): Promise<CertificateListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<CertificateListResponse>({\n method: 'GET',\n path: '/v1/certificates',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/certificates — Upload a new .p12 certificate.\n * Returns 201. No auto-idempotency (openapi.json: no Idempotency-Key header required).\n * Explicit override accepted via opts.idempotencyKey.\n */\n create(\n body: CreateCertificateRequest,\n opts?: CertificateCreateOpts,\n ): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'POST',\n path: '/v1/certificates',\n body,\n idempotencyKey: opts?.idempotencyKey,\n });\n }\n\n /**\n * DELETE /v1/certificates/{id} — Soft-delete a certificate.\n * Returns 200 with the deleted CertificateResponse (not 204). No idempotency-key.\n */\n del(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'DELETE',\n path: `/v1/certificates/${id}`,\n });\n }\n\n /**\n * POST /v1/certificates/{id}/activate — Set this certificate as the active signing cert.\n * Returns 200 with updated CertificateResponse. No idempotency-key.\n */\n activate(id: string): Promise<CertificateResponse> {\n return this._http.request<CertificateResponse>({\n method: 'POST',\n path: `/v1/certificates/${id}/activate`,\n });\n }\n}\n","/**\n * CreditNotesResource — full CRUD + email methods for /v1/credit-notes\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateCreditNoteRequest,\n CreditNoteDetailResponse,\n CreditNoteListResponse,\n CreditNoteResponse,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\ntype NoteStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface CreditNoteListParams {\n /** Max items to return (1–100). */\n limit?: number;\n /** Cursor from previous page. */\n starting_after?: string;\n /** Filter by credit note status. */\n status?: NoteStatus;\n /** ISO-8601 date/datetime — include notes created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include notes created before. */\n 'created[lt]'?: string;\n}\n\nexport interface CreditNoteCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class CreditNotesResource extends BaseResource {\n /**\n * POST /v1/credit-notes — Create a draft credit note.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateCreditNoteRequest, opts?: CreditNoteCreateOpts): Promise<CreditNoteResponse> {\n return this._http.request<CreditNoteResponse>({\n method: 'POST',\n path: '/v1/credit-notes',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id} — Retrieve credit note by ID (detail including DIAN response).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<CreditNoteDetailResponse> {\n return this._http.request<CreditNoteDetailResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}`,\n });\n }\n\n /**\n * GET /v1/credit-notes — List credit notes (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: CreditNoteListParams): Promise<CreditNoteListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n return this._http.request<CreditNoteListResponse>({\n method: 'GET',\n path: '/v1/credit-notes',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/credit-notes/{id}/send-email — Manually resend the credit note email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/credit-notes/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id}/email-content — Get email content.\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/credit-notes/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/credit-notes/${id}/emails`,\n });\n }\n}\n","/**\n * CustomersResource — read + write methods for /v1/customers\n *\n * R06: retrieve(id), list(params?), create(body, opts?), update(id, body), del(id).\n * R03: create() is a billable POST — auto-generates idempotency-key (Idempotency-Key required per openapi.json).\n * PATCH and DELETE do NOT carry idempotency-key.\n */\n\nimport type {\n CreateCustomerRequest,\n CustomerListResponse,\n CustomerResponse,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface CustomerListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination (ID of the last item from the previous page). */\n starting_after?: string;\n}\n\nexport interface CustomerCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated (R03). */\n idempotencyKey?: string;\n}\n\nexport class CustomersResource extends BaseResource {\n /**\n * GET /v1/customers/{id}\n * Returns a customer by public ID. 404 if not found or soft-deleted.\n */\n retrieve(id: string): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'GET',\n path: `/v1/customers/${id}`,\n });\n }\n\n /**\n * GET /v1/customers\n * Returns a cursor-paginated list of customers.\n */\n list(params?: CustomerListParams): Promise<CustomerListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<CustomerListResponse>({\n method: 'GET',\n path: '/v1/customers',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/customers — Create a customer.\n * Returns 201. Auto-generates idempotency-key (R03 — openapi.json marks Idempotency-Key required).\n */\n create(body: CreateCustomerRequest, opts?: CustomerCreateOpts): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'POST',\n path: '/v1/customers',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * PATCH /v1/customers/{id} — Update a customer.\n * Returns 200 with updated CustomerResponse. No idempotency-key.\n */\n update(id: string, body: Partial<CreateCustomerRequest>): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'PATCH',\n path: `/v1/customers/${id}`,\n body,\n });\n }\n\n /**\n * DELETE /v1/customers/{id} — Soft-delete a customer.\n * Returns 200 with the deleted CustomerResponse (not 204). No idempotency-key.\n */\n del(id: string): Promise<CustomerResponse> {\n return this._http.request<CustomerResponse>({\n method: 'DELETE',\n path: `/v1/customers/${id}`,\n });\n }\n}\n","/**\n * DebitNotesResource — full CRUD + email methods for /v1/debit-notes\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateDebitNoteRequest,\n DebitNoteDetailResponse,\n DebitNoteListResponse,\n DebitNoteResponse,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\ntype NoteStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface DebitNoteListParams {\n /** Max items to return (1–100). */\n limit?: number;\n /** Cursor from previous page. */\n starting_after?: string;\n /** Filter by debit note status. */\n status?: NoteStatus;\n /** ISO-8601 date/datetime — include notes created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include notes created before. */\n 'created[lt]'?: string;\n}\n\nexport interface DebitNoteCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class DebitNotesResource extends BaseResource {\n /**\n * POST /v1/debit-notes — Create a draft debit note.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateDebitNoteRequest, opts?: DebitNoteCreateOpts): Promise<DebitNoteResponse> {\n return this._http.request<DebitNoteResponse>({\n method: 'POST',\n path: '/v1/debit-notes',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id} — Retrieve debit note by ID (detail including DIAN response).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<DebitNoteDetailResponse> {\n return this._http.request<DebitNoteDetailResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}`,\n });\n }\n\n /**\n * GET /v1/debit-notes — List debit notes (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: DebitNoteListParams): Promise<DebitNoteListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n return this._http.request<DebitNoteListResponse>({\n method: 'GET',\n path: '/v1/debit-notes',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/debit-notes/{id}/send-email — Manually resend the debit note email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/debit-notes/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id}/email-content — Get email content.\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/debit-notes/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/debit-notes/${id}/emails`,\n });\n }\n}\n","/**\n * InvoicesResource — full CRUD + email methods for /v1/invoices\n *\n * R03: create() and sendEmail() are POST cobrables — auto-generate idempotency-key.\n * R06: 6 methods: create, retrieve, list, sendEmail, emailContent, listEmails.\n * R07: Money fields (payable_amount) remain strings — no coercion.\n */\n\nimport type {\n CreateInvoiceRequest,\n EmailContentResponse,\n EmailDeliveryListResponse,\n EmailDeliveryResponse,\n InvoiceDetailResponse,\n InvoiceListResponse,\n InvoiceResponse,\n SendEmailRequest,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\n/** Status values for the list filter. */\ntype InvoiceStatus =\n | 'draft'\n | 'processing'\n | 'signed'\n | 'accepted_by_dian'\n | 'rejected_by_dian'\n | 'accepted_contingency'\n | 'failed';\n\nexport interface InvoiceListParams {\n /** Max items to return (1–100, default 20). */\n limit?: number;\n /** Cursor from previous page (next_cursor field). */\n starting_after?: string;\n /** Filter by invoice status. */\n status?: InvoiceStatus;\n /** Filter by customer_id. */\n customer?: string;\n /** ISO-8601 date/datetime — include invoices created at or after. */\n 'created[gte]'?: string;\n /** ISO-8601 date/datetime — include invoices created before. */\n 'created[lt]'?: string;\n /** Filter by numbering prefix (e.g. \"FE\"). */\n number_prefix?: string;\n /** Filter by exact CUFE value. */\n cufe?: string;\n}\n\nexport interface InvoiceCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport interface SendEmailOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated. */\n idempotencyKey?: string;\n}\n\nexport class InvoicesResource extends BaseResource {\n /**\n * POST /v1/invoices — Create a draft invoice.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n create(body: CreateInvoiceRequest, opts?: InvoiceCreateOpts): Promise<InvoiceResponse> {\n return this._http.request<InvoiceResponse>({\n method: 'POST',\n path: '/v1/invoices',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/invoices/{id} — Retrieve invoice by ID (detail including lines).\n * No idempotency-key.\n */\n retrieve(id: string): Promise<InvoiceDetailResponse> {\n return this._http.request<InvoiceDetailResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}`,\n });\n }\n\n /**\n * GET /v1/invoices — List invoices (cursor-paginated, filterable).\n * No idempotency-key.\n */\n list(params?: InvoiceListParams): Promise<InvoiceListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n if (params?.status !== undefined) query['status'] = params.status;\n if (params?.customer !== undefined) query['customer'] = params.customer;\n if (params?.['created[gte]'] !== undefined) query['created[gte]'] = params['created[gte]'];\n if (params?.['created[lt]'] !== undefined) query['created[lt]'] = params['created[lt]'];\n if (params?.number_prefix !== undefined) query['number_prefix'] = params.number_prefix;\n if (params?.cufe !== undefined) query['cufe'] = params.cufe;\n return this._http.request<InvoiceListResponse>({\n method: 'GET',\n path: '/v1/invoices',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/invoices/{id}/send-email — Manually resend the invoice email.\n * Returns 202. Auto-generates idempotency-key (R03).\n */\n sendEmail(\n id: string,\n body?: SendEmailRequest,\n opts?: SendEmailOpts,\n ): Promise<EmailDeliveryResponse> {\n return this._http.request<EmailDeliveryResponse>({\n method: 'POST',\n path: `/v1/invoices/${id}/send-email`,\n body: body ?? {},\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/invoices/{id}/email-content — Get email content (recipient, subject, AttachedDoc).\n * No idempotency-key.\n */\n emailContent(id: string): Promise<EmailContentResponse> {\n return this._http.request<EmailContentResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}/email-content`,\n });\n }\n\n /**\n * GET /v1/invoices/{id}/emails — List email delivery attempts.\n * No idempotency-key.\n */\n listEmails(id: string): Promise<EmailDeliveryListResponse> {\n return this._http.request<EmailDeliveryListResponse>({\n method: 'GET',\n path: `/v1/invoices/${id}/emails`,\n });\n }\n}\n","/**\n * NumberingResolutionsResource — read + write methods for /v1/numbering-resolutions\n *\n * R06: retrieve(id), list(params?), create(body, opts?), activate(id).\n * R03: create() auto-generates idempotency-key (openapi.json: Idempotency-Key required on POST /v1/numbering-resolutions).\n * activate() carries no idempotency-key (openapi.json: no header on POST /{id}/activate).\n */\n\nimport type {\n CreateNumberingResolutionRequest,\n NumberingResolutionListResponse,\n NumberingResolutionResponse,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface NumberingResolutionListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination. */\n starting_after?: string;\n}\n\nexport interface NumberingResolutionCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated (R03). */\n idempotencyKey?: string;\n}\n\nexport class NumberingResolutionsResource extends BaseResource {\n /**\n * GET /v1/numbering-resolutions/{id}\n * Returns a numbering resolution by ID. 404 if not found or cross-tenant.\n */\n retrieve(id: string): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'GET',\n path: `/v1/numbering-resolutions/${id}`,\n });\n }\n\n /**\n * GET /v1/numbering-resolutions\n * Returns a cursor-paginated list of numbering resolutions.\n */\n list(params?: NumberingResolutionListParams): Promise<NumberingResolutionListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<NumberingResolutionListResponse>({\n method: 'GET',\n path: '/v1/numbering-resolutions',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * POST /v1/numbering-resolutions — Register a new DIAN resolution.\n * Returns 201. Auto-generates idempotency-key (R03 — openapi.json marks Idempotency-Key required).\n */\n create(\n body: CreateNumberingResolutionRequest,\n opts?: NumberingResolutionCreateOpts,\n ): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'POST',\n path: '/v1/numbering-resolutions',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * POST /v1/numbering-resolutions/{id}/activate — Mark this resolution as active.\n * Returns 200 with updated NumberingResolutionResponse. No idempotency-key.\n */\n activate(id: string): Promise<NumberingResolutionResponse> {\n return this._http.request<NumberingResolutionResponse>({\n method: 'POST',\n path: `/v1/numbering-resolutions/${id}/activate`,\n });\n }\n}\n","/**\n * TestResource — methods for /v1/test/* (test-mode only).\n *\n * R06: triggerEvent(body) → POST /v1/test/trigger-event.\n * R03: No auto-idempotency (openapi.json: no Idempotency-Key header on this endpoint).\n *\n * 403 PermissionError is thrown automatically by the HTTP transport when the API\n * key is a live key — no special handling needed here.\n */\n\nimport type { TriggerEventBody, TriggerEventResponse } from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport class TestResource extends BaseResource {\n /**\n * POST /v1/test/trigger-event — Manually fire a webhook event in test mode.\n * Returns 201 with TriggerEventResponse.\n * Throws PermissionError (403) if called with a live API key.\n * No idempotency-key.\n */\n triggerEvent(body: TriggerEventBody): Promise<TriggerEventResponse> {\n return this._http.request<TriggerEventResponse>({\n method: 'POST',\n path: '/v1/test/trigger-event',\n body,\n });\n }\n}\n","/**\n * WebhookEndpointsResource — read + write methods for /v1/webhook-endpoints\n *\n * R06: create(body, opts?), list(params?), retrieve(id), update(id, body), del(id), rotateSecret(id).\n * R03: create() is a POST that creates a resource — auto-generates idempotency-key.\n * rotateSecret() does NOT auto-generate (no Idempotency-Key header in openapi spec).\n * PATCH and DELETE do NOT carry idempotency-key.\n *\n * Security invariants:\n * - create() and rotateSecret() responses include `secret` (whsec_... returned ONCE).\n * - list(), retrieve(), update() responses do NOT include `secret`.\n * - del() response includes `deleted: true` (hard delete).\n */\n\nimport type {\n CreateWebhookEndpointRequest,\n CreateWebhookEndpointResponse,\n DeleteWebhookEndpointResponse,\n RotateSecretResponse,\n UpdateWebhookEndpointRequest,\n WebhookEndpointListResponse,\n WebhookEndpointResponse,\n} from '../generated/types.js';\nimport { BaseResource } from './base.js';\n\nexport interface WebhookEndpointListParams {\n /** Number of results per page (1–100, default 20). */\n limit?: number;\n /** Opaque cursor for pagination (ID of the last item from the previous page). */\n starting_after?: string;\n}\n\nexport interface WebhookEndpointCreateOpts {\n /** Explicit idempotency key. When omitted a UUID v4 is auto-generated (R03). */\n idempotencyKey?: string;\n}\n\nexport class WebhookEndpointsResource extends BaseResource {\n /**\n * POST /v1/webhook-endpoints — Create a webhook endpoint.\n * Returns 201. Auto-generates idempotency-key (R03).\n * The signing secret (whsec_...) is returned ONCE in the response — store it immediately.\n */\n create(\n body: CreateWebhookEndpointRequest,\n opts?: WebhookEndpointCreateOpts,\n ): Promise<CreateWebhookEndpointResponse> {\n return this._http.request<CreateWebhookEndpointResponse>({\n method: 'POST',\n path: '/v1/webhook-endpoints',\n body,\n idempotencyKey: opts?.idempotencyKey,\n autoIdempotency: opts?.idempotencyKey === undefined,\n });\n }\n\n /**\n * GET /v1/webhook-endpoints\n * Returns a cursor-paginated list of webhook endpoints.\n * The signing secret is NEVER included in list responses.\n */\n list(params?: WebhookEndpointListParams): Promise<WebhookEndpointListResponse> {\n const query: Record<string, string | number | boolean> = {};\n if (params?.limit !== undefined) query['limit'] = params.limit;\n if (params?.starting_after !== undefined) query['starting_after'] = params.starting_after;\n return this._http.request<WebhookEndpointListResponse>({\n method: 'GET',\n path: '/v1/webhook-endpoints',\n query: Object.keys(query).length > 0 ? query : undefined,\n });\n }\n\n /**\n * GET /v1/webhook-endpoints/{id}\n * Returns a webhook endpoint by public ID.\n * 404 if not found or belongs to a different tenant.\n * The signing secret is NEVER included in get responses.\n */\n retrieve(id: string): Promise<WebhookEndpointResponse> {\n return this._http.request<WebhookEndpointResponse>({\n method: 'GET',\n path: `/v1/webhook-endpoints/${id}`,\n });\n }\n\n /**\n * PATCH /v1/webhook-endpoints/{id} — Partially update a webhook endpoint.\n * Returns 200 with updated WebhookEndpointResponse. No idempotency-key.\n * The signing secret is NEVER included in update responses.\n */\n update(id: string, body: UpdateWebhookEndpointRequest): Promise<WebhookEndpointResponse> {\n return this._http.request<WebhookEndpointResponse>({\n method: 'PATCH',\n path: `/v1/webhook-endpoints/${id}`,\n body,\n });\n }\n\n /**\n * DELETE /v1/webhook-endpoints/{id} — Hard-delete a webhook endpoint.\n * Returns 200 with { id, object, deleted: true }. No idempotency-key.\n */\n del(id: string): Promise<DeleteWebhookEndpointResponse> {\n return this._http.request<DeleteWebhookEndpointResponse>({\n method: 'DELETE',\n path: `/v1/webhook-endpoints/${id}`,\n });\n }\n\n /**\n * POST /v1/webhook-endpoints/{id}/rotate-secret\n * Generates a new signing secret (ADR-2: instant rotation, no grace period).\n * The new whsec_ is returned ONCE — store it immediately. No idempotency-key.\n */\n rotateSecret(id: string): Promise<RotateSecretResponse> {\n return this._http.request<RotateSecretResponse>({\n method: 'POST',\n path: `/v1/webhook-endpoints/${id}/rotate-secret`,\n });\n }\n}\n","/**\n * Emitia SDK client.\n *\n * R01: Constructor validates apiKey and merges opts. Throws synchronously on invalid key.\n * R02: HttpClient attaches Authorization + User-Agent to every request.\n *\n * Resource namespaces are readonly properties, instantiated in the constructor\n * with the private #http field. No getter stubs, no _transport leakage.\n *\n * PR2 auditor fix: removed _transport getter. #http is passed directly to each\n * resource in the constructor body — a class private field is accessible within\n * the class scope, so no public exposure is needed.\n *\n * PR3a: invoices, creditNotes, debitNotes wired as real readonly properties.\n * PR3b: customers write methods added; TestResource replaces test stub.\n */\n\nimport { type EmitiaConfig, validateConfig } from './config.js';\nimport { HttpClient } from './http.js';\nimport { AccountResource } from './resources/account.js';\nimport { BalanceResource } from './resources/balance.js';\nimport { CatalogsResource } from './resources/catalogs.js';\nimport { CertificatesResource } from './resources/certificates.js';\nimport { CreditNotesResource } from './resources/credit-notes.js';\nimport { CustomersResource } from './resources/customers.js';\nimport { DebitNotesResource } from './resources/debit-notes.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { NumberingResolutionsResource } from './resources/numbering-resolutions.js';\nimport { TestResource } from './resources/test-resource.js';\nimport { WebhookEndpointsResource } from './resources/webhook-endpoints.js';\n\n/** Options accepted by the Emitia constructor (all optional). */\nexport type EmitiaOptions = Partial<Omit<EmitiaConfig, 'apiKey'>>;\n\nexport class Emitia {\n /**\n * Private HTTP transport.\n * Using a true private field (#http) so it cannot be accessed externally.\n */\n readonly #http: HttpClient;\n\n // ── Read-only resources (PR2 — fully wired) ───────────────────────────────────\n readonly account: AccountResource;\n readonly balance: BalanceResource;\n readonly catalogs: CatalogsResource;\n\n // ── Write resources (PR3b — read + write fully wired) ────────────────────────\n readonly certificates: CertificatesResource;\n readonly numberingResolutions: NumberingResolutionsResource;\n readonly customers: CustomersResource;\n\n // ── Document resources (PR3a — fully wired) ──────────────────────────────────\n readonly invoices: InvoicesResource;\n readonly creditNotes: CreditNotesResource;\n readonly debitNotes: DebitNotesResource;\n\n // ── Test resource (PR3b) ──────────────────────────────────────────────────────\n readonly test: TestResource;\n\n // ── Webhook endpoints (PR3) ───────────────────────────────────────────────────\n readonly webhookEndpoints: WebhookEndpointsResource;\n\n constructor(apiKey: string, opts?: EmitiaOptions) {\n const config = validateConfig(apiKey, opts);\n this.#http = new HttpClient(config);\n\n this.account = new AccountResource(this.#http);\n this.balance = new BalanceResource(this.#http);\n this.catalogs = new CatalogsResource(this.#http);\n this.certificates = new CertificatesResource(this.#http);\n this.numberingResolutions = new NumberingResolutionsResource(this.#http);\n this.customers = new CustomersResource(this.#http);\n this.invoices = new InvoicesResource(this.#http);\n this.creditNotes = new CreditNotesResource(this.#http);\n this.debitNotes = new DebitNotesResource(this.#http);\n this.test = new TestResource(this.#http);\n this.webhookEndpoints = new WebhookEndpointsResource(this.#http);\n }\n}\n","/**\n * Webhook signature verification for @emitia/node.\n *\n * R08: constructEvent() parses and validates the Emitia-Signature header,\n * verifies the HMAC-SHA256 signature timing-safely, checks timestamp freshness,\n * and returns the parsed event.\n *\n * Algorithm (source: apps/worker/src/processors/webhook-deliver.processor.ts L136–158):\n * t = Math.floor(Date.now() / 1000) — unix seconds\n * signed = `${t}.${rawBody}` — concatenate timestamp + raw body\n * v1 = HMAC-SHA256(secret, signed).digest('hex')\n * header = `t=${t},v1=${v1}` — Emitia-Signature header value\n *\n * Additional headers sent by worker (informational, NOT part of signature):\n * Emitia-Event-Id, Emitia-Event-Type\n *\n * Security notes:\n * - timingSafeEqual is used for HMAC comparison to prevent timing attacks.\n * - Length pre-check before timingSafeEqual: if lengths differ we reject\n * immediately (before calling timingSafeEqual which would throw on unequal\n * lengths) to prevent RangeError from leaking information.\n * - JSON.parse is called ONLY after signature verification — never on\n * unverified input first.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto';\nimport type { WebhookEventType } from '@emitia/openapi';\n\n// ── Event shape ───────────────────────────────────────────────────────────────\n\n/**\n * Emitia webhook event shape.\n *\n * Matches the canonical body built in webhook-deliver.processor.ts L137–143:\n * { id, type, api_version, created: tSeconds (number), data }\n *\n * NOTE: There is no shared schema in @emitia/openapi for the event envelope —\n * it is built inline in the worker. This type mirrors that shape exactly.\n *\n * P3-2.2: `type` is narrowed to WebhookEventType (union of 21 known event types\n * from @emitia/shared SSOT, re-exported via @emitia/openapi). Callers performing\n * a switch/exhaustive check on `.type` get compile-time exhaustiveness checking.\n */\nexport interface EmitiaEvent {\n /** Event ID (e.g. \"evt_01HX...\"). */\n id: string;\n /**\n * Event type. One of the 21 known Emitia event types\n * (e.g. \"invoice.accepted_by_dian\", \"invoice.rejected_by_dian\", etc.).\n * Narrowed to WebhookEventType for compile-time exhaustiveness checking.\n */\n type: WebhookEventType;\n /** API version that generated this event (e.g. \"2024-01-01\"). */\n api_version: string;\n /** Unix timestamp (seconds) when the event was created. */\n created: number;\n /** Event-specific payload. Shape depends on event.type. */\n data: unknown;\n}\n\n// ── Error ─────────────────────────────────────────────────────────────────────\n\n/** Reason codes for SignatureVerificationError. */\nexport type SignatureVerificationReason =\n | 'no_signature' /** Header missing, empty, or unparseable. */\n | 'timestamp_out_of_tolerance' /** |now - t| > toleranceSec. */\n | 'signature_mismatch' /** HMAC does not match any v1 value in header. */\n | 'invalid_payload'; /** Signature verified, but the body is not valid JSON. */\n\n/**\n * Thrown when constructEvent() cannot verify the webhook signature.\n *\n * Design: NOT a subclass of EmitiaError (which models HTTP API errors).\n * This error models a local crypto verification failure — no HTTP involved.\n */\nexport class SignatureVerificationError extends Error {\n readonly reason: SignatureVerificationReason;\n\n constructor(reason: SignatureVerificationReason, message: string) {\n super(message);\n this.name = 'SignatureVerificationError';\n this.reason = reason;\n // Maintain proper prototype chain for instanceof checks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ── Header parsing ────────────────────────────────────────────────────────────\n\ninterface ParsedHeader {\n t: number;\n v1Values: string[];\n}\n\n/**\n * Parse an Emitia-Signature header value.\n *\n * Format: `t=<unix_seconds>,v1=<hex_hmac>[,v1=<hex_hmac2>...]`\n * Multiple v1 values are supported (rotation scenario).\n *\n * Returns null if the header is missing, empty, or does not contain\n * a valid numeric `t=` and at least one `v1=` value.\n */\nfunction parseSignatureHeader(header: string): ParsedHeader | null {\n if (!header) return null;\n\n const parts = header.split(',');\n let t: number | undefined;\n const v1Values: string[] = [];\n\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.startsWith('t=')) {\n const raw = trimmed.slice(2);\n // Strictly decimal unix seconds — reject empty, signs, scientific/hex\n // notation, or whitespace (Number() would accept \"1e3\", \"0x10\", \" 10 \").\n if (!/^\\d+$/.test(raw)) {\n return null;\n }\n t = Number(raw);\n } else if (trimmed.startsWith('v1=')) {\n const value = trimmed.slice(3);\n if (value) v1Values.push(value);\n }\n }\n\n if (t === undefined || v1Values.length === 0) return null;\n\n return { t, v1Values };\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Verify an Emitia webhook signature and return the parsed event.\n *\n * @param payload Raw request body — string or Buffer. Do NOT parse JSON first.\n * @param signatureHeader Value of the `Emitia-Signature` header (e.g. `t=...,v1=...`).\n * @param secret Webhook endpoint signing secret.\n * @param toleranceSec Maximum allowed age of the event in seconds (default: 300).\n * @param nowSec Injectable clock (returns current unix seconds). Defaults to\n * Math.floor(Date.now() / 1000). Exposed for deterministic tests.\n * @returns Parsed and verified {@link EmitiaEvent}.\n * @throws {SignatureVerificationError} When the header is invalid, the timestamp is\n * out of tolerance, or the signature does not match.\n */\nexport function constructEvent(\n payload: string | Buffer,\n signatureHeader: string,\n secret: string,\n toleranceSec = 300,\n nowSec: () => number = () => Math.floor(Date.now() / 1000),\n): EmitiaEvent {\n // Step 1: Parse the signature header.\n const parsed = parseSignatureHeader(signatureHeader);\n if (parsed === null) {\n throw new SignatureVerificationError(\n 'no_signature',\n `Invalid or missing Emitia-Signature header: \"${signatureHeader}\". Expected format: t=<unix_seconds>,v1=<hex_hmac>`,\n );\n }\n\n const { t, v1Values } = parsed;\n\n // Step 2: Check timestamp tolerance (replay protection).\n const now = nowSec();\n const drift = Math.abs(now - t);\n if (drift > toleranceSec) {\n throw new SignatureVerificationError(\n 'timestamp_out_of_tolerance',\n `Webhook timestamp is too old or too far in the future. Timestamp: ${t}, now: ${now}, drift: ${drift}s, tolerance: ${toleranceSec}s. Ensure your server clock is synchronized and that this event is not a replay.`,\n );\n }\n\n // Step 3: Recompute HMAC-SHA256 over `${t}.${payload}`.\n const payloadString = Buffer.isBuffer(payload) ? payload.toString('utf8') : payload;\n const signedPayload = `${t}.${payloadString}`;\n const expectedHmac = createHmac('sha256', secret).update(signedPayload).digest();\n\n // Step 4: Timing-safe comparison against all v1 values.\n // - Pre-check length BEFORE calling timingSafeEqual (which throws on unequal lengths).\n // - If lengths differ, reject immediately without leaking timing.\n const matched = v1Values.some((v1) => {\n const v1Buffer = Buffer.from(v1, 'hex');\n // If the hex string was malformed (e.g. odd-length) or different length, reject.\n if (v1Buffer.length !== expectedHmac.length) return false;\n return timingSafeEqual(v1Buffer, expectedHmac);\n });\n\n if (!matched) {\n throw new SignatureVerificationError(\n 'signature_mismatch',\n 'Webhook signature verification failed. The computed HMAC does not match any ' +\n 'v1 signature in the header. Verify you are using the correct signing secret ' +\n 'and that the raw (unparsed) request body is passed to constructEvent().',\n );\n }\n\n // Step 5: Parse JSON ONLY after verification. A signed-but-malformed body is\n // improbable (forging requires the secret) but must surface as a typed error,\n // not a raw SyntaxError, so a single `catch (SignatureVerificationError)` holds.\n try {\n return JSON.parse(payloadString) as EmitiaEvent;\n } catch {\n throw new SignatureVerificationError(\n 'invalid_payload',\n 'Webhook signature verified, but the request body is not valid JSON.',\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emitia/node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Official Node.js & TypeScript SDK for the Emitia API — electronic invoicing for Colombia (DIAN), Stripe-style.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Propiter <pro.pedro0413@gmail.com>",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@emitia/openapi": "0.0.0"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"zod": "^
|
|
56
|
+
"zod": "^4.6.7"
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build": "tsup",
|