facturas 0.5.0 → 0.5.2
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 +4 -2
- package/dist/{constants.js → constants.mjs} +1 -1
- package/dist/{errors.js → errors.mjs} +1 -1
- package/dist/{index.js → index.mjs} +49 -29
- package/dist/index.mjs.map +1 -0
- package/dist/{padron.js → padron.mjs} +1 -1
- package/dist/types.mjs +1 -0
- package/dist/wsfe.d.ts +16 -13
- package/dist/{wsfe.js → wsfe.mjs} +32 -23
- package/dist/wsfe.mjs.map +1 -0
- package/dist/wsmtxca.d.ts +3 -0
- package/dist/{wsmtxca.js → wsmtxca.mjs} +18 -7
- package/dist/wsmtxca.mjs.map +1 -0
- package/package.json +12 -10
- package/dist/index.js.map +0 -1
- package/dist/types.js +0 -1
- package/dist/wsfe.js.map +0 -1
- package/dist/wsmtxca.js.map +0 -1
- /package/dist/{constants.js.map → constants.mjs.map} +0 -0
- /package/dist/{errors.js.map → errors.mjs.map} +0 -0
- /package/dist/{padron.js.map → padron.mjs.map} +0 -0
- /package/dist/{types.js.map → types.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -16,8 +16,8 @@ npm install facturas
|
|
|
16
16
|
|
|
17
17
|
For the full quick start, troubleshooting, and examples, see the repository docs:
|
|
18
18
|
|
|
19
|
-
- [Repository README](https://github.com/LaPyme/
|
|
20
|
-
- [Examples directory](https://github.com/LaPyme/
|
|
19
|
+
- [Repository README](https://github.com/LaPyme/facturas#readme)
|
|
20
|
+
- [Examples directory](https://github.com/LaPyme/facturas/tree/main/examples)
|
|
21
21
|
|
|
22
22
|
The package exports:
|
|
23
23
|
|
|
@@ -31,6 +31,8 @@ The package exports:
|
|
|
31
31
|
|
|
32
32
|
`facturas` also exports `createMemoryWsaaSessionStore()` for tests/local single-process coordination and the small `ArcaWsaaSessionStore` interface for applications that need to share WSAA tickets across workers through their own durable store.
|
|
33
33
|
|
|
34
|
+
Authenticated WSFE and WSMTXCA methods accept `forceRefresh: true` when callers need to discard the cached WSAA TA and request a fresh Token Authorization for the same service.
|
|
35
|
+
|
|
34
36
|
## WSFE associated periods
|
|
35
37
|
|
|
36
38
|
`client.wsfe.createNextVoucher({ data })` supports `associatedPeriod` for credit/debit notes that use `PeriodoAsoc` instead of `CbtesAsoc`:
|
|
@@ -435,7 +435,7 @@ function createWsfeService(options) {
|
|
|
435
435
|
async function executeWsfeAuthenticatedOperation(operation, input, body = {}) {
|
|
436
436
|
const auth = await options.auth.login("wsfe", {
|
|
437
437
|
representedTaxId: input.representedTaxId,
|
|
438
|
-
forceRefresh: input.
|
|
438
|
+
forceRefresh: input.forceRefresh
|
|
439
439
|
});
|
|
440
440
|
const response = await options.soap.execute({
|
|
441
441
|
service: "wsfe",
|
|
@@ -463,13 +463,13 @@ function createWsfeService(options) {
|
|
|
463
463
|
representedTaxId,
|
|
464
464
|
salesPoint,
|
|
465
465
|
voucherType,
|
|
466
|
-
|
|
466
|
+
forceRefresh
|
|
467
467
|
}) {
|
|
468
468
|
const result = await executeWsfeAuthenticatedOperation(
|
|
469
469
|
"FECompUltimoAutorizado",
|
|
470
470
|
{
|
|
471
471
|
representedTaxId,
|
|
472
|
-
|
|
472
|
+
forceRefresh
|
|
473
473
|
},
|
|
474
474
|
{
|
|
475
475
|
PtoVta: salesPoint,
|
|
@@ -481,29 +481,35 @@ function createWsfeService(options) {
|
|
|
481
481
|
async function getWsfeCatalog(operation, resultKey, input) {
|
|
482
482
|
const result = await executeWsfeAuthenticatedOperation(operation, {
|
|
483
483
|
representedTaxId: input.representedTaxId,
|
|
484
|
-
|
|
484
|
+
forceRefresh: input.forceRefresh
|
|
485
485
|
});
|
|
486
486
|
return getWsfeResultEntries(result, resultKey).map(mapWsfeCatalogEntry);
|
|
487
487
|
}
|
|
488
488
|
function authorizeVoucher({
|
|
489
489
|
representedTaxId,
|
|
490
490
|
data,
|
|
491
|
-
voucherNumber
|
|
491
|
+
voucherNumber,
|
|
492
|
+
forceRefresh
|
|
492
493
|
}) {
|
|
493
494
|
const normalizedInput = normalizeWsfeVoucherInput(data);
|
|
494
495
|
return authorizeNormalizedVoucher({
|
|
495
496
|
representedTaxId,
|
|
496
497
|
data: normalizedInput,
|
|
497
|
-
voucherNumber
|
|
498
|
+
voucherNumber,
|
|
499
|
+
forceRefresh
|
|
498
500
|
});
|
|
499
501
|
}
|
|
500
502
|
async function authorizeNormalizedVoucher({
|
|
501
503
|
representedTaxId,
|
|
502
504
|
data: normalizedInput,
|
|
503
|
-
voucherNumber
|
|
505
|
+
voucherNumber,
|
|
506
|
+
forceRefresh
|
|
504
507
|
}) {
|
|
505
508
|
const requestData = mapWsfeVoucherInput(normalizedInput, voucherNumber);
|
|
506
|
-
const auth = await options.auth.login("wsfe", {
|
|
509
|
+
const auth = await options.auth.login("wsfe", {
|
|
510
|
+
representedTaxId,
|
|
511
|
+
forceRefresh
|
|
512
|
+
});
|
|
507
513
|
const response = await options.soap.execute({
|
|
508
514
|
service: "wsfe",
|
|
509
515
|
operation: "FECAESolicitar",
|
|
@@ -543,12 +549,13 @@ function createWsfeService(options) {
|
|
|
543
549
|
}
|
|
544
550
|
return {
|
|
545
551
|
authorizeVoucher,
|
|
546
|
-
async createNextVoucher({ representedTaxId, data }) {
|
|
552
|
+
async createNextVoucher({ representedTaxId, data, forceRefresh }) {
|
|
547
553
|
const normalizedInput = normalizeWsfeVoucherInput(data);
|
|
548
554
|
const voucherNumber = await getNextVoucherNumber({
|
|
549
555
|
representedTaxId,
|
|
550
556
|
salesPoint: normalizedInput.salesPoint,
|
|
551
|
-
voucherType: normalizedInput.voucherType
|
|
557
|
+
voucherType: normalizedInput.voucherType,
|
|
558
|
+
forceRefresh
|
|
552
559
|
});
|
|
553
560
|
return authorizeNormalizedVoucher({
|
|
554
561
|
representedTaxId,
|
|
@@ -560,12 +567,12 @@ function createWsfeService(options) {
|
|
|
560
567
|
getLastVoucher(input) {
|
|
561
568
|
return getNextVoucherNumber(input);
|
|
562
569
|
},
|
|
563
|
-
async getSalesPoints({ representedTaxId,
|
|
570
|
+
async getSalesPoints({ representedTaxId, forceRefresh }) {
|
|
564
571
|
const result = await executeWsfeAuthenticatedOperation(
|
|
565
572
|
"FEParamGetPtosVenta",
|
|
566
573
|
{
|
|
567
574
|
representedTaxId,
|
|
568
|
-
|
|
575
|
+
forceRefresh
|
|
569
576
|
}
|
|
570
577
|
);
|
|
571
578
|
const rawPoints = result.ResultGet?.PtoVenta;
|
|
@@ -584,12 +591,12 @@ function createWsfeService(options) {
|
|
|
584
591
|
getConceptTypes(input) {
|
|
585
592
|
return getWsfeCatalog("FEParamGetTiposConcepto", "ConceptoTipo", input);
|
|
586
593
|
},
|
|
587
|
-
async getCurrencyTypes({ representedTaxId,
|
|
594
|
+
async getCurrencyTypes({ representedTaxId, forceRefresh }) {
|
|
588
595
|
const result = await executeWsfeAuthenticatedOperation(
|
|
589
596
|
"FEParamGetTiposMonedas",
|
|
590
597
|
{
|
|
591
598
|
representedTaxId,
|
|
592
|
-
|
|
599
|
+
forceRefresh
|
|
593
600
|
}
|
|
594
601
|
);
|
|
595
602
|
return getWsfeResultEntries(result, "Moneda").map(mapWsfeCurrencyType);
|
|
@@ -603,12 +610,12 @@ function createWsfeService(options) {
|
|
|
603
610
|
getOptionalTypes(input) {
|
|
604
611
|
return getWsfeCatalog("FEParamGetTiposOpcional", "OpcionalTipo", input);
|
|
605
612
|
},
|
|
606
|
-
async getActivities({ representedTaxId,
|
|
613
|
+
async getActivities({ representedTaxId, forceRefresh }) {
|
|
607
614
|
const result = await executeWsfeAuthenticatedOperation(
|
|
608
615
|
"FEParamGetActividades",
|
|
609
616
|
{
|
|
610
617
|
representedTaxId,
|
|
611
|
-
|
|
618
|
+
forceRefresh
|
|
612
619
|
}
|
|
613
620
|
);
|
|
614
621
|
return getWsfeResultEntries(result, "ActividadesTipo").map(
|
|
@@ -618,13 +625,13 @@ function createWsfeService(options) {
|
|
|
618
625
|
async getReceiverVatConditions({
|
|
619
626
|
representedTaxId,
|
|
620
627
|
voucherClass,
|
|
621
|
-
|
|
628
|
+
forceRefresh
|
|
622
629
|
}) {
|
|
623
630
|
const result = await executeWsfeAuthenticatedOperation(
|
|
624
631
|
"FEParamGetCondicionIvaReceptor",
|
|
625
632
|
{
|
|
626
633
|
representedTaxId,
|
|
627
|
-
|
|
634
|
+
forceRefresh
|
|
628
635
|
},
|
|
629
636
|
{
|
|
630
637
|
...voucherClass === void 0 ? {} : { ClaseCmp: voucherClass }
|
|
@@ -638,12 +645,12 @@ function createWsfeService(options) {
|
|
|
638
645
|
const result = await executeWsfeOperation("FEDummy");
|
|
639
646
|
return mapWsfeServerStatus(result);
|
|
640
647
|
},
|
|
641
|
-
async getQuotation({ currencyId, representedTaxId,
|
|
648
|
+
async getQuotation({ currencyId, representedTaxId, forceRefresh }) {
|
|
642
649
|
const result = await executeWsfeAuthenticatedOperation(
|
|
643
650
|
"FEParamGetCotizacion",
|
|
644
651
|
{
|
|
645
652
|
representedTaxId,
|
|
646
|
-
|
|
653
|
+
forceRefresh
|
|
647
654
|
},
|
|
648
655
|
{
|
|
649
656
|
MonId: currencyId
|
|
@@ -656,12 +663,14 @@ function createWsfeService(options) {
|
|
|
656
663
|
representedTaxId,
|
|
657
664
|
number,
|
|
658
665
|
salesPoint,
|
|
659
|
-
voucherType
|
|
666
|
+
voucherType,
|
|
667
|
+
forceRefresh
|
|
660
668
|
}) {
|
|
661
669
|
const result = await executeWsfeAuthenticatedOperation(
|
|
662
670
|
"FECompConsultar",
|
|
663
671
|
{
|
|
664
|
-
representedTaxId
|
|
672
|
+
representedTaxId,
|
|
673
|
+
forceRefresh
|
|
665
674
|
},
|
|
666
675
|
{
|
|
667
676
|
FeCompConsReq: {
|
|
@@ -1035,8 +1044,11 @@ function getWsfeResultEntries(result, key) {
|
|
|
1035
1044
|
// src/services/wsmtxca.ts
|
|
1036
1045
|
function createWsmtxcaService(options) {
|
|
1037
1046
|
return {
|
|
1038
|
-
async authorizeVoucher({ representedTaxId, data }) {
|
|
1039
|
-
const auth = await options.auth.login("wsmtxca", {
|
|
1047
|
+
async authorizeVoucher({ representedTaxId, data, forceRefresh }) {
|
|
1048
|
+
const auth = await options.auth.login("wsmtxca", {
|
|
1049
|
+
representedTaxId,
|
|
1050
|
+
forceRefresh
|
|
1051
|
+
});
|
|
1040
1052
|
const response = await options.soap.execute({
|
|
1041
1053
|
service: "wsmtxca",
|
|
1042
1054
|
operation: "autorizarComprobante",
|
|
@@ -1082,9 +1094,13 @@ function createWsmtxcaService(options) {
|
|
|
1082
1094
|
async getLastAuthorizedVoucher({
|
|
1083
1095
|
representedTaxId,
|
|
1084
1096
|
voucherType,
|
|
1085
|
-
salesPoint
|
|
1097
|
+
salesPoint,
|
|
1098
|
+
forceRefresh
|
|
1086
1099
|
}) {
|
|
1087
|
-
const auth = await options.auth.login("wsmtxca", {
|
|
1100
|
+
const auth = await options.auth.login("wsmtxca", {
|
|
1101
|
+
representedTaxId,
|
|
1102
|
+
forceRefresh
|
|
1103
|
+
});
|
|
1088
1104
|
const response = await options.soap.execute({
|
|
1089
1105
|
service: "wsmtxca",
|
|
1090
1106
|
operation: "consultarUltimoComprobanteAutorizado",
|
|
@@ -1119,9 +1135,13 @@ function createWsmtxcaService(options) {
|
|
|
1119
1135
|
representedTaxId,
|
|
1120
1136
|
voucherType,
|
|
1121
1137
|
salesPoint,
|
|
1122
|
-
voucherNumber
|
|
1138
|
+
voucherNumber,
|
|
1139
|
+
forceRefresh
|
|
1123
1140
|
}) {
|
|
1124
|
-
const auth = await options.auth.login("wsmtxca", {
|
|
1141
|
+
const auth = await options.auth.login("wsmtxca", {
|
|
1142
|
+
representedTaxId,
|
|
1143
|
+
forceRefresh
|
|
1144
|
+
});
|
|
1125
1145
|
const response = await options.soap.execute({
|
|
1126
1146
|
service: "wsmtxca",
|
|
1127
1147
|
operation: "consultarComprobante",
|
|
@@ -2099,4 +2119,4 @@ export {
|
|
|
2099
2119
|
createWsmtxcaService,
|
|
2100
2120
|
resolveArcaEnvironment
|
|
2101
2121
|
};
|
|
2102
|
-
//# sourceMappingURL=index.
|
|
2122
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/internal/logger.ts","../src/services/padron.ts","../src/services/wsfe.ts","../src/services/wsmtxca.ts","../src/internal/http.ts","../src/internal/xml.ts","../src/soap/index.ts","../src/wsaa/index.ts","../src/wsaa/session-store.ts","../src/client.ts"],"sourcesContent":["import type { ArcaServiceName } from \"./internal/types\";\n\n/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n readonly code: string;\n override readonly name: string = \"ArcaError\";\n\n constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n override readonly name: string = \"ArcaConfigurationError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n }\n}\n\n/** Thrown when caller-provided input data is missing or invalid. */\nexport class ArcaInputError extends ArcaError {\n override readonly name: string = \"ArcaInputError\";\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_INPUT_ERROR\", options);\n this.detail = options?.detail;\n }\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n override readonly name: string = \"ArcaTransportError\";\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBody?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n statusCode?: number;\n contentType?: string;\n responseBody?: string;\n }\n ) {\n super(message, \"ARCA_TRANSPORT_ERROR\", options);\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBody = options?.responseBody;\n }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n override readonly name: string = \"ArcaSoapFaultError\";\n readonly faultCode?: string;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n faultCode?: string;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SOAP_FAULT\", options);\n this.faultCode = options?.faultCode;\n this.detail = options?.detail;\n }\n}\n\n/** Thrown when a response cannot be parsed as a valid SOAP envelope. */\nexport class ArcaInvalidSoapResponseError extends ArcaError {\n override readonly name: string = \"ArcaInvalidSoapResponseError\";\n readonly service?: ArcaServiceName;\n readonly operation?: string;\n readonly endpointUrl?: string;\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBodyLength?: number;\n readonly responseBodyPreview?: string;\n readonly parsedDetail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n service?: ArcaServiceName;\n operation?: string;\n endpointUrl?: string;\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n parsedDetail?: unknown;\n }\n ) {\n super(message, \"ARCA_INVALID_SOAP_RESPONSE\", options);\n this.service = options?.service;\n this.operation = options?.operation;\n this.endpointUrl = options?.endpointUrl;\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBodyLength = options?.responseBodyLength;\n this.responseBodyPreview = options?.responseBodyPreview;\n this.parsedDetail = options?.parsedDetail;\n }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n override readonly name: string = \"ArcaServiceError\";\n readonly serviceCode?: string | number;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n serviceCode?: string | number;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SERVICE_ERROR\", options);\n this.serviceCode = options?.serviceCode;\n this.detail = options?.detail;\n }\n}\n","import { ArcaConfigurationError } from \"./errors\";\nimport type {\n ArcaClientConfig,\n ArcaEnvironment,\n ArcaLogLevel,\n ArcaServiceName,\n ArcaSoapVersion,\n} from \"./internal/types\";\n\n/** Valid ARCA environment names. */\nexport const ARCA_ENVIRONMENTS = [\"production\", \"test\"] as const;\n\n/** Default environment variable names read by {@link createArcaClientConfigFromEnv}. */\nexport const ARCA_ENV_VARIABLES = {\n taxId: \"ARCA_TAX_ID\",\n certificatePem: \"ARCA_CERTIFICATE_PEM\",\n privateKeyPem: \"ARCA_PRIVATE_KEY_PEM\",\n environment: \"ARCA_ENVIRONMENT\",\n} as const;\n\ntype ArcaClientConfigEnvironment = Record<string, string | undefined>;\n/** Options for {@link createArcaClientConfigFromEnv}. */\nexport type CreateArcaClientConfigFromEnvOptions = {\n env?: ArcaClientConfigEnvironment;\n defaultEnvironment?: ArcaEnvironment;\n variableNames?: Partial<typeof ARCA_ENV_VARIABLES>;\n};\n\nconst PRIVATE_KEY_PEM_PREFIXES = [\n \"-----BEGIN PRIVATE KEY-----\",\n \"-----BEGIN RSA PRIVATE KEY-----\",\n \"-----BEGIN ENCRYPTED PRIVATE KEY-----\",\n] as const;\nconst VALID_ARCA_LOG_LEVELS = [\"debug\", \"info\", \"warn\", \"error\"] as const;\nconst DEFAULT_ARCA_TIMEOUT_MS = 30_000;\nconst DEFAULT_ARCA_RETRIES = 0;\nconst DEFAULT_ARCA_RETRY_DELAY_MS = 500;\n\n/** Returns `\"production\"` or `\"test\"` based on the boolean flag. */\nexport function resolveArcaEnvironment(production: boolean): ArcaEnvironment {\n return production ? \"production\" : \"test\";\n}\n\n/**\n * Builds an {@link ArcaClientConfig} from environment variables.\n * Reads `process.env` by default; override with `options.env`.\n *\n * @throws {ArcaConfigurationError} When required variables are missing or invalid.\n */\nexport function createArcaClientConfigFromEnv(\n options: CreateArcaClientConfigFromEnvOptions = {}\n): ArcaClientConfig {\n const env = options.env ?? process.env;\n const variableNames = {\n ...ARCA_ENV_VARIABLES,\n ...options.variableNames,\n };\n const environmentInput = readEnv(env, variableNames.environment);\n const environmentValue = normalizeEnvironmentValue(environmentInput);\n\n const config: ArcaClientConfig = {\n taxId: readEnv(env, variableNames.taxId) ?? \"\",\n certificatePem: readEnv(env, variableNames.certificatePem) ?? \"\",\n privateKeyPem: readEnv(env, variableNames.privateKeyPem) ?? \"\",\n environment:\n environmentValue ??\n (environmentInput as ArcaEnvironment | undefined) ??\n options.defaultEnvironment ??\n \"test\",\n };\n\n assertArcaClientConfig(config);\n return normalizeArcaClientConfig(config);\n}\n\n/**\n * Validates an {@link ArcaClientConfig} and throws if any field is invalid.\n *\n * @throws {ArcaConfigurationError} With a list of invalid field names.\n */\nexport function assertArcaClientConfig(config: ArcaClientConfig): void {\n const invalidFields: string[] = [];\n const normalized = normalizeArcaClientConfig(config);\n const timeout = normalized.timeout ?? DEFAULT_ARCA_TIMEOUT_MS;\n const retries = normalized.retries ?? DEFAULT_ARCA_RETRIES;\n const retryDelay = normalized.retryDelay ?? DEFAULT_ARCA_RETRY_DELAY_MS;\n\n if (!/^\\d{11}$/.test(normalized.taxId)) {\n invalidFields.push(\"taxId\");\n }\n\n if (!normalized.certificatePem.startsWith(\"-----BEGIN CERTIFICATE-----\")) {\n invalidFields.push(\"certificatePem\");\n }\n\n if (\n !PRIVATE_KEY_PEM_PREFIXES.some((prefix) =>\n normalized.privateKeyPem.startsWith(prefix)\n )\n ) {\n invalidFields.push(\"privateKeyPem\");\n }\n\n if (!ARCA_ENVIRONMENTS.includes(normalized.environment)) {\n invalidFields.push(\"environment\");\n }\n\n if (!Number.isFinite(timeout) || timeout <= 0) {\n invalidFields.push(\"timeout\");\n }\n\n if (!Number.isInteger(retries) || retries < 0) {\n invalidFields.push(\"retries\");\n }\n\n if (!Number.isFinite(retryDelay) || retryDelay < 0) {\n invalidFields.push(\"retryDelay\");\n }\n\n const loggerLevel = normalized.logger?.level;\n if (\n loggerLevel !== undefined &&\n !VALID_ARCA_LOG_LEVELS.includes(loggerLevel)\n ) {\n invalidFields.push(\"logger.level\");\n }\n\n if (\n normalized.logger?.log !== undefined &&\n typeof normalized.logger.log !== \"function\"\n ) {\n invalidFields.push(\"logger.log\");\n }\n\n invalidFields.push(...getInvalidWsaaSessionStoreFields(normalized));\n\n if (invalidFields.length > 0) {\n throw new ArcaConfigurationError(\n `Missing or invalid ARCA client config fields: ${invalidFields.join(\", \")}`\n );\n }\n}\n\nfunction getInvalidWsaaSessionStoreFields(config: ArcaClientConfig): string[] {\n const store = config.wsaaSessionStore;\n if (store === undefined) {\n return [];\n }\n\n const invalidFields: string[] = [];\n if (typeof store.get !== \"function\") {\n invalidFields.push(\"wsaaSessionStore.get\");\n }\n if (typeof store.set !== \"function\") {\n invalidFields.push(\"wsaaSessionStore.set\");\n }\n if (store.delete !== undefined && typeof store.delete !== \"function\") {\n invalidFields.push(\"wsaaSessionStore.delete\");\n }\n if (store.withLock !== undefined && typeof store.withLock !== \"function\") {\n invalidFields.push(\"wsaaSessionStore.withLock\");\n }\n\n return invalidFields;\n}\n\nexport type ArcaServiceConfig = {\n namespace: string;\n endpoint: Record<ArcaEnvironment, string>;\n soapVersion: ArcaSoapVersion;\n soapActionBase: string;\n usesEmptySoapAction?: boolean;\n useLegacyTlsSecurityLevel0?: boolean;\n};\n\nexport const ARCA_WSAA_CONFIG: ArcaServiceConfig = {\n namespace: \"http://wsaa.view.sua.dvadac.desein.afip.gov\",\n endpoint: {\n production: \"https://wsaa.afip.gov.ar/ws/services/LoginCms\",\n test: \"https://wsaahomo.afip.gov.ar/ws/services/LoginCms\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n};\n\nexport const ARCA_SERVICE_CONFIG: Record<ArcaServiceName, ArcaServiceConfig> = {\n wsaa: ARCA_WSAA_CONFIG,\n wsfe: {\n namespace: \"http://ar.gov.afip.dif.FEV1/\",\n endpoint: {\n production: \"https://servicios1.afip.gov.ar/wsfev1/service.asmx\",\n test: \"https://wswhomo.afip.gov.ar/wsfev1/service.asmx\",\n },\n soapVersion: \"1.2\",\n soapActionBase: \"http://ar.gov.afip.dif.FEV1/\",\n useLegacyTlsSecurityLevel0: true,\n },\n wsmtxca: {\n namespace: \"http://impl.service.wsmtxca.afip.gov.ar/service/\",\n endpoint: {\n production:\n \"https://serviciosjava.afip.gov.ar/wsmtxca/services/MTXCAService\",\n test: \"https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"http://impl.service.wsmtxca.afip.gov.ar/service/\",\n },\n \"padron-a5\": {\n namespace: \"http://a5.soap.ws.server.puc.sr/\",\n endpoint: {\n production:\n \"https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5\",\n test: \"https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n },\n \"padron-a13\": {\n namespace: \"http://a13.soap.ws.server.puc.sr/\",\n endpoint: {\n production:\n \"https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA13\",\n test: \"https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA13\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n },\n};\n\nexport function getArcaServiceConfig(\n service: ArcaServiceName\n): ArcaServiceConfig {\n const serviceConfig = ARCA_SERVICE_CONFIG[service];\n if (!serviceConfig) {\n throw new ArcaConfigurationError(\n `Unsupported ARCA service configuration: ${service}`\n );\n }\n return serviceConfig;\n}\n\nexport function normalizeArcaClientConfig(\n config: ArcaClientConfig\n): ArcaClientConfig {\n const normalizedEnvironment =\n normalizeEnvironmentValue(String(config.environment)) ?? config.environment;\n const normalizedLoggerLevel = normalizeLogLevelValue(config.logger?.level);\n\n return {\n taxId: config.taxId.trim(),\n certificatePem: config.certificatePem.trim(),\n privateKeyPem: config.privateKeyPem.trim(),\n environment: normalizedEnvironment,\n timeout: config.timeout ?? DEFAULT_ARCA_TIMEOUT_MS,\n retries: config.retries ?? DEFAULT_ARCA_RETRIES,\n retryDelay: config.retryDelay ?? DEFAULT_ARCA_RETRY_DELAY_MS,\n ...(config.logger === undefined\n ? {}\n : {\n logger: {\n ...config.logger,\n ...(normalizedLoggerLevel === undefined\n ? {}\n : { level: normalizedLoggerLevel }),\n },\n }),\n ...(config.wsaaSessionStore === undefined\n ? {}\n : { wsaaSessionStore: config.wsaaSessionStore }),\n };\n}\n\nfunction normalizeEnvironmentValue(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (ARCA_ENVIRONMENTS.includes(normalized as ArcaEnvironment)) {\n return normalized as ArcaEnvironment;\n }\n\n return undefined;\n}\n\nfunction readEnv(\n env: ArcaClientConfigEnvironment,\n variableName: string\n): string | undefined {\n return env[variableName]?.trim() || undefined;\n}\n\nfunction normalizeLogLevelValue(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (VALID_ARCA_LOG_LEVELS.includes(normalized as ArcaLogLevel)) {\n return normalized as ArcaLogLevel;\n }\n\n return value as ArcaLogLevel;\n}\n","import type { ArcaLoggerConfig, ArcaLogLevel } from \"./types\";\n\nconst ARCA_LOG_LEVELS = [\"debug\", \"info\", \"warn\", \"error\"] as const;\n\nexport type ArcaLogger = {\n disabled: boolean;\n level: ArcaLogLevel;\n log: (level: ArcaLogLevel, message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n};\n\nexport function createArcaLogger(config?: ArcaLoggerConfig): ArcaLogger {\n const disabled = config?.disabled ?? false;\n const level = resolveArcaLogLevel(config?.level);\n const sink = config?.log ?? defaultArcaLog;\n\n const log = (\n messageLevel: ArcaLogLevel,\n message: string,\n ...args: unknown[]\n ) => {\n if (disabled || !shouldLog(level, messageLevel)) {\n return;\n }\n\n sink(messageLevel, message, ...args);\n };\n\n return {\n disabled,\n level,\n log,\n debug(message, ...args) {\n log(\"debug\", message, ...args);\n },\n info(message, ...args) {\n log(\"info\", message, ...args);\n },\n warn(message, ...args) {\n log(\"warn\", message, ...args);\n },\n error(message, ...args) {\n log(\"error\", message, ...args);\n },\n };\n}\n\nexport function resolveArcaLogLevel(level?: string): ArcaLogLevel {\n if (isArcaLogLevel(level)) {\n return level;\n }\n\n const envLevel = process.env.ARCA_LOG_LEVEL?.trim().toLowerCase();\n if (isArcaLogLevel(envLevel)) {\n return envLevel;\n }\n\n return \"warn\";\n}\n\nfunction shouldLog(\n threshold: ArcaLogLevel,\n messageLevel: ArcaLogLevel\n): boolean {\n return (\n ARCA_LOG_LEVELS.indexOf(messageLevel) >= ARCA_LOG_LEVELS.indexOf(threshold)\n );\n}\n\nfunction isArcaLogLevel(value: string | undefined): value is ArcaLogLevel {\n return ARCA_LOG_LEVELS.includes(value as ArcaLogLevel);\n}\n\nfunction defaultArcaLog(\n level: ArcaLogLevel,\n message: string,\n ...args: unknown[]\n): void {\n const method =\n level === \"debug\"\n ? console.debug\n : level === \"info\"\n ? console.info\n : level === \"warn\"\n ? console.warn\n : console.error;\n method(message, ...args);\n}\n","import { ArcaSoapFaultError } from \"../errors\";\nimport type {\n ArcaClientConfig,\n ArcaPadronServiceName,\n} from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Result of a taxpayer lookup via Padron A5. */\nexport type PadronTaxpayerResult = {\n taxId: string;\n personType?: string;\n name?: string;\n raw: Record<string, unknown>;\n};\n\n/** Result of a tax ID lookup by document number via Padron A13. */\nexport type PadronTaxIdLookupResult = {\n taxIds: string[];\n raw: Record<string, unknown>;\n};\n\n/** Padron taxpayer registry service. */\nexport type PadronService = {\n /** Looks up taxpayer details by CUIT. Returns `null` if the taxpayer does not exist. */\n getTaxpayerDetails(\n taxId: number | string\n ): Promise<PadronTaxpayerResult | null>;\n /** Looks up CUITs associated with a document number. Returns `null` if not found. */\n getTaxIdByDocument(\n documentNumber: number | string\n ): Promise<PadronTaxIdLookupResult | null>;\n};\n\nexport type CreatePadronServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a Padron service instance wired with authentication and SOAP transport. */\nexport function createPadronService(\n options: CreatePadronServiceOptions\n): PadronService {\n return {\n async getTaxpayerDetails(taxId) {\n const raw = await executePadronOperation(\n options,\n \"padron-a5\",\n \"getPersona_v2\",\n {\n idPersona: Number.parseInt(String(taxId), 10),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const datosGenerales = record.datosGenerales as\n | Record<string, unknown>\n | undefined;\n return {\n taxId: String(record.idPersona ?? \"\"),\n ...(record.tipoPersona === undefined\n ? {}\n : { personType: String(record.tipoPersona) }),\n ...(datosGenerales ? { name: extractPadronName(datosGenerales) } : {}),\n raw: record,\n };\n },\n async getTaxIdByDocument(documentNumber) {\n const raw = await executePadronOperation(\n options,\n \"padron-a13\",\n \"getIdPersonaListByDocumento\",\n {\n documento: String(documentNumber),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const idPersona = record.idPersona;\n const taxIds = Array.isArray(idPersona)\n ? idPersona.map(String)\n : idPersona === undefined\n ? []\n : [String(idPersona)];\n return {\n taxIds,\n raw: record,\n };\n },\n };\n}\n\nfunction extractPadronName(\n datosGenerales: Record<string, unknown>\n): string | undefined {\n if (typeof datosGenerales.razonSocial === \"string\") {\n return datosGenerales.razonSocial;\n }\n const nombre = datosGenerales.nombre;\n const apellido = datosGenerales.apellido;\n if (typeof apellido === \"string\" && typeof nombre === \"string\") {\n return `${apellido} ${nombre}`.trim();\n }\n if (typeof apellido === \"string\") {\n return apellido;\n }\n if (typeof nombre === \"string\") {\n return nombre;\n }\n return undefined;\n}\n\nasync function executePadronOperation(\n options: CreatePadronServiceOptions,\n service: ArcaPadronServiceName,\n operation: string,\n body: Record<string, unknown>\n) {\n const auth = await options.auth.login(\n service === \"padron-a5\"\n ? \"ws_sr_constancia_inscripcion\"\n : \"ws_sr_padron_a13\"\n );\n\n try {\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service,\n operation,\n bodyElementNamespaceMode: \"prefix\",\n body: {\n token: auth.token,\n sign: auth.sign,\n cuitRepresentada: Number.parseInt(options.config.taxId, 10),\n ...body,\n },\n });\n\n const operationResponse = response.result as Record<string, unknown>;\n\n if (operation === \"getPersona_v2\") {\n return operationResponse.personaReturn ?? null;\n }\n\n if (operation === \"getIdPersonaListByDocumento\") {\n return operationResponse.idPersonaListReturn ?? null;\n }\n\n return operationResponse.return ?? null;\n } catch (error) {\n if (\n error instanceof ArcaSoapFaultError &&\n // Public Padron A5/A13 WSDLs expose only a generic validation fault, so\n // there is no documented not-found-specific fault code to match here.\n // Keep the current message fallback, but treat it as fragile.\n error.message.toLowerCase().includes(\"no existe\")\n ) {\n return null;\n }\n\n throw error;\n }\n}\n","import { ArcaInputError, ArcaServiceError } from \"../errors\";\nimport type { ArcaClientConfig, ArcaRepresentedTaxId } from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Accepted public date inputs for WSFE request fields. */\nexport type WsfeDateInput =\n | `${number}${number}${number}${number}-${number}${number}-${number}${number}`\n | `${number}${number}${number}${number}${number}${number}${number}${number}`;\n\n/** An associated voucher referenced by a WSFE invoice request. */\nexport type WsfeAssociatedVoucher = {\n type: number;\n salesPoint: number;\n number: number;\n taxId?: string;\n voucherDate?: WsfeDateInput;\n};\n\n/** An associated period used by WSFE credit/debit notes without associated vouchers. */\nexport type WsfeAssociatedPeriod = {\n startDate: WsfeDateInput;\n endDate: WsfeDateInput;\n};\n\n/** A tax (tributo) item in a WSFE invoice request. */\nexport type WsfeTax = {\n id: number;\n description?: string;\n baseAmount: number;\n rate: number;\n amount: number;\n};\n\n/** A VAT rate (alícuota IVA) item in a WSFE invoice request. */\nexport type WsfeVatRate = {\n id: number;\n baseAmount: number;\n amount: number;\n};\n\n/** An optional field (campo opcional) in a WSFE invoice request. */\nexport type WsfeOptionalField = {\n id: string;\n value: string;\n};\n\n/** A buyer (comprador) in a WSFE invoice request. */\nexport type WsfeBuyer = {\n documentType: number;\n documentNumber: number;\n percentage: number;\n};\n\n/** An activity associated with a WSFE invoice request. */\nexport type WsfeActivity = {\n id: number;\n};\n\n/** Input data for authorizing a WSFE voucher. */\nexport type WsfeVoucherInput = {\n salesPoint: number;\n voucherType: number;\n concept: number;\n documentType: number;\n documentNumber: number;\n receiverVatConditionId?: number;\n voucherDate: WsfeDateInput;\n totalAmount: number;\n nonTaxableAmount: number;\n netAmount: number;\n exemptAmount: number;\n taxAmount: number;\n vatAmount: number;\n currencyId: string;\n exchangeRate?: number;\n sameCurrencyForeignCancellation?: \"S\" | \"N\";\n serviceStartDate?: WsfeDateInput;\n serviceEndDate?: WsfeDateInput;\n paymentDueDate?: WsfeDateInput;\n associatedVouchers?: WsfeAssociatedVoucher[];\n associatedPeriod?: WsfeAssociatedPeriod;\n taxes?: WsfeTax[];\n vatRates?: WsfeVatRate[];\n optionalFields?: WsfeOptionalField[];\n buyers?: WsfeBuyer[];\n activities?: WsfeActivity[];\n};\n\n/** Input for authorizing a WSFE voucher with an explicit voucher number. */\nexport type WsfeAuthorizeVoucherInput = {\n representedTaxId?: number | string;\n data: WsfeVoucherInput;\n voucherNumber: number;\n forceRefresh?: boolean;\n};\n\n/** Result of a successful WSFE voucher authorization. */\nexport type WsfeAuthorizationResult = {\n cae: string;\n caeExpiry: string;\n voucherNumber: number;\n raw: Record<string, unknown>;\n};\n\n/** A point-of-sale entry returned by {@link WsfeService.getSalesPoints}. */\nexport type WsfeSalesPoint = {\n number: number;\n emissionType?: string;\n blocked?: string;\n deletedSince?: string;\n};\n\n/** Voucher details returned by {@link WsfeService.getVoucherInfo}. */\nexport type WsfeVoucherInfo = {\n voucherNumber: number;\n voucherDate?: string;\n salesPoint?: number;\n voucherType?: number;\n totalAmount?: number;\n result?: string;\n cae?: string;\n caeExpiry?: string;\n raw: Record<string, unknown>;\n};\n\nexport type WsfeCatalogEntry = {\n id: number;\n description: string;\n};\n\nexport type WsfeActivityType = WsfeCatalogEntry & {\n order: number;\n};\n\nexport type WsfeReceiverVatCondition = WsfeCatalogEntry & {\n voucherClass: string;\n};\n\nexport type WsfeCurrencyType = {\n id: string;\n description: string;\n validFrom: string;\n validTo: string;\n};\n\nexport type WsfeServerStatus = {\n appServer: string;\n dbServer: string;\n authServer: string;\n};\n\nexport type WsfeQuotation = {\n currencyId: string;\n rate: number;\n date: string;\n};\n\n/** WSFE electronic invoicing service. */\nexport type WsfeService = {\n /** Authorizes a voucher with the explicit number sent as `CbteDesde` and `CbteHasta`. */\n authorizeVoucher(\n input: WsfeAuthorizeVoucherInput\n ): Promise<WsfeAuthorizationResult>;\n /** Authorizes a new voucher by fetching the next number and requesting a CAE. */\n createNextVoucher(input: {\n representedTaxId?: number | string;\n data: WsfeVoucherInput;\n forceRefresh?: boolean;\n }): Promise<WsfeAuthorizationResult>;\n /** Returns the next available voucher number for the given sales point and type. */\n getNextVoucherNumber(input: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n }): Promise<number>;\n /**\n * @deprecated Use `getNextVoucherNumber()` instead.\n * Returns the next available voucher number, not the last authorized one.\n */\n getLastVoucher(input: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n }): Promise<number>;\n /** Lists all configured points of sale for the taxpayer. */\n getSalesPoints(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeSalesPoint[]>;\n /** Lists voucher types accepted by WSFE. */\n getVoucherTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists document types accepted by WSFE. */\n getDocumentTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists concept types accepted by WSFE. */\n getConceptTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists supported currency types. */\n getCurrencyTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCurrencyType[]>;\n /** Lists VAT rates accepted by WSFE. */\n getVatRates(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists tax types accepted by WSFE. */\n getTaxTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists optional field types accepted by WSFE. */\n getOptionalTypes(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists activities enabled for the taxpayer. */\n getActivities(input: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeActivityType[]>;\n /** Lists receiver VAT condition values accepted by WSFE. */\n getReceiverVatConditions(input: {\n representedTaxId?: number | string;\n voucherClass?: string;\n forceRefresh?: boolean;\n }): Promise<WsfeReceiverVatCondition[]>;\n /** Reports WSFE backend status without requiring taxpayer authorization. */\n getServerStatus(): Promise<WsfeServerStatus>;\n /** Returns the exchange rate for a given currency. */\n getQuotation(input: {\n currencyId: string;\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeQuotation>;\n /** Retrieves details for a specific voucher. Returns `null` if not found. */\n getVoucherInfo(input: {\n representedTaxId?: number | string;\n number: number;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n }): Promise<WsfeVoucherInfo | null>;\n};\n\nexport type CreateWsfeServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\ntype NormalizedWsfeAssociatedVoucher = Omit<\n WsfeAssociatedVoucher,\n \"voucherDate\"\n> & {\n voucherDate?: string;\n};\n\ntype NormalizedWsfeAssociatedPeriod = {\n startDate: string;\n endDate: string;\n};\n\ntype NormalizedWsfeVoucherInput = Omit<\n WsfeVoucherInput,\n | \"voucherDate\"\n | \"serviceStartDate\"\n | \"serviceEndDate\"\n | \"paymentDueDate\"\n | \"associatedVouchers\"\n | \"associatedPeriod\"\n> & {\n voucherDate: string;\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n associatedVouchers?: NormalizedWsfeAssociatedVoucher[];\n associatedPeriod?: NormalizedWsfeAssociatedPeriod;\n};\n\n/** Creates a WSFE service instance wired with authentication and SOAP transport. */\nexport function createWsfeService(\n options: CreateWsfeServiceOptions\n): WsfeService {\n async function executeWsfeAuthenticatedOperation(\n operation: string,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n },\n body: Record<string, unknown> = {}\n ) {\n const auth = await options.auth.login(\"wsfe\", {\n representedTaxId: input.representedTaxId,\n forceRefresh: input.forceRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation,\n body: {\n Auth: createWsfeAuth(\n input.representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n ...body,\n },\n });\n\n return unwrapWsfeOperationResult(operation, response.result);\n }\n\n async function executeWsfeOperation(\n operation: string,\n body: Record<string, unknown> = {}\n ) {\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation,\n body,\n });\n\n return unwrapWsfeOperationResult(operation, response.result);\n }\n\n async function getNextVoucherNumber({\n representedTaxId,\n salesPoint,\n voucherType,\n forceRefresh,\n }: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FECompUltimoAutorizado\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n }\n );\n return Number(result.CbteNro ?? 0) + 1;\n }\n\n async function getWsfeCatalog(\n operation: string,\n resultKey: string,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n }\n ): Promise<WsfeCatalogEntry[]> {\n const result = await executeWsfeAuthenticatedOperation(operation, {\n representedTaxId: input.representedTaxId,\n forceRefresh: input.forceRefresh,\n });\n return getWsfeResultEntries(result, resultKey).map(mapWsfeCatalogEntry);\n }\n\n function authorizeVoucher({\n representedTaxId,\n data,\n voucherNumber,\n forceRefresh,\n }: WsfeAuthorizeVoucherInput): Promise<WsfeAuthorizationResult> {\n const normalizedInput = normalizeWsfeVoucherInput(data);\n return authorizeNormalizedVoucher({\n representedTaxId,\n data: normalizedInput,\n voucherNumber,\n forceRefresh,\n });\n }\n\n async function authorizeNormalizedVoucher({\n representedTaxId,\n data: normalizedInput,\n voucherNumber,\n forceRefresh,\n }: {\n representedTaxId?: number | string;\n data: NormalizedWsfeVoucherInput;\n voucherNumber: number;\n forceRefresh?: boolean;\n }): Promise<WsfeAuthorizationResult> {\n const requestData = mapWsfeVoucherInput(normalizedInput, voucherNumber);\n\n const auth = await options.auth.login(\"wsfe\", {\n representedTaxId,\n forceRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n body: {\n Auth: createWsfeAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n FeCAEReq: {\n FeCabReq: {\n CantReg: 1,\n PtoVta: normalizedInput.salesPoint,\n CbteTipo: normalizedInput.voucherType,\n },\n FeDetReq: {\n FECAEDetRequest: requestData,\n },\n },\n },\n });\n\n const result = unwrapWsfeOperationResult(\"FECAESolicitar\", response.result);\n const detailResponse = normalizeWsfeDetailResponse(result);\n const cae = detailResponse.CAE;\n const caeExpiry = detailResponse.CAEFchVto;\n\n if (typeof cae !== \"string\" || typeof caeExpiry !== \"string\") {\n throw new ArcaServiceError(\"WSFE did not return CAE authorization data\", {\n detail: result,\n });\n }\n\n return {\n cae,\n caeExpiry: String(caeExpiry),\n voucherNumber,\n raw: result,\n };\n }\n\n return {\n authorizeVoucher,\n async createNextVoucher({ representedTaxId, data, forceRefresh }) {\n const normalizedInput = normalizeWsfeVoucherInput(data);\n\n const voucherNumber = await getNextVoucherNumber({\n representedTaxId,\n salesPoint: normalizedInput.salesPoint,\n voucherType: normalizedInput.voucherType,\n forceRefresh,\n });\n\n return authorizeNormalizedVoucher({\n representedTaxId,\n data: normalizedInput,\n voucherNumber,\n });\n },\n getNextVoucherNumber,\n getLastVoucher(input) {\n return getNextVoucherNumber(input);\n },\n async getSalesPoints({ representedTaxId, forceRefresh }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetPtosVenta\",\n {\n representedTaxId,\n forceRefresh,\n }\n );\n const rawPoints = (\n result.ResultGet as Record<string, unknown> | undefined\n )?.PtoVenta;\n if (!rawPoints) {\n return [];\n }\n const entries = Array.isArray(rawPoints) ? rawPoints : [rawPoints];\n return entries.map(mapWsfeSalesPoint);\n },\n getVoucherTypes(input) {\n return getWsfeCatalog(\"FEParamGetTiposCbte\", \"CbteTipo\", input);\n },\n getDocumentTypes(input) {\n return getWsfeCatalog(\"FEParamGetTiposDoc\", \"DocTipo\", input);\n },\n getConceptTypes(input) {\n return getWsfeCatalog(\"FEParamGetTiposConcepto\", \"ConceptoTipo\", input);\n },\n async getCurrencyTypes({ representedTaxId, forceRefresh }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetTiposMonedas\",\n {\n representedTaxId,\n forceRefresh,\n }\n );\n return getWsfeResultEntries(result, \"Moneda\").map(mapWsfeCurrencyType);\n },\n getVatRates(input) {\n return getWsfeCatalog(\"FEParamGetTiposIva\", \"IvaTipo\", input);\n },\n getTaxTypes(input) {\n return getWsfeCatalog(\"FEParamGetTiposTributos\", \"TributoTipo\", input);\n },\n getOptionalTypes(input) {\n return getWsfeCatalog(\"FEParamGetTiposOpcional\", \"OpcionalTipo\", input);\n },\n async getActivities({ representedTaxId, forceRefresh }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetActividades\",\n {\n representedTaxId,\n forceRefresh,\n }\n );\n return getWsfeResultEntries(result, \"ActividadesTipo\").map(\n mapWsfeActivityType\n );\n },\n async getReceiverVatConditions({\n representedTaxId,\n voucherClass,\n forceRefresh,\n }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetCondicionIvaReceptor\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n ...(voucherClass === undefined ? {} : { ClaseCmp: voucherClass }),\n }\n );\n return getWsfeResultEntries(result, \"CondicionIvaReceptor\").map(\n mapWsfeReceiverVatCondition\n );\n },\n async getServerStatus() {\n const result = await executeWsfeOperation(\"FEDummy\");\n return mapWsfeServerStatus(result);\n },\n async getQuotation({ currencyId, representedTaxId, forceRefresh }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetCotizacion\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n MonId: currencyId,\n }\n );\n const raw =\n (result.ResultGet as Record<string, unknown> | undefined) ?? {};\n return mapWsfeQuotation(raw);\n },\n async getVoucherInfo({\n representedTaxId,\n number,\n salesPoint,\n voucherType,\n forceRefresh,\n }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FECompConsultar\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n FeCompConsReq: {\n CbteNro: number,\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n },\n }\n );\n const raw = (result.ResultGet as Record<string, unknown> | null) ?? null;\n if (!raw) {\n return null;\n }\n return mapWsfeVoucherInfo(raw);\n },\n };\n}\n\nfunction mapWsfeVoucherInput(\n input: NormalizedWsfeVoucherInput,\n voucherNumber: number\n): Record<string, unknown> {\n const sendsSameForeignCurrencyCancellation =\n input.currencyId !== \"PES\" && input.sameCurrencyForeignCancellation === \"S\";\n\n if (\n input.exchangeRate === undefined &&\n !sendsSameForeignCurrencyCancellation\n ) {\n throw new ArcaInputError(\n \"exchangeRate is required unless sameCurrencyForeignCancellation is S for a foreign-currency voucher.\"\n );\n }\n\n const data: Record<string, unknown> = {\n Concepto: input.concept,\n DocTipo: input.documentType,\n DocNro: input.documentNumber,\n CbteDesde: voucherNumber,\n CbteHasta: voucherNumber,\n CbteFch: input.voucherDate,\n ImpTotal: input.totalAmount,\n ImpTotConc: input.nonTaxableAmount,\n ImpNeto: input.netAmount,\n ImpOpEx: input.exemptAmount,\n ImpTrib: input.taxAmount,\n ImpIVA: input.vatAmount,\n MonId: input.currencyId,\n PtoVta: input.salesPoint,\n CbteTipo: input.voucherType,\n };\n\n if (!sendsSameForeignCurrencyCancellation) {\n data.MonCotiz = input.exchangeRate;\n }\n\n if (input.receiverVatConditionId !== undefined) {\n data.CondicionIVAReceptorId = input.receiverVatConditionId;\n }\n\n if (\n input.currencyId !== \"PES\" &&\n input.sameCurrencyForeignCancellation !== undefined\n ) {\n data.CanMisMonExt = input.sameCurrencyForeignCancellation;\n }\n\n if (input.serviceStartDate !== undefined) {\n data.FchServDesde = input.serviceStartDate;\n }\n if (input.serviceEndDate !== undefined) {\n data.FchServHasta = input.serviceEndDate;\n }\n if (input.paymentDueDate !== undefined) {\n data.FchVtoPago = input.paymentDueDate;\n }\n\n if (input.associatedVouchers) {\n data.CbtesAsoc = {\n CbteAsoc: input.associatedVouchers.map((v) => ({\n Tipo: v.type,\n PtoVta: v.salesPoint,\n Nro: v.number,\n ...(v.taxId === undefined ? {} : { Cuit: v.taxId }),\n ...(v.voucherDate === undefined ? {} : { CbteFch: v.voucherDate }),\n })),\n };\n }\n\n if (input.associatedPeriod) {\n data.PeriodoAsoc = {\n FchDesde: input.associatedPeriod.startDate,\n FchHasta: input.associatedPeriod.endDate,\n };\n }\n\n if (input.taxes) {\n data.Tributos = {\n Tributo: input.taxes.map((t) => ({\n Id: t.id,\n ...(t.description === undefined ? {} : { Desc: t.description }),\n BaseImp: t.baseAmount,\n Alic: t.rate,\n Importe: t.amount,\n })),\n };\n }\n\n if (input.vatRates) {\n data.Iva = {\n AlicIva: input.vatRates.map((v) => ({\n Id: v.id,\n BaseImp: v.baseAmount,\n Importe: v.amount,\n })),\n };\n }\n\n if (input.optionalFields) {\n data.Opcionales = {\n Opcional: input.optionalFields.map((o) => ({\n Id: o.id,\n Valor: o.value,\n })),\n };\n }\n\n if (input.buyers) {\n data.Compradores = {\n Comprador: input.buyers.map((b) => ({\n DocTipo: b.documentType,\n DocNro: b.documentNumber,\n Porcentaje: b.percentage,\n })),\n };\n }\n\n if (input.activities) {\n data.Actividades = {\n Actividad: input.activities.map((a) => ({\n Id: a.id,\n })),\n };\n }\n\n return data;\n}\n\nfunction normalizeWsfeVoucherInput(\n input: WsfeVoucherInput\n): NormalizedWsfeVoucherInput {\n const {\n voucherDate,\n serviceStartDate,\n serviceEndDate,\n paymentDueDate,\n associatedVouchers,\n associatedPeriod,\n ...rest\n } = input;\n\n return {\n ...rest,\n voucherDate: normalizeWsfeDateInput(voucherDate, \"voucherDate\"),\n ...(serviceStartDate === undefined\n ? {}\n : {\n serviceStartDate: normalizeWsfeDateInput(\n serviceStartDate,\n \"serviceStartDate\"\n ),\n }),\n ...(serviceEndDate === undefined\n ? {}\n : {\n serviceEndDate: normalizeWsfeDateInput(\n serviceEndDate,\n \"serviceEndDate\"\n ),\n }),\n ...(paymentDueDate === undefined\n ? {}\n : {\n paymentDueDate: normalizeWsfeDateInput(\n paymentDueDate,\n \"paymentDueDate\"\n ),\n }),\n ...(associatedVouchers === undefined\n ? {}\n : {\n associatedVouchers: associatedVouchers.map((voucher, index) => {\n const { voucherDate: associatedVoucherDate, ...associatedRest } =\n voucher;\n\n return {\n ...associatedRest,\n ...(associatedVoucherDate === undefined\n ? {}\n : {\n voucherDate: normalizeWsfeDateInput(\n associatedVoucherDate,\n `associatedVouchers[${index}].voucherDate`\n ),\n }),\n };\n }),\n }),\n ...(associatedPeriod === undefined\n ? {}\n : {\n associatedPeriod: {\n startDate: normalizeWsfeDateInput(\n associatedPeriod.startDate,\n \"associatedPeriod.startDate\"\n ),\n endDate: normalizeWsfeDateInput(\n associatedPeriod.endDate,\n \"associatedPeriod.endDate\"\n ),\n },\n }),\n };\n}\n\nfunction normalizeWsfeDateInput(\n value: WsfeDateInput,\n fieldName: string\n): string {\n if (typeof value !== \"string\") {\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: expected a YYYY-MM-DD or YYYYMMDD string`,\n {\n detail: { field: fieldName, value },\n }\n );\n }\n\n const normalizedValue = value.trim();\n const afipMatch = normalizedValue.match(/^(\\d{4})(\\d{2})(\\d{2})$/);\n if (afipMatch) {\n const [, year, month, day] = afipMatch;\n assertValidCalendarDate(year, month, day, fieldName, normalizedValue);\n return normalizedValue;\n }\n\n const isoMatch = normalizedValue.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n assertValidCalendarDate(year, month, day, fieldName, normalizedValue);\n return `${year}${month}${day}`;\n }\n\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: expected a YYYY-MM-DD or YYYYMMDD string`,\n {\n detail: { field: fieldName, value: normalizedValue },\n }\n );\n}\n\nfunction assertValidCalendarDate(\n yearInput: string,\n monthInput: string,\n dayInput: string,\n fieldName: string,\n value: string\n) {\n const year = Number(yearInput);\n const month = Number(monthInput);\n const day = Number(dayInput);\n const candidate = new Date(Date.UTC(year, month - 1, day));\n\n if (\n candidate.getUTCFullYear() !== year ||\n candidate.getUTCMonth() !== month - 1 ||\n candidate.getUTCDate() !== day\n ) {\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: received a non-existent calendar date`,\n {\n detail: { field: fieldName, value },\n }\n );\n }\n}\n\nfunction mapWsfeSalesPoint(raw: unknown): WsfeSalesPoint {\n const record = raw as Record<string, unknown>;\n return {\n number: Number(record.Nro ?? 0),\n ...(record.EmisionTipo === undefined\n ? {}\n : { emissionType: String(record.EmisionTipo) }),\n ...(record.Bloqueado === undefined\n ? {}\n : { blocked: String(record.Bloqueado) }),\n ...(record.FchBaja === undefined\n ? {}\n : { deletedSince: String(record.FchBaja) }),\n };\n}\n\nfunction mapWsfeCatalogEntry(raw: unknown): WsfeCatalogEntry {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n };\n}\n\nfunction mapWsfeActivityType(raw: unknown): WsfeActivityType {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n order: Number(record.Orden ?? 0),\n };\n}\n\nfunction mapWsfeReceiverVatCondition(raw: unknown): WsfeReceiverVatCondition {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n voucherClass: String(record.Cmp_Clase ?? \"\"),\n };\n}\n\nfunction mapWsfeCurrencyType(raw: unknown): WsfeCurrencyType {\n const record = raw as Record<string, unknown>;\n return {\n id: String(record.Id ?? \"\"),\n description: String(record.Desc ?? \"\"),\n validFrom: String(record.FchDesde ?? \"\"),\n validTo: String(record.FchHasta ?? \"\"),\n };\n}\n\nfunction mapWsfeServerStatus(raw: Record<string, unknown>): WsfeServerStatus {\n return {\n appServer: String(raw.AppServer ?? \"\"),\n dbServer: String(raw.DbServer ?? \"\"),\n authServer: String(raw.AuthServer ?? \"\"),\n };\n}\n\nfunction mapWsfeQuotation(raw: Record<string, unknown>): WsfeQuotation {\n return {\n currencyId: String(raw.MonId ?? \"\"),\n rate: Number(raw.MonCotiz ?? 0),\n date: String(raw.FchCotiz ?? \"\"),\n };\n}\n\nfunction mapWsfeVoucherInfo(raw: Record<string, unknown>): WsfeVoucherInfo {\n return {\n voucherNumber: Number(raw.CbteDesde ?? raw.CbteHasta ?? 0),\n ...(raw.CbteFch === undefined ? {} : { voucherDate: String(raw.CbteFch) }),\n ...(raw.PtoVta === undefined ? {} : { salesPoint: Number(raw.PtoVta) }),\n ...(raw.CbteTipo === undefined\n ? {}\n : { voucherType: Number(raw.CbteTipo) }),\n ...(raw.ImpTotal === undefined\n ? {}\n : { totalAmount: Number(raw.ImpTotal) }),\n ...(raw.Resultado === undefined ? {} : { result: String(raw.Resultado) }),\n ...(raw.CAE === undefined ? {} : { cae: String(raw.CAE) }),\n ...(raw.CAEFchVto === undefined\n ? {}\n : { caeExpiry: String(raw.CAEFchVto) }),\n raw,\n };\n}\n\nfunction createWsfeAuth(\n representedTaxId: number | string,\n token: string,\n sign: string\n) {\n return {\n Token: token,\n Sign: sign,\n Cuit: Number.parseInt(String(representedTaxId), 10),\n };\n}\n\nfunction unwrapWsfeOperationResult(\n operation: string,\n response: Record<string, unknown>\n) {\n const operationResponse = response[`${operation}Response`] as\n | Record<string, unknown>\n | undefined;\n const result = (operationResponse?.[`${operation}Result`] ??\n response[`${operation}Result`] ??\n response) as Record<string, unknown>;\n\n if (operation === \"FECAESolicitar\") {\n const detailResponse = normalizeWsfeDetailResponse(result);\n const resultCode = detailResponse.Resultado;\n if (resultCode && resultCode !== \"A\") {\n const observationsContainer = detailResponse.Observaciones as\n | Record<string, unknown>\n | undefined;\n const observations = normalizeWsfeErrors(observationsContainer?.Obs);\n if (observations.length > 0) {\n const firstObservation = observations[0];\n if (!firstObservation) {\n throw new ArcaServiceError(\n \"WSFE returned an empty observation list\",\n {\n detail: result,\n }\n );\n }\n throw new ArcaServiceError(firstObservation.message, {\n serviceCode: firstObservation.code,\n detail: result,\n });\n }\n }\n }\n\n const errorsContainer = result.Errors as Record<string, unknown> | undefined;\n const errors = normalizeWsfeErrors(errorsContainer?.Err);\n if (errors.length > 0) {\n const firstError = errors[0];\n if (!firstError) {\n throw new ArcaServiceError(\"WSFE returned an empty error list\", {\n detail: result,\n });\n }\n throw new ArcaServiceError(firstError.message, {\n serviceCode: firstError.code,\n detail: result,\n });\n }\n\n return result;\n}\n\nfunction normalizeWsfeDetailResponse(result: Record<string, unknown>) {\n const detailResponse = result.FeDetResp as\n | Record<string, unknown>\n | undefined;\n const rawDetail = detailResponse?.FECAEDetResponse;\n\n if (Array.isArray(rawDetail)) {\n return (rawDetail[0] as Record<string, unknown>) ?? {};\n }\n\n return (rawDetail as Record<string, unknown> | undefined) ?? {};\n}\n\nfunction normalizeWsfeErrors(rawErrors: unknown) {\n const entries = Array.isArray(rawErrors)\n ? rawErrors\n : rawErrors\n ? [rawErrors]\n : [];\n\n return entries\n .map((entry) => entry as Record<string, unknown>)\n .map((entry) => {\n const code = entry.Code ?? entry.code ?? \"N/A\";\n const message = entry.Msg ?? entry.msg ?? \"Unknown WSFE error\";\n return {\n code: String(code),\n message: `(${String(code)}) ${String(message)}`,\n };\n });\n}\n\nfunction getWsfeResultEntries(\n result: Record<string, unknown>,\n key: string\n): Record<string, unknown>[] {\n const rawEntries = (\n result.ResultGet as Record<string, unknown> | undefined\n )?.[key];\n if (!rawEntries) {\n return [];\n }\n\n return (Array.isArray(rawEntries) ? rawEntries : [rawEntries]).map(\n (entry) => entry as Record<string, unknown>\n );\n}\n","import { ArcaServiceError } from \"../errors\";\nimport type { ArcaClientConfig, ArcaRepresentedTaxId } from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Result of a successful WSMTXCA voucher authorization. */\nexport type WsmtxcaAuthorizationResult = {\n cae: string;\n caeExpiry?: string;\n voucherNumber: number;\n messages: string[];\n raw: Record<string, unknown>;\n};\n\n/** Result of querying the last authorized voucher number. */\nexport type WsmtxcaLastAuthorizedVoucherResult = {\n voucherNumber: number;\n raw: Record<string, unknown>;\n};\n\n/** Result of looking up a specific WSMTXCA voucher. */\nexport type WsmtxcaVoucherLookupResult = {\n invoiceDate: string;\n voucher: Record<string, unknown>;\n messages: string[];\n raw: Record<string, unknown>;\n};\n\n/** WSMTXCA electronic invoicing service (Factura de Crédito Electrónica). */\nexport type WsmtxcaService = {\n /** Authorizes a voucher and returns the CAE. */\n authorizeVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n data: Record<string, unknown>;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaAuthorizationResult>;\n /** Returns the last authorized voucher number for the given sales point and type. */\n getLastAuthorizedVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaLastAuthorizedVoucherResult>;\n /** Retrieves details for a specific voucher. */\n getVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaVoucherLookupResult>;\n};\n\nexport type CreateWsmtxcaServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a WSMTXCA service instance wired with authentication and SOAP transport. */\nexport function createWsmtxcaService(\n options: CreateWsmtxcaServiceOptions\n): WsmtxcaService {\n return {\n async authorizeVoucher({ representedTaxId, data, forceRefresh }) {\n const auth = await options.auth.login(\"wsmtxca\", {\n representedTaxId,\n forceRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"autorizarComprobante\",\n bodyElementName: \"autorizarComprobanteRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n ...(data as Record<string, unknown>),\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"autorizarComprobante\"\n );\n const authorizationPayload = extractWsmtxcaAuthorizationPayload(raw);\n const messages = extractWsmtxcaMessages(raw);\n const resultado = raw.resultado ?? authorizationPayload.resultado;\n\n const caeValue =\n authorizationPayload.CAE ??\n authorizationPayload.codigoAutorizacion ??\n raw.codigoAutorizacion;\n\n if (resultado === \"R\" || caeValue == null) {\n throw new ArcaServiceError(\n messages.join(\" | \") || \"WSMTXCA rejected the voucher authorization\",\n { detail: raw }\n );\n }\n\n return {\n cae: String(caeValue),\n caeExpiry: normalizeWsmtxcaResponseDate(\n authorizationPayload.fechaVencimientoCAE ??\n authorizationPayload.fechaVencimiento ??\n raw.fechaVencimiento\n ),\n voucherNumber: parseWsmtxcaVoucherNumber(\n authorizationPayload.numeroComprobante ?? raw.numeroComprobante,\n \"WSMTXCA did not return the authorized voucher number\",\n raw\n ),\n messages,\n raw,\n };\n },\n async getLastAuthorizedVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n forceRefresh,\n }) {\n const auth = await options.auth.login(\"wsmtxca\", {\n representedTaxId,\n forceRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"consultarUltimoComprobanteAutorizado\",\n bodyElementName: \"consultarUltimoComprobanteAutorizadoRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n consultaUltimoComprobanteAutorizadoRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n },\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"consultarUltimoComprobanteAutorizado\"\n );\n return {\n voucherNumber: parseWsmtxcaVoucherNumber(\n raw.numeroComprobante ?? raw.cbteNro ?? raw.nroComprobante,\n extractWsmtxcaMessages(raw).join(\" | \") ||\n \"WSMTXCA did not return the last authorized voucher number\",\n raw\n ),\n raw,\n };\n },\n async getVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n voucherNumber,\n forceRefresh,\n }) {\n const auth = await options.auth.login(\"wsmtxca\", {\n representedTaxId,\n forceRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"consultarComprobante\",\n bodyElementName: \"consultarComprobanteRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n consultaComprobanteRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n numeroComprobante: voucherNumber,\n },\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"consultarComprobante\"\n );\n const voucher = extractWsmtxcaVoucherPayload(raw);\n const messages = extractWsmtxcaMessages(raw);\n const invoiceDate = normalizeWsmtxcaResponseDate(\n voucher.fechaEmision ?? voucher.fecha ?? voucher.CbteFch\n );\n\n if (!invoiceDate) {\n throw new ArcaServiceError(\n messages[0] ?? \"WSMTXCA did not return the voucher issue date\",\n { detail: raw }\n );\n }\n\n return {\n invoiceDate,\n voucher,\n messages,\n raw,\n };\n },\n };\n}\n\nfunction createWsmtxcaAuth(\n representedTaxId: number | string,\n token: string,\n sign: string\n) {\n return {\n token,\n sign,\n cuitRepresentada: Number.parseInt(String(representedTaxId), 10),\n };\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction unwrapWsmtxcaOperationResponse(\n response: unknown,\n operation:\n | \"autorizarComprobante\"\n | \"consultarUltimoComprobanteAutorizado\"\n | \"consultarComprobante\"\n) {\n const responseRecord = toRecord(response) ?? {};\n\n if (operation === \"autorizarComprobante\") {\n return (\n toRecord(responseRecord.autorizarComprobanteResponse) ??\n toRecord(responseRecord.autorizarComprobanteResult) ??\n toRecord(responseRecord.comprobanteCAEResponse) ??\n toRecord(responseRecord.comprobanteCAEReponse) ??\n responseRecord\n );\n }\n\n if (operation === \"consultarComprobante\") {\n return (\n toRecord(responseRecord.consultarComprobanteResponse) ??\n toRecord(responseRecord.consultaComprobanteResponse) ??\n toRecord(responseRecord.consultarComprobanteResult) ??\n responseRecord\n );\n }\n\n return (\n toRecord(responseRecord.consultarUltimoComprobanteAutorizadoResponse) ??\n toRecord(responseRecord.consultaUltimoComprobanteAutorizadoResponse) ??\n toRecord(responseRecord.consultarUltimoComprobanteAutorizadoResult) ??\n responseRecord\n );\n}\n\nfunction extractWsmtxcaAuthorizationPayload(raw: Record<string, unknown>) {\n return (\n toRecord(raw.comprobanteResponse) ??\n toRecord(raw.comprobanteCAEResponse) ??\n toRecord(raw.comprobanteCAEReponse) ??\n raw\n );\n}\n\nfunction extractWsmtxcaVoucherPayload(raw: Record<string, unknown>) {\n return (\n toRecord(raw.comprobanteResponse) ??\n toRecord(raw.comprobante) ??\n toRecord(raw.cmp) ??\n raw\n );\n}\n\nfunction extractWsmtxcaMessages(raw: Record<string, unknown>): string[] {\n const rawErrors = raw.arrayErrores as\n | { codigoDescripcion?: unknown }\n | undefined;\n const rawObservations = raw.arrayObservaciones as\n | { codigoDescripcion?: unknown }\n | undefined;\n\n const toEntries = (\n value: unknown\n ): Array<{ codigo?: unknown; descripcion?: unknown }> => {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value as Array<{ codigo?: unknown; descripcion?: unknown }>;\n }\n if (typeof value === \"object\") {\n return [value as { codigo?: unknown; descripcion?: unknown }];\n }\n return [];\n };\n\n const errors = toEntries(rawErrors?.codigoDescripcion).map((entry) => {\n const code = entry.codigo == null ? \"N/A\" : String(entry.codigo);\n const description =\n entry.descripcion == null\n ? \"Unknown WSMTXCA error\"\n : String(entry.descripcion);\n return `Error ${code}: ${description}`;\n });\n\n const observations = toEntries(rawObservations?.codigoDescripcion).map(\n (entry) => {\n const code = entry.codigo == null ? \"N/A\" : String(entry.codigo);\n const description =\n entry.descripcion == null ? \"\" : String(entry.descripcion);\n return `Obs ${code}: ${description}`.trim();\n }\n );\n\n return [...errors, ...observations];\n}\n\nfunction parseWsmtxcaVoucherNumber(\n value: unknown,\n message: string,\n detail: Record<string, unknown>\n) {\n const parsed = Number.parseInt(String(value ?? \"\"), 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new ArcaServiceError(message, { detail });\n }\n return parsed;\n}\n\nfunction normalizeWsmtxcaResponseDate(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return formatCompactDateToIso(value);\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (/^\\d{8}$/.test(trimmed)) {\n return formatCompactDateToIso(Number.parseInt(trimmed, 10));\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(trimmed)) {\n return trimmed.slice(0, 10);\n }\n\n return undefined;\n}\n\nfunction formatCompactDateToIso(dateValue?: number | null): string | undefined {\n if (!dateValue) {\n return undefined;\n }\n\n const raw = String(dateValue);\n if (raw.length !== 8) {\n return undefined;\n }\n\n return `${raw.slice(0, 4)}-${raw.slice(4, 6)}-${raw.slice(6, 8)}`;\n}\n","import https from \"node:https\";\nimport { ArcaTransportError } from \"../errors\";\nimport type { ArcaLogger } from \"./logger\";\n\nconst defaultAgent = new https.Agent({\n keepAlive: true,\n});\n\nconst legacyTlsAgent = new https.Agent({\n keepAlive: true,\n ciphers: \"DEFAULT@SECLEVEL=0\",\n});\n\ntype PostXmlOptions = {\n url: string;\n body: string;\n contentType: string;\n soapAction?: string;\n useLegacyTlsSecurityLevel0?: boolean;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n logger?: ArcaLogger;\n service?: string;\n operation?: string;\n};\n\nexport type PostXmlResponse = {\n body: string;\n statusCode?: number;\n contentType?: string;\n};\n\nexport async function postXml({ ...options }: PostXmlOptions): Promise<string> {\n const response = await postXmlWithMetadata(options);\n return response.body;\n}\n\nexport async function postXmlWithMetadata({\n url,\n body,\n contentType,\n soapAction,\n useLegacyTlsSecurityLevel0 = false,\n timeout = 30_000,\n retries = 0,\n retryDelay = 500,\n logger,\n service,\n operation,\n}: PostXmlOptions): Promise<PostXmlResponse> {\n const totalAttempts = retries + 1;\n for (let attempt = 1; attempt <= totalAttempts; attempt += 1) {\n try {\n return await postXmlOnce({\n url,\n body,\n contentType,\n soapAction,\n useLegacyTlsSecurityLevel0,\n timeout,\n });\n } catch (error) {\n if (!(error instanceof ArcaTransportError)) {\n throw error;\n }\n\n if (attempt >= totalAttempts) {\n logger?.error(\"ARCA transport request failed\", {\n service,\n operation,\n url,\n attempt,\n attempts: totalAttempts,\n error,\n });\n throw error;\n }\n\n const nextAttempt = attempt + 1;\n logger?.warn(\n `Retrying ARCA request after transport failure (attempt ${nextAttempt}/${totalAttempts})`,\n {\n service,\n operation,\n url,\n attempt: nextAttempt,\n attempts: totalAttempts,\n error,\n }\n );\n await delay(retryDelay);\n }\n }\n\n throw new ArcaTransportError(\"ARCA HTTP request exhausted retries\");\n}\n\nasync function postXmlOnce({\n url,\n body,\n contentType,\n soapAction,\n useLegacyTlsSecurityLevel0,\n timeout,\n}: Required<\n Pick<\n PostXmlOptions,\n \"url\" | \"body\" | \"contentType\" | \"useLegacyTlsSecurityLevel0\" | \"timeout\"\n >\n> &\n Pick<PostXmlOptions, \"soapAction\">): Promise<PostXmlResponse> {\n const endpoint = new URL(url);\n const requestBody = Buffer.from(body, \"utf8\");\n\n return await new Promise((resolve, reject) => {\n let settled = false;\n const settleResolve = (response: PostXmlResponse) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(response);\n };\n const settleReject = (error: ArcaTransportError) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n const request = https.request(\n {\n protocol: endpoint.protocol,\n hostname: endpoint.hostname,\n port: endpoint.port || undefined,\n path: `${endpoint.pathname}${endpoint.search}`,\n method: \"POST\",\n agent: useLegacyTlsSecurityLevel0 ? legacyTlsAgent : defaultAgent,\n headers: {\n Accept: \"text/xml, application/soap+xml\",\n \"Content-Length\": requestBody.byteLength,\n \"Content-Type\": contentType,\n ...(soapAction === undefined\n ? {}\n : { SOAPAction: `\"${soapAction}\"` }),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n const getResponseBody = () => Buffer.concat(chunks).toString(\"utf8\");\n\n response.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(\n typeof chunk === \"string\" ? Buffer.from(chunk, \"utf8\") : chunk\n );\n });\n\n response.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP response stream failed: ${error.message}`,\n {\n cause: error,\n statusCode: response.statusCode,\n responseBody: getResponseBody(),\n }\n )\n );\n });\n\n response.on(\"aborted\", () => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP response was aborted\", {\n statusCode: response.statusCode,\n responseBody: getResponseBody(),\n })\n );\n });\n\n response.on(\"end\", () => {\n const responseBody = getResponseBody();\n const statusCode = response.statusCode ?? 500;\n const responseContentType = Array.isArray(\n response.headers[\"content-type\"]\n )\n ? response.headers[\"content-type\"].join(\"; \")\n : response.headers[\"content-type\"];\n\n if (statusCode >= 200 && statusCode < 300) {\n settleResolve({\n body: responseBody,\n statusCode,\n contentType: responseContentType,\n });\n return;\n }\n\n // SOAP services commonly return structured fault payloads with HTTP\n // 500. Let higher layers parse those XML faults instead of forcing a\n // transport error here.\n if (isXmlLikeResponse(responseBody, responseContentType)) {\n settleResolve({\n body: responseBody,\n statusCode,\n contentType: responseContentType,\n });\n return;\n }\n\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP request failed with status ${statusCode}`,\n {\n statusCode,\n contentType: responseContentType,\n responseBody,\n }\n )\n );\n });\n }\n );\n\n request.setTimeout(timeout, () => {\n request.destroy(\n new Error(`ARCA HTTP request timed out after ${timeout}ms`)\n );\n });\n\n request.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(`ARCA HTTP request failed: ${error.message}`, {\n cause: error,\n })\n );\n });\n\n request.write(requestBody);\n request.end();\n });\n}\n\nfunction isXmlLikeResponse(body: string, contentType?: string): boolean {\n const normalizedContentType = contentType?.toLowerCase() ?? \"\";\n if (\n normalizedContentType.includes(\"xml\") ||\n normalizedContentType.includes(\"soap\")\n ) {\n return true;\n }\n\n return body.trimStart().startsWith(\"<\");\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import { XMLBuilder, XMLParser } from \"fast-xml-parser\";\nimport { ArcaInvalidSoapResponseError, ArcaSoapFaultError } from \"../errors\";\nimport type { ArcaServiceName, ArcaSoapVersion } from \"../internal/types\";\n\nconst xmlBuilder = new XMLBuilder({\n attributeNamePrefix: \"@_\",\n format: false,\n ignoreAttributes: false,\n suppressBooleanAttributes: false,\n suppressEmptyNode: true,\n});\n\nconst xmlParser = new XMLParser({\n attributeNamePrefix: \"@_\",\n ignoreAttributes: false,\n parseAttributeValue: false,\n parseTagValue: false,\n removeNSPrefix: true,\n trimValues: true,\n});\n\nexport type ArcaSoapParseContext = {\n service?: ArcaServiceName;\n operation?: string;\n endpointUrl?: string;\n statusCode?: number;\n contentType?: string;\n responseBody?: string;\n responseBodyPreviewLength?: number;\n};\n\nexport function buildSoapEnvelope(\n soapVersion: ArcaSoapVersion,\n operation: string,\n namespace: string,\n body: Record<string, unknown>,\n options?: {\n namespaceMode?: \"default\" | \"prefix\";\n }\n): string {\n const prefix = soapVersion === \"1.2\" ? \"soap12\" : \"soap\";\n const envelopeNamespace =\n soapVersion === \"1.2\"\n ? \"http://www.w3.org/2003/05/soap-envelope\"\n : \"http://schemas.xmlsoap.org/soap/envelope/\";\n const namespaceMode = options?.namespaceMode ?? \"default\";\n const operationElementName =\n namespaceMode === \"prefix\" ? `tns:${operation}` : operation;\n const operationNamespaceAttributes =\n namespaceMode === \"prefix\"\n ? { \"@_xmlns:tns\": namespace }\n : { \"@_xmlns\": namespace };\n\n const payload = {\n [`${prefix}:Envelope`]: {\n \"@_xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\",\n \"@_xmlns:xsd\": \"http://www.w3.org/2001/XMLSchema\",\n [`@_xmlns:${prefix}`]: envelopeNamespace,\n [`${prefix}:Body`]: {\n [operationElementName]: {\n ...operationNamespaceAttributes,\n ...pruneUndefinedDeep(body),\n },\n },\n },\n };\n\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>${xmlBuilder.build(payload)}`;\n}\n\nexport function parseSoapBody(\n xml: string,\n context: ArcaSoapParseContext = {}\n): Record<string, unknown> {\n let parsed: Record<string, unknown>;\n try {\n parsed = xmlParser.parse(xml) as Record<string, unknown>;\n } catch (error) {\n throw createInvalidSoapResponseError(\n \"Invalid SOAP response: XML parse failed\",\n context,\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n\n const envelope = parsed.Envelope as Record<string, unknown> | undefined;\n const body = envelope?.Body as Record<string, unknown> | undefined;\n\n if (!body) {\n throw createInvalidSoapResponseError(\n \"Invalid SOAP response: missing body\",\n context,\n parsed\n );\n }\n\n const fault = body.Fault as Record<string, unknown> | undefined;\n if (fault) {\n throw createSoapFaultError(fault);\n }\n\n return body;\n}\n\nexport function getSingleBodyEntry<T = unknown>(\n body: Record<string, unknown>,\n context: ArcaSoapParseContext = {}\n): [string, T] {\n const entries = Object.entries(body).filter(([key]) => key !== \"@_xmlns\");\n if (entries.length !== 1) {\n throw createInvalidSoapResponseError(\n `Invalid SOAP response: expected a single body entry, got ${entries.length}`,\n context,\n body\n );\n }\n\n return entries[0] as [string, T];\n}\n\nfunction createInvalidSoapResponseError(\n message: string,\n context: ArcaSoapParseContext,\n parsedDetail?: unknown,\n cause?: Error\n): ArcaInvalidSoapResponseError {\n const responseBody = context.responseBody ?? \"\";\n\n return new ArcaInvalidSoapResponseError(message, {\n cause,\n service: context.service,\n operation: context.operation,\n endpointUrl: context.endpointUrl,\n statusCode: context.statusCode,\n contentType: context.contentType,\n responseBodyLength: responseBody.length,\n responseBodyPreview: sanitizeSoapResponsePreview(\n responseBody,\n context.responseBodyPreviewLength\n ),\n parsedDetail,\n });\n}\n\nfunction sanitizeSoapResponsePreview(\n responseBody: string,\n maxLength = 4096\n): string {\n return responseBody\n .replace(\n /<((?:[A-Za-z_][\\w.-]*:)?(?:Token|Sign))\\b([^>]*)>[\\s\\S]*?<\\/\\1>/gi,\n (_match, tagName: string, attributes: string) =>\n `<${tagName}${attributes}>[REDACTED]</${tagName}>`\n )\n .slice(0, maxLength);\n}\n\nexport function parseXmlDocument<T = unknown>(xml: string): T {\n return xmlParser.parse(xml) as T;\n}\n\nexport function pruneUndefinedDeep<T>(value: T): T {\n if (Array.isArray(value)) {\n return value\n .map((item) => pruneUndefinedDeep(item))\n .filter((item) => item !== undefined) as T;\n }\n\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, nestedValue]) => nestedValue !== undefined)\n .map(([key, nestedValue]) => [key, pruneUndefinedDeep(nestedValue)]);\n return Object.fromEntries(entries) as T;\n }\n\n return value;\n}\n\nfunction createSoapFaultError(\n fault: Record<string, unknown>\n): ArcaSoapFaultError {\n const faultCode =\n typeof fault.faultcode === \"string\"\n ? fault.faultcode\n : getNestedString(fault, [\"Code\", \"Value\"]);\n const message =\n typeof fault.faultstring === \"string\"\n ? fault.faultstring\n : (getNestedString(fault, [\"Reason\", \"Text\"]) ??\n \"ARCA SOAP fault response\");\n\n return new ArcaSoapFaultError(message, {\n faultCode: faultCode ?? undefined,\n detail: fault,\n });\n}\n\nfunction getNestedString(\n value: Record<string, unknown>,\n path: string[]\n): string | null {\n let current: unknown = value;\n for (const key of path) {\n if (!current || typeof current !== \"object\") {\n return null;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return typeof current === \"string\" ? current : null;\n}\n","import { getArcaServiceConfig } from \"../config\";\nimport { ArcaInvalidSoapResponseError, ArcaSoapFaultError } from \"../errors\";\nimport { postXmlWithMetadata } from \"../internal/http\";\nimport type { ArcaLogger } from \"../internal/logger\";\nimport type {\n ArcaClientConfig,\n ArcaSoapExecutionOptions,\n ArcaSoapResponse,\n} from \"../internal/types\";\nimport {\n buildSoapEnvelope,\n getSingleBodyEntry,\n parseSoapBody,\n} from \"../internal/xml\";\n\nexport type SoapTransport = {\n execute<TBody, TResult>(\n request: ArcaSoapExecutionOptions<TBody>\n ): Promise<ArcaSoapResponse<TResult>>;\n};\n\nexport type CreateSoapTransportOptions = {\n config: ArcaClientConfig;\n logger?: ArcaLogger;\n};\n\nexport function createSoapTransport(\n options: CreateSoapTransportOptions\n): SoapTransport {\n return {\n async execute<TBody, TResult>(request: ArcaSoapExecutionOptions<TBody>) {\n const serviceConfig = getArcaServiceConfig(request.service);\n const url = serviceConfig.endpoint[options.config.environment];\n const soapActionOperation = request.operation;\n const bodyElementName = request.bodyElementName ?? request.operation;\n const soapAction = serviceConfig.usesEmptySoapAction\n ? \"\"\n : `${serviceConfig.soapActionBase}${soapActionOperation}`;\n const contentType =\n serviceConfig.soapVersion === \"1.2\"\n ? `application/soap+xml; charset=utf-8; action=\"${soapAction}\"`\n : 'text/xml; charset=\"utf-8\"';\n const xml = buildSoapEnvelope(\n serviceConfig.soapVersion,\n bodyElementName,\n serviceConfig.namespace,\n request.body as Record<string, unknown>,\n {\n namespaceMode: request.bodyElementNamespaceMode,\n }\n );\n const startedAt = Date.now();\n\n options.logger?.debug(\"Sending ARCA SOAP request\", {\n service: request.service,\n operation: request.operation,\n url,\n });\n\n try {\n const response = await postXmlWithMetadata({\n url,\n body: xml,\n contentType,\n soapAction:\n serviceConfig.soapVersion === \"1.1\" ? soapAction : undefined,\n useLegacyTlsSecurityLevel0:\n options.config.environment === \"production\" &&\n serviceConfig.useLegacyTlsSecurityLevel0 === true,\n timeout: options.config.timeout,\n retries: options.config.retries,\n retryDelay: options.config.retryDelay,\n logger: options.logger,\n service: request.service,\n operation: request.operation,\n });\n\n options.logger?.debug(\"Received ARCA SOAP response\", {\n service: request.service,\n operation: request.operation,\n durationMs: Date.now() - startedAt,\n });\n\n const parseContext = {\n service: request.service,\n operation: request.operation,\n endpointUrl: url,\n statusCode: response.statusCode,\n contentType: response.contentType,\n responseBody: response.body,\n };\n const soapBody = parseSoapBody(response.body, parseContext);\n const [, result] = getSingleBodyEntry<Record<string, unknown>>(\n soapBody,\n parseContext\n );\n\n return {\n service: request.service,\n operation: request.operation,\n raw: response.body,\n result: result as TResult,\n };\n } catch (error) {\n if (error instanceof ArcaSoapFaultError) {\n options.logger?.error(\"ARCA SOAP fault response\", {\n service: request.service,\n operation: request.operation,\n url,\n faultCode: error.faultCode,\n error,\n });\n }\n\n if (error instanceof ArcaInvalidSoapResponseError) {\n options.logger?.error(\"ARCA invalid SOAP response\", {\n service: request.service,\n operation: request.operation,\n url,\n statusCode: error.statusCode,\n contentType: error.contentType,\n responseBodyLength: error.responseBodyLength,\n error,\n });\n }\n\n throw error;\n }\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport forge from \"node-forge\";\nimport { ARCA_WSAA_CONFIG } from \"../config\";\nimport {\n ArcaConfigurationError,\n ArcaSoapFaultError,\n ArcaTransportError,\n} from \"../errors\";\nimport { postXmlWithMetadata } from \"../internal/http\";\nimport type { ArcaLogger } from \"../internal/logger\";\nimport type {\n ArcaAuthCredentials,\n ArcaAuthOptions,\n ArcaClientConfig,\n ArcaWsaaServiceId,\n ArcaWsaaSessionKey,\n} from \"../internal/types\";\nimport {\n buildSoapEnvelope,\n getSingleBodyEntry,\n parseSoapBody,\n parseXmlDocument,\n} from \"../internal/xml\";\nimport {\n isWsaaCredentialValid,\n serializeWsaaSessionKey,\n} from \"./session-store\";\n\nexport type WsaaAuthModule = {\n login(\n service: ArcaWsaaServiceId,\n options?: ArcaAuthOptions\n ): Promise<ArcaAuthCredentials>;\n};\n\nexport type CreateWsaaAuthModuleOptions = {\n config: ArcaClientConfig;\n logger?: ArcaLogger;\n};\n\ntype ForgeSignerOptions = Parameters<\n forge.pkcs7.PkcsSignedData[\"addSigner\"]\n>[0];\ntype ForgeAuthenticatedAttribute = NonNullable<\n ForgeSignerOptions[\"authenticatedAttributes\"]\n>[number];\ntype WsaaAuthenticatedAttribute = Omit<ForgeAuthenticatedAttribute, \"value\"> & {\n value?: string | Date;\n};\n\nexport function createWsaaAuthModule(\n options: CreateWsaaAuthModuleOptions\n): WsaaAuthModule {\n const cache = new Map<string, ArcaAuthCredentials>();\n const inFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n\n return {\n async login(service, authOptions = {}) {\n const sessionKey = buildWsaaSessionKey(options.config, service);\n const cacheKey = serializeWsaaSessionKey(sessionKey);\n const running = inFlight.get(cacheKey);\n if (running) {\n return running;\n }\n\n const loginPromise = (async () => {\n const reuse = await getReusableCredentials({\n config: options.config,\n cache,\n cacheKey,\n sessionKey,\n logger: options.logger,\n service,\n allowStore: !authOptions.forceRefresh,\n allowCache: !authOptions.forceRefresh,\n });\n if (reuse) {\n return reuse;\n }\n\n const refresh = () =>\n refreshWsaaCredentials({\n config: options.config,\n cache,\n cacheKey,\n sessionKey,\n logger: options.logger,\n service,\n forceRefresh: authOptions.forceRefresh === true,\n });\n\n if (options.config.wsaaSessionStore?.withLock) {\n return await withWsaaSessionStoreLock(\n options.config,\n sessionKey,\n service,\n refresh\n );\n }\n\n return await refresh();\n })();\n\n inFlight.set(cacheKey, loginPromise);\n\n try {\n return await loginPromise;\n } catch (error) {\n if (\n error instanceof ArcaSoapFaultError &&\n error.faultCode === \"ns1:coe.alreadyAuthenticated\"\n ) {\n const recovered = await getReusableCredentials({\n config: options.config,\n cache,\n cacheKey,\n sessionKey,\n logger: options.logger,\n service,\n allowStore: true,\n allowCache: true,\n });\n if (recovered) {\n options.logger?.warn(\n \"Recovered WSAA coe.alreadyAuthenticated fault\",\n {\n service,\n faultCode: error.faultCode,\n }\n );\n return recovered;\n }\n\n if (!options.config.wsaaSessionStore) {\n throw new ArcaConfigurationError(\n \"WSAA login failed because another process likely owns a valid TA. Configure a durable wsaaSessionStore for multi-process or serverless deployments.\",\n { cause: error }\n );\n }\n }\n\n if (error instanceof ArcaSoapFaultError) {\n options.logger?.error(\"WSAA SOAP fault response\", {\n service,\n operation: \"loginCms\",\n url: ARCA_WSAA_CONFIG.endpoint[options.config.environment],\n faultCode: error.faultCode,\n error,\n });\n }\n\n throw error;\n } finally {\n inFlight.delete(cacheKey);\n }\n },\n };\n}\n\nasync function requestCredentials(\n config: ArcaClientConfig,\n service: ArcaWsaaServiceId,\n options?: {\n logger?: ArcaLogger;\n }\n): Promise<ArcaAuthCredentials> {\n const loginTicketRequestXml = buildLoginTicketRequest(service);\n const signedCms = signLoginTicketRequest(loginTicketRequestXml, {\n certificatePem: config.certificatePem,\n privateKeyPem: config.privateKeyPem,\n });\n\n const requestXml = buildSoapEnvelope(\n ARCA_WSAA_CONFIG.soapVersion,\n \"loginCms\",\n ARCA_WSAA_CONFIG.namespace,\n { in0: signedCms }\n );\n\n const url = ARCA_WSAA_CONFIG.endpoint[config.environment];\n const response = await postXmlWithMetadata({\n url: ARCA_WSAA_CONFIG.endpoint[config.environment],\n body: requestXml,\n contentType: 'text/xml; charset=\"utf-8\"',\n soapAction: ARCA_WSAA_CONFIG.soapActionBase,\n timeout: config.timeout,\n retries: config.retries,\n retryDelay: config.retryDelay,\n logger: options?.logger,\n service: \"wsaa\",\n operation: \"loginCms\",\n });\n const parseContext = {\n service: \"wsaa\" as const,\n operation: \"loginCms\",\n endpointUrl: url,\n statusCode: response.statusCode,\n contentType: response.contentType,\n responseBody: response.body,\n };\n\n const soapBody = parseSoapBody(response.body, parseContext);\n const [, responseBody] = getSingleBodyEntry<Record<string, unknown>>(\n soapBody,\n parseContext\n );\n const loginCmsReturn = responseBody.loginCmsReturn;\n\n if (typeof loginCmsReturn !== \"string\" || loginCmsReturn.trim().length < 1) {\n throw new ArcaTransportError(\n \"WSAA response did not include loginCmsReturn XML\"\n );\n }\n\n return parseLoginTicketResponse(loginCmsReturn);\n}\n\nfunction buildWsaaSessionKey(\n config: ArcaClientConfig,\n service: ArcaWsaaServiceId\n): ArcaWsaaSessionKey {\n return {\n environment: config.environment,\n service,\n certificateFingerprint: getCertificateFingerprint(config),\n };\n}\n\nfunction getCertificateFingerprint(config: ArcaClientConfig): string {\n return createHash(\"sha256\").update(config.certificatePem).digest(\"hex\");\n}\n\nfunction getCachedCredentials(\n cache: Map<string, ArcaAuthCredentials>,\n cacheKey: string\n): ArcaAuthCredentials | null {\n const localCached = cache.get(cacheKey);\n if (localCached && isWsaaCredentialValid(localCached)) {\n return localCached;\n }\n\n return null;\n}\n\nasync function getReusableCredentials(options: {\n config: ArcaClientConfig;\n cache: Map<string, ArcaAuthCredentials>;\n cacheKey: string;\n sessionKey: ArcaWsaaSessionKey;\n logger?: ArcaLogger;\n service: ArcaWsaaServiceId;\n allowStore: boolean;\n allowCache: boolean;\n}): Promise<ArcaAuthCredentials | null> {\n if (options.allowCache) {\n const cached = getCachedCredentials(options.cache, options.cacheKey);\n if (cached) {\n options.logger?.debug(\"Attempting WSAA login\", {\n service: options.service,\n source: \"cached\",\n });\n return cached;\n }\n }\n\n if (!(options.allowStore && options.config.wsaaSessionStore)) {\n return null;\n }\n\n const stored = await getStoredCredentials(\n options.config,\n options.sessionKey,\n options.service\n );\n if (!stored) {\n return null;\n }\n\n options.cache.set(options.cacheKey, stored);\n options.logger?.debug(\"Attempting WSAA login\", {\n service: options.service,\n source: \"store\",\n });\n return stored;\n}\n\nasync function refreshWsaaCredentials(options: {\n config: ArcaClientConfig;\n cache: Map<string, ArcaAuthCredentials>;\n cacheKey: string;\n sessionKey: ArcaWsaaSessionKey;\n logger?: ArcaLogger;\n service: ArcaWsaaServiceId;\n forceRefresh: boolean;\n}): Promise<ArcaAuthCredentials> {\n if (!options.forceRefresh) {\n const reuse = await getReusableCredentials({\n config: options.config,\n cache: options.cache,\n cacheKey: options.cacheKey,\n sessionKey: options.sessionKey,\n logger: options.logger,\n service: options.service,\n allowStore: true,\n allowCache: true,\n });\n if (reuse) {\n return reuse;\n }\n }\n\n options.logger?.debug(\"Attempting WSAA login\", {\n service: options.service,\n source: \"fresh\",\n });\n\n const credentials = await requestCredentials(\n options.config,\n options.service,\n {\n logger: options.logger,\n }\n );\n options.logger?.info(\"WSAA login succeeded\", {\n service: options.service,\n expiresAt: credentials.expiresAt,\n });\n options.cache.set(options.cacheKey, credentials);\n await setStoredCredentials(options.config, options.sessionKey, credentials);\n return credentials;\n}\n\nasync function getStoredCredentials(\n config: ArcaClientConfig,\n key: ArcaWsaaSessionKey,\n service: ArcaWsaaServiceId\n): Promise<ArcaAuthCredentials | null> {\n if (!config.wsaaSessionStore) {\n return null;\n }\n\n try {\n const credentials = await config.wsaaSessionStore.get(key);\n if (!(credentials && isWsaaCredentialValid(credentials))) {\n return null;\n }\n\n return credentials;\n } catch (error) {\n throw new ArcaConfigurationError(\n `WSAA session store get failed for service ${service}`,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n}\n\nasync function setStoredCredentials(\n config: ArcaClientConfig,\n key: ArcaWsaaSessionKey,\n credentials: ArcaAuthCredentials\n): Promise<void> {\n if (!config.wsaaSessionStore) {\n return;\n }\n\n try {\n await config.wsaaSessionStore.set(key, credentials);\n } catch (error) {\n throw new ArcaConfigurationError(\n `WSAA session store set failed for service ${key.service}`,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n}\n\nasync function withWsaaSessionStoreLock<T>(\n config: ArcaClientConfig,\n key: ArcaWsaaSessionKey,\n service: ArcaWsaaServiceId,\n fn: () => Promise<T>\n): Promise<T> {\n const store = config.wsaaSessionStore;\n if (!store?.withLock) {\n return await fn();\n }\n\n let entered = false;\n try {\n return await store.withLock(key, async () => {\n entered = true;\n return await fn();\n });\n } catch (error) {\n if (entered) {\n throw error;\n }\n\n if (error instanceof ArcaConfigurationError) {\n throw error;\n }\n\n throw new ArcaConfigurationError(\n `WSAA session store lock failed for service ${service}`,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n}\n\nfunction buildLoginTicketRequest(service: ArcaWsaaServiceId): string {\n const uniqueId = Math.floor(Date.now() / 1000);\n const generationTime = new Date(Date.now() - 5 * 60_000)\n .toISOString()\n .replace(\".000Z\", \"Z\");\n const expirationTime = new Date(Date.now() + 5 * 60_000)\n .toISOString()\n .replace(\".000Z\", \"Z\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<loginTicketRequest version=\"1.0\">\n <header>\n <uniqueId>${uniqueId}</uniqueId>\n <generationTime>${generationTime}</generationTime>\n <expirationTime>${expirationTime}</expirationTime>\n </header>\n <service>${service}</service>\n</loginTicketRequest>`;\n}\n\nfunction signLoginTicketRequest(\n loginTicketRequestXml: string,\n options: Pick<ArcaClientConfig, \"certificatePem\" | \"privateKeyPem\">\n): string {\n const certificate = forge.pki.certificateFromPem(options.certificatePem);\n const privateKey = forge.pki.privateKeyFromPem(options.privateKeyPem);\n const signedData = forge.pkcs7.createSignedData();\n\n signedData.content = forge.util.createBuffer(loginTicketRequestXml, \"utf8\");\n signedData.addCertificate(certificate);\n const authenticatedAttributes: WsaaAuthenticatedAttribute[] = [\n {\n type: String(forge.pki.oids.contentType),\n value: String(forge.pki.oids.data),\n },\n {\n type: String(forge.pki.oids.messageDigest),\n },\n {\n type: String(forge.pki.oids.signingTime),\n value: new Date(),\n },\n ];\n\n const signerOptions: ForgeSignerOptions = {\n key: privateKey,\n certificate,\n digestAlgorithm: String(forge.pki.oids.sha1),\n authenticatedAttributes:\n authenticatedAttributes as unknown as ForgeSignerOptions[\"authenticatedAttributes\"],\n };\n\n signedData.addSigner(signerOptions);\n signedData.sign();\n\n const der = forge.asn1.toDer(signedData.toAsn1()).getBytes();\n return Buffer.from(der, \"binary\").toString(\"base64\");\n}\n\nfunction parseLoginTicketResponse(xml: string): ArcaAuthCredentials {\n const parsed = parseXmlDocument<Record<string, unknown>>(xml);\n const response =\n (parsed.loginTicketResponse as Record<string, unknown> | undefined) ??\n parsed;\n const header = response.header as Record<string, unknown> | undefined;\n const credentials = response.credentials as\n | Record<string, unknown>\n | undefined;\n const token = credentials?.token;\n const sign = credentials?.sign;\n const expiresAt = header?.expirationTime;\n\n if (\n typeof token !== \"string\" ||\n typeof sign !== \"string\" ||\n typeof expiresAt !== \"string\"\n ) {\n throw new ArcaTransportError(\n \"Invalid WSAA login ticket response structure\"\n );\n }\n\n return {\n token,\n sign,\n expiresAt,\n };\n}\n","import type {\n ArcaAuthCredentials,\n ArcaWsaaSessionKey,\n ArcaWsaaSessionStore,\n} from \"../internal/types\";\n\nconst CREDENTIAL_EXPIRY_SAFETY_MARGIN_MS = 60_000;\n\nexport function createMemoryWsaaSessionStore(): ArcaWsaaSessionStore {\n const sessions = new Map<string, ArcaAuthCredentials>();\n const locks = new Map<string, Promise<void>>();\n\n return {\n get(key) {\n const credentials = sessions.get(serializeWsaaSessionKey(key));\n if (!(credentials && isWsaaCredentialValid(credentials))) {\n return Promise.resolve(null);\n }\n\n return Promise.resolve({ ...credentials });\n },\n set(key, credentials) {\n sessions.set(serializeWsaaSessionKey(key), { ...credentials });\n return Promise.resolve();\n },\n delete(key) {\n sessions.delete(serializeWsaaSessionKey(key));\n return Promise.resolve();\n },\n async withLock(key, fn) {\n const lockKey = serializeWsaaSessionKey(key);\n const previous = locks.get(lockKey) ?? Promise.resolve();\n let release: () => void = () => undefined;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.catch(() => undefined).then(() => current);\n locks.set(lockKey, queued);\n\n await previous.catch(() => undefined);\n\n try {\n return await fn();\n } finally {\n release();\n if (locks.get(lockKey) === queued) {\n locks.delete(lockKey);\n }\n }\n },\n };\n}\n\nexport function serializeWsaaSessionKey(key: ArcaWsaaSessionKey): string {\n return [key.environment, key.service, key.certificateFingerprint].join(\":\");\n}\n\nexport function isWsaaCredentialValid(\n credentials: ArcaAuthCredentials\n): boolean {\n return (\n new Date(credentials.expiresAt).getTime() - Date.now() >\n CREDENTIAL_EXPIRY_SAFETY_MARGIN_MS\n );\n}\n","import { assertArcaClientConfig, normalizeArcaClientConfig } from \"./config\";\nimport { createArcaLogger } from \"./internal/logger\";\nimport type { ArcaClientConfig } from \"./internal/types\";\nimport { createPadronService, type PadronService } from \"./services/padron\";\nimport { createWsfeService, type WsfeService } from \"./services/wsfe\";\nimport { createWsmtxcaService, type WsmtxcaService } from \"./services/wsmtxca\";\nimport { createSoapTransport } from \"./soap\";\nimport { createWsaaAuthModule } from \"./wsaa\";\n\n/** Fully wired ARCA client with access to all service modules. */\nexport type ArcaClient = {\n config: ArcaClientConfig;\n wsfe: WsfeService;\n wsmtxca: WsmtxcaService;\n padron: PadronService;\n};\n\n/**\n * Creates an ARCA client from the given configuration.\n * Validates the config, wires WSAA authentication and SOAP transport,\n * and returns an object with `.wsfe`, `.wsmtxca`, and `.padron` service modules.\n *\n * @throws {ArcaConfigurationError} When the config is missing or invalid.\n */\nexport function createArcaClient(config: ArcaClientConfig): ArcaClient {\n assertArcaClientConfig(config);\n const normalizedConfig = normalizeArcaClientConfig(config);\n const logger = createArcaLogger(normalizedConfig.logger);\n\n const auth = createWsaaAuthModule({ config: normalizedConfig, logger });\n const soap = createSoapTransport({ config: normalizedConfig, logger });\n\n return {\n config: normalizedConfig,\n wsfe: createWsfeService({ config: normalizedConfig, auth, soap }),\n wsmtxca: createWsmtxcaService({ config: normalizedConfig, auth, soap }),\n padron: createPadronService({ config: normalizedConfig, auth, soap }),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/types.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.mjs.map
|