facturas 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/internal/logger.ts","../src/services/wsfe-derive.ts","../src/services/wsfe-identity.ts","../src/services/vouchers.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 { 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] as const;\nconst ENCRYPTED_PRIVATE_KEY_PEM_PREFIX =\n \"-----BEGIN ENCRYPTED PRIVATE KEY-----\";\nconst LEGACY_ENCRYPTED_RSA_PRIVATE_KEY_PATTERN =\n /^-----BEGIN RSA PRIVATE KEY-----[\\s\\S]*^Proc-Type:\\s*4,\\s*ENCRYPTED\\s*$/m;\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 (\n normalized.privateKeyPem.startsWith(ENCRYPTED_PRIVATE_KEY_PEM_PREFIX) ||\n LEGACY_ENCRYPTED_RSA_PRIVATE_KEY_PATTERN.test(normalized.privateKeyPem)\n ) {\n throw new ArcaConfigurationError(\n \"Encrypted private keys are not supported. Provide an unencrypted PKCS#8 or RSA private key PEM.\"\n );\n }\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 {\n ARCA_CURRENCY_IDS,\n ARCA_DOCUMENT_TYPES,\n ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS,\n ARCA_INVOICE_CLASS_BY_ISSUER,\n ARCA_ISSUER_CONDITION_IDS,\n ARCA_RECEIVER_CONDITION_IDS,\n ARCA_VOUCHER_TYPES,\n type ReceiverCondition,\n type VoucherClass,\n} from \"../constants\";\nimport { ArcaError, ArcaInputError } from \"../errors\";\nimport { serializeArcaExchangeRate } from \"../internal/decimal\";\nimport {\n normalizeWsfeDateInput,\n normalizeWsfeVoucherInput,\n type WsfeDateInput,\n type WsfeVoucherInput,\n} from \"./wsfe\";\nimport {\n type AmountItem,\n calculateWsfeAmounts,\n type IssueAmounts,\n type VatItem,\n} from \"./wsfe-amounts\";\n\nexport type Receiver =\n | {\n condition: \"consumidor_final\";\n cuit?: number | string;\n dni?: number | string;\n }\n | {\n condition: Exclude<ReceiverCondition, \"consumidor_final\">;\n cuit: number | string;\n dni?: never;\n };\nexport type IssueCommon = {\n salesPoint: number;\n to: Receiver;\n total?: number;\n date?: WsfeDateInput;\n currency?: \"ARS\" | \"USD\";\n exchangeRate?: string;\n service?: { from: WsfeDateInput; to: WsfeDateInput; dueDate: WsfeDateInput };\n};\nexport type IssueInput = IssueCommon &\n (\n | { issuer: \"responsable_inscripto\"; items: readonly VatItem[] }\n | {\n issuer: \"monotributo\" | \"exento\" | \"no_alcanzado\";\n items: readonly AmountItem[];\n }\n );\n\nconst INVOICE_TYPES = {\n A: ARCA_VOUCHER_TYPES.FACTURA_A,\n B: ARCA_VOUCHER_TYPES.FACTURA_B,\n C: ARCA_VOUCHER_TYPES.FACTURA_C,\n};\n\n/** No I/O: all caller validation finishes before the next-number read. */\nexport function deriveWsfeInvoice(\n input: IssueInput,\n now = new Date()\n): {\n data: WsfeVoucherInput;\n voucherClass: VoucherClass;\n amounts: IssueAmounts;\n} {\n assertIssueObject(input, \"input\");\n assertIssueKeys(\n input,\n [\n \"issuer\",\n \"items\",\n \"salesPoint\",\n \"to\",\n \"total\",\n \"date\",\n \"currency\",\n \"exchangeRate\",\n \"service\",\n ],\n \"input\"\n );\n if (\n typeof input.issuer !== \"string\" ||\n !Object.hasOwn(ARCA_ISSUER_CONDITION_IDS, input.issuer)\n ) {\n invalid(\n \"issuer\",\n \"responsable_inscripto, monotributo, exento, or no_alcanzado\"\n );\n }\n if (\n !Number.isSafeInteger(input.salesPoint) ||\n input.salesPoint < 1 ||\n input.salesPoint > 99_999\n ) {\n invalid(\"salesPoint\", \"an integer from 1 through 99999\");\n }\n const receiver = deriveReceiver(input.to);\n const voucherClass =\n ARCA_INVOICE_CLASS_BY_ISSUER[input.issuer][input.to.condition];\n const { data: amountsData, amounts } = calculateWsfeAmounts(input);\n const currency = deriveCurrency(input);\n if (\n input.to.condition === \"consumidor_final\" &&\n receiver.documentType === ARCA_DOCUMENT_TYPES.CONSUMIDOR_FINAL\n ) {\n const [whole, fraction = \"\"] = currency.exchangeRate.split(\".\");\n const rate = BigInt(whole) * 1_000_000n + BigInt(fraction.padEnd(6, \"0\"));\n // Compare exact peso equivalents; rounding below the threshold must not hide it.\n if (\n BigInt(amounts.sentTotal) * rate >=\n ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS * 1_000_000n\n ) {\n throw new ArcaInputError(\n \"The final consumer must be identified for this amount.\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"to\",\n expected:\n \"cuit or dni for operations at or above ARS 10,000,000 (RG 5866)\",\n }\n );\n }\n }\n const voucherDate = normalizeWsfeDateInput(\n input.date === undefined ? buenosAiresDate(now) : input.date,\n \"date\"\n ) as WsfeDateInput;\n const data: WsfeVoucherInput = {\n salesPoint: input.salesPoint,\n voucherType: INVOICE_TYPES[voucherClass],\n voucherDate,\n ...receiver,\n ...currency,\n ...amountsData,\n ...deriveService(input.service, voucherDate),\n };\n try {\n normalizeWsfeVoucherInput(data);\n } catch (cause) {\n throw new ArcaError(\n \"The derived invoice failed exact WSFE validation. This is an SDK invariant failure.\",\n \"ARCA_ISSUE_INVARIANT\",\n { cause }\n );\n }\n return { data, voucherClass, amounts };\n}\n\nfunction deriveReceiver(to: Receiver) {\n assertIssueObject(to, \"to\");\n assertIssueKeys(to, [\"condition\", \"cuit\", \"dni\"], \"to\");\n if (\n typeof to.condition !== \"string\" ||\n !Object.hasOwn(ARCA_RECEIVER_CONDITION_IDS, to.condition)\n ) {\n invalid(\"to.condition\", \"one of the five supported receiver conditions\");\n }\n if (to.cuit !== undefined && to.dni !== undefined) {\n invalid(\"to\", \"either cuit or dni, never both\");\n }\n if (to.condition !== \"consumidor_final\" && to.cuit === undefined) {\n throw new ArcaInputError(\n \"to.cuit is required for this receiver (WSFE 10063 for class A).\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"to.cuit\",\n expected: \"an 11-digit CUIT\",\n }\n );\n }\n const documentType =\n to.cuit === undefined\n ? to.dni === undefined\n ? ARCA_DOCUMENT_TYPES.CONSUMIDOR_FINAL\n : ARCA_DOCUMENT_TYPES.DNI\n : ARCA_DOCUMENT_TYPES.CUIT;\n // WSFE DocNro is Long(11); do not impose an undocumented DNI-only width.\n const documentNumber =\n to.cuit === undefined\n ? to.dni === undefined\n ? 0\n : issueDocumentNumber(to.dni, \"to.dni\", 1, 11)\n : issueDocumentNumber(to.cuit, \"to.cuit\", 11, 11);\n return {\n documentType,\n documentNumber,\n receiverVatConditionId: ARCA_RECEIVER_CONDITION_IDS[to.condition],\n };\n}\n\nexport function issueDocumentNumber(\n value: unknown,\n field: string,\n min: number,\n max: number\n): number {\n if (typeof value !== \"number\" && typeof value !== \"string\") {\n invalid(field, `a positive document number with ${min} to ${max} digits`);\n }\n const text = String(value);\n if (\n !/^\\d+$/.test(text) ||\n text.length < min ||\n text.length > max ||\n !Number.isSafeInteger(Number(text)) ||\n Number(text) <= 0\n ) {\n invalid(field, `a positive document number with ${min} to ${max} digits`);\n }\n return Number(text);\n}\n\nfunction deriveCurrency(input: IssueCommon) {\n const currency = input.currency === undefined ? \"ARS\" : input.currency;\n if (currency !== \"ARS\" && currency !== \"USD\") {\n invalid(\"currency\", \"ARS or USD\");\n }\n if (\n input.exchangeRate !== undefined &&\n typeof input.exchangeRate !== \"string\"\n ) {\n invalid(\"exchangeRate\", \"a decimal string\");\n }\n if (currency === \"USD\" && input.exchangeRate === undefined) {\n throw new ArcaInputError(\"exchangeRate is required for USD.\", {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"exchangeRate\",\n expected: \"a positive decimal string\",\n });\n }\n const exchangeRate = serializeArcaExchangeRate(\n input.exchangeRate ?? \"1\",\n \"exchangeRate\"\n );\n if (currency === \"ARS\" && exchangeRate !== \"1\") {\n throw new ArcaInputError(\"exchangeRate must be 1 for ARS.\", {\n code: \"ARCA_INPUT_INVALID_EXCHANGE_RATE\",\n field: \"exchangeRate\",\n expected: \"1 for ARS\",\n });\n }\n return { currencyId: ARCA_CURRENCY_IDS[currency], exchangeRate };\n}\n\nfunction deriveService(service: IssueCommon[\"service\"], date: WsfeDateInput) {\n if (service === undefined) {\n return { concept: 1 };\n }\n assertIssueObject(service, \"service\");\n assertIssueKeys(service, [\"from\", \"to\", \"dueDate\"], \"service\");\n for (const field of [\"from\", \"to\", \"dueDate\"] as const) {\n if (service[field] === undefined) {\n throw new ArcaInputError(`service.${field} is required.`, {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: `service.${field}`,\n expected: \"a calendar date\",\n });\n }\n }\n const serviceStartDate = normalizeWsfeDateInput(\n service.from,\n \"service.from\"\n ) as WsfeDateInput;\n const serviceEndDate = normalizeWsfeDateInput(\n service.to,\n \"service.to\"\n ) as WsfeDateInput;\n const paymentDueDate = normalizeWsfeDateInput(\n service.dueDate,\n \"service.dueDate\"\n ) as WsfeDateInput;\n if (serviceEndDate < serviceStartDate) {\n invalid(\"service.to\", \"a date on or after service.from\");\n }\n if (paymentDueDate < date) {\n invalid(\"service.dueDate\", \"a date on or after date\");\n }\n return { concept: 2, serviceStartDate, serviceEndDate, paymentDueDate };\n}\n\nfunction buenosAiresDate(now: Date): WsfeDateInput {\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: \"America/Argentina/Buenos_Aires\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).formatToParts(now);\n return [\"year\", \"month\", \"day\"]\n .map((part) => parts.find((entry) => entry.type === part)?.value)\n .join(\"\") as WsfeDateInput;\n}\n\nexport function assertIssueObject(\n value: unknown,\n field: string\n): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n invalid(field, \"an object\");\n }\n}\nexport function assertIssueKeys(\n value: object,\n keys: readonly string[],\n prefix: string\n): void {\n for (const key of Object.keys(value)) {\n if (!keys.includes(key)) {\n const field = prefix === \"input\" ? key : `${prefix}.${key}`;\n throw new ArcaInputError(\n `${field} is not supported by vouchers.issue().`,\n {\n code: \"ARCA_INPUT_RESERVED_FIELD\",\n field,\n expected:\n \"a supported facade field; use the exact API for other fiscal fields\",\n }\n );\n }\n }\n}\nfunction invalid(field: string, expected: string): never {\n throw new ArcaInputError(`${field} must be ${expected}.`, {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field,\n expected,\n });\n}\n","import {\n normalizeArcaAmountToMinorUnits,\n serializeArcaExchangeRate,\n} from \"../internal/decimal\";\nimport type { WsfeVatRate, WsfeVoucherInfo, WsfeVoucherInput } from \"./wsfe\";\nimport { normalizeWsfeDateInput } from \"./wsfe\";\n\nexport type VoucherCoordinates = {\n salesPoint: number;\n voucherType: number;\n number: number;\n};\n\n/** Raw-free consultation evidence. Missing provider fields remain absent. */\nexport type VoucherSummary = {\n number: number;\n salesPoint?: number;\n voucherType?: number;\n date?: string;\n concept?: number;\n documentType?: number;\n documentNumber?: string;\n receiverVatConditionId?: number;\n currencyId?: string;\n exchangeRate?: number;\n totalAmount?: number;\n netAmount?: number;\n vatAmount?: number;\n exemptAmount?: number;\n nonTaxableAmount?: number;\n taxAmount?: number;\n vatRates?: { id: number; baseAmount: number; amount: number }[];\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n result?: string;\n cae?: string;\n caeExpiry?: string;\n};\n\nexport type WsfeIdentityMatch =\n | { matches: true }\n | { matches: false; evidence: \"conflict\" | \"incomplete\"; reason: string };\n\n/**\n * Compares the invoice subset supported by vouchers.issue(). This proves\n * consistency, not authorship; callers must serialize writers per taxpayer,\n * sales point and voucher type. Unsupported exact-API extensions are incomplete.\n */\nexport function matchWsfeVoucherIdentity(\n sent: WsfeVoucherInput,\n number: number,\n found: WsfeVoucherInfo\n): WsfeIdentityMatch {\n let missing: string | undefined;\n const compare = (\n field: string,\n expected: unknown,\n actual: unknown,\n normalize?: (value: never) => unknown\n ): WsfeIdentityMatch | undefined => {\n if (actual === undefined || actual === null || expected === undefined) {\n missing ??= field;\n return undefined;\n }\n try {\n const left = normalize ? normalize(expected as never) : expected;\n const right = normalize ? normalize(actual as never) : actual;\n if (left !== right) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `${field} differs from the sent input`,\n };\n }\n } catch {\n missing ??= field;\n }\n return undefined;\n };\n const checks: [string, unknown, unknown, ((value: never) => unknown)?][] = [\n [\"voucherType\", sent.voucherType, found.voucherType],\n [\"salesPoint\", sent.salesPoint, found.salesPoint],\n [\"number\", number, found.voucherNumber, normalizeVoucherNumber],\n [\n \"date\",\n sent.voucherDate,\n found.voucherDate,\n (value) => normalizeWsfeDateInput(value, \"date\"),\n ],\n [\"concept\", sent.concept, found.concept],\n [\"documentType\", sent.documentType, found.documentType],\n [\n \"documentNumber\",\n sent.documentNumber,\n found.documentNumber,\n normalizeDocument,\n ],\n [\n \"receiverVatConditionId\",\n sent.receiverVatConditionId,\n found.receiverVatConditionId,\n ],\n [\"currencyId\", sent.currencyId, found.currencyId],\n [\n \"exchangeRate\",\n sent.exchangeRate ?? (sent.currencyId === \"PES\" ? 1 : undefined),\n found.exchangeRate,\n (value) => serializeArcaExchangeRate(value, \"exchangeRate\"),\n ],\n ];\n for (const field of [\n \"totalAmount\",\n \"netAmount\",\n \"vatAmount\",\n \"exemptAmount\",\n \"nonTaxableAmount\",\n \"taxAmount\",\n ] as const) {\n checks.push([\n field,\n sent[field],\n found[field],\n (value) => normalizeArcaAmountToMinorUnits(value, field),\n ]);\n }\n if (sent.concept === 2) {\n for (const field of [\n \"serviceStartDate\",\n \"serviceEndDate\",\n \"paymentDueDate\",\n ] as const) {\n checks.push([\n field,\n sent[field],\n found[field],\n (value) => normalizeWsfeDateInput(value, field),\n ]);\n }\n }\n for (const check of checks) {\n const result = compare(...check);\n if (result) {\n return result;\n }\n }\n const rates = compareVatRates(sent.vatRates ?? [], found.vatRates);\n if (!rates.matches) {\n if (rates.evidence === \"conflict\") {\n return rates;\n }\n missing ??= rates.reason;\n }\n missing ??= incompleteAuthorization(sent, found);\n return missing\n ? {\n matches: false,\n evidence: \"incomplete\",\n reason: `Cannot verify ${missing}`,\n }\n : { matches: true };\n}\n\nfunction incompleteAuthorization(\n sent: WsfeVoucherInput,\n found: WsfeVoucherInfo\n): string | undefined {\n let missing: string | undefined;\n // These fields have no complete consultation identity contract in this facade.\n if (sent.concept !== 1 && sent.concept !== 2) {\n missing ??= \"unsupported concept\";\n }\n for (const field of [\n \"taxes\",\n \"associatedVouchers\",\n \"associatedPeriod\",\n \"optionalFields\",\n \"buyers\",\n \"activities\",\n \"sameCurrencyForeignCancellation\",\n ] as const) {\n const value = sent[field];\n if (value !== undefined && (!Array.isArray(value) || value.length > 0)) {\n missing ??= `unsupported exact field ${field}`;\n }\n }\n if (!(found.result === \"A\" || found.result === \"O\")) {\n missing ??= \"authorized result\";\n }\n if (!found.cae?.trim()) {\n missing ??= \"cae\";\n }\n if (!found.caeExpiry?.trim()) {\n missing ??= \"caeExpiry\";\n }\n return missing;\n}\n\nfunction normalizeVoucherNumber(value: number): number {\n // The exact lookup mapper maps missing/malformed numbers to 0 or NaN.\n // Neither is evidence that a different voucher occupies the attempted number.\n if (!Number.isSafeInteger(value) || value < 1 || value > 99_999_999) {\n throw new Error(\"Invalid voucher number\");\n }\n return value;\n}\n\nfunction normalizeDocument(value: string | number): bigint {\n const text = String(value);\n if (!/^\\d+$/.test(text)) {\n throw new Error(\"Invalid document number\");\n }\n return BigInt(text);\n}\n\nfunction compareVatRates(\n expected: WsfeVatRate[],\n actual: WsfeVatRate[] | undefined\n): WsfeIdentityMatch {\n if (actual === undefined) {\n return expected.length === 0\n ? { matches: true }\n : { matches: false, evidence: \"incomplete\", reason: \"vatRates\" };\n }\n if (\n actual.length !== expected.length ||\n new Set(actual.map((rate) => rate.id)).size !== actual.length\n ) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: \"vatRates ids differ from the sent input\",\n };\n }\n for (const rate of expected) {\n const found = actual.find((item) => item.id === rate.id);\n if (!found) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `vatRates id ${rate.id} differs from the sent input`,\n };\n }\n for (const field of [\"baseAmount\", \"amount\"] as const) {\n try {\n if (\n normalizeArcaAmountToMinorUnits(rate[field], field) !==\n normalizeArcaAmountToMinorUnits(found[field], field)\n ) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `vatRates[${rate.id}].${field} differs from the sent input`,\n };\n }\n } catch {\n return {\n matches: false,\n evidence: \"incomplete\",\n reason: `vatRates[${rate.id}].${field}`,\n };\n }\n }\n }\n return { matches: true };\n}\n\nexport function toVoucherSummary(found: WsfeVoucherInfo): VoucherSummary {\n const summary: VoucherSummary = { number: found.voucherNumber };\n for (const field of [\n \"salesPoint\",\n \"voucherType\",\n \"concept\",\n \"documentType\",\n \"documentNumber\",\n \"receiverVatConditionId\",\n \"currencyId\",\n \"exchangeRate\",\n \"totalAmount\",\n \"netAmount\",\n \"vatAmount\",\n \"exemptAmount\",\n \"nonTaxableAmount\",\n \"taxAmount\",\n \"serviceStartDate\",\n \"serviceEndDate\",\n \"paymentDueDate\",\n \"result\",\n \"cae\",\n \"caeExpiry\",\n ] as const) {\n if (found[field] !== undefined) {\n Object.assign(summary, { [field]: found[field] });\n }\n }\n if (found.voucherDate !== undefined) {\n summary.date = found.voucherDate;\n }\n if (found.vatRates !== undefined) {\n summary.vatRates = found.vatRates.map(({ id, baseAmount, amount }) => ({\n id,\n baseAmount,\n amount,\n }));\n }\n return summary;\n}\n","import {\n ArcaInputError,\n ArcaServiceError,\n toArcaSafeErrorMetadata,\n} from \"../errors\";\nimport type { ArcaAuthorizationOutcome } from \"./fiscal-evidence\";\nimport type {\n IssuedVoucher,\n IssueOptions,\n IssueOutcome,\n} from \"./vouchers-types\";\nimport type { WsfeService, WsfeVoucherInput } from \"./wsfe\";\nimport {\n assertIssueKeys,\n assertIssueObject,\n deriveWsfeInvoice,\n type IssueInput,\n issueDocumentNumber,\n} from \"./wsfe-derive\";\nimport {\n matchWsfeVoucherIdentity,\n toVoucherSummary,\n type VoucherCoordinates,\n} from \"./wsfe-identity\";\n\nexport type VouchersService = {\n /**\n * Single-writer contract: serialize calls per (representedTaxId, salesPoint,\n * voucherType), including concurrent promises in one process. The SDK does not\n * coordinate writers; uncoordinated calls collide on ARCA 10016. Servers and\n * queues must persist attempts and use wsfe.authorizeVoucherOutcome() directly.\n * See the \"does not serialize concurrent calls\" test in services/vouchers.test.ts.\n *\n * One next-number read, one authorization attempt (zero transport retries), and\n * at most one identity-matched lookup after indeterminate. Never resubmits.\n * Local validation and next-number read failures throw before authorization.\n */\n issue<O extends IssueOptions = { include?: never }>(\n input: IssueInput,\n options?: O\n ): Promise<IssueOutcome<O>>;\n};\n\ntype IssueWsfeService = Pick<\n WsfeService,\n \"getNextVoucherNumber\" | \"authorizeVoucherOutcome\" | \"lookupVoucher\"\n>;\nconst SERIALIZATION_NOTICE =\n \"Serialize calls per (representedTaxId, salesPoint, voucherType). The SDK does not coordinate writers; uncoordinated calls collide on 10016. Servers and queues must persist attempts and use wsfe.authorizeVoucherOutcome().\";\n\nexport function createVouchersService(wsfe: IssueWsfeService): VouchersService {\n return {\n issue: async <O extends IssueOptions = { include?: never }>(\n input: IssueInput,\n options?: O\n ): Promise<IssueOutcome<O>> => {\n const result = await issueInvoice(\n wsfe,\n input,\n options === undefined ? {} : options\n );\n // issueInvoice conditionally adds the fields specified by O at runtime.\n return result as IssueOutcome<O>;\n },\n };\n}\n\nasync function issueInvoice(\n wsfe: IssueWsfeService,\n input: IssueInput,\n options: IssueOptions\n): Promise<IssueOutcome<IssueOptions>> {\n validateOptions(options);\n const { data, voucherClass, amounts } = deriveWsfeInvoice(input);\n const auth = {\n representedTaxId: options.representedTaxId,\n forceRefresh: options.forceRefresh,\n };\n const includeRaw = options.include?.raw === true;\n const includeExact = options.include?.exactInput === true;\n const number = await wsfe.getNextVoucherNumber({\n ...auth,\n salesPoint: data.salesPoint,\n voucherType: data.voucherType,\n });\n if (!Number.isSafeInteger(number) || number < 1 || number > 99_999_999) {\n throw new ArcaServiceError(\n \"WSFE returned an invalid next voucher number.\",\n {\n service: \"wsfe\",\n operation: \"FECompUltimoAutorizado\",\n }\n );\n }\n const attempted = {\n salesPoint: data.salesPoint,\n voucherType: data.voucherType,\n number,\n };\n const exact = includeExact ? { sent: data } : {};\n // This is the only authorization call, including all transport/recovery branches.\n const authorization = await wsfe.authorizeVoucherOutcome({\n ...auth,\n data,\n voucherNumber: number,\n });\n const voucher = (cae: string, caeExpiry: string): IssuedVoucher => ({\n ...attempted,\n voucherClass,\n date: data.voucherDate,\n cae,\n caeExpiry,\n amounts,\n });\n if (\n authorization.kind === \"authorized\" &&\n authorization.caeExpiry &&\n authorization.voucherNumber === number\n ) {\n return {\n kind: \"authorized\",\n recoveredByMatch: false,\n voucher: voucher(authorization.cae, authorization.caeExpiry),\n authorization: projectEvidence(authorization, includeRaw),\n ...exact,\n };\n }\n if (authorization.kind === \"rejected\") {\n return {\n kind: \"rejected\",\n attempted,\n issues: [...authorization.errors, ...authorization.observations].map(\n projectIssue\n ),\n authorization: projectEvidence(authorization, includeRaw),\n };\n }\n // The exact outcome type permits an absent expiry. Keep that uncertainty visible.\n const uncertain =\n authorization.kind === \"indeterminate\"\n ? authorization\n : {\n ...authorization,\n kind: \"indeterminate\" as const,\n reason:\n authorization.voucherNumber === number\n ? (\"incomplete_response\" as const)\n : (\"contradictory_response\" as const),\n };\n const attempt = projectEvidence(uncertain, includeRaw);\n return recoverInvoice({\n wsfe,\n auth,\n data,\n attempted,\n attempt,\n includeRaw,\n exact,\n voucher,\n });\n}\n\ntype RecoveryInput = {\n wsfe: IssueWsfeService;\n auth: Pick<IssueOptions, \"representedTaxId\" | \"forceRefresh\">;\n data: WsfeVoucherInput;\n attempted: VoucherCoordinates;\n attempt: Omit<\n Extract<ArcaAuthorizationOutcome<\"wsfe\">, { kind: \"indeterminate\" }>,\n \"raw\"\n > & { raw?: Record<string, unknown> };\n includeRaw: boolean;\n exact: { sent?: WsfeVoucherInput };\n voucher: (cae: string, caeExpiry: string) => IssuedVoucher;\n};\nasync function recoverInvoice({\n wsfe,\n auth,\n data,\n attempted,\n attempt,\n includeRaw,\n exact,\n voucher,\n}: RecoveryInput): Promise<IssueOutcome<IssueOptions>> {\n let lookup: Awaited<ReturnType<IssueWsfeService[\"lookupVoucher\"]>>;\n try {\n lookup = await wsfe.lookupVoucher({ ...auth, ...attempted });\n } catch (error) {\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"failed\", error: toArcaSafeErrorMetadata(error) },\n };\n }\n const raw = includeRaw ? { raw: lookup.raw } : {};\n if (lookup.kind === \"not_found\") {\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"not_found\", ...raw },\n };\n }\n const matched = matchWsfeVoucherIdentity(\n data,\n attempted.number,\n lookup.voucher\n );\n if (!matched.matches) {\n if (matched.evidence === \"conflict\") {\n return {\n kind: \"conflict\",\n attempted,\n attempt,\n found: { ...toVoucherSummary(lookup.voucher), ...raw },\n reason: `${matched.reason}. ${SERIALIZATION_NOTICE}`,\n };\n }\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"incomplete\", reason: matched.reason, ...raw },\n };\n }\n // The matcher requires both fields before declaring a complete match.\n return {\n kind: \"authorized\",\n recoveredByMatch: true,\n voucher: voucher(\n lookup.voucher.cae as string,\n lookup.voucher.caeExpiry as string\n ),\n attempt,\n lookup: { ...toVoucherSummary(lookup.voucher), ...raw },\n ...exact,\n };\n}\n\nfunction projectIssue(issue: ArcaAuthorizationOutcome[\"errors\"][number]) {\n return {\n service: issue.service,\n operation: issue.operation,\n source: issue.source,\n category: issue.category,\n message: issue.message,\n ...(issue.code === undefined ? {} : { code: issue.code }),\n ...(issue.resultLevel === undefined\n ? {}\n : { resultLevel: issue.resultLevel }),\n };\n}\nfunction projectEvidence<T extends ArcaAuthorizationOutcome<\"wsfe\">>(\n evidence: T,\n includeRaw: boolean\n): Omit<T, \"raw\"> & { raw?: Record<string, unknown> } {\n const base = {\n kind: evidence.kind,\n service: evidence.service,\n operation: evidence.operation,\n results: {\n ...(evidence.results.header === undefined\n ? {}\n : { header: evidence.results.header }),\n ...(evidence.results.detail === undefined\n ? {}\n : { detail: evidence.results.detail }),\n ...(evidence.results.operation === undefined\n ? {}\n : { operation: evidence.results.operation }),\n },\n errors: evidence.errors.map(projectIssue),\n observations: evidence.observations.map(projectIssue),\n ...(includeRaw && evidence.raw !== undefined ? { raw: evidence.raw } : {}),\n };\n const projected: Record<string, unknown> = { ...base };\n for (const field of [\n \"result\",\n \"resultLevel\",\n \"cae\",\n \"caeExpiry\",\n \"voucherNumber\",\n \"reason\",\n ] as const) {\n if (field in evidence && evidence[field as keyof T] !== undefined) {\n projected[field] = evidence[field as keyof T];\n }\n }\n if (evidence.kind === \"indeterminate\" && evidence.authentication) {\n const { code, reason, providerCode } = evidence.authentication;\n projected.authentication = {\n code,\n reason,\n ...(providerCode === undefined ? {} : { providerCode }),\n };\n }\n return projected as Omit<T, \"raw\"> & { raw?: Record<string, unknown> };\n}\n\nfunction validateOptions(options: IssueOptions) {\n assertIssueObject(options, \"options\");\n assertIssueKeys(\n options,\n [\"representedTaxId\", \"forceRefresh\", \"include\"],\n \"options\"\n );\n if (options.representedTaxId !== undefined) {\n issueDocumentNumber(\n options.representedTaxId,\n \"options.representedTaxId\",\n 11,\n 11\n );\n }\n if (\n options.forceRefresh !== undefined &&\n typeof options.forceRefresh !== \"boolean\"\n ) {\n throw new ArcaInputError(\"options.forceRefresh must be a boolean.\", {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field: \"options.forceRefresh\",\n });\n }\n if (options.include !== undefined) {\n assertIssueObject(options.include, \"options.include\");\n assertIssueKeys(options.include, [\"raw\", \"exactInput\"], \"options.include\");\n for (const field of [\"raw\", \"exactInput\"] as const) {\n if (\n options.include[field] !== undefined &&\n typeof options.include[field] !== \"boolean\"\n ) {\n throw new ArcaInputError(\n `options.include.${field} must be a boolean.`,\n {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field: `options.include.${field}`,\n }\n );\n }\n }\n }\n}\n","import https from \"node:https\";\nimport { ArcaTransportError } from \"../errors\";\nimport type { ArcaLogger } from \"./logger\";\nimport {\n createResponseBodyDiagnostic,\n createSafeErrorDiagnostic,\n} from \"./redaction\";\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 ...createSafeErrorDiagnostic(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 ...createSafeErrorDiagnostic(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(\"ARCA HTTP response stream failed\", {\n cause: error,\n statusCode: response.statusCode,\n ...createResponseBodyDiagnostic(getResponseBody()),\n })\n );\n });\n\n response.on(\"aborted\", () => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP response was aborted\", {\n statusCode: response.statusCode,\n ...createResponseBodyDiagnostic(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 ...createResponseBodyDiagnostic(responseBody),\n }\n )\n );\n });\n }\n );\n\n request.setTimeout(timeout, () => {\n const timeoutCause = new Error(\n `ARCA HTTP request timed out after ${timeout}ms`\n );\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP request timed out after ${timeout}ms`,\n { cause: timeoutCause }\n )\n );\n request.destroy(timeoutCause);\n });\n\n request.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP request failed\", {\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\";\nimport { createResponseBodyDiagnostic } from \"./redaction\";\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 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 );\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 );\n }\n\n return entries[0] as [string, T];\n}\n\nfunction createInvalidSoapResponseError(\n message: string,\n context: ArcaSoapParseContext,\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 ...createResponseBodyDiagnostic(\n responseBody,\n context.responseBodyPreviewLength\n ),\n });\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 });\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 { createSafeErrorDiagnostic } from \"../internal/redaction\";\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: request.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 ...createSafeErrorDiagnostic(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 ...createSafeErrorDiagnostic(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 { createSafeErrorDiagnostic } from \"../internal/redaction\";\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 ordinaryInFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n const forcedInFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n\n function trackLogin(\n target: Map<string, Promise<ArcaAuthCredentials>>,\n cacheKey: string,\n login: () => Promise<ArcaAuthCredentials>\n ): Promise<ArcaAuthCredentials> {\n const promise = login();\n target.set(cacheKey, promise);\n const cleanup = () => {\n if (target.get(cacheKey) === promise) {\n target.delete(cacheKey);\n }\n };\n promise.then(cleanup, cleanup);\n return promise;\n }\n\n async function requestOrReuseWsaaCredentials(\n service: ArcaWsaaServiceId,\n sessionKey: ArcaWsaaSessionKey,\n cacheKey: string,\n forceRefresh: boolean\n ): Promise<ArcaAuthCredentials> {\n const reuse = await getReusableCredentials({\n config: options.config,\n cache,\n cacheKey,\n sessionKey,\n logger: options.logger,\n service,\n allowStore: !forceRefresh,\n allowCache: !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,\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 async function performLogin(\n service: ArcaWsaaServiceId,\n sessionKey: ArcaWsaaSessionKey,\n cacheKey: string,\n forceRefresh: boolean\n ): Promise<ArcaAuthCredentials> {\n try {\n return await requestOrReuseWsaaCredentials(\n service,\n sessionKey,\n cacheKey,\n forceRefresh\n );\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 ...createSafeErrorDiagnostic(error),\n });\n }\n\n throw error;\n }\n }\n\n return {\n login(service, authOptions = {}) {\n const sessionKey = buildWsaaSessionKey(options.config, service);\n const cacheKey = serializeWsaaSessionKey(sessionKey);\n\n if (authOptions.forceRefresh) {\n const runningForced = forcedInFlight.get(cacheKey);\n if (runningForced) {\n return runningForced;\n }\n\n const runningOrdinary = ordinaryInFlight.get(cacheKey);\n return trackLogin(forcedInFlight, cacheKey, async () => {\n await runningOrdinary?.catch(() => undefined);\n return await performLogin(service, sessionKey, cacheKey, true);\n });\n }\n\n const runningOrdinary = ordinaryInFlight.get(cacheKey);\n if (runningOrdinary) {\n return runningOrdinary;\n }\n\n const runningForced = forcedInFlight.get(cacheKey);\n if (runningForced) {\n return runningForced;\n }\n\n return trackLogin(ordinaryInFlight, cacheKey, () =>\n performLogin(service, sessionKey, cacheKey, false)\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, ArcaEnvironment } from \"./internal/types\";\nimport { createPadronService, type PadronService } from \"./services/padron\";\nimport {\n createVouchersService,\n type VouchersService,\n} from \"./services/vouchers\";\nimport { createWsfeService, type WsfeService } from \"./services/wsfe\";\nimport { createWsmtxcaService, type WsmtxcaService } from \"./services/wsmtxca\";\nimport { createSoapTransport } from \"./soap\";\nimport { createWsaaAuthModule } from \"./wsaa\";\n\n/** Immutable, credential-free operational view of an ARCA client configuration. */\nexport type ArcaClientConfigView = Readonly<{\n taxId: string;\n environment: ArcaEnvironment;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n}>;\n\n/** Fully wired ARCA client with access to all service modules. */\nexport type ArcaClient = {\n readonly config: ArcaClientConfigView;\n wsfe: WsfeService;\n vouchers: VouchersService;\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 `.vouchers`, `.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 const publicConfig = Object.freeze({\n taxId: normalizedConfig.taxId,\n environment: normalizedConfig.environment,\n timeout: normalizedConfig.timeout,\n retries: normalizedConfig.retries,\n retryDelay: normalizedConfig.retryDelay,\n });\n\n const wsfe = createWsfeService({ config: normalizedConfig, auth, soap });\n return {\n config: publicConfig,\n wsfe,\n vouchers: createVouchersService(wsfe),\n wsmtxca: createWsmtxcaService({ config: normalizedConfig, auth, soap }),\n padron: createPadronService({ config: normalizedConfig, auth, soap }),\n };\n}\n"],"mappings":"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","names":["runningForced","runningOrdinary"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/internal/logger.ts","../src/store/types.ts","../src/services/wsfe-derive.ts","../src/services/wsfe-cancel.ts","../src/services/wsfe-identity.ts","../src/services/vouchers.ts","../src/internal/http.ts","../src/internal/xml.ts","../src/soap/index.ts","../src/wsaa/index.ts","../src/wsaa/session-store.ts","../src/wsaa/store-adapter.ts","../src/client.ts","../src/store/file.ts","../src/store/memory.ts","../src/store/postgres.ts","../src/store/redis.ts"],"sourcesContent":["import { ArcaConfigurationError } from \"./errors\";\nimport type {\n ArcaClientConfig,\n ArcaClientOptions,\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] as const;\nconst ENCRYPTED_PRIVATE_KEY_PEM_PREFIX =\n \"-----BEGIN ENCRYPTED PRIVATE KEY-----\";\nconst LEGACY_ENCRYPTED_RSA_PRIVATE_KEY_PATTERN =\n /^-----BEGIN RSA PRIVATE KEY-----[\\s\\S]*^Proc-Type:\\s*4,\\s*ENCRYPTED\\s*$/m;\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 (\n normalized.privateKeyPem.startsWith(ENCRYPTED_PRIVATE_KEY_PEM_PREFIX) ||\n LEGACY_ENCRYPTED_RSA_PRIVATE_KEY_PATTERN.test(normalized.privateKeyPem)\n ) {\n throw new ArcaConfigurationError(\n \"Encrypted private keys are not supported. Provide an unencrypted PKCS#8 or RSA private key PEM.\"\n );\n }\n\n invalidFields.push(...invalidCredentialFields(normalized));\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): ResolvedArcaClientConfig {\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 ?? \"test\",\n ...(config.store === undefined ? {} : { store: config.store }),\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\nexport type ResolvedArcaClientConfig = ArcaClientConfig & {\n taxId: string;\n certificatePem: string;\n privateKeyPem: string;\n environment: ArcaEnvironment;\n};\n\nexport function discoverArcaClientConfig(\n config: ArcaClientOptions\n): ArcaClientConfig {\n const environment =\n config.environment ??\n (readEnv(process.env, ARCA_ENV_VARIABLES.environment) as\n | ArcaEnvironment\n | undefined);\n if (environment === undefined) {\n throw new ArcaConfigurationError(\n `environment is required: pass environment or set ${ARCA_ENV_VARIABLES.environment} to \"test\" or \"production\".`\n );\n }\n return {\n ...config,\n taxId: config.taxId ?? readEnv(process.env, ARCA_ENV_VARIABLES.taxId) ?? \"\",\n certificatePem:\n config.certificatePem ??\n readEnv(process.env, ARCA_ENV_VARIABLES.certificatePem) ??\n \"\",\n privateKeyPem:\n config.privateKeyPem ??\n readEnv(process.env, ARCA_ENV_VARIABLES.privateKeyPem) ??\n \"\",\n environment,\n };\n}\n\nfunction invalidCredentialFields(\n normalized: ResolvedArcaClientConfig\n): string[] {\n const invalidFields: string[] = [];\n if (!/^\\d{11}$/.test(normalized.taxId)) {\n invalidFields.push(normalized.taxId ? \"taxId\" : \"taxId (ARCA_TAX_ID)\");\n }\n\n if (!normalized.certificatePem.startsWith(\"-----BEGIN CERTIFICATE-----\")) {\n invalidFields.push(\n normalized.certificatePem\n ? \"certificatePem\"\n : \"certificatePem (ARCA_CERTIFICATE_PEM)\"\n );\n }\n\n if (\n !PRIVATE_KEY_PEM_PREFIXES.some((prefix) =>\n normalized.privateKeyPem.startsWith(prefix)\n )\n ) {\n invalidFields.push(\n normalized.privateKeyPem\n ? \"privateKeyPem\"\n : \"privateKeyPem (ARCA_PRIVATE_KEY_PEM)\"\n );\n }\n\n return invalidFields;\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 { createHash } from \"node:crypto\";\nimport { ArcaConfigurationError } from \"../errors\";\nimport type { ArcaEnvironment } from \"../internal/types\";\nimport type { WsfeVoucherInput } from \"../services/wsfe\";\n\n/** Durable values. add must atomically create only when the key is absent. */\nexport type ArcaStore = {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n add(key: string, value: string): Promise<boolean>;\n delete?(key: string): Promise<void>;\n withLock?<T>(key: string, fn: () => Promise<T>): Promise<T>;\n};\n\nexport type ArcaAttemptRecord = {\n v: 1;\n operation: \"issue\" | \"cancel\";\n representedTaxId?: string;\n salesPoint: number;\n voucherType: number;\n number: number;\n inputHash: string;\n sent: WsfeVoucherInput;\n createdAt: string;\n};\n\nexport function attemptKey(\n environment: ArcaEnvironment,\n taxId: string,\n key: string\n): string {\n return `arca:v1:attempt:${environment}:${taxId}:${key}`;\n}\n\nexport function canonicalHash(input: unknown): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(canonical(input)))\n .digest(\"hex\");\n}\nfunction canonical(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(canonical);\n }\n if (value instanceof Date) {\n return value.toJSON();\n }\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, item]) => [key, canonical(item)])\n );\n }\n return value;\n}\n\nexport async function storeCall<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (cause) {\n throw new ArcaConfigurationError(\"ARCA store operation failed.\", { cause });\n }\n}\n","import {\n ARCA_CURRENCY_IDS,\n ARCA_DOCUMENT_TYPES,\n ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS,\n ARCA_INVOICE_CLASS_BY_ISSUER,\n ARCA_ISSUER_CONDITION_IDS,\n ARCA_RECEIVER_CONDITION_IDS,\n ARCA_VOUCHER_TYPES,\n type ReceiverCondition,\n type VoucherClass,\n} from \"../constants\";\nimport { ArcaError, ArcaInputError } from \"../errors\";\nimport { serializeArcaExchangeRate } from \"../internal/decimal\";\nimport {\n normalizeWsfeDateInput,\n normalizeWsfeVoucherInput,\n type WsfeDateInput,\n type WsfeVoucherInput,\n} from \"./wsfe\";\nimport {\n type AmountItem,\n calculateWsfeAmounts,\n type IssueAmounts,\n type VatItem,\n} from \"./wsfe-amounts\";\n\nexport type Receiver =\n | {\n condition: \"consumidor_final\";\n cuit?: number | string;\n dni?: number | string;\n }\n | {\n condition: Exclude<ReceiverCondition, \"consumidor_final\">;\n cuit: number | string;\n dni?: never;\n };\nexport type IssueCommon = {\n salesPoint: number;\n to: Receiver;\n total?: number;\n date?: WsfeDateInput;\n currency?: \"ARS\" | \"USD\";\n exchangeRate?: string;\n service?: { from: WsfeDateInput; to: WsfeDateInput; dueDate: WsfeDateInput };\n};\nexport type IssueInput = IssueCommon &\n (\n | { issuer: \"responsable_inscripto\"; items: readonly VatItem[] }\n | {\n issuer: \"monotributo\" | \"exento\" | \"no_alcanzado\";\n items: readonly AmountItem[];\n }\n );\n\nconst INVOICE_TYPES = {\n A: ARCA_VOUCHER_TYPES.FACTURA_A,\n B: ARCA_VOUCHER_TYPES.FACTURA_B,\n C: ARCA_VOUCHER_TYPES.FACTURA_C,\n};\n\n/** No I/O: all caller validation finishes before the next-number read. */\nexport function deriveWsfeInvoice(\n input: IssueInput,\n now = new Date()\n): {\n data: WsfeVoucherInput;\n voucherClass: VoucherClass;\n amounts: IssueAmounts;\n} {\n assertIssueObject(input, \"input\");\n assertIssueKeys(\n input,\n [\n \"issuer\",\n \"items\",\n \"salesPoint\",\n \"to\",\n \"total\",\n \"date\",\n \"currency\",\n \"exchangeRate\",\n \"service\",\n ],\n \"input\"\n );\n if (\n typeof input.issuer !== \"string\" ||\n !Object.hasOwn(ARCA_ISSUER_CONDITION_IDS, input.issuer)\n ) {\n invalid(\n \"issuer\",\n \"responsable_inscripto, monotributo, exento, or no_alcanzado\"\n );\n }\n if (\n !Number.isSafeInteger(input.salesPoint) ||\n input.salesPoint < 1 ||\n input.salesPoint > 99_999\n ) {\n invalid(\"salesPoint\", \"an integer from 1 through 99999\");\n }\n const receiver = deriveReceiver(input.to);\n const voucherClass =\n ARCA_INVOICE_CLASS_BY_ISSUER[input.issuer][input.to.condition];\n const { data: amountsData, amounts } = calculateWsfeAmounts(input);\n const currency = deriveCurrency(input);\n if (\n input.to.condition === \"consumidor_final\" &&\n receiver.documentType === ARCA_DOCUMENT_TYPES.CONSUMIDOR_FINAL\n ) {\n const [whole, fraction = \"\"] = currency.exchangeRate.split(\".\");\n const rate = BigInt(whole) * 1_000_000n + BigInt(fraction.padEnd(6, \"0\"));\n // Compare exact peso equivalents; rounding below the threshold must not hide it.\n if (\n BigInt(amounts.sentTotal) * rate >=\n ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS * 1_000_000n\n ) {\n throw new ArcaInputError(\n \"The final consumer must be identified for this amount.\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"to\",\n expected:\n \"cuit or dni for operations at or above ARS 10,000,000 (RG 5866)\",\n }\n );\n }\n }\n const voucherDate = normalizeWsfeDateInput(\n input.date === undefined ? buenosAiresDate(now) : input.date,\n \"date\"\n ) as WsfeDateInput;\n const data: WsfeVoucherInput = {\n salesPoint: input.salesPoint,\n voucherType: INVOICE_TYPES[voucherClass],\n voucherDate,\n ...receiver,\n ...currency,\n ...amountsData,\n ...deriveService(input.service, voucherDate),\n };\n try {\n normalizeWsfeVoucherInput(data);\n } catch (cause) {\n throw new ArcaError(\n \"The derived invoice failed exact WSFE validation. This is an SDK invariant failure.\",\n \"ARCA_ISSUE_INVARIANT\",\n { cause }\n );\n }\n return { data, voucherClass, amounts };\n}\n\nfunction deriveReceiver(to: Receiver) {\n assertIssueObject(to, \"to\");\n assertIssueKeys(to, [\"condition\", \"cuit\", \"dni\"], \"to\");\n if (\n typeof to.condition !== \"string\" ||\n !Object.hasOwn(ARCA_RECEIVER_CONDITION_IDS, to.condition)\n ) {\n invalid(\"to.condition\", \"one of the five supported receiver conditions\");\n }\n if (to.cuit !== undefined && to.dni !== undefined) {\n invalid(\"to\", \"either cuit or dni, never both\");\n }\n if (to.condition !== \"consumidor_final\" && to.cuit === undefined) {\n throw new ArcaInputError(\n \"to.cuit is required for this receiver (WSFE 10063 for class A).\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"to.cuit\",\n expected: \"an 11-digit CUIT\",\n }\n );\n }\n const documentType =\n to.cuit === undefined\n ? to.dni === undefined\n ? ARCA_DOCUMENT_TYPES.CONSUMIDOR_FINAL\n : ARCA_DOCUMENT_TYPES.DNI\n : ARCA_DOCUMENT_TYPES.CUIT;\n // WSFE DocNro is Long(11); do not impose an undocumented DNI-only width.\n const documentNumber =\n to.cuit === undefined\n ? to.dni === undefined\n ? 0\n : issueDocumentNumber(to.dni, \"to.dni\", 1, 11)\n : issueDocumentNumber(to.cuit, \"to.cuit\", 11, 11);\n return {\n documentType,\n documentNumber,\n receiverVatConditionId: ARCA_RECEIVER_CONDITION_IDS[to.condition],\n };\n}\n\nexport function issueDocumentNumber(\n value: unknown,\n field: string,\n min: number,\n max: number\n): number {\n if (typeof value !== \"number\" && typeof value !== \"string\") {\n invalid(field, `a positive document number with ${min} to ${max} digits`);\n }\n const text = String(value);\n if (\n !/^\\d+$/.test(text) ||\n text.length < min ||\n text.length > max ||\n !Number.isSafeInteger(Number(text)) ||\n Number(text) <= 0\n ) {\n invalid(field, `a positive document number with ${min} to ${max} digits`);\n }\n return Number(text);\n}\n\nfunction deriveCurrency(input: IssueCommon) {\n const currency = input.currency === undefined ? \"ARS\" : input.currency;\n if (currency !== \"ARS\" && currency !== \"USD\") {\n invalid(\"currency\", \"ARS or USD\");\n }\n if (\n input.exchangeRate !== undefined &&\n typeof input.exchangeRate !== \"string\"\n ) {\n invalid(\"exchangeRate\", \"a decimal string\");\n }\n if (currency === \"USD\" && input.exchangeRate === undefined) {\n throw new ArcaInputError(\"exchangeRate is required for USD.\", {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"exchangeRate\",\n expected: \"a positive decimal string\",\n });\n }\n const exchangeRate = serializeArcaExchangeRate(\n input.exchangeRate ?? \"1\",\n \"exchangeRate\"\n );\n if (currency === \"ARS\" && exchangeRate !== \"1\") {\n throw new ArcaInputError(\"exchangeRate must be 1 for ARS.\", {\n code: \"ARCA_INPUT_INVALID_EXCHANGE_RATE\",\n field: \"exchangeRate\",\n expected: \"1 for ARS\",\n });\n }\n return { currencyId: ARCA_CURRENCY_IDS[currency], exchangeRate };\n}\n\nfunction deriveService(service: IssueCommon[\"service\"], date: WsfeDateInput) {\n if (service === undefined) {\n return { concept: 1 };\n }\n assertIssueObject(service, \"service\");\n assertIssueKeys(service, [\"from\", \"to\", \"dueDate\"], \"service\");\n for (const field of [\"from\", \"to\", \"dueDate\"] as const) {\n if (service[field] === undefined) {\n throw new ArcaInputError(`service.${field} is required.`, {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: `service.${field}`,\n expected: \"a calendar date\",\n });\n }\n }\n const serviceStartDate = normalizeWsfeDateInput(\n service.from,\n \"service.from\"\n ) as WsfeDateInput;\n const serviceEndDate = normalizeWsfeDateInput(\n service.to,\n \"service.to\"\n ) as WsfeDateInput;\n const paymentDueDate = normalizeWsfeDateInput(\n service.dueDate,\n \"service.dueDate\"\n ) as WsfeDateInput;\n if (serviceEndDate < serviceStartDate) {\n invalid(\"service.to\", \"a date on or after service.from\");\n }\n if (paymentDueDate < date) {\n invalid(\"service.dueDate\", \"a date on or after date\");\n }\n return { concept: 2, serviceStartDate, serviceEndDate, paymentDueDate };\n}\n\nexport function buenosAiresDate(now: Date): WsfeDateInput {\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: \"America/Argentina/Buenos_Aires\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).formatToParts(now);\n return [\"year\", \"month\", \"day\"]\n .map((part) => parts.find((entry) => entry.type === part)?.value)\n .join(\"\") as WsfeDateInput;\n}\n\nexport function assertIssueObject(\n value: unknown,\n field: string\n): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n invalid(field, \"an object\");\n }\n}\nexport function assertIssueKeys(\n value: object,\n keys: readonly string[],\n prefix: string\n): void {\n for (const key of Object.keys(value)) {\n if (!keys.includes(key)) {\n const field = prefix === \"input\" ? key : `${prefix}.${key}`;\n throw new ArcaInputError(`${field} is not supported by issue().`, {\n code: \"ARCA_INPUT_RESERVED_FIELD\",\n field,\n expected:\n \"a supported facade field; use the exact API for other fiscal fields\",\n });\n }\n }\n}\nfunction invalid(field: string, expected: string): never {\n throw new ArcaInputError(`${field} must be ${expected}.`, {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field,\n expected,\n });\n}\n","import type { VoucherClass } from \"../constants\";\nimport { ArcaInputError } from \"../errors\";\nimport { normalizeArcaAmountToMinorUnits } from \"../internal/decimal\";\nimport {\n normalizeWsfeDateInput,\n normalizeWsfeVoucherInput,\n type WsfeDateInput,\n type WsfeVoucherInfo,\n type WsfeVoucherInput,\n} from \"./wsfe\";\nimport { buenosAiresDate } from \"./wsfe-derive\";\n\nconst NOTES: Record<\n number,\n { voucherType: number; voucherClass: VoucherClass }\n> = {\n 1: { voucherType: 3, voucherClass: \"A\" },\n 6: { voucherType: 8, voucherClass: \"B\" },\n 11: { voucherType: 13, voucherClass: \"C\" },\n};\nfunction invalid(reason: string): never {\n throw new ArcaInputError(\n `Cannot cancel: ${reason}. Use wsfe.issue() for exact control.`,\n { code: \"ARCA_INPUT_INVALID_VALUE\" }\n );\n}\nfunction required<T>(value: T | undefined, field: string): T {\n if (value === undefined || value === null) {\n invalid(`original is missing ${field}`);\n }\n return value;\n}\n\n/** Builds a full ordinary credit note using the original's consultation evidence. */\nexport function deriveWsfeCancellation(\n original: WsfeVoucherInfo,\n date?: WsfeDateInput,\n now = new Date()\n) {\n const note = NOTES[original.voucherType ?? 0];\n if (!note) {\n invalid(\"original must be an invoice of type 1, 6 or 11\");\n }\n if (\n !(\n [\"A\", \"O\"].includes(original.result ?? \"\") &&\n original.cae?.trim() &&\n original.caeExpiry?.trim()\n )\n ) {\n invalid(\"original is not authorized\");\n }\n rejectExtensions(original);\n if (original.currencyId !== \"PES\" && original.currencyId !== \"DOL\") {\n invalid(\"unsupported currency; only ARS and USD are supported\");\n }\n const voucherDate = normalizeWsfeDateInput(\n date ?? buenosAiresDate(now),\n \"date\"\n ) as WsfeDateInput;\n const originalDate = normalizeWsfeDateInput(\n required(original.voucherDate, \"voucherDate\") as WsfeDateInput,\n \"original.voucherDate\"\n ) as WsfeDateInput;\n if (\n originalDate > voucherDate &&\n originalDate.slice(0, 6) !== voucherDate.slice(0, 6)\n ) {\n invalid(\n \"original date is later than the note and outside its month (10210)\"\n );\n }\n const data: WsfeVoucherInput = {\n salesPoint: required(original.salesPoint, \"salesPoint\"),\n voucherType: note.voucherType,\n concept: required(original.concept, \"concept\"),\n documentType: required(original.documentType, \"documentType\"),\n documentNumber: Number(required(original.documentNumber, \"documentNumber\")),\n receiverVatConditionId: required(\n original.receiverVatConditionId,\n \"receiverVatConditionId\"\n ),\n currencyId: original.currencyId,\n exchangeRate: required(original.exchangeRate, \"exchangeRate\"),\n voucherDate,\n totalAmount: required(original.totalAmount, \"totalAmount\"),\n netAmount: required(original.netAmount, \"netAmount\"),\n vatAmount: required(original.vatAmount, \"vatAmount\"),\n exemptAmount: required(original.exemptAmount, \"exemptAmount\"),\n nonTaxableAmount: required(original.nonTaxableAmount, \"nonTaxableAmount\"),\n taxAmount: required(original.taxAmount, \"taxAmount\"),\n ...(original.vatRates === undefined\n ? {}\n : { vatRates: original.vatRates.map((rate) => ({ ...rate })) }),\n associatedVouchers: [\n {\n type: required(original.voucherType, \"voucherType\"),\n salesPoint: required(original.salesPoint, \"salesPoint\"),\n number: original.voucherNumber,\n voucherDate: originalDate,\n },\n ],\n };\n copyServiceDates(original, data);\n normalizeWsfeVoucherInput(data);\n const total = Number(\n normalizeArcaAmountToMinorUnits(data.totalAmount, \"totalAmount\")\n );\n return {\n data,\n voucherClass: note.voucherClass,\n amounts: { computedTotal: total, sentTotal: total, vatAdjustment: 0 },\n };\n}\n\nfunction rejectExtensions(original: WsfeVoucherInfo) {\n for (const [field, rawField] of [\n [\"taxes\", \"Tributos\"],\n [\"optionalFields\", \"Opcionales\"],\n [\"buyers\", \"Compradores\"],\n [\"activities\", \"Actividades\"],\n [\"associatedPeriod\", \"PeriodoAsoc\"],\n ]) {\n const value = (original as unknown as Record<string, unknown>)[field];\n const raw = original.raw[rawField];\n if (present(value) || present(raw)) {\n invalid(`unsupported original ${field}`);\n }\n }\n if ((original.taxAmount ?? 0) !== 0) {\n invalid(\"unsupported original taxes\");\n }\n}\nfunction present(value: unknown): boolean {\n return (\n value !== undefined &&\n value !== null &&\n value !== \"\" &&\n (!Array.isArray(value) || value.length > 0)\n );\n}\nfunction copyServiceDates(original: WsfeVoucherInfo, data: WsfeVoucherInput) {\n if (data.concept !== 2 && data.concept !== 3) {\n return;\n }\n data.serviceStartDate = required(\n original.serviceStartDate,\n \"serviceStartDate\"\n ) as WsfeDateInput;\n data.serviceEndDate = required(\n original.serviceEndDate,\n \"serviceEndDate\"\n ) as WsfeDateInput;\n const due = normalizeWsfeDateInput(\n required(original.paymentDueDate, \"paymentDueDate\") as WsfeDateInput,\n \"original.paymentDueDate\"\n ) as WsfeDateInput;\n data.paymentDueDate = due < data.voucherDate ? data.voucherDate : due;\n}\n","import {\n normalizeArcaAmountToMinorUnits,\n serializeArcaExchangeRate,\n} from \"../internal/decimal\";\nimport type { WsfeVatRate, WsfeVoucherInfo, WsfeVoucherInput } from \"./wsfe\";\nimport { normalizeWsfeDateInput } from \"./wsfe\";\n\nexport type VoucherCoordinates = {\n salesPoint: number;\n voucherType: number;\n number: number;\n};\n\n/** Raw-free consultation evidence. Missing provider fields remain absent. */\nexport type VoucherSummary = {\n number: number;\n salesPoint?: number;\n voucherType?: number;\n date?: string;\n concept?: number;\n documentType?: number;\n documentNumber?: string;\n receiverVatConditionId?: number;\n currencyId?: string;\n exchangeRate?: number;\n totalAmount?: number;\n netAmount?: number;\n vatAmount?: number;\n exemptAmount?: number;\n nonTaxableAmount?: number;\n taxAmount?: number;\n vatRates?: { id: number; baseAmount: number; amount: number }[];\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n result?: string;\n cae?: string;\n caeExpiry?: string;\n};\n\nexport type WsfeIdentityMatch =\n | { matches: true }\n | { matches: false; evidence: \"conflict\" | \"incomplete\"; reason: string };\n\n/**\n * Compares the invoice subset supported by issue(). This proves\n * consistency, not authorship. Configure a store and pass idempotencyKey for retries.\n * Unsupported exact-API extensions are incomplete.\n */\nexport function matchWsfeVoucherIdentity(\n sent: WsfeVoucherInput,\n number: number,\n found: WsfeVoucherInfo\n): WsfeIdentityMatch {\n let missing: string | undefined;\n const compare = (\n field: string,\n expected: unknown,\n actual: unknown,\n normalize?: (value: never) => unknown\n ): WsfeIdentityMatch | undefined => {\n if (actual === undefined || actual === null || expected === undefined) {\n missing ??= field;\n return undefined;\n }\n try {\n const left = normalize ? normalize(expected as never) : expected;\n const right = normalize ? normalize(actual as never) : actual;\n if (left !== right) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `${field} differs from the sent input`,\n };\n }\n } catch {\n missing ??= field;\n }\n return undefined;\n };\n const checks: [string, unknown, unknown, ((value: never) => unknown)?][] = [\n [\"voucherType\", sent.voucherType, found.voucherType],\n [\"salesPoint\", sent.salesPoint, found.salesPoint],\n [\"number\", number, found.voucherNumber, normalizeVoucherNumber],\n [\n \"date\",\n sent.voucherDate,\n found.voucherDate,\n (value) => normalizeWsfeDateInput(value, \"date\"),\n ],\n [\"concept\", sent.concept, found.concept],\n [\"documentType\", sent.documentType, found.documentType],\n [\n \"documentNumber\",\n sent.documentNumber,\n found.documentNumber,\n normalizeDocument,\n ],\n [\n \"receiverVatConditionId\",\n sent.receiverVatConditionId,\n found.receiverVatConditionId,\n ],\n [\"currencyId\", sent.currencyId, found.currencyId],\n [\n \"exchangeRate\",\n sent.exchangeRate ?? (sent.currencyId === \"PES\" ? 1 : undefined),\n found.exchangeRate,\n (value) => serializeArcaExchangeRate(value, \"exchangeRate\"),\n ],\n ];\n for (const field of [\n \"totalAmount\",\n \"netAmount\",\n \"vatAmount\",\n \"exemptAmount\",\n \"nonTaxableAmount\",\n \"taxAmount\",\n ] as const) {\n checks.push([\n field,\n sent[field],\n found[field],\n (value) => normalizeArcaAmountToMinorUnits(value, field),\n ]);\n }\n if (sent.concept === 2 || sent.concept === 3) {\n for (const field of [\n \"serviceStartDate\",\n \"serviceEndDate\",\n \"paymentDueDate\",\n ] as const) {\n checks.push([\n field,\n sent[field],\n found[field],\n (value) => normalizeWsfeDateInput(value, field),\n ]);\n }\n }\n for (const check of checks) {\n const result = compare(...check);\n if (result) {\n return result;\n }\n }\n const rates = compareVatRates(sent.vatRates ?? [], found.vatRates);\n if (!rates.matches) {\n if (rates.evidence === \"conflict\") {\n return rates;\n }\n missing ??= rates.reason;\n }\n if (sent.associatedVouchers?.length) {\n if (!found.associatedVouchers) {\n missing ??= \"associatedVouchers\";\n } else if (\n associationIdentity(sent.associatedVouchers) !==\n associationIdentity(found.associatedVouchers)\n ) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: \"associatedVouchers differ from the sent input\",\n };\n }\n }\n missing ??= incompleteAuthorization(sent, found);\n return missing\n ? {\n matches: false,\n evidence: \"incomplete\",\n reason: `Cannot verify ${missing}`,\n }\n : { matches: true };\n}\n\nfunction incompleteAuthorization(\n sent: WsfeVoucherInput,\n found: WsfeVoucherInfo\n): string | undefined {\n let missing: string | undefined;\n // These fields have no complete consultation identity contract in this facade.\n if (sent.concept !== 1 && sent.concept !== 2 && sent.concept !== 3) {\n missing ??= \"unsupported concept\";\n }\n for (const field of [\n \"taxes\",\n \"associatedPeriod\",\n \"optionalFields\",\n \"buyers\",\n \"activities\",\n \"sameCurrencyForeignCancellation\",\n ] as const) {\n const value = sent[field];\n if (value !== undefined && (!Array.isArray(value) || value.length > 0)) {\n missing ??= `unsupported exact field ${field}`;\n }\n }\n if (!(found.result === \"A\" || found.result === \"O\")) {\n missing ??= \"authorized result\";\n }\n if (!found.cae?.trim()) {\n missing ??= \"cae\";\n }\n if (!found.caeExpiry?.trim()) {\n missing ??= \"caeExpiry\";\n }\n return missing;\n}\n\nfunction normalizeVoucherNumber(value: number): number {\n // The exact lookup mapper maps missing/malformed numbers to 0 or NaN.\n // Neither is evidence that a different voucher occupies the attempted number.\n if (!Number.isSafeInteger(value) || value < 1 || value > 99_999_999) {\n throw new Error(\"Invalid voucher number\");\n }\n return value;\n}\n\nfunction normalizeDocument(value: string | number): bigint {\n const text = String(value);\n if (!/^\\d+$/.test(text)) {\n throw new Error(\"Invalid document number\");\n }\n return BigInt(text);\n}\n\nfunction compareVatRates(\n expected: WsfeVatRate[],\n actual: WsfeVatRate[] | undefined\n): WsfeIdentityMatch {\n if (actual === undefined) {\n return expected.length === 0\n ? { matches: true }\n : { matches: false, evidence: \"incomplete\", reason: \"vatRates\" };\n }\n if (\n actual.length !== expected.length ||\n new Set(actual.map((rate) => rate.id)).size !== actual.length\n ) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: \"vatRates ids differ from the sent input\",\n };\n }\n for (const rate of expected) {\n const found = actual.find((item) => item.id === rate.id);\n if (!found) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `vatRates id ${rate.id} differs from the sent input`,\n };\n }\n for (const field of [\"baseAmount\", \"amount\"] as const) {\n try {\n if (\n normalizeArcaAmountToMinorUnits(rate[field], field) !==\n normalizeArcaAmountToMinorUnits(found[field], field)\n ) {\n return {\n matches: false,\n evidence: \"conflict\",\n reason: `vatRates[${rate.id}].${field} differs from the sent input`,\n };\n }\n } catch {\n return {\n matches: false,\n evidence: \"incomplete\",\n reason: `vatRates[${rate.id}].${field}`,\n };\n }\n }\n }\n return { matches: true };\n}\n\nexport function toVoucherSummary(found: WsfeVoucherInfo): VoucherSummary {\n const summary: VoucherSummary = { number: found.voucherNumber };\n for (const field of [\n \"salesPoint\",\n \"voucherType\",\n \"concept\",\n \"documentType\",\n \"documentNumber\",\n \"receiverVatConditionId\",\n \"currencyId\",\n \"exchangeRate\",\n \"totalAmount\",\n \"netAmount\",\n \"vatAmount\",\n \"exemptAmount\",\n \"nonTaxableAmount\",\n \"taxAmount\",\n \"serviceStartDate\",\n \"serviceEndDate\",\n \"paymentDueDate\",\n \"result\",\n \"cae\",\n \"caeExpiry\",\n ] as const) {\n if (found[field] !== undefined) {\n Object.assign(summary, { [field]: found[field] });\n }\n }\n if (found.voucherDate !== undefined) {\n summary.date = found.voucherDate;\n }\n if (found.vatRates !== undefined) {\n summary.vatRates = found.vatRates.map(({ id, baseAmount, amount }) => ({\n id,\n baseAmount,\n amount,\n }));\n }\n return summary;\n}\n\nfunction associationIdentity(\n vouchers: NonNullable<WsfeVoucherInput[\"associatedVouchers\"]>\n): string {\n return JSON.stringify(\n vouchers\n .map(({ type, salesPoint, number }) => `${type}:${salesPoint}:${number}`)\n .sort()\n );\n}\n","import {\n ArcaConfigurationError,\n ArcaInputError,\n ArcaServiceError,\n toArcaSafeErrorMetadata,\n} from \"../errors\";\nimport { normalizeArcaAmountToMinorUnits } from \"../internal/decimal\";\nimport type { ArcaEnvironment } from \"../internal/types\";\nimport {\n type ArcaAttemptRecord,\n type ArcaStore,\n attemptKey,\n canonicalHash,\n storeCall,\n} from \"../store/types\";\nimport type { ArcaAuthorizationOutcome } from \"./fiscal-evidence\";\nimport type {\n IssuedVoucher,\n IssueOptions,\n IssueOutcome,\n} from \"./vouchers-types\";\nimport {\n normalizeWsfeDateInput,\n normalizeWsfeVoucherInput,\n type WsfeDateInput,\n type WsfeService,\n type WsfeVoucherInput,\n} from \"./wsfe\";\nimport { deriveWsfeCancellation } from \"./wsfe-cancel\";\nimport {\n assertIssueKeys,\n assertIssueObject,\n deriveWsfeInvoice,\n type IssueInput,\n issueDocumentNumber,\n} from \"./wsfe-derive\";\nimport {\n matchWsfeVoucherIdentity,\n toVoucherSummary,\n type VoucherCoordinates,\n} from \"./wsfe-identity\";\n\nexport type VouchersService = {\n /** Creates a full credit note associated to an authorized A, B or C invoice. */\n cancel<\n O extends IssueOptions & { date?: WsfeDateInput } = { include?: never },\n >(target: VoucherCoordinates, options?: O): Promise<IssueOutcome<O>>;\n /**\n * Configure a store and pass idempotencyKey to recover retries after a crash.\n *\n * Without a key: one next-number read, one authorization and at most one lookup.\n * Keyed replay consults the reserved number; only not_found permits a write.\n * Local validation and next-number read failures throw before authorization.\n */\n issue<O extends IssueOptions = { include?: never }>(\n input: IssueInput,\n options?: O\n ): Promise<IssueOutcome<O>>;\n};\n\ntype IssueWsfeService = Pick<\n WsfeService,\n \"getNextVoucherNumber\" | \"issue\" | \"lookupVoucher\"\n>;\ntype StoreContext = {\n store?: ArcaStore;\n environment: ArcaEnvironment;\n taxId: string;\n};\ntype Prepared = ReturnType<typeof deriveWsfeInvoice>;\n\nexport function createVouchersService(\n wsfe: IssueWsfeService,\n context?: StoreContext\n): VouchersService {\n return {\n cancel: async <\n O extends IssueOptions & { date?: WsfeDateInput } = { include?: never },\n >(\n target: VoucherCoordinates,\n options?: O\n ): Promise<IssueOutcome<O>> => {\n const result = await cancelInvoice(wsfe, target, options ?? {}, context);\n return result as IssueOutcome<O>;\n },\n issue: async <O extends IssueOptions = { include?: never }>(\n input: IssueInput,\n options?: O\n ): Promise<IssueOutcome<O>> => {\n const result = await issueInvoice(\n wsfe,\n input,\n options === undefined ? {} : options,\n context\n );\n // issueInvoice conditionally adds the fields specified by O at runtime.\n return result as IssueOutcome<O>;\n },\n };\n}\n\nasync function issueInvoice(\n wsfe: IssueWsfeService,\n input: IssueInput,\n options: IssueOptions,\n context?: StoreContext\n): Promise<IssueOutcome<IssueOptions>> {\n validateOptions(options);\n validateKeyStore(options, context);\n const prepared = deriveWsfeInvoice(input);\n return await runOperation(\n wsfe,\n \"issue\",\n input,\n () => Promise.resolve(prepared),\n options,\n context,\n prepared.amounts\n );\n}\n\nasync function runOperation(\n wsfe: IssueWsfeService,\n operation: ArcaAttemptRecord[\"operation\"],\n input: unknown,\n prepare: () => Promise<Prepared>,\n options: IssueOptions,\n context?: StoreContext,\n replayAmounts?: Prepared[\"amounts\"]\n): Promise<IssueOutcome<IssueOptions>> {\n const store = context?.store;\n if (options.idempotencyKey === undefined || !store || !context) {\n return runAuthorization(wsfe, await prepare(), options);\n }\n const key = attemptKey(\n context.environment,\n context.taxId,\n options.idempotencyKey\n );\n const representedTaxId =\n options.representedTaxId === undefined\n ? undefined\n : String(options.representedTaxId);\n const inputHash = canonicalHash({ input, representedTaxId });\n const existing = await storeCall(() => store.get(key));\n if (existing !== null) {\n return replay(existing);\n }\n const prepared = await prepare();\n const number = await nextNumber(wsfe, prepared.data, options);\n const record: ArcaAttemptRecord = {\n v: 1,\n operation,\n representedTaxId,\n inputHash,\n number,\n salesPoint: prepared.data.salesPoint,\n voucherType: prepared.data.voucherType,\n sent: prepared.data,\n createdAt: new Date().toISOString(),\n };\n if (await storeCall(() => store.add(key, JSON.stringify(record)))) {\n return runAuthorization(wsfe, prepared, options, number);\n }\n const winner = await storeCall(() => store.get(key));\n if (winner === null) {\n throw new ArcaConfigurationError(\n \"ARCA reservation disappeared after atomic creation lost.\"\n );\n }\n return replay(winner);\n\n function replay(json: string) {\n const stored = readRecord(json);\n if (\n stored.operation !== operation ||\n stored.inputHash !== inputHash ||\n stored.representedTaxId !== representedTaxId\n ) {\n throw new ArcaInputError(\n \"The idempotency key was already used with different input or operation.\",\n {\n code: \"ARCA_INPUT_IDEMPOTENCY_MISMATCH\",\n field: \"options.idempotencyKey\",\n }\n );\n }\n return runAuthorization(\n wsfe,\n {\n ...preparedFromRecord(stored),\n ...(replayAmounts ? { amounts: replayAmounts } : {}),\n },\n options,\n stored.number,\n true\n );\n }\n}\n\nfunction validateKeyStore(options: IssueOptions, context?: StoreContext) {\n if (options.idempotencyKey === undefined) {\n return;\n }\n if (\n typeof options.idempotencyKey !== \"string\" ||\n options.idempotencyKey.length < 1 ||\n options.idempotencyKey.length > 255\n ) {\n throw new ArcaInputError(\n \"idempotencyKey must contain 1 to 255 characters.\",\n { code: \"ARCA_INPUT_INVALID_VALUE\", field: \"options.idempotencyKey\" }\n );\n }\n if (!context?.store) {\n throw new ArcaConfigurationError(\n 'idempotencyKey requires a store. Add import { createPostgresStore } from \"facturas\"; and store: createPostgresStore({ query }) to createArcaClient().'\n );\n }\n}\n\nfunction readRecord(json: string): ArcaAttemptRecord {\n try {\n const record = JSON.parse(json) as ArcaAttemptRecord;\n if (\n !record ||\n record.v !== 1 ||\n ![\"issue\", \"cancel\"].includes(record.operation) ||\n typeof record.inputHash !== \"string\" ||\n !record.sent ||\n !Number.isSafeInteger(record.number) ||\n record.number < 1 ||\n record.number > 99_999_999 ||\n record.sent.salesPoint !== record.salesPoint ||\n record.sent.voucherType !== record.voucherType\n ) {\n throw new Error(\"Invalid reservation structure\");\n }\n normalizeWsfeVoucherInput(record.sent);\n return record;\n } catch (cause) {\n throw new ArcaConfigurationError(\n \"Invalid ARCA reservation record; preserve it for reconciliation.\",\n { cause }\n );\n }\n}\n\nfunction preparedFromRecord(record: ArcaAttemptRecord): Prepared {\n const sentTotal = Number(\n normalizeArcaAmountToMinorUnits(record.sent.totalAmount, \"totalAmount\")\n );\n return {\n data: record.sent,\n voucherClass: [1, 3].includes(record.voucherType)\n ? \"A\"\n : [6, 8].includes(record.voucherType)\n ? \"B\"\n : \"C\",\n amounts: { computedTotal: sentTotal, sentTotal, vatAdjustment: 0 },\n };\n}\n\nasync function nextNumber(\n wsfe: IssueWsfeService,\n data: WsfeVoucherInput,\n options: IssueOptions\n): Promise<number> {\n const number = await wsfe.getNextVoucherNumber({\n representedTaxId: options.representedTaxId,\n forceRefresh: options.forceRefresh,\n salesPoint: data.salesPoint,\n voucherType: data.voucherType,\n });\n if (!Number.isSafeInteger(number) || number < 1 || number > 99_999_999) {\n throw new ArcaServiceError(\n \"WSFE returned an invalid next voucher number.\",\n { service: \"wsfe\", operation: \"FECompUltimoAutorizado\" }\n );\n }\n return number;\n}\n\nasync function runAuthorization(\n wsfe: IssueWsfeService,\n { data, voucherClass, amounts }: Prepared,\n options: IssueOptions,\n reservedNumber?: number,\n replay = false\n): Promise<IssueOutcome<IssueOptions>> {\n const auth = {\n representedTaxId: options.representedTaxId,\n forceRefresh: options.forceRefresh,\n };\n const includeRaw = options.include?.raw === true;\n const includeExact = options.include?.exactInput === true;\n const number = reservedNumber ?? (await nextNumber(wsfe, data, options));\n const attempted = {\n salesPoint: data.salesPoint,\n voucherType: data.voucherType,\n number,\n };\n const exact = includeExact ? { sent: data } : {};\n const voucher = (cae: string, caeExpiry: string): IssuedVoucher => ({\n ...attempted,\n voucherClass,\n date: data.voucherDate,\n cae,\n caeExpiry,\n amounts,\n });\n const recovery = { wsfe, auth, data, attempted, includeRaw, exact, voucher };\n if (replay) {\n const attempt = replayEvidence();\n let lookup: Awaited<ReturnType<IssueWsfeService[\"lookupVoucher\"]>>;\n try {\n lookup = await wsfe.lookupVoucher({ ...auth, ...attempted });\n } catch (error) {\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"failed\", error: toArcaSafeErrorMetadata(error) },\n };\n }\n if (lookup.kind === \"found\") {\n return recoverInvoice({ ...recovery, attempt, lookup });\n }\n }\n // This is the only authorization call, including all transport/recovery branches.\n const authorization = await wsfe.issue({\n ...auth,\n data,\n voucherNumber: number,\n });\n if (\n authorization.kind === \"authorized\" &&\n authorization.caeExpiry &&\n authorization.voucherNumber === number\n ) {\n return {\n kind: \"authorized\",\n recoveredByMatch: false,\n voucher: voucher(authorization.cae, authorization.caeExpiry),\n authorization: projectEvidence(authorization, includeRaw),\n ...exact,\n };\n }\n if (authorization.kind === \"rejected\") {\n if (\n options.idempotencyKey !== undefined &&\n [...authorization.errors, ...authorization.observations].some(\n (issue) => issue.code === \"10016\"\n )\n ) {\n const recovered = await recoverInvoice({\n ...recovery,\n attempt: projectEvidence(\n {\n ...authorization,\n kind: \"indeterminate\",\n reason: \"contradictory_response\",\n },\n includeRaw\n ),\n });\n // A stranger at the reserved number is a conflict; a failed or empty\n // lookup keeps the provider rejection as the answer.\n if (recovered.kind === \"authorized\" || recovered.kind === \"conflict\") {\n return recovered;\n }\n }\n return {\n kind: \"rejected\",\n attempted,\n issues: [...authorization.errors, ...authorization.observations].map(\n projectIssue\n ),\n authorization: projectEvidence(authorization, includeRaw),\n };\n }\n // The exact outcome type permits an absent expiry. Keep that uncertainty visible.\n const uncertain =\n authorization.kind === \"indeterminate\"\n ? authorization\n : {\n ...authorization,\n kind: \"indeterminate\" as const,\n reason:\n authorization.voucherNumber === number\n ? (\"incomplete_response\" as const)\n : (\"contradictory_response\" as const),\n };\n const attempt = projectEvidence(uncertain, includeRaw);\n return recoverInvoice({\n wsfe,\n auth,\n data,\n attempted,\n attempt,\n includeRaw,\n exact,\n voucher,\n });\n}\n\ntype RecoveryInput = {\n wsfe: IssueWsfeService;\n lookup?: Awaited<ReturnType<IssueWsfeService[\"lookupVoucher\"]>>;\n auth: Pick<IssueOptions, \"representedTaxId\" | \"forceRefresh\">;\n data: WsfeVoucherInput;\n attempted: VoucherCoordinates;\n attempt: Omit<\n Extract<ArcaAuthorizationOutcome<\"wsfe\">, { kind: \"indeterminate\" }>,\n \"raw\"\n > & { raw?: Record<string, unknown> };\n includeRaw: boolean;\n exact: { sent?: WsfeVoucherInput };\n voucher: (cae: string, caeExpiry: string) => IssuedVoucher;\n};\nasync function recoverInvoice({\n wsfe,\n auth,\n data,\n attempted,\n attempt,\n includeRaw,\n exact,\n voucher,\n lookup: suppliedLookup,\n}: RecoveryInput): Promise<IssueOutcome<IssueOptions>> {\n let lookup: Awaited<ReturnType<IssueWsfeService[\"lookupVoucher\"]>>;\n try {\n lookup =\n suppliedLookup ?? (await wsfe.lookupVoucher({ ...auth, ...attempted }));\n } catch (error) {\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"failed\", error: toArcaSafeErrorMetadata(error) },\n };\n }\n const raw = includeRaw ? { raw: lookup.raw } : {};\n if (lookup.kind === \"not_found\") {\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"not_found\", ...raw },\n };\n }\n const matched = matchWsfeVoucherIdentity(\n data,\n attempted.number,\n lookup.voucher\n );\n if (!matched.matches) {\n if (matched.evidence === \"conflict\") {\n return {\n kind: \"conflict\",\n attempted,\n attempt,\n found: { ...toVoucherSummary(lookup.voucher), ...raw },\n reason: `${matched.reason}. Configure a store and pass idempotencyKey for retries.`,\n };\n }\n return {\n kind: \"indeterminate\",\n attempted,\n attempt,\n lookup: { kind: \"incomplete\", reason: matched.reason, ...raw },\n };\n }\n // The matcher requires both fields before declaring a complete match.\n return {\n kind: \"authorized\",\n recoveredByMatch: true,\n voucher: voucher(\n lookup.voucher.cae as string,\n lookup.voucher.caeExpiry as string\n ),\n attempt,\n lookup: { ...toVoucherSummary(lookup.voucher), ...raw },\n ...exact,\n };\n}\n\nfunction projectIssue(issue: ArcaAuthorizationOutcome[\"errors\"][number]) {\n return {\n service: issue.service,\n operation: issue.operation,\n source: issue.source,\n category: issue.category,\n message: issue.message,\n ...(issue.code === undefined ? {} : { code: issue.code }),\n ...(issue.resultLevel === undefined\n ? {}\n : { resultLevel: issue.resultLevel }),\n };\n}\nfunction projectEvidence<T extends ArcaAuthorizationOutcome<\"wsfe\">>(\n evidence: T,\n includeRaw: boolean\n): Omit<T, \"raw\"> & { raw?: Record<string, unknown> } {\n const base = {\n kind: evidence.kind,\n service: evidence.service,\n operation: evidence.operation,\n results: {\n ...(evidence.results.header === undefined\n ? {}\n : { header: evidence.results.header }),\n ...(evidence.results.detail === undefined\n ? {}\n : { detail: evidence.results.detail }),\n ...(evidence.results.operation === undefined\n ? {}\n : { operation: evidence.results.operation }),\n },\n errors: evidence.errors.map(projectIssue),\n observations: evidence.observations.map(projectIssue),\n ...(includeRaw && evidence.raw !== undefined ? { raw: evidence.raw } : {}),\n };\n const projected: Record<string, unknown> = { ...base };\n for (const field of [\n \"result\",\n \"resultLevel\",\n \"cae\",\n \"caeExpiry\",\n \"voucherNumber\",\n \"reason\",\n ] as const) {\n if (field in evidence && evidence[field as keyof T] !== undefined) {\n projected[field] = evidence[field as keyof T];\n }\n }\n if (evidence.kind === \"indeterminate\" && evidence.authentication) {\n const { code, reason, providerCode } = evidence.authentication;\n projected.authentication = {\n code,\n reason,\n ...(providerCode === undefined ? {} : { providerCode }),\n };\n }\n return projected as Omit<T, \"raw\"> & { raw?: Record<string, unknown> };\n}\n\nfunction validateOptions(options: IssueOptions) {\n assertIssueObject(options, \"options\");\n assertIssueKeys(\n options,\n [\"representedTaxId\", \"forceRefresh\", \"include\", \"idempotencyKey\"],\n \"options\"\n );\n if (options.representedTaxId !== undefined) {\n issueDocumentNumber(\n options.representedTaxId,\n \"options.representedTaxId\",\n 11,\n 11\n );\n }\n if (\n options.forceRefresh !== undefined &&\n typeof options.forceRefresh !== \"boolean\"\n ) {\n throw new ArcaInputError(\"options.forceRefresh must be a boolean.\", {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field: \"options.forceRefresh\",\n });\n }\n if (options.include !== undefined) {\n assertIssueObject(options.include, \"options.include\");\n assertIssueKeys(options.include, [\"raw\", \"exactInput\"], \"options.include\");\n for (const field of [\"raw\", \"exactInput\"] as const) {\n if (\n options.include[field] !== undefined &&\n typeof options.include[field] !== \"boolean\"\n ) {\n throw new ArcaInputError(\n `options.include.${field} must be a boolean.`,\n {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field: `options.include.${field}`,\n }\n );\n }\n }\n }\n}\n\nfunction replayEvidence(): RecoveryInput[\"attempt\"] {\n return {\n kind: \"indeterminate\",\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n reason: \"incomplete_response\",\n results: {},\n errors: [],\n observations: [],\n };\n}\n\nasync function cancelInvoice(\n wsfe: IssueWsfeService,\n target: VoucherCoordinates,\n options: IssueOptions & { date?: WsfeDateInput },\n context?: StoreContext\n): Promise<IssueOutcome<IssueOptions>> {\n assertIssueObject(options, \"options\");\n const { date, ...issueOptions } = options;\n validateOptions(issueOptions);\n validateKeyStore(issueOptions, context);\n assertIssueObject(target, \"target\");\n for (const [field, max] of [\n [\"salesPoint\", 99_999],\n [\"voucherType\", 999],\n [\"number\", 99_999_999],\n ] as const) {\n if (\n !Number.isSafeInteger(target[field]) ||\n target[field] < 1 ||\n target[field] > max\n ) {\n throw new ArcaInputError(`Invalid cancel target ${field}.`, {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field,\n });\n }\n }\n if (![1, 6, 11].includes(target.voucherType)) {\n throw new ArcaInputError(\n \"cancel requires an invoice of type 1, 6 or 11; use wsfe.issue() for exact control.\",\n { code: \"ARCA_INPUT_INVALID_VALUE\" }\n );\n }\n if (date !== undefined) {\n normalizeWsfeDateInput(date, \"date\");\n }\n return await runOperation(\n wsfe,\n \"cancel\",\n { target, date },\n async () => {\n const original = await wsfe.lookupVoucher({\n representedTaxId: issueOptions.representedTaxId,\n forceRefresh: issueOptions.forceRefresh,\n salesPoint: target.salesPoint,\n voucherType: target.voucherType,\n number: target.number,\n });\n if (original.kind === \"not_found\") {\n throw new ArcaInputError(\"original voucher not found\", {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n });\n }\n if (\n original.voucher.salesPoint !== target.salesPoint ||\n original.voucher.voucherType !== target.voucherType ||\n original.voucher.voucherNumber !== target.number\n ) {\n throw new ArcaInputError(\n \"Original lookup coordinates do not match the cancel target.\",\n { code: \"ARCA_INPUT_INVALID_VALUE\" }\n );\n }\n return deriveWsfeCancellation(original.voucher, date);\n },\n issueOptions,\n context\n );\n}\n","import https from \"node:https\";\nimport { ArcaTransportError } from \"../errors\";\nimport type { ArcaLogger } from \"./logger\";\nimport {\n createResponseBodyDiagnostic,\n createSafeErrorDiagnostic,\n} from \"./redaction\";\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 ...createSafeErrorDiagnostic(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 ...createSafeErrorDiagnostic(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(\"ARCA HTTP response stream failed\", {\n cause: error,\n statusCode: response.statusCode,\n ...createResponseBodyDiagnostic(getResponseBody()),\n })\n );\n });\n\n response.on(\"aborted\", () => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP response was aborted\", {\n statusCode: response.statusCode,\n ...createResponseBodyDiagnostic(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 ...createResponseBodyDiagnostic(responseBody),\n }\n )\n );\n });\n }\n );\n\n request.setTimeout(timeout, () => {\n const timeoutCause = new Error(\n `ARCA HTTP request timed out after ${timeout}ms`\n );\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP request timed out after ${timeout}ms`,\n { cause: timeoutCause }\n )\n );\n request.destroy(timeoutCause);\n });\n\n request.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP request failed\", {\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\";\nimport { createResponseBodyDiagnostic } from \"./redaction\";\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 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 );\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 );\n }\n\n return entries[0] as [string, T];\n}\n\nfunction createInvalidSoapResponseError(\n message: string,\n context: ArcaSoapParseContext,\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 ...createResponseBodyDiagnostic(\n responseBody,\n context.responseBodyPreviewLength\n ),\n });\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 });\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 { createSafeErrorDiagnostic } from \"../internal/redaction\";\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: request.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 ...createSafeErrorDiagnostic(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 ...createSafeErrorDiagnostic(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 { createSafeErrorDiagnostic } from \"../internal/redaction\";\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 ordinaryInFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n const forcedInFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n\n function trackLogin(\n target: Map<string, Promise<ArcaAuthCredentials>>,\n cacheKey: string,\n login: () => Promise<ArcaAuthCredentials>\n ): Promise<ArcaAuthCredentials> {\n const promise = login();\n target.set(cacheKey, promise);\n const cleanup = () => {\n if (target.get(cacheKey) === promise) {\n target.delete(cacheKey);\n }\n };\n promise.then(cleanup, cleanup);\n return promise;\n }\n\n async function requestOrReuseWsaaCredentials(\n service: ArcaWsaaServiceId,\n sessionKey: ArcaWsaaSessionKey,\n cacheKey: string,\n forceRefresh: boolean\n ): Promise<ArcaAuthCredentials> {\n const reuse = await getReusableCredentials({\n config: options.config,\n cache,\n cacheKey,\n sessionKey,\n logger: options.logger,\n service,\n allowStore: !forceRefresh,\n allowCache: !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,\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 async function performLogin(\n service: ArcaWsaaServiceId,\n sessionKey: ArcaWsaaSessionKey,\n cacheKey: string,\n forceRefresh: boolean\n ): Promise<ArcaAuthCredentials> {\n try {\n return await requestOrReuseWsaaCredentials(\n service,\n sessionKey,\n cacheKey,\n forceRefresh\n );\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 ...createSafeErrorDiagnostic(error),\n });\n }\n\n throw error;\n }\n }\n\n return {\n login(service, authOptions = {}) {\n const sessionKey = buildWsaaSessionKey(options.config, service);\n const cacheKey = serializeWsaaSessionKey(sessionKey);\n\n if (authOptions.forceRefresh) {\n const runningForced = forcedInFlight.get(cacheKey);\n if (runningForced) {\n return runningForced;\n }\n\n const runningOrdinary = ordinaryInFlight.get(cacheKey);\n return trackLogin(forcedInFlight, cacheKey, async () => {\n await runningOrdinary?.catch(() => undefined);\n return await performLogin(service, sessionKey, cacheKey, true);\n });\n }\n\n const runningOrdinary = ordinaryInFlight.get(cacheKey);\n if (runningOrdinary) {\n return runningOrdinary;\n }\n\n const runningForced = forcedInFlight.get(cacheKey);\n if (runningForced) {\n return runningForced;\n }\n\n return trackLogin(ordinaryInFlight, cacheKey, () =>\n performLogin(service, sessionKey, cacheKey, false)\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 type {\n ArcaAuthCredentials,\n ArcaWsaaSessionKey,\n ArcaWsaaSessionStore,\n} from \"../internal/types\";\nimport { type ArcaStore, storeCall } from \"../store/types\";\nimport {\n isWsaaCredentialValid,\n serializeWsaaSessionKey,\n} from \"./session-store\";\n\nexport function createWsaaStoreAdapter(store: ArcaStore): ArcaWsaaSessionStore {\n const key = (value: ArcaWsaaSessionKey) =>\n `arca:v1:wsaa:${serializeWsaaSessionKey(value)}`;\n const remove = store.delete?.bind(store);\n const lock = store.withLock?.bind(store);\n return {\n get: (value) =>\n storeCall(async () => {\n const json = await store.get(key(value));\n if (json === null) {\n return null;\n }\n const credentials = JSON.parse(json) as ArcaAuthCredentials;\n return credentials &&\n typeof credentials.token === \"string\" &&\n typeof credentials.sign === \"string\" &&\n isWsaaCredentialValid(credentials)\n ? credentials\n : null;\n }),\n set: (value, credentials) =>\n storeCall(() => store.set(key(value), JSON.stringify(credentials))),\n ...(remove\n ? {\n delete: (value: ArcaWsaaSessionKey) =>\n storeCall(() => remove(key(value))),\n }\n : {}),\n ...(lock\n ? {\n withLock: <T>(value: ArcaWsaaSessionKey, fn: () => Promise<T>) =>\n lock(key(value), fn),\n }\n : {}),\n };\n}\n","import {\n assertArcaClientConfig,\n discoverArcaClientConfig,\n normalizeArcaClientConfig,\n} from \"./config\";\nimport { createArcaLogger } from \"./internal/logger\";\nimport type { ArcaClientOptions, ArcaEnvironment } from \"./internal/types\";\nimport { createPadronService, type PadronService } from \"./services/padron\";\nimport {\n createVouchersService,\n type VouchersService,\n} from \"./services/vouchers\";\nimport { createWsfeService, type WsfeService } from \"./services/wsfe\";\nimport { createWsmtxcaService, type WsmtxcaService } from \"./services/wsmtxca\";\nimport { createSoapTransport } from \"./soap\";\nimport { createWsaaAuthModule } from \"./wsaa\";\nimport { createWsaaStoreAdapter } from \"./wsaa/store-adapter\";\n\n/** Immutable, credential-free operational view of an ARCA client configuration. */\nexport type ArcaClientConfigView = Readonly<{\n taxId: string;\n environment: ArcaEnvironment;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n}>;\n\n/** Fully wired ARCA client with access to all service modules. */\nexport type ArcaClient = {\n readonly config: ArcaClientConfigView;\n /** Issues an invoice from business input. Idempotent with a store and key. */\n issue: VouchersService[\"issue\"];\n /** Issues a full credit note against an authorized invoice. */\n cancel: VouchersService[\"cancel\"];\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 `issue()`, `cancel()` and the `.wsfe`, `.wsmtxca`, and `.padron` service modules.\n *\n * @throws {ArcaConfigurationError} When the config is missing or invalid.\n */\nexport function createArcaClient(config: ArcaClientOptions = {}): ArcaClient {\n const discovered = discoverArcaClientConfig(config);\n assertArcaClientConfig(discovered);\n const normalizedConfig = normalizeArcaClientConfig(discovered);\n if (normalizedConfig.store && !normalizedConfig.wsaaSessionStore) {\n normalizedConfig.wsaaSessionStore = createWsaaStoreAdapter(\n normalizedConfig.store\n );\n }\n const logger = createArcaLogger(normalizedConfig.logger);\n\n const auth = createWsaaAuthModule({ config: normalizedConfig, logger });\n const soap = createSoapTransport({ config: normalizedConfig, logger });\n const publicConfig = Object.freeze({\n taxId: normalizedConfig.taxId,\n environment: normalizedConfig.environment,\n timeout: normalizedConfig.timeout,\n retries: normalizedConfig.retries,\n retryDelay: normalizedConfig.retryDelay,\n });\n\n const wsfe = createWsfeService({ config: normalizedConfig, auth, soap });\n const vouchers = createVouchersService(wsfe, normalizedConfig);\n return {\n config: publicConfig,\n issue: vouchers.issue,\n cancel: vouchers.cancel,\n wsfe,\n wsmtxca: createWsmtxcaService({ config: normalizedConfig, auth, soap }),\n padron: createPadronService({ config: normalizedConfig, auth, soap }),\n };\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\n/** Persistent store for a single server with a private durable volume. */\nexport function createFileStore(directory: string): ArcaStore {\n const path = (key: string) =>\n join(directory, createHash(\"sha256\").update(key).digest(\"hex\"));\n const ensure = () => mkdir(directory, { recursive: true, mode: 0o700 });\n return {\n get: (key) =>\n storeCall(async () => {\n try {\n return await readFile(path(key), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }),\n set: (key, value) =>\n storeCall(async () => {\n await ensure();\n const temporary = `${path(key)}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporary, value, { mode: 0o600, flag: \"wx\" });\n await rename(temporary, path(key));\n } finally {\n await unlink(temporary).catch(() => undefined);\n }\n }),\n add: (key, value) =>\n storeCall(async () => {\n await ensure();\n try {\n await writeFile(path(key), value, { flag: \"wx\", mode: 0o600 });\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n }),\n delete: (key) =>\n storeCall(async () => {\n try {\n await unlink(path(key));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }),\n };\n}\n","import type { ArcaStore } from \"./types\";\n\n/** In-process store for tests; reservations do not survive a restart. */\nexport function createMemoryStore(): ArcaStore {\n const values = new Map<string, string>();\n const locks = new Map<string, Promise<void>>();\n return {\n get: (key) => Promise.resolve(values.get(key) ?? null),\n set(key, value) {\n values.set(key, value);\n return Promise.resolve();\n },\n add(key, value) {\n if (values.has(key)) {\n return Promise.resolve(false);\n }\n values.set(key, value);\n return Promise.resolve(true);\n },\n delete(key) {\n values.delete(key);\n return Promise.resolve();\n },\n async withLock(key, fn) {\n const previous = locks.get(key) ?? 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(key, queued);\n await previous.catch(() => undefined);\n try {\n return await fn();\n } finally {\n release();\n if (locks.get(key) === queued) {\n locks.delete(key);\n }\n }\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype Row = { key?: string; value?: string };\n/** Uses the caller's SQL client; provision the table before use. */\nexport function createPostgresStore({\n query,\n table = \"arca_store\",\n}: {\n query: (text: string, params: string[]) => Promise<Row[] | { rows: Row[] }>;\n table?: string;\n}): ArcaStore {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(table)) {\n throw new ArcaConfigurationError(\"Invalid ARCA store table identifier.\");\n }\n const name = `\"${table}\"`;\n const run = (text: string, params: string[]) =>\n storeCall(async () => {\n const result = await query(text, params);\n return Array.isArray(result) ? result : result.rows;\n });\n return {\n async get(key) {\n return (\n (await run(`SELECT value FROM ${name} WHERE key = $1`, [key]))[0]\n ?.value ?? null\n );\n },\n async set(key, value) {\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = now()`,\n [key, value]\n );\n },\n async add(key, value) {\n return (\n (\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT DO NOTHING RETURNING key`,\n [key, value]\n )\n ).length > 0\n );\n },\n async delete(key) {\n await run(`DELETE FROM ${name} WHERE key = $1`, [key]);\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype RedisClient = {\n get(key: string): Promise<unknown>;\n set(key: string, value: string): Promise<unknown>;\n call?(...args: string[]): Promise<unknown>;\n del?(key: string): Promise<unknown>;\n};\n/** Uses ioredis or Upstash without importing either driver. */\nexport function createRedisStore(\n client: RedisClient,\n options: { flavor?: \"ioredis\" | \"upstash\" } = {}\n): ArcaStore {\n const flavor =\n options.flavor ??\n (typeof client.call === \"function\" ? \"ioredis\" : \"upstash\");\n if (flavor === \"ioredis\" && !client.call) {\n throw new ArcaConfigurationError(\n \"ARCA Redis ioredis flavor requires client.call.\"\n );\n }\n // The public structural type accepts ioredis's overloaded set method.\n // Only the Upstash flavor invokes its options-object overload.\n const upstashSet = client.set as (\n key: string,\n value: string,\n options: { nx: true }\n ) => Promise<unknown>;\n return {\n get: (key) =>\n storeCall(async () => {\n const value = await client.get(key);\n if (value === null) {\n return null;\n }\n // Upstash can deserialize stored JSON automatically.\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }),\n set: (key, value) =>\n storeCall(async () => {\n await client.set(key, value);\n }),\n add: (key, value) =>\n storeCall(\n async () =>\n (flavor === \"ioredis\"\n ? await client.call?.(\"SET\", key, value, \"NX\")\n : await upstashSet.call(client, key, value, { nx: true })) === \"OK\"\n ),\n ...(client.del\n ? {\n delete: (key: string) =>\n storeCall(async () => {\n await client.del?.(key);\n }),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":["invalid","attempt","createHash","runningForced","runningOrdinary","createHash","createHash","createHash"]}