facturas 0.7.0 → 0.8.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/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 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 { 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 wsmtxca: WsmtxcaService;\n padron: PadronService;\n};\n\n/**\n * Creates an ARCA client from the given configuration.\n * Validates the config, wires WSAA authentication and SOAP transport,\n * and returns an object with `.wsfe`, `.wsmtxca`, and `.padron` service modules.\n *\n * @throws {ArcaConfigurationError} When the config is missing or invalid.\n */\nexport function createArcaClient(config: ArcaClientConfig): ArcaClient {\n assertArcaClientConfig(config);\n const normalizedConfig = normalizeArcaClientConfig(config);\n const logger = createArcaLogger(normalizedConfig.logger);\n\n const auth = createWsaaAuthModule({ config: normalizedConfig, logger });\n const soap = createSoapTransport({ config: normalizedConfig, logger });\n 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 return {\n config: publicConfig,\n wsfe: createWsfeService({ config: normalizedConfig, auth, soap }),\n wsmtxca: createWsmtxcaService({ config: normalizedConfig, auth, soap }),\n padron: createPadronService({ config: normalizedConfig, auth, soap }),\n };\n}\n"],"mappings":"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","names":["runningForced","runningOrdinary"]}
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"]}
package/dist/padron.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPadronService
3
- } from "./chunk-EDY3PNKJ.mjs";
4
- import "./chunk-MBWOFO67.mjs";
3
+ } from "./chunk-NUV5RZPZ.mjs";
4
+ import "./chunk-HUT3PFKF.mjs";
5
5
  export {
6
6
  createPadronService
7
7
  };