@innvoid/getmarket-sdk 0.2.7 → 0.2.8

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/index.ts","../src/cache/redisCacheProvider.ts","../src/cache/cacheProvider.ts","../src/cache/ttlCache.ts","../src/cache/twoLevelCache.ts","../src/cache/index.ts","../src/core/errors.ts","../src/core/http.ts","../src/core/internalHttp.ts","../src/headers/constants.ts","../src/headers/parse.ts","../src/middlewares/parseHeaders.ts","../src/middlewares/requestId.ts","../src/middlewares/internalAuth.ts","../src/middlewares/respond.ts","../src/middlewares/authorization.ts","../src/auth/jwt.ts","../src/auth/middleware.ts","../src/auth/authentication.ts","../src/middlewares/guards.ts","../src/internalHttpClient.ts","../src/clients/env.ts","../src/clients/cacheFactory.ts","../src/clients/bulkRefsClient.ts","../src/clients/platformClient.ts","../src/clients/resClient.ts","../src/clients/mdClient.ts","../src/clients/fisClient.ts","../src/clients/mediaClient.ts","../src/clients/mkpClient.ts","../src/clients/payClient.ts","../src/common/ids.ts"],"sourcesContent":["// packages/sdk/src/index.ts\nexport * from \"./cache\";\nexport * from \"./core\";\nexport * from \"./headers\";\nexport * from \"./middlewares\";\nexport * from \"./auth\";\n\nexport * from \"./internalHttpClient\";\n\nexport * from \"./clients\";\n\nexport * from \"./common/ids\";\n","// clients/cache/redisCacheProvider.ts\nimport {createClient, type RedisClientType} from \"redis\";\nimport type {CacheProvider, CacheSetOptions, CacheValue} from \"./cacheProvider\";\n\nexport type RedisCacheProviderOptions = {\n url?: string;\n\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n\n tls?: boolean;\n\n connectTimeoutMs?: number;\n\n keyPrefix?: string;\n};\n\nfunction buildRedisUrl(opts: RedisCacheProviderOptions): string | undefined {\n if (opts.url && opts.url.trim()) return opts.url.trim();\n\n if (!opts.host) return undefined;\n const port = opts.port ?? 6379;\n const db = opts.db ?? 0;\n\n const auth = opts.password ? `:${encodeURIComponent(opts.password)}@` : \"\";\n return `redis://${auth}${opts.host}:${port}/${db}`;\n}\n\nexport class RedisCacheProvider implements CacheProvider {\n readonly kind = \"redis\" as const;\n\n // ✅ tip \"amplio\" para evitar TS2322 por typings genéricos\n private client: RedisClientType<any, any, any>;\n private ready = false;\n private readonly keyPrefix?: string;\n\n constructor(private readonly opts: RedisCacheProviderOptions) {\n const url = buildRedisUrl(opts);\n if (!url) {\n throw new Error(\"[RedisCacheProvider] Missing redis config (REDIS_URL or REDIS_HOST)\");\n }\n\n this.keyPrefix = opts.keyPrefix?.trim() || undefined;\n\n this.client = createClient({\n url,\n socket: {\n connectTimeout: opts.connectTimeoutMs ?? 3000,\n tls: opts.tls ? true : undefined,\n },\n }) as RedisClientType<any, any, any>;\n\n this.client.on(\"error\", (err: unknown) => {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as any).message)\n : String(err);\n\n console.error(\"[redis] error\", msg, err);\n });\n }\n\n private k(key: string): string {\n if (!this.keyPrefix) return key;\n return `${this.keyPrefix}:${key}`;\n }\n\n private async ensureConnected() {\n if (this.ready) return;\n await this.client.connect();\n this.ready = true;\n }\n\n async get(key: string): Promise<CacheValue | null> {\n await this.ensureConnected();\n const v = (await this.client.get(this.k(key))) as string | null;\n return v ?? null;\n }\n\n async set(key: string, value: CacheValue, options?: CacheSetOptions): Promise<void> {\n await this.ensureConnected();\n\n const ttlMs = options?.ttlMs;\n if (ttlMs && ttlMs > 0) {\n await this.client.set(this.k(key), value, {PX: ttlMs});\n return;\n }\n\n await this.client.set(this.k(key), value);\n }\n\n async del(key: string): Promise<void> {\n await this.ensureConnected();\n await this.client.del(this.k(key));\n }\n\n async close(): Promise<void> {\n try {\n if (this.ready) await this.client.quit();\n } catch {\n try {\n await this.client.disconnect();\n } catch {\n }\n } finally {\n this.ready = false;\n }\n }\n}\n","// clients/cache/cacheProvider.ts\nimport type {RedisCacheProviderOptions} from \"./redisCacheProvider\";\nimport {RedisCacheProvider} from \"./redisCacheProvider\";\n\nexport type CacheValue = string;\n\nexport type CacheSetOptions = {\n ttlMs?: number; // TTL en milisegundos (PX)\n};\n\nexport interface CacheProvider {\n readonly kind: \"redis\" | \"noop\";\n\n get(key: string): Promise<CacheValue | null>;\n\n set(key: string, value: CacheValue, options?: CacheSetOptions): Promise<void>;\n\n del(key: string): Promise<void>;\n\n /**\n * Cierra conexiones si aplica.\n */\n close(): Promise<void>;\n}\n\nexport class NoopCacheProvider implements CacheProvider {\n readonly kind = \"noop\" as const;\n\n async get(_key: string): Promise<CacheValue | null> {\n return null;\n }\n\n async set(_key: string, _value: CacheValue, _options?: CacheSetOptions): Promise<void> {\n return;\n }\n\n async del(_key: string): Promise<void> {\n return;\n }\n\n async close(): Promise<void> {\n return;\n }\n}\n\nexport type CacheProviderFactoryOptions = {\n /**\n * Si false, devuelve Noop (útil en local si no quieres Redis).\n * Default: true si hay REDIS_URL o REDIS_HOST.\n */\n enabled?: boolean;\n\n /**\n * Prefijo global opcional para keys.\n * Ej: \"getmarket:erp\"\n */\n keyPrefix?: string;\n\n /**\n * Redis options\n */\n redis?: Partial<RedisCacheProviderOptions>;\n};\n\n/**\n * Factory simple para L2 (Redis).\n * - Si no está habilitado / no hay config => Noop\n * - Si hay config => RedisCacheProvider\n */\nexport function createCacheProvider(opts: CacheProviderFactoryOptions = {}): CacheProvider {\n const envHasRedis = Boolean(process.env.REDIS_URL || process.env.REDIS_HOST);\n\n const enabled =\n typeof opts.enabled === \"boolean\" ? opts.enabled : envHasRedis;\n\n if (!enabled) return new NoopCacheProvider();\n\n // Construye options redis desde env + overrides\n const redisOpts: RedisCacheProviderOptions = {\n url: process.env.REDIS_URL,\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? Number(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n db: process.env.REDIS_DB ? Number(process.env.REDIS_DB) : undefined,\n tls: (process.env.REDIS_TLS || \"\").toLowerCase() === \"true\",\n connectTimeoutMs: process.env.REDIS_CONNECT_TIMEOUT_MS\n ? Number(process.env.REDIS_CONNECT_TIMEOUT_MS)\n : 3000,\n keyPrefix: opts.keyPrefix || process.env.REDIS_KEY_PREFIX || undefined,\n ...(opts.redis || {}),\n };\n\n return new RedisCacheProvider(redisOpts);\n}\n","// clients/cache/ttlCache.ts\ntype CacheEntry<T> = { value: T; expiresAt: number };\n\nexport class TtlCache<T> {\n private store = new Map<string, CacheEntry<T>>();\n\n constructor(private defaultTtlMs: number) {\n }\n\n get(key: string): T | null {\n const e = this.store.get(key);\n if (!e) return null;\n if (Date.now() > e.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return e.value;\n }\n\n set(key: string, value: T, ttlMs?: number): void {\n this.store.set(key, {value, expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs)});\n }\n\n del(key: string): void {\n this.store.delete(key);\n }\n}\n","// clients/cache/twoLevelCache.ts\nimport type {CacheProvider} from \"./cacheProvider\";\nimport {TtlCache} from \"./ttlCache\";\n\nexport type TwoLevelCacheOptions = {\n /**\n * TTL para L1 (in-memory).\n * Default: 2 min\n */\n ttlMsL1?: number;\n\n /**\n * TTL para L2 (redis).\n * Default: 10 min\n */\n ttlMsL2?: number;\n\n /**\n * Si quieres cachear \"no encontrado\" (null) por un TTL corto,\n * para evitar golpear upstream repetidamente.\n * Default: 0 (deshabilitado)\n */\n negativeTtlMsL1?: number;\n negativeTtlMsL2?: number;\n\n /**\n * Prefijo lógico extra por instancia (además del keyPrefix del provider).\n * Ej: \"res:variety\"\n */\n namespace?: string;\n};\n\ntype Loader<T> = () => Promise<T>;\n\nfunction safeJsonParse<T>(raw: string): T | null {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction safeJsonStringify(v: any): string | null {\n try {\n return JSON.stringify(v);\n } catch {\n return null;\n }\n}\n\nexport class TwoLevelCache<T> {\n private readonly l1: TtlCache<T | null>;\n private readonly inflight = new Map<string, Promise<T>>();\n\n constructor(\n private readonly l2: CacheProvider,\n private readonly opts: TwoLevelCacheOptions = {}\n ) {\n // El TTL real lo controla set(key, ttl), pero TTLCache necesita \"default ttl\"\n const defaultTtl = this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n this.l1 = new TtlCache<T | null>(defaultTtl);\n }\n\n private key(k: string): string {\n const ns = (this.opts.namespace || \"\").trim();\n return ns ? `${ns}:${k}` : k;\n }\n\n /**\n * GET \"best effort\": primero L1, luego L2.\n * (No llama loader)\n */\n async get(k: string): Promise<T | null> {\n const key = this.key(k);\n\n const v1 = this.l1.get(key);\n if (v1 !== undefined) return v1; // Ojo: TTLCache puede devolver null también\n\n const raw = await this.l2.get(key);\n if (!raw) return null;\n\n const parsed = safeJsonParse<T | null>(raw);\n if (parsed === null && raw !== \"null\") {\n // payload corrupto\n return null;\n }\n\n // Rehidrata L1 con ttl L1\n this.l1.set(key, parsed, this.opts.ttlMsL1);\n return parsed;\n }\n\n async set(k: string, value: T | null, ttlOverride?: { ttlMsL1?: number; ttlMsL2?: number }) {\n const key = this.key(k);\n\n const ttlL1 = ttlOverride?.ttlMsL1 ?? this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n const ttlL2 = ttlOverride?.ttlMsL2 ?? this.opts.ttlMsL2 ?? 10 * 60 * 1000;\n\n this.l1.set(key, value, ttlL1);\n\n const raw = safeJsonStringify(value);\n if (raw == null) return;\n\n await this.l2.set(key, raw, {ttlMs: ttlL2});\n }\n\n async del(k: string) {\n const key = this.key(k);\n this.l1.del?.(key as any); // si tu TtlCache no tiene del(), ignora (ver comentario abajo)\n await this.l2.del(key);\n }\n\n /**\n * Cache-aside real con L1 + L2 + loader.\n *\n * - Dedup de concurrencia por key (inflight)\n * - Soporta negative caching (si loader retorna null)\n */\n async getOrSet(\n k: string,\n loader: Loader<T | null>,\n options?: TwoLevelCacheOptions\n ): Promise<T | null> {\n const key = this.key(k);\n\n // 1) L1\n const v1 = this.l1.get(key);\n if (v1 !== undefined) return v1;\n\n // 2) L2\n const raw = await this.l2.get(key);\n if (raw) {\n const parsed = safeJsonParse<T | null>(raw);\n if (parsed !== null || raw === \"null\") {\n this.l1.set(key, parsed, options?.ttlMsL1 ?? this.opts.ttlMsL1);\n return parsed;\n }\n }\n\n // 3) Dedup inflight (anti stampede)\n if (this.inflight.has(key)) {\n return this.inflight.get(key)! as any;\n }\n\n const promise = (async () => {\n try {\n const value = await loader();\n\n const ttlMsL1 = options?.ttlMsL1 ?? this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n const ttlMsL2 = options?.ttlMsL2 ?? this.opts.ttlMsL2 ?? 10 * 60 * 1000;\n\n // negative caching\n const negL1 = options?.negativeTtlMsL1 ?? this.opts.negativeTtlMsL1 ?? 0;\n const negL2 = options?.negativeTtlMsL2 ?? this.opts.negativeTtlMsL2 ?? 0;\n\n if (value === null) {\n if (negL1 > 0) this.l1.set(key, null, negL1);\n if (negL2 > 0) await this.l2.set(key, \"null\", {ttlMs: negL2});\n return null;\n }\n\n // normal set\n this.l1.set(key, value, ttlMsL1);\n\n const rawValue = safeJsonStringify(value);\n if (rawValue != null) {\n await this.l2.set(key, rawValue, {ttlMs: ttlMsL2});\n }\n\n return value;\n } finally {\n this.inflight.delete(key);\n }\n })();\n\n this.inflight.set(key, promise as any);\n return promise;\n }\n}\n","// packages/sdk/src/cache/index.ts\nimport {createCacheProvider, type CacheProvider} from \"./cacheProvider\";\nimport {TwoLevelCache, type TwoLevelCacheOptions} from \"./twoLevelCache\";\n\nconst envInt = (v?: string, dflt: number = 0) => {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;\n};\n\nconst DEFAULT_L1_TTL_MS = envInt(process.env.CACHE_L1_DEFAULT_TTL_MS, 30_000);\nconst DEFAULT_L2_TTL_MS = envInt(process.env.CACHE_L2_DEFAULT_TTL_MS, 300_000);\nconst DEFAULT_NEG_TTL_MS = envInt(process.env.CACHE_NEGATIVE_TTL_MS, 30_000);\n\nlet l2Provider: CacheProvider | null = null;\nconst twoLevelByNamespace = new Map<string, TwoLevelCache<any>>();\n\nfunction getL2(): CacheProvider {\n if (l2Provider) return l2Provider;\n l2Provider = createCacheProvider();\n return l2Provider;\n}\n\n/**\n * Retorna (o crea) un TwoLevelCache por namespace.\n * Namespace recomendado: auth:employee | md:country | platform:tenant-resolve ...\n */\nexport function getTwoLevelCache<T = any>(\n namespace: string,\n opts: Partial<TwoLevelCacheOptions> = {}\n): TwoLevelCache<T> {\n const existing = twoLevelByNamespace.get(namespace);\n if (existing) return existing as TwoLevelCache<T>;\n\n const l2 = getL2();\n\n const cacheOptions: TwoLevelCacheOptions = {\n // ✅ TwoLevelCache prefija keys con namespace internamente\n namespace,\n\n ttlMsL1: opts.ttlMsL1 ?? DEFAULT_L1_TTL_MS,\n ttlMsL2: opts.ttlMsL2 ?? DEFAULT_L2_TTL_MS,\n\n // ✅ negative caching\n negativeTtlMsL1: opts.negativeTtlMsL1 ?? DEFAULT_NEG_TTL_MS,\n negativeTtlMsL2: opts.negativeTtlMsL2 ?? DEFAULT_NEG_TTL_MS,\n };\n\n const cache = new TwoLevelCache<T>(l2, cacheOptions);\n twoLevelByNamespace.set(namespace, cache as TwoLevelCache<any>);\n return cache;\n}\n\n/**\n * Helper: cache.getOrSet\n *\n * IMPORTANT:\n * - No prefijar manualmente la key.\n * - TwoLevelCache ya usa opts.namespace.\n */\nexport async function getOrSet<T>(\n namespace: string,\n key: string,\n loader: () => Promise<T | null>,\n opts: Partial<TwoLevelCacheOptions> = {}\n): Promise<T | null> {\n const cache = getTwoLevelCache<T>(namespace, opts);\n return cache.getOrSet(key, loader, opts);\n}\n\nexport async function closeCache(): Promise<void> {\n try {\n if (l2Provider && typeof (l2Provider as any).close === \"function\") {\n await (l2Provider as any).close();\n }\n } finally {\n l2Provider = null;\n twoLevelByNamespace.clear();\n }\n}\n\n/**\n * ✅ Re-exports públicos para consumo desde:\n * import type {TwoLevelCacheOptions} from \"@innvoid/getmarket-sdk/cache\";\n */\nexport type {TwoLevelCacheOptions, CacheProvider};\nexport {TwoLevelCache};\n","export type ClientErrorCode =\n | \"UPSTREAM_TIMEOUT\"\n | \"UPSTREAM_UNAVAILABLE\"\n | \"UPSTREAM_BAD_RESPONSE\"\n | \"UPSTREAM_NOT_FOUND\"\n | \"UPSTREAM_UNAUTHORIZED\"\n | \"UPSTREAM_FORBIDDEN\"\n | \"UPSTREAM_UNKNOWN\";\n\nexport class UpstreamError extends Error {\n public code: ClientErrorCode;\n public status?: number;\n public details?: any;\n\n constructor(message: string, code: ClientErrorCode, status?: number, details?: any) {\n super(message);\n this.name = \"UpstreamError\";\n this.code = code;\n this.status = status;\n this.details = details;\n }\n}\n\nexport function mapAxiosToUpstreamError(err: any, svc: string): UpstreamError {\n const status = err?.response?.status;\n const data = err?.response?.data;\n const isTimeout = err?.code === \"ECONNABORTED\" || String(err?.message || \"\").includes(\"timeout\");\n\n if (isTimeout) {\n return new UpstreamError(`[${svc}] timeout`, \"UPSTREAM_TIMEOUT\", 504, {cause: err?.message});\n }\n if (!err?.response) {\n return new UpstreamError(`[${svc}] unavailable`, \"UPSTREAM_UNAVAILABLE\", 503, {cause: err?.message});\n }\n if (status === 404) return new UpstreamError(`[${svc}] not found`, \"UPSTREAM_NOT_FOUND\", 404, data);\n if (status === 401) return new UpstreamError(`[${svc}] unauthorized`, \"UPSTREAM_UNAUTHORIZED\", 401, data);\n if (status === 403) return new UpstreamError(`[${svc}] forbidden`, \"UPSTREAM_FORBIDDEN\", 403, data);\n if (status >= 400 && status < 600) {\n return new UpstreamError(`[${svc}] bad response`, \"UPSTREAM_BAD_RESPONSE\", status, data);\n }\n return new UpstreamError(`[${svc}] unknown error`, \"UPSTREAM_UNKNOWN\", status, data);\n}\n","import axios, {AxiosInstance, AxiosRequestConfig} from \"axios\";\n\nexport type HttpClient = AxiosInstance;\n\nexport type HttpClientOpts = {\n baseURL: string;\n timeoutMs?: number;\n headers?: Record<string, string>;\n};\n\nexport function createHttpClient(opts: HttpClientOpts): HttpClient {\n return axios.create({\n baseURL: opts.baseURL.replace(/\\/+$/, \"\"),\n timeout: opts.timeoutMs ?? 8000,\n headers: opts.headers ?? {},\n } satisfies AxiosRequestConfig);\n}\n\n/**\n * Injects x-request-id into an Axios config while preserving existing headers.\n */\nexport function withRequestIdConfig<T extends AxiosRequestConfig = AxiosRequestConfig>(\n config: T = {} as T,\n requestId?: string\n): T {\n if (!requestId) return config;\n\n return {\n ...config,\n headers: {\n ...(config.headers ?? {}),\n \"x-request-id\": requestId,\n },\n } as T;\n}\n","// clients/internalHttp.ts\n\ntype RetryPolicy = {\n retries: number;\n baseDelayMs: number;\n retryOnStatuses: number[];\n retryOnNetworkErrors: boolean;\n};\n\ntype InternalHttpOptions = {\n baseUrl: string;\n apiKey?: string; // x-internal-api-key\n timeoutMs?: number;\n retry?: Partial<RetryPolicy>;\n};\n\nconst DEFAULT_RETRY: RetryPolicy = {\n retries: 1,\n baseDelayMs: 150,\n retryOnStatuses: [429, 502, 503, 504],\n retryOnNetworkErrors: true,\n};\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction safeJsonStringify(v: any) {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction toHeaders(init?: HeadersInit): Headers {\n return new Headers(init || {});\n}\n\nfunction isJsonContentType(contentType: string | null): boolean {\n if (!contentType) return false;\n const ct = contentType.toLowerCase();\n return ct.includes(\"application/json\") || ct.includes(\"+json\");\n}\n\nfunction isAbortError(e: any): boolean {\n return e?.name === \"AbortError\";\n}\n\nfunction withJitter(ms: number): number {\n // jitter +-20%\n const jitter = ms * 0.2;\n const delta = (Math.random() * 2 - 1) * jitter;\n return Math.max(0, Math.floor(ms + delta));\n}\n\nexport class InternalHttp {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeoutMs: number;\n private retry: RetryPolicy;\n\n constructor(opts: InternalHttpOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n\n // ✅ Default más seguro para internas (evita cascadas)\n this.timeoutMs = opts.timeoutMs ?? 4000;\n\n this.retry = {...DEFAULT_RETRY, ...(opts.retry || {})};\n }\n\n async request<T>(\n path: string,\n init: RequestInit & {\n requestId?: string;\n idempotencyKey?: string;\n headers?: HeadersInit;\n } = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n\n const baseHeaders = toHeaders(init.headers);\n\n if (!baseHeaders.has(\"Content-Type\")) baseHeaders.set(\"Content-Type\", \"application/json\");\n if (this.apiKey) baseHeaders.set(\"x-internal-api-key\", this.apiKey);\n\n if (init.requestId) baseHeaders.set(\"x-request-id\", init.requestId);\n if (init.idempotencyKey) baseHeaders.set(\"Idempotency-Key\", init.idempotencyKey);\n\n const {headers: _ignored, ...restInit} = init;\n\n const doFetchOnce = async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\n ...restInit,\n headers: baseHeaders,\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const err: any = new Error(\n `HTTP ${res.status} ${res.statusText}${text ? ` - ${text}` : \"\"}`\n );\n err.status = res.status;\n err.body = text;\n throw err;\n }\n\n if (res.status === 204) return undefined as unknown as T;\n\n const contentType = res.headers.get(\"content-type\");\n if (isJsonContentType(contentType)) {\n return (await res.json()) as T;\n }\n\n const text = await res.text().catch(() => \"\");\n return text as unknown as T;\n } finally {\n clearTimeout(timeout);\n }\n };\n\n let attempt = 0;\n\n while (true) {\n try {\n return await doFetchOnce();\n } catch (e: any) {\n attempt++;\n\n const status = e?.status;\n const retryableStatus = !!status && this.retry.retryOnStatuses.includes(status);\n\n const retryableNetwork =\n this.retry.retryOnNetworkErrors &&\n (isAbortError(e) || !status); // sin status suele ser red/dns/timeout\n\n const isRetryable = retryableStatus || retryableNetwork;\n\n if (!isRetryable || attempt > this.retry.retries) {\n console.error(\n `[InternalHttp] request failed: ${url} attempt=${attempt} status=${status ?? \"n/a\"} err=${e?.message\n } body=${safeJsonStringify(e?.body)}`\n );\n throw e;\n }\n\n const backoff = withJitter(this.retry.baseDelayMs * attempt);\n await sleep(backoff);\n }\n }\n }\n}\n","// packages/sdk/src/constants.ts\nexport const HEADER_REQUEST_ID = \"x-request-id\";\n\nexport const HEADER_COMPANY_UID = \"x-company\";\nexport const HEADER_BRANCH_UID = \"x-branch\";\nexport const HEADER_EMPLOYEE_UID = \"x-employee-uid\";\n\nexport const HEADER_INTERNAL_API_KEY = \"x-internal-api-key\";\nexport const HEADER_AUTHORIZATION = \"authorization\";\n","// packages/sdk/src/parse.ts\nimport {\n HEADER_BRANCH_UID,\n HEADER_COMPANY_UID,\n HEADER_EMPLOYEE_UID,\n HEADER_REQUEST_ID,\n} from \"./constants\";\n\nexport type RequestContext = {\n requestId?: string | null;\n company_uid?: string | null;\n branch_uid?: string | null;\n employee_uid?: string | null;\n};\n\nfunction normalizeHeaderValue(v: unknown): string | null {\n if (typeof v !== \"string\") return null;\n const s = v.trim();\n if (!s) return null;\n\n // ✅ NO-LEGACY: bloquea JSON en headers\n if (s.startsWith(\"{\") || s.startsWith(\"[\") || s.includes('\"')) return null;\n\n // Evitar valores demasiado cortos (basura)\n if (s.length < 6) return null;\n\n return s;\n}\n\n/**\n * Lee header aunque venga en mayúsculas/minúsculas (Express suele bajar a lower-case).\n */\nfunction h(headers: Record<string, any>, key: string): unknown {\n return headers[key] ?? headers[key.toLowerCase()] ?? headers[key.toUpperCase()];\n}\n\n/**\n * ✅ NO-LEGACY:\n * - x-company: <UID>\n * - x-branch: <UID>\n * - x-employee-uid: <UID> (opcional; NO reemplaza JWT)\n * - x-request-id: string (opcional)\n */\nexport function getRequestContextFromHeaders(headers: Record<string, any>): RequestContext {\n return {\n requestId: normalizeHeaderValue(h(headers, HEADER_REQUEST_ID)) ?? null,\n company_uid: normalizeHeaderValue(h(headers, HEADER_COMPANY_UID)) ?? null,\n branch_uid: normalizeHeaderValue(h(headers, HEADER_BRANCH_UID)) ?? null,\n employee_uid: normalizeHeaderValue(h(headers, HEADER_EMPLOYEE_UID)) ?? null,\n };\n}\n","// sdk/src/middlewares/parseHeaders.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {getRequestContextFromHeaders} from \"../headers\";\n\n/**\n * ✅ NO-LEGACY / ESTÁNDAR:\n * - Lee SOLO x-company y x-branch (UIDs planos)\n * - Setea req.context = { company_uid, branch_uid }\n * - NO toca req.auth (auth lo setea authentication/requireAuth)\n */\nexport default function parseHeaders(req: Request, _res: Response, next: NextFunction) {\n (req as any).context = getRequestContextFromHeaders(req.headers as any);\n next();\n}\n","// middlewares/requestId.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {randomUUID, randomBytes} from \"crypto\";\n\nexport const REQUEST_ID_HEADER = \"x-request-id\";\nexport const REQUEST_ID_HEADER_ALT = \"x-requestid\";\nexport const RESPONSE_REQUEST_ID_HEADER = \"X-Request-Id\";\n\n// Si quieres IDs más cortos (opcional). Por defecto usamos UUID.\nfunction nanoidLike(len = 21) {\n return randomBytes(16).toString(\"base64url\").slice(0, len);\n}\n\nexport default function requestId(req: Request, res: Response, next: NextFunction) {\n const headerId = (req.headers[REQUEST_ID_HEADER] || req.headers[REQUEST_ID_HEADER_ALT]) as\n | string\n | undefined;\n\n // ✅ estándar único: usa UUID (o cambia a nanoidLike() si prefieres corto)\n const id = headerId?.trim() || randomUUID();\n\n // ✅ estándar único (no legacy)\n (req as any).requestId = id;\n res.locals.requestId = id;\n\n // ✅ respuesta\n res.setHeader(RESPONSE_REQUEST_ID_HEADER, id);\n\n next();\n}\n","import type {Request, Response, NextFunction} from \"express\";\nimport fs from \"fs\";\nimport crypto from \"crypto\";\nimport {sendError} from \"./respond\";\nimport {HEADER_INTERNAL_API_KEY} from \"../headers\";\n\nfunction readSecretFile(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction splitKeys(v?: string | null): string[] {\n if (!v) return [];\n return v.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction getExpectedKeys(): string[] {\n const fileKey = readSecretFile(process.env.INTERNAL_API_KEY_FILE);\n const envKey = (process.env.INTERNAL_API_KEY || \"\").trim();\n const raw = fileKey || envKey;\n return splitKeys(raw);\n}\n\nfunction extractToken(req: Request): string | null {\n const apiKey = (req.header(HEADER_INTERNAL_API_KEY) || \"\").trim();\n return apiKey || null;\n}\n\nfunction safeEquals(a: string, b: string): boolean {\n const aa = Buffer.from(a);\n const bb = Buffer.from(b);\n if (aa.length !== bb.length) return false;\n return crypto.timingSafeEqual(aa, bb);\n}\n\nexport default function internalAuth(req: Request, res: Response, next: NextFunction) {\n const token = extractToken(req);\n\n if (!token) {\n return sendError(req, res, 401, \"UNAUTHORIZED\", `Missing internal api key (${HEADER_INTERNAL_API_KEY})`);\n }\n\n const expectedKeys = getExpectedKeys();\n if (expectedKeys.length === 0) {\n return sendError(\n req,\n res,\n 500,\n \"MISCONFIGURED_INTERNAL_AUTH\",\n \"Internal api key not configured (INTERNAL_API_KEY or INTERNAL_API_KEY_FILE)\"\n );\n }\n\n const ok = expectedKeys.some((k) => safeEquals(token, k));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Invalid internal api key\");\n }\n\n return next();\n}\n","// packages/sdk/src/middleware/respond.ts\nimport type {Request, Response} from \"express\";\n\nexport function sendOk<T>(_req: Request, res: Response, data: T, statusCode = 200) {\n return res.status(statusCode).json({ok: true, data, requestId: res.locals?.requestId ?? null});\n}\n\nexport function sendError(\n _req: Request,\n res: Response,\n statusCode: number,\n code: string,\n message: string,\n details?: any\n) {\n return res.status(statusCode).json({\n ok: false,\n error: {code, message, ...(details !== undefined ? {details} : {})},\n requestId: res.locals?.requestId ?? null,\n });\n}\n","// packages/sdk/src/middlewares/authorization.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {sendError} from \"./respond\";\n\ntype AuthRole = string | { code?: string; name?: string };\ntype AuthPermission = string | { code?: string; name?: string };\n\ntype AuthShape = {\n roles?: AuthRole[];\n permissions?: AuthPermission[];\n denied_permissions?: AuthPermission[];\n};\n\nfunction getAuth(req: Request): AuthShape {\n return ((req as any).auth ?? {}) as AuthShape;\n}\n\nfunction normalizeCode(v: any): string | null {\n if (!v) return null;\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return v.code || v.name || null;\n return null;\n}\n\nfunction rolesSet(auth: AuthShape): Set<string> {\n const out = new Set<string>();\n for (const r of auth.roles || []) {\n const c = normalizeCode(r);\n if (c) out.add(c);\n }\n return out;\n}\n\nfunction permsSet(list?: AuthPermission[]): Set<string> {\n const out = new Set<string>();\n for (const p of list || []) {\n const c = normalizeCode(p);\n if (c) out.add(c);\n }\n return out;\n}\n\n/**\n * 401 si no existe req.auth (contexto auth).\n * Útil para proteger rutas donde SIEMPRE debe existir auth.\n */\nexport function requireAuthContext() {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!(req as any).auth) {\n return sendError(req, res, 401, \"UNAUTHORIZED\", \"Missing auth context\");\n }\n return next();\n };\n}\n\n/**\n * Helper: SYS_ADMIN bypass (por defecto activo)\n */\nfunction isSysAdmin(auth: AuthShape, sysAdminRole: string) {\n const have = rolesSet(auth);\n return have.has(sysAdminRole);\n}\n\n/**\n * Requiere TODOS los permisos indicados.\n * Regla: denied_permissions siempre gana sobre permissions.\n *\n * options:\n * - sysAdminBypass: default true\n * - sysAdminRole: default \"SYS_ADMIN\"\n */\nexport function requirePermissions(\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const missing = perms.filter((p) => !allow.has(p));\n if (missing.length) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions\", {\n missing,\n mode: \"ALL\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere AL MENOS 1 permiso de la lista (ANY/OR).\n * Regla: denied_permissions siempre gana.\n */\nexport function requireAnyPermission(\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre (si alguno requerido está denegado explícitamente)\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const ok = perms.some((p) => allow.has(p));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Permission denied\", {\n required: perms,\n mode: \"ANY\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere al menos 1 rol (ANY/OR).\n * options:\n * - sysAdminBypass: default true\n * - sysAdminRole: default \"SYS_ADMIN\"\n */\nexport function requireRoles(\n roles: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n // SYS_ADMIN bypass aplica también aquí\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const have = rolesSet(auth);\n if (!roles.some((r) => have.has(r))) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Role not allowed\", {\n required: roles,\n mode: \"ANY\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere (roles ANY) OR (permissions ANY).\n * deny_permissions siempre gana sobre permissions.\n */\nexport function requireRolesOrAnyPermission(\n roles: string[],\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const haveRoles = rolesSet(auth);\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre (si cualquiera de los permisos evaluados está denegado explícitamente)\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const okRole = roles.some((r) => haveRoles.has(r));\n const okPerm = perms.some((p) => allow.has(p));\n\n if (!okRole && !okPerm) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Access denied\", {\n roles,\n permissions: perms,\n mode: \"ROLES_OR_PERMS_ANY\",\n });\n }\n\n return next();\n };\n}\n","import fs from \"fs\";\nimport jwt, {JwtPayload} from \"jsonwebtoken\";\n\nfunction readFileIfExists(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\n/**\n * ✅ Keys viven en getmarket-stack:\n * - JWT_PUBLIC_KEY_PATH=/run/secrets/jwtRS256.key.pub (recomendado)\n * - fallback env AUTH_JWT_PUBLIC_KEY / AUTH_RSA_PUBLIC_KEY\n */\nexport function readRs256PublicKey(): string {\n const fromFile = readFileIfExists(process.env.JWT_PUBLIC_KEY_PATH);\n if (fromFile) return fromFile;\n\n const fromEnv = String(process.env.AUTH_JWT_PUBLIC_KEY || process.env.AUTH_RSA_PUBLIC_KEY || \"\")\n .replace(/\\\\n/g, \"\\n\")\n .trim();\n\n if (fromEnv) return fromEnv;\n\n throw new Error(\"Missing RS256 public key (JWT_PUBLIC_KEY_PATH / AUTH_JWT_PUBLIC_KEY / AUTH_RSA_PUBLIC_KEY)\");\n}\n\nexport function verifyBackendJwtRS256(raw: string): JwtPayload {\n const publicKey = readRs256PublicKey();\n\n const audience = process.env.JWT_AUDIENCE || process.env.AUTH_JWT_AUDIENCE || \"getmarket.api\";\n const issuer = process.env.JWT_ISSUER || process.env.AUTH_JWT_ISSUER || \"getmarket-auth\";\n\n // ✅ SOLO RS256\n return jwt.verify(raw, publicKey, {\n algorithms: [\"RS256\"],\n audience,\n issuer,\n }) as JwtPayload;\n}\n","import type {NextFunction, Response} from \"express\";\nimport {verifyBackendJwtRS256} from \"./jwt\";\nimport type {AuthContext, AuthMiddlewareOptions} from \"./types\";\n\nfunction getBearerToken(req: any): string | null {\n const auth = String(req.headers?.authorization || \"\");\n if (!auth.startsWith(\"Bearer \")) return null;\n const token = auth.slice(7).trim();\n return token.length ? token : null;\n}\n\nfunction normalizeUid(v: any): string | null {\n const s = String(v ?? \"\").trim();\n return s.length ? s : null;\n}\n\n/**\n * ✅ Middleware estándar:\n * - Solo Authorization: Bearer\n * - Solo RS256\n * - Cero legacy\n * - Hidrata vía hook (OBLIGATORIO)\n */\nexport function createAuthMiddleware(opts: AuthMiddlewareOptions) {\n const {subject, allowFirebaseIdToken = false, requireSubject = true, hydrate} = opts;\n\n return async (req: any, res: Response, next: NextFunction) => {\n const token = getBearerToken(req);\n if (!token) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_MISSING_TOKEN\",\n message: \"Missing Authorization Bearer token\",\n });\n }\n\n // Contexto desde parseHeaders (SDK) -> req.context\n const headerCtx = (req as any).context || {};\n const company_uid = normalizeUid(headerCtx.company_uid);\n const branch_uid = normalizeUid(headerCtx.branch_uid);\n\n // 1) RS256 backend JWT\n try {\n const decoded: any = verifyBackendJwtRS256(token);\n\n const baseCtx: AuthContext = {\n tokenType: \"backend\",\n subject,\n company_uid: company_uid ?? undefined,\n branch_uid: branch_uid ?? undefined,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions) ? decoded.denied_permissions : [],\n session: {\n jti: decoded?.jti,\n device_id: decoded?.device_id,\n expires_at: decoded?.exp,\n },\n };\n\n // ✅ hydrate obligatorio\n const hydrated = await hydrate({decoded, req, subject, company_uid, branch_uid});\n Object.assign(baseCtx, hydrated);\n\n if (requireSubject) {\n if (subject === \"employee\" && !baseCtx.employee) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMPLOYEE_NOT_FOUND\",\n message: \"Employee not resolved by hydrator\",\n });\n }\n if (subject === \"customer\" && !baseCtx.customer) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_CUSTOMER_NOT_FOUND\",\n message: \"Customer not resolved by hydrator\",\n });\n }\n }\n\n (req as any).auth = baseCtx;\n return next();\n } catch {\n // 2) Firebase opcional\n if (!allowFirebaseIdToken) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n\n try {\n const {default: admin} = await import(\"firebase-admin\");\n const firebaseDecoded = await admin.auth().verifyIdToken(token);\n\n if (firebaseDecoded.email && firebaseDecoded.email_verified === false) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMAIL_NOT_VERIFIED\",\n message: \"Email not verified\",\n });\n }\n\n (req as any).auth = {\n tokenType: \"backend\",\n subject,\n firebase: firebaseDecoded,\n company_uid: company_uid ?? undefined,\n branch_uid: branch_uid ?? undefined,\n companies: [],\n roles: [],\n permissions: [],\n denied_permissions: [],\n } satisfies AuthContext;\n\n return next();\n } catch {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n }\n };\n}\n","// packages/sdk/src/auth/authentication.ts\nimport type {NextFunction, Response} from \"express\";\nimport admin from \"firebase-admin\";\nimport jwt, {JwtPayload} from \"jsonwebtoken\";\nimport fs from \"fs\";\n\ntype Subject = \"employee\" | \"customer\";\ntype TokenType = \"backend\";\n\nexport interface AuthContext {\n tokenType: TokenType;\n subject: Subject;\n\n // ✅ UID-first canonical\n employee_uid?: string;\n customer_uid?: string;\n\n // Opcional (puede venir embebido o ser ref mínimo)\n employee?: any;\n customer?: any;\n\n company_uid?: string;\n branch_uid?: string;\n\n company?: any;\n branch?: any;\n companies?: any[];\n\n roles?: any[];\n permissions?: any[];\n denied_permissions?: any[];\n\n session?: { jti?: string; device_id?: string; expires_at?: number };\n firebase?: admin.auth.DecodedIdToken;\n}\n\n/**\n * ✅ ÚNICO estándar:\n * - Authorization: Bearer <token>\n */\nfunction getBearerToken(req: any): string | null {\n const auth = String(req.headers?.authorization || \"\");\n if (!auth.startsWith(\"Bearer \")) return null;\n const token = auth.slice(7).trim();\n return token.length ? token : null;\n}\n\nfunction readPublicKey(): string {\n const publicKeyPath = process.env.JWT_PUBLIC_KEY_PATH;\n const publicKeyEnv = process.env.AUTH_JWT_PUBLIC_KEY || process.env.AUTH_RSA_PUBLIC_KEY || \"\";\n\n if (publicKeyPath) {\n const v = fs.readFileSync(publicKeyPath, \"utf8\").trim();\n if (v) return v;\n }\n\n const envKey = publicKeyEnv.replace(/\\\\n/g, \"\\n\").trim();\n if (envKey) return envKey;\n\n throw new Error(\"Missing RS256 public key (JWT_PUBLIC_KEY_PATH / AUTH_JWT_PUBLIC_KEY / AUTH_RSA_PUBLIC_KEY)\");\n}\n\nfunction verifyBackendJwtRS256(raw: string): JwtPayload {\n const publicKey = readPublicKey();\n const audience = process.env.JWT_AUDIENCE || process.env.AUTH_JWT_AUDIENCE || \"getmarket.api\";\n const issuer = process.env.JWT_ISSUER || process.env.AUTH_JWT_ISSUER || \"getmarket-auth\";\n\n return jwt.verify(raw, publicKey, {\n algorithms: [\"RS256\"],\n audience,\n issuer,\n }) as JwtPayload;\n}\n\nfunction normalizeUid(v: any): string | null {\n const s = String(v ?? \"\").trim();\n return s.length ? s : null;\n}\n\nfunction deriveCompanyBranch(decoded: any, companyUid: string | null, branchUid: string | null) {\n const companiesFromToken = Array.isArray(decoded?.companies) ? decoded.companies : [];\n\n const company =\n decoded?.company ??\n (companyUid ? companiesFromToken.find((c: any) => c?.uid === companyUid) : null) ??\n null;\n\n const branch =\n decoded?.branch ??\n (branchUid && company?.branches ? (company.branches || []).find((b: any) => b?.uid === branchUid) : null) ??\n null;\n\n return {companiesFromToken, company, branch};\n}\n\n/**\n * ✅ UID-first extractors\n * - decoded.employee_uid / decoded.customer_uid\n * - decoded.sub = \"emp:<uid>\" / \"cus:<uid>\"\n */\nfunction extractEmployeeUid(decoded: any): string | null {\n const direct = normalizeUid(decoded?.employee_uid);\n if (direct) return direct;\n\n const sub = normalizeUid(decoded?.sub);\n if (!sub) return null;\n\n const m = /^emp:(.+)$/i.exec(sub);\n return m?.[1] ? normalizeUid(m[1]) : null;\n}\n\nfunction extractCustomerUid(decoded: any): string | null {\n const direct = normalizeUid(decoded?.customer_uid);\n if (direct) return direct;\n\n const sub = normalizeUid(decoded?.sub);\n if (!sub) return null;\n\n const m = /^cus:(.+)$/i.exec(sub);\n return m?.[1] ? normalizeUid(m[1]) : null;\n}\n\nexport function createAuthMiddleware(opts: { subject: Subject; allowFirebaseIdToken?: boolean }) {\n const {subject, allowFirebaseIdToken = false} = opts;\n\n return async (req: any, res: Response, next: NextFunction) => {\n const token = getBearerToken(req);\n if (!token) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_MISSING_TOKEN\",\n message: \"Missing Authorization Bearer token\",\n });\n }\n\n // 1) Backend JWT RS256\n try {\n const decoded: any = verifyBackendJwtRS256(token);\n\n const headerCtx = (req as any).context || {};\n const companyUid = normalizeUid(headerCtx.company_uid);\n const branchUid = normalizeUid(headerCtx.branch_uid);\n\n const {companiesFromToken, company, branch} = deriveCompanyBranch(decoded, companyUid, branchUid);\n\n const ctx: AuthContext = {\n tokenType: \"backend\",\n subject,\n\n company_uid: companyUid ?? undefined,\n branch_uid: branchUid ?? undefined,\n\n companies: companiesFromToken,\n company,\n branch,\n\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions) ? decoded.denied_permissions : [],\n\n session: {\n jti: decoded?.jti,\n device_id: decoded?.device_id,\n expires_at: decoded?.exp,\n },\n };\n\n if (subject === \"employee\") {\n const employee_uid = extractEmployeeUid(decoded);\n if (!employee_uid) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMPLOYEE_UID_MISSING\",\n message: \"employee_uid missing in token (expected employee_uid or sub=emp:<uid>)\",\n });\n }\n ctx.employee_uid = employee_uid;\n\n // ✅ employee embebido es opcional; si no viene, dejamos ref mínimo\n const embedded = decoded?.employee ?? decoded?.user ?? null;\n ctx.employee = embedded && typeof embedded === \"object\"\n ? embedded\n : {uid: employee_uid, email: decoded?.email ?? null};\n } else {\n const customer_uid = extractCustomerUid(decoded);\n if (!customer_uid) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_CUSTOMER_UID_MISSING\",\n message: \"customer_uid missing in token (expected customer_uid or sub=cus:<uid>)\",\n });\n }\n ctx.customer_uid = customer_uid;\n\n const embedded = decoded?.customer ?? null;\n ctx.customer = embedded && typeof embedded === \"object\"\n ? embedded\n : {uid: customer_uid};\n }\n\n req.auth = ctx;\n return next();\n } catch {\n // 2) Firebase opcional\n if (!allowFirebaseIdToken) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n\n try {\n const firebaseDecoded = await admin.auth().verifyIdToken(token);\n\n if (firebaseDecoded.email && firebaseDecoded.email_verified === false) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMAIL_NOT_VERIFIED\",\n message: \"Email not verified\",\n });\n }\n\n const headerCtx = (req as any).context || {};\n const companyUid = normalizeUid(headerCtx.company_uid);\n const branchUid = normalizeUid(headerCtx.branch_uid);\n\n req.auth = {\n tokenType: \"backend\",\n subject,\n firebase: firebaseDecoded,\n company_uid: companyUid ?? undefined,\n branch_uid: branchUid ?? undefined,\n companies: [],\n roles: [],\n permissions: [],\n denied_permissions: [],\n };\n\n return next();\n } catch {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n }\n };\n}\n\nexport const authEmployeeRequired = createAuthMiddleware({subject: \"employee\", allowFirebaseIdToken: false});\nexport const authCustomerRequired = createAuthMiddleware({subject: \"customer\", allowFirebaseIdToken: false});\nexport const authEmployeeAllowFirebase = createAuthMiddleware({subject: \"employee\", allowFirebaseIdToken: true});\nexport const authCustomerAllowFirebase = createAuthMiddleware({subject: \"customer\", allowFirebaseIdToken: true});\n","// packages/sdk/src/middlewares/guards.ts\nimport type {Request, Response, NextFunction, RequestHandler} from \"express\";\nimport parseHeaders from \"./parseHeaders\";\nimport {authEmployeeRequired} from \"../auth\";\nimport {sendError} from \"./respond\";\n\ntype RoleShape = string | { code?: string; name?: string };\ntype PermShape = string | { code?: string; name?: string };\n\nfunction normalizeRole(r: RoleShape): string | null {\n if (!r) return null;\n if (typeof r === \"string\") return r;\n return r.code || r.name || null;\n}\n\nfunction normalizePerm(p: PermShape): string | null {\n if (!p) return null;\n if (typeof p === \"string\") return p;\n return p.code || p.name || null;\n}\n\nfunction isSysAdmin(roles: RoleShape[] | undefined): boolean {\n if (!Array.isArray(roles)) return false;\n return roles.some((r) => normalizeRole(r) === \"SYS_ADMIN\");\n}\n\nfunction getAuth(req: Request) {\n return ((req as any).auth ?? {}) as {\n roles?: RoleShape[];\n permissions?: PermShape[];\n denied_permissions?: PermShape[];\n };\n}\n\nfunction permissionSets(auth: ReturnType<typeof getAuth>) {\n const allow = new Set<string>((auth.permissions ?? []).map(normalizePerm).filter(Boolean) as string[]);\n const deny = new Set<string>((auth.denied_permissions ?? []).map(normalizePerm).filter(Boolean) as string[]);\n return {allow, deny};\n}\n\nfunction roleSet(auth: ReturnType<typeof getAuth>) {\n return new Set<string>((auth.roles ?? []).map(normalizeRole).filter(Boolean) as string[]);\n}\n\n/**\n * ✅ SysAdmin bypass OR (ANY) permissions\n * - Si tiene alguno de los permisos => OK\n * - denied_permissions gana siempre\n */\nexport function allowSysAdminOrAnyPermission(...perms: string[]): RequestHandler[] {\n const required = (perms ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n\n for (const p of required) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {denied: p});\n }\n }\n\n const ok = required.some((p) => allow.has(p));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions (ANY)\", {required});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SysAdmin bypass OR (ALL) permissions (AND)\n */\nexport function allowSysAdminOrPermissionsAll(...perms: string[]): RequestHandler[] {\n const required = (perms ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n\n for (const p of required) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {denied: p});\n }\n }\n\n const missing = required.filter((p) => !allow.has(p));\n if (missing.length) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions (ALL)\", {required, missing});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SysAdmin bypass OR roles (ANY)\n */\nexport function allowSysAdminOrRoles(...roles: string[]): RequestHandler[] {\n const required = (roles ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const have = roleSet(auth);\n\n const ok = required.some((r) => have.has(r));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Role not allowed\", {required});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SYS_ADMIN bypass OR (ANY) roles OR (ANY) permissions\n * - denied_permissions siempre gana\n */\nexport function allowSysAdminOrRolesOrAnyPermission(\n roles: string | string[],\n permissions: string | string[]\n): RequestHandler[] {\n const requiredRoles = (Array.isArray(roles) ? roles : [roles]).filter(Boolean);\n const requiredPerms = (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n for (const p of requiredPerms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied: ${p}`, {permission: p});\n }\n }\n\n const haveRoles = roleSet(auth);\n if (requiredRoles.some((r) => haveRoles.has(r))) return next();\n\n if (requiredPerms.some((p) => allow.has(p))) return next();\n\n return sendError(req, res, 403, \"FORBIDDEN\", \"Permission denied\", {\n roles: requiredRoles,\n permissions: requiredPerms,\n mode: \"ROLES_OR_ANY_PERMISSION\",\n });\n },\n ];\n}\n\n/**\n * ✅ Helper específico Auth:\n * Rol AUTH_ADMIN o permiso fino (y SYS_ADMIN bypass)\n */\nexport function allowAuthAdminOrPerm(permission: string): RequestHandler[] {\n return allowSysAdminOrRolesOrAnyPermission([\"AUTH_ADMIN\"], [permission]);\n}\n","// packages/sdk/src/internalHttpClient.ts\nimport fs from \"fs\";\nimport {\n HEADER_INTERNAL_API_KEY,\n HEADER_REQUEST_ID,\n HEADER_COMPANY_UID,\n HEADER_BRANCH_UID,\n HEADER_EMPLOYEE_UID\n} from \"./headers\";\nimport type {RequestContext} from \"./headers\";\n\nexport type InternalHttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport type InternalHttpClientOptions = {\n baseURL: string; // ej: http://platform:3010\n apiPrefix?: string; // ej: /internal/v1\n timeoutMs?: number; // default 15000\n retries?: number; // default 2\n retryDelayMs?: number; // default 250\n apiKey?: string | null; // override opcional\n};\n\nexport type InternalRequestOptions = {\n method: InternalHttpMethod;\n path: string; // \"/tenants/provision\"\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: any; // JSON\n headers?: Record<string, string | undefined>;\n ctx?: RequestContext | null;\n\n idempotencyKey?: string | null;\n\n expectJson?: boolean; // default true\n};\n\nexport class InternalHttpError extends Error {\n status: number;\n code: string;\n details: any;\n\n constructor(status: number, code: string, message: string, details?: any) {\n super(message);\n this.status = status;\n this.code = code;\n this.details = details ?? null;\n }\n}\n\nfunction readSecretFile(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction splitKeys(v?: string | null): string[] {\n if (!v) return [];\n return v.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * ✅ MISMA lógica que internalAuth.ts:\n * - INTERNAL_API_KEY_FILE tiene prioridad\n * - fallback a INTERNAL_API_KEY\n * - permite CSV\n *\n * Nota: Para enviar, usamos la primera key disponible.\n */\nfunction getInternalApiKey(override?: string | null): string | null {\n if (override && override.trim()) return override.trim();\n\n const fileKey = readSecretFile(process.env.INTERNAL_API_KEY_FILE);\n const envKey = (process.env.INTERNAL_API_KEY || \"\").trim();\n const raw = fileKey || envKey;\n const keys = splitKeys(raw);\n return keys[0] || null;\n}\n\nfunction normalizeBaseURL(baseURL: string): string {\n const b = (baseURL || \"\").trim();\n if (!b) throw new Error(\"InternalHttpClient: baseURL is required\");\n return b.replace(/\\/+$/g, \"\");\n}\n\nfunction normalizePrefix(prefix?: string): string {\n const p = (prefix || \"\").trim();\n if (!p) return \"\";\n const withSlash = p.startsWith(\"/\") ? p : `/${p}`;\n return withSlash.replace(/\\/+$/g, \"\");\n}\n\nfunction buildQuery(query?: InternalRequestOptions[\"query\"]): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === null || v === undefined) continue;\n params.set(k, String(v));\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * ✅ Propaga contexto estándar (SDK)\n * - x-request-id\n * - x-company\n * - x-branch\n * - x-employee-uid\n */\nexport function buildInternalHeaders(\n ctx?: RequestContext | null,\n extra?: Record<string, string | undefined>,\n idempotencyKey?: string | null\n): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (ctx?.requestId) h[HEADER_REQUEST_ID] = String(ctx.requestId);\n if (ctx?.company_uid) h[HEADER_COMPANY_UID] = String(ctx.company_uid);\n if (ctx?.branch_uid) h[HEADER_BRANCH_UID] = String(ctx.branch_uid);\n if (ctx?.employee_uid) h[HEADER_EMPLOYEE_UID] = String(ctx.employee_uid);\n\n if (idempotencyKey && idempotencyKey.trim()) {\n h[\"Idempotency-Key\"] = idempotencyKey.trim();\n }\n\n for (const [k, v] of Object.entries(extra || {})) {\n if (v === undefined) continue;\n const vv = String(v).trim();\n if (!vv) continue;\n h[k] = vv;\n }\n\n return h;\n}\n\nasync function sleep(ms: number) {\n await new Promise((r) => setTimeout(r, ms));\n}\n\nfunction shouldRetry(status: number | null, err: any): boolean {\n if (err?.name === \"AbortError\") return true;\n if (!status) return true;\n if (status >= 500) return true;\n if (status === 429) return true;\n return false;\n}\n\nasync function safeReadJson(res: Response): Promise<any> {\n const text = await res.text();\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return {raw: text};\n }\n}\n\n/**\n * Cliente interno universal (fetch)\n */\nexport function createInternalHttpClient(opts: InternalHttpClientOptions) {\n const baseURL = normalizeBaseURL(opts.baseURL);\n const apiPrefix = normalizePrefix(opts.apiPrefix);\n const timeoutMs = typeof opts.timeoutMs === \"number\" ? opts.timeoutMs : 15000;\n const retries = typeof opts.retries === \"number\" ? opts.retries : 2;\n const retryDelayMs = typeof opts.retryDelayMs === \"number\" ? opts.retryDelayMs : 250;\n\n const apiKey = getInternalApiKey(opts.apiKey ?? null);\n if (!apiKey) {\n throw new Error(\n \"InternalHttpClient: INTERNAL_API_KEY or INTERNAL_API_KEY_FILE is required to call internal endpoints.\"\n );\n }\n\n async function request<T = any>(r: InternalRequestOptions): Promise<T> {\n const path = (r.path || \"\").trim();\n if (!path.startsWith(\"/\")) {\n throw new Error(`InternalHttpClient: path must start with '/': ${path}`);\n }\n\n const url = `${baseURL}${apiPrefix}${path}${buildQuery(r.query)}`;\n\n const headers = buildInternalHeaders(r.ctx ?? null, r.headers, r.idempotencyKey ?? null);\n if (apiKey != null) {\n headers[HEADER_INTERNAL_API_KEY] = apiKey;\n }\n\n const method = r.method;\n const expectJson = r.expectJson !== false;\n\n const body =\n method === \"GET\" || method === \"DELETE\"\n ? undefined\n : r.body !== undefined\n ? JSON.stringify(r.body)\n : undefined;\n\n let attempt = 0;\n let lastErr: any = null;\n\n while (attempt <= retries) {\n attempt++;\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers,\n body,\n signal: ac.signal,\n });\n\n clearTimeout(to);\n\n if (res.ok) {\n if (!expectJson) return (undefined as any) as T;\n const data = await safeReadJson(res);\n return data as T;\n }\n\n const errBody = await safeReadJson(res);\n const status = res.status;\n\n if (attempt <= retries && shouldRetry(status, null)) {\n lastErr = new InternalHttpError(\n status,\n \"INTERNAL_HTTP_RETRY\",\n `Retryable internal HTTP error (${status})`,\n {url, status, response: errBody, attempt}\n );\n await sleep(retryDelayMs * attempt);\n continue;\n }\n\n throw new InternalHttpError(\n status,\n \"INTERNAL_HTTP_ERROR\",\n `Internal HTTP error (${status})`,\n {url, status, response: errBody}\n );\n } catch (e: any) {\n clearTimeout(to);\n\n if (attempt <= retries && shouldRetry(null, e)) {\n lastErr = e;\n await sleep(retryDelayMs * attempt);\n continue;\n }\n\n if (e instanceof InternalHttpError) throw e;\n\n throw new InternalHttpError(\n 0,\n \"INTERNAL_HTTP_NETWORK_ERROR\",\n e?.message || \"Internal HTTP network error\",\n {url, attempt, error: String(e)}\n );\n }\n }\n\n throw lastErr || new InternalHttpError(0, \"INTERNAL_HTTP_FAILED\", \"Internal request failed\");\n }\n\n return {\n request,\n get: <T = any>(path: string, o?: Omit<InternalRequestOptions, \"method\" | \"path\">) =>\n request<T>({...(o || {}), method: \"GET\", path}),\n post: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"POST\", path, body}),\n put: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"PUT\", path, body}),\n patch: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"PATCH\", path, body}),\n del: <T = any>(path: string, o?: Omit<InternalRequestOptions, \"method\" | \"path\">) =>\n request<T>({...(o || {}), method: \"DELETE\", path}),\n };\n}\n","// packages/sdk/src/clients/env.ts\nimport type {ServiceClientEnv} from \"./types\";\n\nfunction must(v: string | undefined, name: string): string {\n const s = (v || \"\").trim();\n if (!s) throw new Error(`Missing env var: ${name}`);\n return s;\n}\n\nexport function readServiceEnv(prefix: string, defaults?: Partial<ServiceClientEnv>): ServiceClientEnv {\n const baseURL = (process.env[`${prefix}_BASE_URL`] || defaults?.baseURL || \"\").trim();\n const apiPrefix = (process.env[`${prefix}_API_PREFIX`] || defaults?.apiPrefix || \"/internal/v1\").trim();\n\n return {\n baseURL: must(baseURL, `${prefix}_BASE_URL`),\n apiPrefix,\n };\n}\n","// packages/sdk/src/clients/cacheFactory.ts\nimport {TwoLevelCache} from \"../cache\";\nimport {createCacheProvider} from \"../cache/cacheProvider\";\n\n/**\n * Crea un TwoLevelCache por \"namespace\" (ej: \"res:variety\")\n * - L1: in-memory (TTL corto)\n * - L2: redis (TTL medio)\n *\n * Nota: createCacheProvider ya aplica REDIS_KEY_PREFIX desde env,\n * y además TwoLevelCache agrega namespace como prefijo lógico.\n */\nexport function makeRefsCache<T>(namespace: string) {\n const l2 = createCacheProvider(); // redis o noop según env\n return new TwoLevelCache<T>(l2, {\n namespace,\n ttlMsL1: 30_000,\n ttlMsL2: 300_000,\n negativeTtlMsL1: 30_000,\n negativeTtlMsL2: 30_000,\n });\n}\n","// packages/sdk/src/clients/bulkRefsClient.ts\nimport type {RequestContext} from \"../headers\";\nimport {createInternalHttpClient} from \"../internalHttpClient\";\nimport type {BulkRefsResponse, BulkUidsRequest, InternalBulkRefsOptions} from \"./types\";\nimport {makeRefsCache} from \"./cacheFactory\";\n\nfunction uniq(arr: string[]) {\n return Array.from(new Set(arr.filter(Boolean)));\n}\n\nexport function createBulkRefsClient<TRef extends { uid: string }>(args: {\n namespace: string; // cache namespace e.g. \"res:variety\"\n baseURL: string;\n apiPrefix: string;\n path: string; // e.g. \"/refs/varieties\"\n defaultTtlMsL1?: number;\n defaultTtlMsL2?: number;\n}) {\n const http = createInternalHttpClient({\n baseURL: args.baseURL,\n apiPrefix: args.apiPrefix,\n });\n\n // ✅ cache tipado\n const cache = makeRefsCache<TRef>(args.namespace);\n\n async function bulkRefs(\n uids: string[],\n opts?: InternalBulkRefsOptions\n ): Promise<BulkRefsResponse<TRef>> {\n const list = uniq(uids);\n if (list.length === 0) {\n return {ok: true, refs: [], meta: {requested: 0, returned: 0, missing: []}};\n }\n\n // 1) cache hits\n const hits: TRef[] = [];\n const missing: string[] = [];\n\n for (const uid of list) {\n const v = await cache.get(uid); // ✅ sin genéricos\n if (v) hits.push(v);\n else missing.push(uid);\n }\n\n // 2) fetch missing\n let fetched: TRef[] = [];\n if (missing.length) {\n const resp = await http.post<BulkRefsResponse<TRef>>(\n args.path,\n {uids: missing} as BulkUidsRequest,\n {\n ctx: (opts?.ctx ?? null) as RequestContext | null,\n }\n );\n\n const refs = (resp.refs ?? resp.items ?? []) as TRef[];\n fetched = refs;\n\n const ttlMsL1 = opts?.ttlMsL1 ?? args.defaultTtlMsL1;\n const ttlMsL2 = opts?.ttlMsL2 ?? args.defaultTtlMsL2;\n\n for (const ref of refs) {\n const uid = String(ref?.uid || \"\").trim();\n if (!uid) continue;\n\n await cache.set(uid, ref, {\n ttlMsL1,\n ttlMsL2,\n });\n }\n }\n\n const all = [...hits, ...fetched];\n\n // missing final (uids requested but not returned)\n const returnedSet = new Set(all.map((r) => String(r?.uid || \"\")));\n const missingFinal = list.filter((u) => !returnedSet.has(u));\n\n return {\n ok: true,\n refs: all,\n meta: {\n requested: list.length,\n returned: all.length,\n missing: missingFinal,\n },\n };\n }\n\n return {bulkRefs};\n}\n","// packages/sdk/src/clients/platformClient.ts\nimport type {PlatformResolveTenantResponse, PlatformServiceCode} from \"@innvoid/getmarket-contracts\";\nimport type {RequestContext} from \"../headers\";\nimport {createInternalHttpClient} from \"../internalHttpClient\";\nimport {makeRefsCache} from \"./cacheFactory\";\n\nexport function createPlatformClient(env: { baseURL: string; apiPrefix: string }) {\n const http = createInternalHttpClient(env);\n\n // ✅ cache tipado\n const cache = makeRefsCache<PlatformResolveTenantResponse>(\"platform:tenant\");\n\n async function resolveTenant(\n input: { company_uid: string; service: PlatformServiceCode },\n ctx?: RequestContext | null\n ) {\n const key = `${input.company_uid}:${input.service}`;\n\n const cached = await cache.get(key); // ✅ sin genéricos\n if (cached) return cached;\n\n const resp = await http.post<PlatformResolveTenantResponse>(\n \"/tenants/resolve\",\n input,\n {ctx: ctx ?? null}\n );\n\n await cache.set(key, resp);\n return resp;\n }\n\n return {resolveTenant};\n}\n","// packages/sdk/src/clients/resClient.ts\nimport type {\n ResVarietyRef,\n ResVarietiesRefsResponse,\n ResResourceRef,\n ResResourcesRefsResponse,\n ResCategoryRef,\n ResCategoriesRefsResponse,\n ResAttributeRef,\n ResAttributesRefsResponse,\n ResAttributeOptionRef,\n ResAttributeOptionsRefsResponse,\n ResAttributeValueRef,\n ResAttributeValuesRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createResClient() {\n const env = readServiceEnv(\"RES\", {apiPrefix: \"/internal/v1\"});\n\n const varieties = createBulkRefsClient<ResVarietyRef>({\n namespace: \"res:variety\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/varieties\",\n });\n\n const resources = createBulkRefsClient<ResResourceRef>({\n namespace: \"res:resource\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/resources\",\n });\n\n const categories = createBulkRefsClient<ResCategoryRef>({\n namespace: \"res:category\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/categories\",\n });\n\n const attributes = createBulkRefsClient<ResAttributeRef>({\n namespace: \"res:attribute\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attributes\",\n });\n\n const attributeOptions = createBulkRefsClient<ResAttributeOptionRef>({\n namespace: \"res:attribute_option\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attribute-options\",\n });\n\n const attributeValues = createBulkRefsClient<ResAttributeValueRef>({\n namespace: \"res:attribute_value\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attribute-values\",\n });\n\n return {\n varietiesRefs: (uids: string[], opts?: any) =>\n varieties.bulkRefs(uids, opts) as Promise<ResVarietiesRefsResponse>,\n\n resourcesRefs: (uids: string[], opts?: any) =>\n resources.bulkRefs(uids, opts) as Promise<ResResourcesRefsResponse>,\n\n categoriesRefs: (uids: string[], opts?: any) =>\n categories.bulkRefs(uids, opts) as Promise<ResCategoriesRefsResponse>,\n\n attributesRefs: (uids: string[], opts?: any) =>\n attributes.bulkRefs(uids, opts) as Promise<ResAttributesRefsResponse>,\n\n attributeOptionsRefs: (uids: string[], opts?: any) =>\n attributeOptions.bulkRefs(uids, opts) as Promise<ResAttributeOptionsRefsResponse>,\n\n attributeValuesRefs: (uids: string[], opts?: any) =>\n attributeValues.bulkRefs(uids, opts) as Promise<ResAttributeValuesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/mdClient.ts\nimport type {\n MdMeasureRef,\n MdMeasuresRefsResponse,\n MdMeasureTypeRef,\n MdMeasureTypesRefsResponse,\n MdCountryRef,\n MdCountriesRefsResponse,\n MdCurrencyRef,\n MdCurrenciesRefsResponse,\n MdRegionRef,\n MdRegionsRefsResponse,\n MdCommuneRef,\n MdCommunesRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMdClient() {\n const env = readServiceEnv(\"MD\", {apiPrefix: \"/internal/v1\"});\n\n const measures = createBulkRefsClient<MdMeasureRef>({\n namespace: \"md:measure\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/measures\",\n });\n\n const measureTypes = createBulkRefsClient<MdMeasureTypeRef>({\n namespace: \"md:measure_type\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/measure-types\",\n });\n\n const countries = createBulkRefsClient<MdCountryRef>({\n namespace: \"md:country\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/countries\",\n });\n\n const currencies = createBulkRefsClient<MdCurrencyRef>({\n namespace: \"md:currency\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/currencies\",\n });\n\n const regions = createBulkRefsClient<MdRegionRef>({\n namespace: \"md:region\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/regions\",\n });\n\n const communes = createBulkRefsClient<MdCommuneRef>({\n namespace: \"md:commune\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/communes\",\n });\n\n return {\n measuresRefs: (uids: string[], opts?: any) =>\n measures.bulkRefs(uids, opts) as Promise<MdMeasuresRefsResponse>,\n\n measureTypesRefs: (uids: string[], opts?: any) =>\n measureTypes.bulkRefs(uids, opts) as Promise<MdMeasureTypesRefsResponse>,\n\n countriesRefs: (uids: string[], opts?: any) =>\n countries.bulkRefs(uids, opts) as Promise<MdCountriesRefsResponse>,\n\n currenciesRefs: (uids: string[], opts?: any) =>\n currencies.bulkRefs(uids, opts) as Promise<MdCurrenciesRefsResponse>,\n\n regionsRefs: (uids: string[], opts?: any) =>\n regions.bulkRefs(uids, opts) as Promise<MdRegionsRefsResponse>,\n\n communesRefs: (uids: string[], opts?: any) =>\n communes.bulkRefs(uids, opts) as Promise<MdCommunesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/fisClient.ts\nimport type {\n UID,\n FisProfileRef,\n FisProfilesRefsResponse,\n FisDocumentRef,\n FisDocumentsRefsResponse,\n FisSnapshotRef,\n FisSnapshotsRefsResponse,\n FisSubmissionRef,\n FisSubmissionsRefsResponse,\n FisFolioPoolRef,\n FisFolioPoolsRefsResponse,\n FisTaxRuleRef,\n FisTaxRulesRefsResponse,\n FisCalculateRequest,\n FisCalculateResponse,\n FisTaxCalculateRequest,\n FisTaxCalculateResponse,\n FisBuildDocumentRequest,\n FisBuildDocumentResponse,\n FisSignDocumentRequest,\n FisSignDocumentResponse,\n FisSubmitDocumentRequest,\n FisSubmitDocumentResponse,\n FisCancelDocumentRequest,\n FisCancelDocumentResponse,\n FisReserveFolioRequest,\n FisReserveFolioResponse,\n FisConsumeFolioRequest,\n FisConsumeFolioResponse,\n FisDocumentsQueryRequest,\n FisDocumentsQueryResponse,\n FisSubmissionRetryRequest,\n FisSubmissionRetryResponse,\n FisDocumentResponse,\n FisSnapshotResponse,\n FisSubmissionResponse,\n FisStatusEventsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\nimport {createHttpClient, type HttpClient} from \"../core\";\n\nexport function createFisClient() {\n const env = readServiceEnv(\"FIS\", {apiPrefix: \"/internal/v1\"});\n\n const http: HttpClient = createHttpClient({\n baseURL: `${env.baseURL}${env.apiPrefix}`,\n timeoutMs: 8000,\n });\n\n const profiles = createBulkRefsClient<FisProfileRef>({\n namespace: \"fis:profile\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/profiles\",\n });\n\n const documents = createBulkRefsClient<FisDocumentRef>({\n namespace: \"fis:document\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/documents\",\n });\n\n const snapshots = createBulkRefsClient<FisSnapshotRef>({\n namespace: \"fis:snapshot\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/snapshots\",\n });\n\n const submissions = createBulkRefsClient<FisSubmissionRef>({\n namespace: \"fis:submission\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/submissions\",\n });\n\n const folioPools = createBulkRefsClient<FisFolioPoolRef>({\n namespace: \"fis:folio_pool\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/folio-pools\",\n });\n\n const taxRules = createBulkRefsClient<FisTaxRuleRef>({\n namespace: \"fis:tax_rule\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/tax-rules\",\n });\n\n return {\n // -----------------------------------------------------------------------\n // Bulk refs\n // -----------------------------------------------------------------------\n profilesRefs: (uids: string[], opts?: any) =>\n profiles.bulkRefs(uids, opts) as Promise<FisProfilesRefsResponse>,\n\n documentsRefs: (uids: string[], opts?: any) =>\n documents.bulkRefs(uids, opts) as Promise<FisDocumentsRefsResponse>,\n\n snapshotsRefs: (uids: string[], opts?: any) =>\n snapshots.bulkRefs(uids, opts) as Promise<FisSnapshotsRefsResponse>,\n\n submissionsRefs: (uids: string[], opts?: any) =>\n submissions.bulkRefs(uids, opts) as Promise<FisSubmissionsRefsResponse>,\n\n folioPoolsRefs: (uids: string[], opts?: any) =>\n folioPools.bulkRefs(uids, opts) as Promise<FisFolioPoolsRefsResponse>,\n\n taxRulesRefs: (uids: string[], opts?: any) =>\n taxRules.bulkRefs(uids, opts) as Promise<FisTaxRulesRefsResponse>,\n\n // -----------------------------------------------------------------------\n // Fiscal calculation / build / lifecycle\n // -----------------------------------------------------------------------\n async calculate(body: FisCalculateRequest): Promise<FisCalculateResponse> {\n const {data} = await http.post<FisCalculateResponse>(\"/calculate\", body);\n return data;\n },\n\n async calculateTaxes(body: FisTaxCalculateRequest): Promise<FisTaxCalculateResponse> {\n const {data} = await http.post<FisTaxCalculateResponse>(\"/tax/calculate\", body);\n return data;\n },\n\n async buildDocument(body: FisBuildDocumentRequest): Promise<FisBuildDocumentResponse> {\n const {data} = await http.post<FisBuildDocumentResponse>(\"/documents\", body);\n return data;\n },\n\n async signDocument(body: FisSignDocumentRequest): Promise<FisSignDocumentResponse> {\n const {data} = await http.post<FisSignDocumentResponse>(\n `/documents/${body.document_uid}/sign`,\n body\n );\n return data;\n },\n\n async submitDocument(body: FisSubmitDocumentRequest): Promise<FisSubmitDocumentResponse> {\n const {data} = await http.post<FisSubmitDocumentResponse>(\n `/documents/${body.document_uid}/submit`,\n body\n );\n return data;\n },\n\n async cancelDocument(body: FisCancelDocumentRequest): Promise<FisCancelDocumentResponse> {\n const {data} = await http.post<FisCancelDocumentResponse>(\n `/documents/${body.document_uid}/cancel`,\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Folios / series\n // -----------------------------------------------------------------------\n async reserveFolio(body: FisReserveFolioRequest): Promise<FisReserveFolioResponse> {\n const {data} = await http.post<FisReserveFolioResponse>(\"/folios/reserve\", body);\n return data;\n },\n\n async consumeFolio(body: FisConsumeFolioRequest): Promise<FisConsumeFolioResponse> {\n const {data} = await http.post<FisConsumeFolioResponse>(\"/folios/consume\", body);\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Queries / detail\n // -----------------------------------------------------------------------\n async queryDocuments(body: FisDocumentsQueryRequest): Promise<FisDocumentsQueryResponse> {\n const {data} = await http.post<FisDocumentsQueryResponse>(\"/documents/query\", body);\n return data;\n },\n\n async getDocumentByUid(uid: UID): Promise<FisDocumentResponse> {\n const {data} = await http.get<FisDocumentResponse>(`/documents/${uid}`);\n return data;\n },\n\n async getSnapshotByUid(uid: UID): Promise<FisSnapshotResponse> {\n const {data} = await http.get<FisSnapshotResponse>(`/snapshots/${uid}`);\n return data;\n },\n\n async getSubmissionByUid(uid: UID): Promise<FisSubmissionResponse> {\n const {data} = await http.get<FisSubmissionResponse>(`/submissions/${uid}`);\n return data;\n },\n\n async getStatusEventsByDocumentUid(documentUid: UID): Promise<FisStatusEventsResponse> {\n const {data} = await http.get<FisStatusEventsResponse>(\n `/documents/${documentUid}/status-events`\n );\n return data;\n },\n\n async retrySubmission(body: FisSubmissionRetryRequest): Promise<FisSubmissionRetryResponse> {\n const {data} = await http.post<FisSubmissionRetryResponse>(\"/submissions/retry\", body);\n return data;\n },\n };\n}\n","// packages/sdk/src/clients/mediaClient.ts\nimport type {MediaFileRef, MediaFilesRefsResponse} from \"@innvoid/getmarket-contracts\";\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMediaClient() {\n const env = readServiceEnv(\"MEDIA\", {apiPrefix: \"/internal/v1\"});\n\n const files = createBulkRefsClient<MediaFileRef>({\n namespace: \"media:file\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/files\",\n });\n\n return {\n filesRefs: (uids: string[], opts?: any) =>\n files.bulkRefs(uids, opts) as Promise<MediaFilesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/mkpClient.ts\nimport type {\n MkpPublicationRef,\n MkpPublicationsRefsResponse,\n MkpEventRef,\n MkpEventsRefsResponse,\n MkpPromotionRef,\n MkpPromotionsRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMkpClient() {\n const env = readServiceEnv(\"MKP\", {apiPrefix: \"/internal/v1\"});\n\n const publications = createBulkRefsClient<MkpPublicationRef>({\n namespace: \"mkp:publication\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/publications\",\n });\n\n const events = createBulkRefsClient<MkpEventRef>({\n namespace: \"mkp:event\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/events\",\n });\n\n const promotions = createBulkRefsClient<MkpPromotionRef>({\n namespace: \"mkp:promotion\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/promotions\",\n });\n\n return {\n publicationsRefs: (uids: string[], opts?: any) =>\n publications.bulkRefs(uids, opts) as Promise<MkpPublicationsRefsResponse>,\n\n eventsRefs: (uids: string[], opts?: any) =>\n events.bulkRefs(uids, opts) as Promise<MkpEventsRefsResponse>,\n\n promotionsRefs: (uids: string[], opts?: any) =>\n promotions.bulkRefs(uids, opts) as Promise<MkpPromotionsRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/payClient.ts\nimport type {\n UID,\n PayCreateIntentRequest,\n PayCreateIntentResponse,\n PayConfirmIntentRequest,\n PayConfirmIntentResponse,\n PayStartAttemptRequest,\n PayStartAttemptResponse,\n PayIntentResponse,\n PayMethodsAvailabilityQuery,\n PayMethodsAvailabilityResponse,\n PayPaymentsQueryRequest,\n PayPaymentsQueryResponse,\n PayAllocationsByTargetRequest,\n PayAllocationsByTargetResponse,\n PayIntentRef,\n PayAttemptRef,\n PayTransactionRef,\n PayRefundRef,\n PayAllocationRef,\n PayProviderAccountRef,\n PayPaymentMethodRef,\n PayIntentsRefsResponse,\n PayAttemptsRefsResponse,\n PayTransactionsRefsResponse,\n PayRefundsRefsResponse,\n PayAllocationsRefsResponse,\n PayProviderAccountsRefsResponse,\n PayPaymentMethodsRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\nimport {createHttpClient, type HttpClient} from \"../core\";\n\nexport function createPayClient() {\n const env = readServiceEnv(\"PAY\", {apiPrefix: \"/internal/v1\"});\n\n const http: HttpClient = createHttpClient({\n baseURL: `${env.baseURL}${env.apiPrefix}`,\n timeoutMs: 8000,\n });\n\n const intents = createBulkRefsClient<PayIntentRef>({\n namespace: \"pay:intent\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/intents\",\n });\n\n const attempts = createBulkRefsClient<PayAttemptRef>({\n namespace: \"pay:attempt\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attempts\",\n });\n\n const transactions = createBulkRefsClient<PayTransactionRef>({\n namespace: \"pay:transaction\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/transactions\",\n });\n\n const refunds = createBulkRefsClient<PayRefundRef>({\n namespace: \"pay:refund\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/refunds\",\n });\n\n const allocations = createBulkRefsClient<PayAllocationRef>({\n namespace: \"pay:allocation\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/allocations\",\n });\n\n const providerAccounts = createBulkRefsClient<PayProviderAccountRef>({\n namespace: \"pay:provider_account\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/provider-accounts\",\n });\n\n const paymentMethods = createBulkRefsClient<PayPaymentMethodRef>({\n namespace: \"pay:payment_method\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/payment-methods\",\n });\n\n return {\n // -----------------------------------------------------------------------\n // Payment intents\n // -----------------------------------------------------------------------\n async createIntent(body: PayCreateIntentRequest): Promise<PayCreateIntentResponse> {\n const {data} = await http.post<PayCreateIntentResponse>(\"/payment-intents\", body);\n return data;\n },\n\n async getIntentByUid(uid: UID): Promise<PayIntentResponse> {\n const {data} = await http.get<PayIntentResponse>(`/payment-intents/${uid}`);\n return data;\n },\n\n async confirmIntent(body: PayConfirmIntentRequest): Promise<PayConfirmIntentResponse> {\n const {data} = await http.post<PayConfirmIntentResponse>(\n `/payment-intents/${body.intent_uid}/confirm`,\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Attempts\n // -----------------------------------------------------------------------\n async startAttempt(body: PayStartAttemptRequest): Promise<PayStartAttemptResponse> {\n const {data} = await http.post<PayStartAttemptResponse>(\"/attempts\", body);\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Methods / availability\n // -----------------------------------------------------------------------\n async getAvailableMethods(\n params: PayMethodsAvailabilityQuery\n ): Promise<PayMethodsAvailabilityResponse> {\n const {data} = await http.get<PayMethodsAvailabilityResponse>(\"/methods/available\", {\n params,\n });\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Queries / allocations\n // -----------------------------------------------------------------------\n async queryPayments(body: PayPaymentsQueryRequest): Promise<PayPaymentsQueryResponse> {\n const {data} = await http.post<PayPaymentsQueryResponse>(\"/payments/query\", body);\n return data;\n },\n\n async getAllocationsByTarget(\n body: PayAllocationsByTargetRequest\n ): Promise<PayAllocationsByTargetResponse> {\n const {data} = await http.post<PayAllocationsByTargetResponse>(\n \"/allocations/by-target\",\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Bulk refs\n // -----------------------------------------------------------------------\n intentsRefs: (uids: string[], opts?: any) =>\n intents.bulkRefs(uids, opts) as Promise<PayIntentsRefsResponse>,\n\n attemptsRefs: (uids: string[], opts?: any) =>\n attempts.bulkRefs(uids, opts) as Promise<PayAttemptsRefsResponse>,\n\n transactionsRefs: (uids: string[], opts?: any) =>\n transactions.bulkRefs(uids, opts) as Promise<PayTransactionsRefsResponse>,\n\n refundsRefs: (uids: string[], opts?: any) =>\n refunds.bulkRefs(uids, opts) as Promise<PayRefundsRefsResponse>,\n\n allocationsRefs: (uids: string[], opts?: any) =>\n allocations.bulkRefs(uids, opts) as Promise<PayAllocationsRefsResponse>,\n\n providerAccountsRefs: (uids: string[], opts?: any) =>\n providerAccounts.bulkRefs(uids, opts) as Promise<PayProviderAccountsRefsResponse>,\n\n paymentMethodsRefs: (uids: string[], opts?: any) =>\n paymentMethods.bulkRefs(uids, opts) as Promise<PayPaymentMethodsRefsResponse>,\n };\n}\n","// packages/sdk/src/common/ids.ts\nimport {v7 as uuidv7, v4 as uuidv4, validate as uuidValidate, version as uuidVersion} from \"uuid\";\n\n/**\n * UID canónico GetMarket.\n * - Por defecto genera UUIDv7 (time-ordered).\n * - Durante transición, aceptamos v4 y v7 como válidos.\n */\nexport function newUid(): string {\n return uuidv7();\n}\n\n/** Útil si necesitas generar v4 puntualmente (idealmente no usarlo). */\nexport function newUidV4(): string {\n return uuidv4();\n}\n\n/** Validación para inputs que vengan de DB/requests durante migración. */\nexport function isUid(value: string): boolean {\n return uuidValidate(value) && (uuidVersion(value) === 7 || uuidVersion(value) === 4);\n}\n"],"mappings":"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","names":["createAuthMiddleware","axios","requestId","safeJsonStringify","text","import_crypto","fs","crypto","import_fs","fs","jwt","admin","import_jsonwebtoken","import_fs","getBearerToken","fs","verifyBackendJwtRS256","jwt","normalizeUid","createAuthMiddleware","admin","isSysAdmin","getAuth","import_fs","readSecretFile","fs","splitKeys","h","sleep","uuidv7","uuidv4","uuidValidate","uuidVersion"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cache/redisCacheProvider.ts","../src/cache/cacheProvider.ts","../src/cache/ttlCache.ts","../src/cache/twoLevelCache.ts","../src/cache/index.ts","../src/core/errors.ts","../src/core/http.ts","../src/core/internalHttp.ts","../src/headers/constants.ts","../src/headers/parse.ts","../src/middlewares/parseHeaders.ts","../src/middlewares/requestId.ts","../src/middlewares/internalAuth.ts","../src/middlewares/respond.ts","../src/middlewares/authorization.ts","../src/auth/jwt.ts","../src/auth/middleware.ts","../src/auth/authentication.ts","../src/middlewares/guards.ts","../src/internalHttpClient.ts","../src/clients/env.ts","../src/clients/cacheFactory.ts","../src/clients/bulkRefsClient.ts","../src/clients/platformClient.ts","../src/clients/resClient.ts","../src/clients/mdClient.ts","../src/clients/fisClient.ts","../src/clients/mediaClient.ts","../src/clients/mkpClient.ts","../src/clients/payClient.ts","../src/common/ids.ts"],"sourcesContent":["// packages/sdk/src/index.ts\nexport * from \"./cache\";\nexport * from \"./core\";\nexport * from \"./headers\";\nexport * from \"./middlewares\";\nexport * from \"./auth\";\n\nexport * from \"./internalHttpClient\";\n\nexport * from \"./clients\";\n\nexport * from \"./common/ids\";\n","// clients/cache/redisCacheProvider.ts\nimport {createClient, type RedisClientType} from \"redis\";\nimport type {CacheProvider, CacheSetOptions, CacheValue} from \"./cacheProvider\";\n\nexport type RedisCacheProviderOptions = {\n url?: string;\n\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n\n tls?: boolean;\n\n connectTimeoutMs?: number;\n\n keyPrefix?: string;\n};\n\nfunction buildRedisUrl(opts: RedisCacheProviderOptions): string | undefined {\n if (opts.url && opts.url.trim()) return opts.url.trim();\n\n if (!opts.host) return undefined;\n const port = opts.port ?? 6379;\n const db = opts.db ?? 0;\n\n const auth = opts.password ? `:${encodeURIComponent(opts.password)}@` : \"\";\n return `redis://${auth}${opts.host}:${port}/${db}`;\n}\n\nexport class RedisCacheProvider implements CacheProvider {\n readonly kind = \"redis\" as const;\n\n // ✅ tip \"amplio\" para evitar TS2322 por typings genéricos\n private client: RedisClientType<any, any, any>;\n private ready = false;\n private readonly keyPrefix?: string;\n\n constructor(private readonly opts: RedisCacheProviderOptions) {\n const url = buildRedisUrl(opts);\n if (!url) {\n throw new Error(\"[RedisCacheProvider] Missing redis config (REDIS_URL or REDIS_HOST)\");\n }\n\n this.keyPrefix = opts.keyPrefix?.trim() || undefined;\n\n this.client = createClient({\n url,\n socket: {\n connectTimeout: opts.connectTimeoutMs ?? 3000,\n tls: opts.tls ? true : undefined,\n },\n }) as RedisClientType<any, any, any>;\n\n this.client.on(\"error\", (err: unknown) => {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as any).message)\n : String(err);\n\n console.error(\"[redis] error\", msg, err);\n });\n }\n\n private k(key: string): string {\n if (!this.keyPrefix) return key;\n return `${this.keyPrefix}:${key}`;\n }\n\n private async ensureConnected() {\n if (this.ready) return;\n await this.client.connect();\n this.ready = true;\n }\n\n async get(key: string): Promise<CacheValue | null> {\n await this.ensureConnected();\n const v = (await this.client.get(this.k(key))) as string | null;\n return v ?? null;\n }\n\n async set(key: string, value: CacheValue, options?: CacheSetOptions): Promise<void> {\n await this.ensureConnected();\n\n const ttlMs = options?.ttlMs;\n if (ttlMs && ttlMs > 0) {\n await this.client.set(this.k(key), value, {PX: ttlMs});\n return;\n }\n\n await this.client.set(this.k(key), value);\n }\n\n async del(key: string): Promise<void> {\n await this.ensureConnected();\n await this.client.del(this.k(key));\n }\n\n async close(): Promise<void> {\n try {\n if (this.ready) await this.client.quit();\n } catch {\n try {\n await this.client.disconnect();\n } catch {\n }\n } finally {\n this.ready = false;\n }\n }\n}\n","// clients/cache/cacheProvider.ts\nimport type {RedisCacheProviderOptions} from \"./redisCacheProvider\";\nimport {RedisCacheProvider} from \"./redisCacheProvider\";\n\nexport type CacheValue = string;\n\nexport type CacheSetOptions = {\n ttlMs?: number; // TTL en milisegundos (PX)\n};\n\nexport interface CacheProvider {\n readonly kind: \"redis\" | \"noop\";\n\n get(key: string): Promise<CacheValue | null>;\n\n set(key: string, value: CacheValue, options?: CacheSetOptions): Promise<void>;\n\n del(key: string): Promise<void>;\n\n /**\n * Cierra conexiones si aplica.\n */\n close(): Promise<void>;\n}\n\nexport class NoopCacheProvider implements CacheProvider {\n readonly kind = \"noop\" as const;\n\n async get(_key: string): Promise<CacheValue | null> {\n return null;\n }\n\n async set(_key: string, _value: CacheValue, _options?: CacheSetOptions): Promise<void> {\n return;\n }\n\n async del(_key: string): Promise<void> {\n return;\n }\n\n async close(): Promise<void> {\n return;\n }\n}\n\nexport type CacheProviderFactoryOptions = {\n /**\n * Si false, devuelve Noop (útil en local si no quieres Redis).\n * Default: true si hay REDIS_URL o REDIS_HOST.\n */\n enabled?: boolean;\n\n /**\n * Prefijo global opcional para keys.\n * Ej: \"getmarket:erp\"\n */\n keyPrefix?: string;\n\n /**\n * Redis options\n */\n redis?: Partial<RedisCacheProviderOptions>;\n};\n\n/**\n * Factory simple para L2 (Redis).\n * - Si no está habilitado / no hay config => Noop\n * - Si hay config => RedisCacheProvider\n */\nexport function createCacheProvider(opts: CacheProviderFactoryOptions = {}): CacheProvider {\n const envHasRedis = Boolean(process.env.REDIS_URL || process.env.REDIS_HOST);\n\n const enabled =\n typeof opts.enabled === \"boolean\" ? opts.enabled : envHasRedis;\n\n if (!enabled) return new NoopCacheProvider();\n\n // Construye options redis desde env + overrides\n const redisOpts: RedisCacheProviderOptions = {\n url: process.env.REDIS_URL,\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? Number(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n db: process.env.REDIS_DB ? Number(process.env.REDIS_DB) : undefined,\n tls: (process.env.REDIS_TLS || \"\").toLowerCase() === \"true\",\n connectTimeoutMs: process.env.REDIS_CONNECT_TIMEOUT_MS\n ? Number(process.env.REDIS_CONNECT_TIMEOUT_MS)\n : 3000,\n keyPrefix: opts.keyPrefix || process.env.REDIS_KEY_PREFIX || undefined,\n ...(opts.redis || {}),\n };\n\n return new RedisCacheProvider(redisOpts);\n}\n","// clients/cache/ttlCache.ts\ntype CacheEntry<T> = { value: T; expiresAt: number };\n\nexport class TtlCache<T> {\n private store = new Map<string, CacheEntry<T>>();\n\n constructor(private defaultTtlMs: number) {\n }\n\n get(key: string): T | null {\n const e = this.store.get(key);\n if (!e) return null;\n if (Date.now() > e.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return e.value;\n }\n\n set(key: string, value: T, ttlMs?: number): void {\n this.store.set(key, {value, expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs)});\n }\n\n del(key: string): void {\n this.store.delete(key);\n }\n}\n","// clients/cache/twoLevelCache.ts\nimport type {CacheProvider} from \"./cacheProvider\";\nimport {TtlCache} from \"./ttlCache\";\n\nexport type TwoLevelCacheOptions = {\n /**\n * TTL para L1 (in-memory).\n * Default: 2 min\n */\n ttlMsL1?: number;\n\n /**\n * TTL para L2 (redis).\n * Default: 10 min\n */\n ttlMsL2?: number;\n\n /**\n * Si quieres cachear \"no encontrado\" (null) por un TTL corto,\n * para evitar golpear upstream repetidamente.\n * Default: 0 (deshabilitado)\n */\n negativeTtlMsL1?: number;\n negativeTtlMsL2?: number;\n\n /**\n * Prefijo lógico extra por instancia (además del keyPrefix del provider).\n * Ej: \"res:variety\"\n */\n namespace?: string;\n};\n\ntype Loader<T> = () => Promise<T>;\n\nfunction safeJsonParse<T>(raw: string): T | null {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction safeJsonStringify(v: any): string | null {\n try {\n return JSON.stringify(v);\n } catch {\n return null;\n }\n}\n\nexport class TwoLevelCache<T> {\n private readonly l1: TtlCache<T | null>;\n private readonly inflight = new Map<string, Promise<T>>();\n\n constructor(\n private readonly l2: CacheProvider,\n private readonly opts: TwoLevelCacheOptions = {}\n ) {\n // El TTL real lo controla set(key, ttl), pero TTLCache necesita \"default ttl\"\n const defaultTtl = this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n this.l1 = new TtlCache<T | null>(defaultTtl);\n }\n\n private key(k: string): string {\n const ns = (this.opts.namespace || \"\").trim();\n return ns ? `${ns}:${k}` : k;\n }\n\n /**\n * GET \"best effort\": primero L1, luego L2.\n * (No llama loader)\n */\n async get(k: string): Promise<T | null> {\n const key = this.key(k);\n\n const v1 = this.l1.get(key);\n if (v1 !== undefined) return v1; // Ojo: TTLCache puede devolver null también\n\n const raw = await this.l2.get(key);\n if (!raw) return null;\n\n const parsed = safeJsonParse<T | null>(raw);\n if (parsed === null && raw !== \"null\") {\n // payload corrupto\n return null;\n }\n\n // Rehidrata L1 con ttl L1\n this.l1.set(key, parsed, this.opts.ttlMsL1);\n return parsed;\n }\n\n async set(k: string, value: T | null, ttlOverride?: { ttlMsL1?: number; ttlMsL2?: number }) {\n const key = this.key(k);\n\n const ttlL1 = ttlOverride?.ttlMsL1 ?? this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n const ttlL2 = ttlOverride?.ttlMsL2 ?? this.opts.ttlMsL2 ?? 10 * 60 * 1000;\n\n this.l1.set(key, value, ttlL1);\n\n const raw = safeJsonStringify(value);\n if (raw == null) return;\n\n await this.l2.set(key, raw, {ttlMs: ttlL2});\n }\n\n async del(k: string) {\n const key = this.key(k);\n this.l1.del?.(key as any); // si tu TtlCache no tiene del(), ignora (ver comentario abajo)\n await this.l2.del(key);\n }\n\n /**\n * Cache-aside real con L1 + L2 + loader.\n *\n * - Dedup de concurrencia por key (inflight)\n * - Soporta negative caching (si loader retorna null)\n */\n async getOrSet(\n k: string,\n loader: Loader<T | null>,\n options?: TwoLevelCacheOptions\n ): Promise<T | null> {\n const key = this.key(k);\n\n // 1) L1\n const v1 = this.l1.get(key);\n if (v1 !== undefined) return v1;\n\n // 2) L2\n const raw = await this.l2.get(key);\n if (raw) {\n const parsed = safeJsonParse<T | null>(raw);\n if (parsed !== null || raw === \"null\") {\n this.l1.set(key, parsed, options?.ttlMsL1 ?? this.opts.ttlMsL1);\n return parsed;\n }\n }\n\n // 3) Dedup inflight (anti stampede)\n if (this.inflight.has(key)) {\n return this.inflight.get(key)! as any;\n }\n\n const promise = (async () => {\n try {\n const value = await loader();\n\n const ttlMsL1 = options?.ttlMsL1 ?? this.opts.ttlMsL1 ?? 2 * 60 * 1000;\n const ttlMsL2 = options?.ttlMsL2 ?? this.opts.ttlMsL2 ?? 10 * 60 * 1000;\n\n // negative caching\n const negL1 = options?.negativeTtlMsL1 ?? this.opts.negativeTtlMsL1 ?? 0;\n const negL2 = options?.negativeTtlMsL2 ?? this.opts.negativeTtlMsL2 ?? 0;\n\n if (value === null) {\n if (negL1 > 0) this.l1.set(key, null, negL1);\n if (negL2 > 0) await this.l2.set(key, \"null\", {ttlMs: negL2});\n return null;\n }\n\n // normal set\n this.l1.set(key, value, ttlMsL1);\n\n const rawValue = safeJsonStringify(value);\n if (rawValue != null) {\n await this.l2.set(key, rawValue, {ttlMs: ttlMsL2});\n }\n\n return value;\n } finally {\n this.inflight.delete(key);\n }\n })();\n\n this.inflight.set(key, promise as any);\n return promise;\n }\n}\n","// packages/sdk/src/cache/index.ts\nimport {createCacheProvider, type CacheProvider} from \"./cacheProvider\";\nimport {TwoLevelCache, type TwoLevelCacheOptions} from \"./twoLevelCache\";\n\nconst envInt = (v?: string, dflt: number = 0) => {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;\n};\n\nconst DEFAULT_L1_TTL_MS = envInt(process.env.CACHE_L1_DEFAULT_TTL_MS, 30_000);\nconst DEFAULT_L2_TTL_MS = envInt(process.env.CACHE_L2_DEFAULT_TTL_MS, 300_000);\nconst DEFAULT_NEG_TTL_MS = envInt(process.env.CACHE_NEGATIVE_TTL_MS, 30_000);\n\nlet l2Provider: CacheProvider | null = null;\nconst twoLevelByNamespace = new Map<string, TwoLevelCache<any>>();\n\nfunction getL2(): CacheProvider {\n if (l2Provider) return l2Provider;\n l2Provider = createCacheProvider();\n return l2Provider;\n}\n\n/**\n * Retorna (o crea) un TwoLevelCache por namespace.\n * Namespace recomendado: auth:employee | md:country | platform:tenant-resolve ...\n */\nexport function getTwoLevelCache<T = any>(\n namespace: string,\n opts: Partial<TwoLevelCacheOptions> = {}\n): TwoLevelCache<T> {\n const existing = twoLevelByNamespace.get(namespace);\n if (existing) return existing as TwoLevelCache<T>;\n\n const l2 = getL2();\n\n const cacheOptions: TwoLevelCacheOptions = {\n // ✅ TwoLevelCache prefija keys con namespace internamente\n namespace,\n\n ttlMsL1: opts.ttlMsL1 ?? DEFAULT_L1_TTL_MS,\n ttlMsL2: opts.ttlMsL2 ?? DEFAULT_L2_TTL_MS,\n\n // ✅ negative caching\n negativeTtlMsL1: opts.negativeTtlMsL1 ?? DEFAULT_NEG_TTL_MS,\n negativeTtlMsL2: opts.negativeTtlMsL2 ?? DEFAULT_NEG_TTL_MS,\n };\n\n const cache = new TwoLevelCache<T>(l2, cacheOptions);\n twoLevelByNamespace.set(namespace, cache as TwoLevelCache<any>);\n return cache;\n}\n\n/**\n * Helper: cache.getOrSet\n *\n * IMPORTANT:\n * - No prefijar manualmente la key.\n * - TwoLevelCache ya usa opts.namespace.\n */\nexport async function getOrSet<T>(\n namespace: string,\n key: string,\n loader: () => Promise<T | null>,\n opts: Partial<TwoLevelCacheOptions> = {}\n): Promise<T | null> {\n const cache = getTwoLevelCache<T>(namespace, opts);\n return cache.getOrSet(key, loader, opts);\n}\n\nexport async function closeCache(): Promise<void> {\n try {\n if (l2Provider && typeof (l2Provider as any).close === \"function\") {\n await (l2Provider as any).close();\n }\n } finally {\n l2Provider = null;\n twoLevelByNamespace.clear();\n }\n}\n\n/**\n * ✅ Re-exports públicos para consumo desde:\n * import type {TwoLevelCacheOptions} from \"@innvoid/getmarket-sdk/cache\";\n */\nexport type {TwoLevelCacheOptions, CacheProvider};\nexport {TwoLevelCache};\n","export type ClientErrorCode =\n | \"UPSTREAM_TIMEOUT\"\n | \"UPSTREAM_UNAVAILABLE\"\n | \"UPSTREAM_BAD_RESPONSE\"\n | \"UPSTREAM_NOT_FOUND\"\n | \"UPSTREAM_UNAUTHORIZED\"\n | \"UPSTREAM_FORBIDDEN\"\n | \"UPSTREAM_UNKNOWN\";\n\nexport class UpstreamError extends Error {\n public code: ClientErrorCode;\n public status?: number;\n public details?: any;\n\n constructor(message: string, code: ClientErrorCode, status?: number, details?: any) {\n super(message);\n this.name = \"UpstreamError\";\n this.code = code;\n this.status = status;\n this.details = details;\n }\n}\n\nexport function mapAxiosToUpstreamError(err: any, svc: string): UpstreamError {\n const status = err?.response?.status;\n const data = err?.response?.data;\n const isTimeout = err?.code === \"ECONNABORTED\" || String(err?.message || \"\").includes(\"timeout\");\n\n if (isTimeout) {\n return new UpstreamError(`[${svc}] timeout`, \"UPSTREAM_TIMEOUT\", 504, {cause: err?.message});\n }\n if (!err?.response) {\n return new UpstreamError(`[${svc}] unavailable`, \"UPSTREAM_UNAVAILABLE\", 503, {cause: err?.message});\n }\n if (status === 404) return new UpstreamError(`[${svc}] not found`, \"UPSTREAM_NOT_FOUND\", 404, data);\n if (status === 401) return new UpstreamError(`[${svc}] unauthorized`, \"UPSTREAM_UNAUTHORIZED\", 401, data);\n if (status === 403) return new UpstreamError(`[${svc}] forbidden`, \"UPSTREAM_FORBIDDEN\", 403, data);\n if (status >= 400 && status < 600) {\n return new UpstreamError(`[${svc}] bad response`, \"UPSTREAM_BAD_RESPONSE\", status, data);\n }\n return new UpstreamError(`[${svc}] unknown error`, \"UPSTREAM_UNKNOWN\", status, data);\n}\n","import axios, {AxiosInstance, AxiosRequestConfig} from \"axios\";\n\nexport type HttpClient = AxiosInstance;\n\nexport type HttpClientOpts = {\n baseURL: string;\n timeoutMs?: number;\n headers?: Record<string, string>;\n};\n\nexport function createHttpClient(opts: HttpClientOpts): HttpClient {\n return axios.create({\n baseURL: opts.baseURL.replace(/\\/+$/, \"\"),\n timeout: opts.timeoutMs ?? 8000,\n headers: opts.headers ?? {},\n } satisfies AxiosRequestConfig);\n}\n\n/**\n * Injects x-request-id into an Axios config while preserving existing headers.\n */\nexport function withRequestIdConfig<T extends AxiosRequestConfig = AxiosRequestConfig>(\n config: T = {} as T,\n requestId?: string\n): T {\n if (!requestId) return config;\n\n return {\n ...config,\n headers: {\n ...(config.headers ?? {}),\n \"x-request-id\": requestId,\n },\n } as T;\n}\n","// clients/internalHttp.ts\n\ntype RetryPolicy = {\n retries: number;\n baseDelayMs: number;\n retryOnStatuses: number[];\n retryOnNetworkErrors: boolean;\n};\n\ntype InternalHttpOptions = {\n baseUrl: string;\n apiKey?: string; // x-internal-api-key\n timeoutMs?: number;\n retry?: Partial<RetryPolicy>;\n};\n\nconst DEFAULT_RETRY: RetryPolicy = {\n retries: 1,\n baseDelayMs: 150,\n retryOnStatuses: [429, 502, 503, 504],\n retryOnNetworkErrors: true,\n};\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction safeJsonStringify(v: any) {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction toHeaders(init?: HeadersInit): Headers {\n return new Headers(init || {});\n}\n\nfunction isJsonContentType(contentType: string | null): boolean {\n if (!contentType) return false;\n const ct = contentType.toLowerCase();\n return ct.includes(\"application/json\") || ct.includes(\"+json\");\n}\n\nfunction isAbortError(e: any): boolean {\n return e?.name === \"AbortError\";\n}\n\nfunction withJitter(ms: number): number {\n // jitter +-20%\n const jitter = ms * 0.2;\n const delta = (Math.random() * 2 - 1) * jitter;\n return Math.max(0, Math.floor(ms + delta));\n}\n\nexport class InternalHttp {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeoutMs: number;\n private retry: RetryPolicy;\n\n constructor(opts: InternalHttpOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n\n // ✅ Default más seguro para internas (evita cascadas)\n this.timeoutMs = opts.timeoutMs ?? 4000;\n\n this.retry = {...DEFAULT_RETRY, ...(opts.retry || {})};\n }\n\n async request<T>(\n path: string,\n init: RequestInit & {\n requestId?: string;\n idempotencyKey?: string;\n headers?: HeadersInit;\n } = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n\n const baseHeaders = toHeaders(init.headers);\n\n if (!baseHeaders.has(\"Content-Type\")) baseHeaders.set(\"Content-Type\", \"application/json\");\n if (this.apiKey) baseHeaders.set(\"x-internal-api-key\", this.apiKey);\n\n if (init.requestId) baseHeaders.set(\"x-request-id\", init.requestId);\n if (init.idempotencyKey) baseHeaders.set(\"Idempotency-Key\", init.idempotencyKey);\n\n const {headers: _ignored, ...restInit} = init;\n\n const doFetchOnce = async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\n ...restInit,\n headers: baseHeaders,\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const err: any = new Error(\n `HTTP ${res.status} ${res.statusText}${text ? ` - ${text}` : \"\"}`\n );\n err.status = res.status;\n err.body = text;\n throw err;\n }\n\n if (res.status === 204) return undefined as unknown as T;\n\n const contentType = res.headers.get(\"content-type\");\n if (isJsonContentType(contentType)) {\n return (await res.json()) as T;\n }\n\n const text = await res.text().catch(() => \"\");\n return text as unknown as T;\n } finally {\n clearTimeout(timeout);\n }\n };\n\n let attempt = 0;\n\n while (true) {\n try {\n return await doFetchOnce();\n } catch (e: any) {\n attempt++;\n\n const status = e?.status;\n const retryableStatus = !!status && this.retry.retryOnStatuses.includes(status);\n\n const retryableNetwork =\n this.retry.retryOnNetworkErrors &&\n (isAbortError(e) || !status); // sin status suele ser red/dns/timeout\n\n const isRetryable = retryableStatus || retryableNetwork;\n\n if (!isRetryable || attempt > this.retry.retries) {\n console.error(\n `[InternalHttp] request failed: ${url} attempt=${attempt} status=${status ?? \"n/a\"} err=${e?.message\n } body=${safeJsonStringify(e?.body)}`\n );\n throw e;\n }\n\n const backoff = withJitter(this.retry.baseDelayMs * attempt);\n await sleep(backoff);\n }\n }\n }\n}\n","// packages/sdk/src/constants.ts\nexport const HEADER_REQUEST_ID = \"x-request-id\";\n\nexport const HEADER_COMPANY_UID = \"x-company\";\nexport const HEADER_BRANCH_UID = \"x-branch\";\nexport const HEADER_EMPLOYEE_UID = \"x-employee-uid\";\n\nexport const HEADER_INTERNAL_API_KEY = \"x-internal-api-key\";\nexport const HEADER_AUTHORIZATION = \"authorization\";\n","// packages/sdk/src/parse.ts\nimport {\n HEADER_BRANCH_UID,\n HEADER_COMPANY_UID,\n HEADER_EMPLOYEE_UID,\n HEADER_REQUEST_ID,\n} from \"./constants\";\n\nexport type RequestContext = {\n requestId?: string | null;\n company_uid?: string | null;\n branch_uid?: string | null;\n employee_uid?: string | null;\n};\n\nfunction normalizeHeaderValue(v: unknown): string | null {\n if (typeof v !== \"string\") return null;\n const s = v.trim();\n if (!s) return null;\n\n // ✅ NO-LEGACY: bloquea JSON en headers\n if (s.startsWith(\"{\") || s.startsWith(\"[\") || s.includes('\"')) return null;\n\n // Evitar valores demasiado cortos (basura)\n if (s.length < 6) return null;\n\n return s;\n}\n\n/**\n * Lee header aunque venga en mayúsculas/minúsculas (Express suele bajar a lower-case).\n */\nfunction h(headers: Record<string, any>, key: string): unknown {\n return headers[key] ?? headers[key.toLowerCase()] ?? headers[key.toUpperCase()];\n}\n\n/**\n * ✅ NO-LEGACY:\n * - x-company: <UID>\n * - x-branch: <UID>\n * - x-employee-uid: <UID> (opcional; NO reemplaza JWT)\n * - x-request-id: string (opcional)\n */\nexport function getRequestContextFromHeaders(headers: Record<string, any>): RequestContext {\n return {\n requestId: normalizeHeaderValue(h(headers, HEADER_REQUEST_ID)) ?? null,\n company_uid: normalizeHeaderValue(h(headers, HEADER_COMPANY_UID)) ?? null,\n branch_uid: normalizeHeaderValue(h(headers, HEADER_BRANCH_UID)) ?? null,\n employee_uid: normalizeHeaderValue(h(headers, HEADER_EMPLOYEE_UID)) ?? null,\n };\n}\n","// sdk/src/middlewares/parseHeaders.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {getRequestContextFromHeaders} from \"../headers\";\n\n/**\n * ✅ NO-LEGACY / ESTÁNDAR:\n * - Lee SOLO x-company y x-branch (UIDs planos)\n * - Setea req.context = { company_uid, branch_uid }\n * - NO toca req.auth (auth lo setea authentication/requireAuth)\n */\nexport default function parseHeaders(req: Request, _res: Response, next: NextFunction) {\n (req as any).context = getRequestContextFromHeaders(req.headers as any);\n next();\n}\n","// middlewares/requestId.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {randomUUID, randomBytes} from \"crypto\";\n\nexport const REQUEST_ID_HEADER = \"x-request-id\";\nexport const REQUEST_ID_HEADER_ALT = \"x-requestid\";\nexport const RESPONSE_REQUEST_ID_HEADER = \"X-Request-Id\";\n\n// Si quieres IDs más cortos (opcional). Por defecto usamos UUID.\nfunction nanoidLike(len = 21) {\n return randomBytes(16).toString(\"base64url\").slice(0, len);\n}\n\nexport default function requestId(req: Request, res: Response, next: NextFunction) {\n const headerId = (req.headers[REQUEST_ID_HEADER] || req.headers[REQUEST_ID_HEADER_ALT]) as\n | string\n | undefined;\n\n // ✅ estándar único: usa UUID (o cambia a nanoidLike() si prefieres corto)\n const id = headerId?.trim() || randomUUID();\n\n // ✅ estándar único (no legacy)\n (req as any).requestId = id;\n res.locals.requestId = id;\n\n // ✅ respuesta\n res.setHeader(RESPONSE_REQUEST_ID_HEADER, id);\n\n next();\n}\n","import type {Request, Response, NextFunction} from \"express\";\nimport fs from \"fs\";\nimport crypto from \"crypto\";\nimport {sendError} from \"./respond\";\nimport {HEADER_INTERNAL_API_KEY} from \"../headers\";\n\nfunction readSecretFile(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction splitKeys(v?: string | null): string[] {\n if (!v) return [];\n return v.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction getExpectedKeys(): string[] {\n const fileKey = readSecretFile(process.env.INTERNAL_API_KEY_FILE);\n const envKey = (process.env.INTERNAL_API_KEY || \"\").trim();\n const raw = fileKey || envKey;\n return splitKeys(raw);\n}\n\nfunction extractToken(req: Request): string | null {\n const apiKey = (req.header(HEADER_INTERNAL_API_KEY) || \"\").trim();\n return apiKey || null;\n}\n\nfunction safeEquals(a: string, b: string): boolean {\n const aa = Buffer.from(a);\n const bb = Buffer.from(b);\n if (aa.length !== bb.length) return false;\n return crypto.timingSafeEqual(aa, bb);\n}\n\nexport default function internalAuth(req: Request, res: Response, next: NextFunction) {\n const token = extractToken(req);\n\n if (!token) {\n return sendError(req, res, 401, \"UNAUTHORIZED\", `Missing internal api key (${HEADER_INTERNAL_API_KEY})`);\n }\n\n const expectedKeys = getExpectedKeys();\n if (expectedKeys.length === 0) {\n return sendError(\n req,\n res,\n 500,\n \"MISCONFIGURED_INTERNAL_AUTH\",\n \"Internal api key not configured (INTERNAL_API_KEY or INTERNAL_API_KEY_FILE)\"\n );\n }\n\n const ok = expectedKeys.some((k) => safeEquals(token, k));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Invalid internal api key\");\n }\n\n return next();\n}\n","// packages/sdk/src/middleware/respond.ts\nimport type {Request, Response} from \"express\";\n\nexport function sendOk<T>(_req: Request, res: Response, data: T, statusCode = 200) {\n return res.status(statusCode).json({ok: true, data, requestId: res.locals?.requestId ?? null});\n}\n\nexport function sendError(\n _req: Request,\n res: Response,\n statusCode: number,\n code: string,\n message: string,\n details?: any\n) {\n return res.status(statusCode).json({\n ok: false,\n error: {code, message, ...(details !== undefined ? {details} : {})},\n requestId: res.locals?.requestId ?? null,\n });\n}\n","// packages/sdk/src/middlewares/authorization.ts\nimport type {Request, Response, NextFunction} from \"express\";\nimport {sendError} from \"./respond\";\n\ntype AuthRole = string | { code?: string; name?: string };\ntype AuthPermission = string | { code?: string; name?: string };\n\ntype AuthShape = {\n roles?: AuthRole[];\n permissions?: AuthPermission[];\n denied_permissions?: AuthPermission[];\n};\n\nfunction getAuth(req: Request): AuthShape {\n return ((req as any).auth ?? {}) as AuthShape;\n}\n\nfunction normalizeCode(v: any): string | null {\n if (!v) return null;\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return v.code || v.name || null;\n return null;\n}\n\nfunction rolesSet(auth: AuthShape): Set<string> {\n const out = new Set<string>();\n for (const r of auth.roles || []) {\n const c = normalizeCode(r);\n if (c) out.add(c);\n }\n return out;\n}\n\nfunction permsSet(list?: AuthPermission[]): Set<string> {\n const out = new Set<string>();\n for (const p of list || []) {\n const c = normalizeCode(p);\n if (c) out.add(c);\n }\n return out;\n}\n\n/**\n * 401 si no existe req.auth (contexto auth).\n * Útil para proteger rutas donde SIEMPRE debe existir auth.\n */\nexport function requireAuthContext() {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!(req as any).auth) {\n return sendError(req, res, 401, \"UNAUTHORIZED\", \"Missing auth context\");\n }\n return next();\n };\n}\n\n/**\n * Helper: SYS_ADMIN bypass (por defecto activo)\n */\nfunction isSysAdmin(auth: AuthShape, sysAdminRole: string) {\n const have = rolesSet(auth);\n return have.has(sysAdminRole);\n}\n\n/**\n * Requiere TODOS los permisos indicados.\n * Regla: denied_permissions siempre gana sobre permissions.\n *\n * options:\n * - sysAdminBypass: default true\n * - sysAdminRole: default \"SYS_ADMIN\"\n */\nexport function requirePermissions(\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const missing = perms.filter((p) => !allow.has(p));\n if (missing.length) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions\", {\n missing,\n mode: \"ALL\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere AL MENOS 1 permiso de la lista (ANY/OR).\n * Regla: denied_permissions siempre gana.\n */\nexport function requireAnyPermission(\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre (si alguno requerido está denegado explícitamente)\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const ok = perms.some((p) => allow.has(p));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Permission denied\", {\n required: perms,\n mode: \"ANY\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere al menos 1 rol (ANY/OR).\n * options:\n * - sysAdminBypass: default true\n * - sysAdminRole: default \"SYS_ADMIN\"\n */\nexport function requireRoles(\n roles: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n // SYS_ADMIN bypass aplica también aquí\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const have = rolesSet(auth);\n if (!roles.some((r) => have.has(r))) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Role not allowed\", {\n required: roles,\n mode: \"ANY\",\n });\n }\n\n return next();\n };\n}\n\n/**\n * Requiere (roles ANY) OR (permissions ANY).\n * deny_permissions siempre gana sobre permissions.\n */\nexport function requireRolesOrAnyPermission(\n roles: string[],\n perms: string[],\n options?: { sysAdminBypass?: boolean; sysAdminRole?: string }\n) {\n const sysAdminBypass = options?.sysAdminBypass !== false;\n const sysAdminRole = options?.sysAdminRole || \"SYS_ADMIN\";\n\n return (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n\n if (sysAdminBypass && isSysAdmin(auth, sysAdminRole)) return next();\n\n const haveRoles = rolesSet(auth);\n const allow = permsSet(auth.permissions);\n const deny = permsSet(auth.denied_permissions);\n\n // deny gana siempre (si cualquiera de los permisos evaluados está denegado explícitamente)\n for (const p of perms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {\n denied: p,\n });\n }\n }\n\n const okRole = roles.some((r) => haveRoles.has(r));\n const okPerm = perms.some((p) => allow.has(p));\n\n if (!okRole && !okPerm) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Access denied\", {\n roles,\n permissions: perms,\n mode: \"ROLES_OR_PERMS_ANY\",\n });\n }\n\n return next();\n };\n}\n","import fs from \"fs\";\nimport jwt, {JwtPayload} from \"jsonwebtoken\";\n\nfunction readFileIfExists(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\nexport function getBearerToken(req: any): string | null {\n const auth = String(req?.headers?.authorization || \"\");\n if (!auth.startsWith(\"Bearer \")) return null;\n const token = auth.slice(7).trim();\n return token.length ? token : null;\n}\n\nexport function normalizeUid(v: any): string | null {\n const s = String(v ?? \"\").trim();\n return s.length ? s : null;\n}\n\n/**\n * ✅ Keys centralizadas:\n * - JWT_PUBLIC_KEY_PATH=/run/secrets/jwtRS256.key.pub\n * - fallback env AUTH_JWT_PUBLIC_KEY / AUTH_RSA_PUBLIC_KEY\n */\nexport function readRs256PublicKey(): string {\n const fromFile = readFileIfExists(process.env.JWT_PUBLIC_KEY_PATH);\n if (fromFile) return fromFile;\n\n const fromEnv = String(\n process.env.AUTH_JWT_PUBLIC_KEY || process.env.AUTH_RSA_PUBLIC_KEY || \"\"\n )\n .replace(/\\\\n/g, \"\\n\")\n .trim();\n\n if (fromEnv) return fromEnv;\n\n throw new Error(\n \"Missing RS256 public key (JWT_PUBLIC_KEY_PATH / AUTH_JWT_PUBLIC_KEY / AUTH_RSA_PUBLIC_KEY)\"\n );\n}\n\nexport function verifyBackendJwtRS256(raw: string): JwtPayload {\n const publicKey = readRs256PublicKey();\n\n const audience =\n process.env.JWT_AUDIENCE ||\n process.env.AUTH_JWT_AUDIENCE ||\n \"getmarket.api\";\n\n const issuer =\n process.env.JWT_ISSUER ||\n process.env.AUTH_JWT_ISSUER ||\n \"getmarket-auth\";\n\n return jwt.verify(raw, publicKey, {\n algorithms: [\"RS256\"],\n audience,\n issuer,\n }) as JwtPayload;\n}\n\nexport function extractEmployeeUid(decoded: any): string | null {\n const direct =\n normalizeUid(decoded?.employee_uid) ??\n normalizeUid(decoded?.employee?.uid);\n\n if (direct) return direct;\n\n const sub = normalizeUid(decoded?.sub);\n if (!sub) return null;\n\n const match = /^emp:(.+)$/i.exec(sub);\n return match?.[1] ? normalizeUid(match[1]) : null;\n}\n\nexport function extractCustomerUid(decoded: any): string | null {\n const direct =\n normalizeUid(decoded?.customer_uid) ??\n normalizeUid(decoded?.customer?.uid);\n\n if (direct) return direct;\n\n const sub = normalizeUid(decoded?.sub);\n if (!sub) return null;\n\n const match = /^cus:(.+)$/i.exec(sub);\n return match?.[1] ? normalizeUid(match[1]) : null;\n}\n","import type {NextFunction, Response} from \"express\";\nimport type {AuthContext, AuthMiddlewareOptions} from \"./types\";\nimport {\n extractCustomerUid,\n extractEmployeeUid,\n getBearerToken,\n normalizeUid,\n verifyBackendJwtRS256,\n} from \"./jwt\";\n\nexport function createAuthMiddleware(opts: AuthMiddlewareOptions) {\n const {\n subject,\n allowFirebaseIdToken = false,\n requireSubject = true,\n hydrate,\n } = opts;\n\n return async (req: any, res: Response, next: NextFunction) => {\n const token = getBearerToken(req);\n\n if (!token) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_MISSING_TOKEN\",\n message: \"Missing Authorization Bearer token\",\n });\n }\n\n const headerCtx = (req as any).context || {};\n const company_uid = normalizeUid(headerCtx.company_uid);\n const branch_uid = normalizeUid(headerCtx.branch_uid);\n\n try {\n const decoded: any = verifyBackendJwtRS256(token);\n\n const baseCtx: AuthContext = {\n tokenType: \"backend\",\n subject,\n company_uid: company_uid ?? undefined,\n branch_uid: branch_uid ?? undefined,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions)\n ? decoded.permissions\n : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions)\n ? decoded.denied_permissions\n : [],\n session: {\n jti: decoded?.jti,\n device_id: decoded?.device_id,\n expires_at: decoded?.exp,\n },\n };\n\n if (subject === \"employee\") {\n baseCtx.employee_uid = extractEmployeeUid(decoded) ?? undefined;\n } else {\n baseCtx.customer_uid = extractCustomerUid(decoded) ?? undefined;\n }\n\n const hydrated = await hydrate({\n decoded,\n req,\n subject,\n company_uid,\n branch_uid,\n });\n\n Object.assign(baseCtx, hydrated);\n\n if (subject === \"employee\" && !baseCtx.employee_uid) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMPLOYEE_UID_MISSING\",\n message:\n \"employee_uid missing in token/context (expected employee_uid or sub=emp:<uid>)\",\n });\n }\n\n if (subject === \"customer\" && !baseCtx.customer_uid) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_CUSTOMER_UID_MISSING\",\n message:\n \"customer_uid missing in token/context (expected customer_uid or sub=cus:<uid>)\",\n });\n }\n\n if (requireSubject) {\n if (subject === \"employee\" && !baseCtx.employee) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMPLOYEE_NOT_FOUND\",\n message: \"Employee not resolved by hydrator\",\n });\n }\n\n if (subject === \"customer\" && !baseCtx.customer) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_CUSTOMER_NOT_FOUND\",\n message: \"Customer not resolved by hydrator\",\n });\n }\n }\n\n (req as any).auth = baseCtx;\n return next();\n } catch {\n if (!allowFirebaseIdToken) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n\n try {\n const {default: admin} = await import(\"firebase-admin\");\n const firebaseDecoded = await admin.auth().verifyIdToken(token);\n\n if (firebaseDecoded.email && firebaseDecoded.email_verified === false) {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_EMAIL_NOT_VERIFIED\",\n message: \"Email not verified\",\n });\n }\n\n (req as any).auth = {\n tokenType: \"backend\",\n subject,\n firebase: firebaseDecoded,\n company_uid: company_uid ?? undefined,\n branch_uid: branch_uid ?? undefined,\n companies: [],\n roles: [],\n permissions: [],\n denied_permissions: [],\n } satisfies AuthContext;\n\n return next();\n } catch {\n return res.status(401).json({\n ok: false,\n code: \"AUTH_INVALID_TOKEN\",\n message: \"Invalid or expired token\",\n });\n }\n }\n };\n}\n","import {createAuthMiddleware} from \"./middleware\";\nimport {\n extractCustomerUid,\n extractEmployeeUid,\n normalizeUid,\n} from \"./jwt\";\n\n/**\n * Wrappers simples sobre el middleware oficial.\n * Sirven como fachada reusable en micros que todavía no declaran\n * un hydrator propio más rico.\n */\n\nfunction deriveCompanyBranch(decoded: any, companyUid: string | null, branchUid: string | null) {\n const companiesFromToken = Array.isArray(decoded?.companies)\n ? decoded.companies\n : [];\n\n const company =\n decoded?.company ??\n (companyUid\n ? companiesFromToken.find((c: any) => c?.uid === companyUid)\n : null) ??\n null;\n\n const branch =\n decoded?.branch ??\n (branchUid && company?.branches\n ? (company.branches || []).find((b: any) => b?.uid === branchUid)\n : null) ??\n null;\n\n return {\n companiesFromToken,\n company,\n branch,\n };\n}\n\nexport const authEmployeeRequired = createAuthMiddleware({\n subject: \"employee\",\n allowFirebaseIdToken: false,\n requireSubject: false,\n hydrate: async ({decoded, company_uid, branch_uid}) => {\n const employee_uid =\n extractEmployeeUid(decoded) ??\n normalizeUid(decoded?.employee?.uid);\n\n const {companiesFromToken, company, branch} = deriveCompanyBranch(\n decoded,\n company_uid,\n branch_uid\n );\n\n const employee =\n decoded?.employee && typeof decoded.employee === \"object\"\n ? decoded.employee\n : employee_uid\n ? {uid: employee_uid, email: decoded?.email ?? null}\n : undefined;\n\n return {\n employee_uid: employee_uid ?? undefined,\n employee,\n companies: companiesFromToken,\n company,\n branch,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions)\n ? decoded.denied_permissions\n : [],\n };\n },\n});\n\nexport const authCustomerRequired = createAuthMiddleware({\n subject: \"customer\",\n allowFirebaseIdToken: false,\n requireSubject: false,\n hydrate: async ({decoded, company_uid, branch_uid}) => {\n const customer_uid =\n extractCustomerUid(decoded) ??\n normalizeUid(decoded?.customer?.uid);\n\n const {companiesFromToken, company, branch} = deriveCompanyBranch(\n decoded,\n company_uid,\n branch_uid\n );\n\n const customer =\n decoded?.customer && typeof decoded.customer === \"object\"\n ? decoded.customer\n : customer_uid\n ? {uid: customer_uid}\n : undefined;\n\n return {\n customer_uid: customer_uid ?? undefined,\n customer,\n companies: companiesFromToken,\n company,\n branch,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions)\n ? decoded.denied_permissions\n : [],\n };\n },\n});\n\nexport const authEmployeeAllowFirebase = createAuthMiddleware({\n subject: \"employee\",\n allowFirebaseIdToken: true,\n requireSubject: false,\n hydrate: async ({decoded, company_uid, branch_uid}) => {\n const employee_uid =\n extractEmployeeUid(decoded) ??\n normalizeUid(decoded?.employee?.uid);\n\n const {companiesFromToken, company, branch} = deriveCompanyBranch(\n decoded,\n company_uid,\n branch_uid\n );\n\n const employee =\n decoded?.employee && typeof decoded.employee === \"object\"\n ? decoded.employee\n : employee_uid\n ? {uid: employee_uid, email: decoded?.email ?? null}\n : undefined;\n\n return {\n employee_uid: employee_uid ?? undefined,\n employee,\n companies: companiesFromToken,\n company,\n branch,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions)\n ? decoded.denied_permissions\n : [],\n };\n },\n});\n\nexport const authCustomerAllowFirebase = createAuthMiddleware({\n subject: \"customer\",\n allowFirebaseIdToken: true,\n requireSubject: false,\n hydrate: async ({decoded, company_uid, branch_uid}) => {\n const customer_uid =\n extractCustomerUid(decoded) ??\n normalizeUid(decoded?.customer?.uid);\n\n const {companiesFromToken, company, branch} = deriveCompanyBranch(\n decoded,\n company_uid,\n branch_uid\n );\n\n const customer =\n decoded?.customer && typeof decoded.customer === \"object\"\n ? decoded.customer\n : customer_uid\n ? {uid: customer_uid}\n : undefined;\n\n return {\n customer_uid: customer_uid ?? undefined,\n customer,\n companies: companiesFromToken,\n company,\n branch,\n roles: Array.isArray(decoded?.roles) ? decoded.roles : [],\n permissions: Array.isArray(decoded?.permissions) ? decoded.permissions : [],\n denied_permissions: Array.isArray(decoded?.denied_permissions)\n ? decoded.denied_permissions\n : [],\n };\n },\n});\n","// packages/sdk/src/middlewares/guards.ts\nimport type {Request, Response, NextFunction, RequestHandler} from \"express\";\nimport parseHeaders from \"./parseHeaders\";\nimport {authEmployeeRequired} from \"../auth\";\nimport {sendError} from \"./respond\";\n\ntype RoleShape = string | { code?: string; name?: string };\ntype PermShape = string | { code?: string; name?: string };\n\nfunction normalizeRole(r: RoleShape): string | null {\n if (!r) return null;\n if (typeof r === \"string\") return r;\n return r.code || r.name || null;\n}\n\nfunction normalizePerm(p: PermShape): string | null {\n if (!p) return null;\n if (typeof p === \"string\") return p;\n return p.code || p.name || null;\n}\n\nfunction isSysAdmin(roles: RoleShape[] | undefined): boolean {\n if (!Array.isArray(roles)) return false;\n return roles.some((r) => normalizeRole(r) === \"SYS_ADMIN\");\n}\n\nfunction getAuth(req: Request) {\n return ((req as any).auth ?? {}) as {\n roles?: RoleShape[];\n permissions?: PermShape[];\n denied_permissions?: PermShape[];\n };\n}\n\nfunction permissionSets(auth: ReturnType<typeof getAuth>) {\n const allow = new Set<string>((auth.permissions ?? []).map(normalizePerm).filter(Boolean) as string[]);\n const deny = new Set<string>((auth.denied_permissions ?? []).map(normalizePerm).filter(Boolean) as string[]);\n return {allow, deny};\n}\n\nfunction roleSet(auth: ReturnType<typeof getAuth>) {\n return new Set<string>((auth.roles ?? []).map(normalizeRole).filter(Boolean) as string[]);\n}\n\n/**\n * ✅ SysAdmin bypass OR (ANY) permissions\n * - Si tiene alguno de los permisos => OK\n * - denied_permissions gana siempre\n */\nexport function allowSysAdminOrAnyPermission(...perms: string[]): RequestHandler[] {\n const required = (perms ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n\n for (const p of required) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {denied: p});\n }\n }\n\n const ok = required.some((p) => allow.has(p));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions (ANY)\", {required});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SysAdmin bypass OR (ALL) permissions (AND)\n */\nexport function allowSysAdminOrPermissionsAll(...perms: string[]): RequestHandler[] {\n const required = (perms ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n\n for (const p of required) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied permission: ${p}`, {denied: p});\n }\n }\n\n const missing = required.filter((p) => !allow.has(p));\n if (missing.length) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Missing permissions (ALL)\", {required, missing});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SysAdmin bypass OR roles (ANY)\n */\nexport function allowSysAdminOrRoles(...roles: string[]): RequestHandler[] {\n const required = (roles ?? []).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const have = roleSet(auth);\n\n const ok = required.some((r) => have.has(r));\n if (!ok) {\n return sendError(req, res, 403, \"FORBIDDEN\", \"Role not allowed\", {required});\n }\n\n return next();\n },\n ];\n}\n\n/**\n * ✅ SYS_ADMIN bypass OR (ANY) roles OR (ANY) permissions\n * - denied_permissions siempre gana\n */\nexport function allowSysAdminOrRolesOrAnyPermission(\n roles: string | string[],\n permissions: string | string[]\n): RequestHandler[] {\n const requiredRoles = (Array.isArray(roles) ? roles : [roles]).filter(Boolean);\n const requiredPerms = (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean);\n\n return [\n parseHeaders,\n authEmployeeRequired,\n (req: Request, res: Response, next: NextFunction) => {\n const auth = getAuth(req);\n if (isSysAdmin(auth.roles)) return next();\n\n const {allow, deny} = permissionSets(auth);\n for (const p of requiredPerms) {\n if (deny.has(p)) {\n return sendError(req, res, 403, \"FORBIDDEN\", `Denied: ${p}`, {permission: p});\n }\n }\n\n const haveRoles = roleSet(auth);\n if (requiredRoles.some((r) => haveRoles.has(r))) return next();\n\n if (requiredPerms.some((p) => allow.has(p))) return next();\n\n return sendError(req, res, 403, \"FORBIDDEN\", \"Permission denied\", {\n roles: requiredRoles,\n permissions: requiredPerms,\n mode: \"ROLES_OR_ANY_PERMISSION\",\n });\n },\n ];\n}\n\n/**\n * ✅ Helper específico Auth:\n * Rol AUTH_ADMIN o permiso fino (y SYS_ADMIN bypass)\n */\nexport function allowAuthAdminOrPerm(permission: string): RequestHandler[] {\n return allowSysAdminOrRolesOrAnyPermission([\"AUTH_ADMIN\"], [permission]);\n}\n","// packages/sdk/src/internalHttpClient.ts\nimport fs from \"fs\";\nimport {\n HEADER_INTERNAL_API_KEY,\n HEADER_REQUEST_ID,\n HEADER_COMPANY_UID,\n HEADER_BRANCH_UID,\n HEADER_EMPLOYEE_UID\n} from \"./headers\";\nimport type {RequestContext} from \"./headers\";\n\nexport type InternalHttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport type InternalHttpClientOptions = {\n baseURL: string; // ej: http://platform:3010\n apiPrefix?: string; // ej: /internal/v1\n timeoutMs?: number; // default 15000\n retries?: number; // default 2\n retryDelayMs?: number; // default 250\n apiKey?: string | null; // override opcional\n};\n\nexport type InternalRequestOptions = {\n method: InternalHttpMethod;\n path: string; // \"/tenants/provision\"\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: any; // JSON\n headers?: Record<string, string | undefined>;\n ctx?: RequestContext | null;\n\n idempotencyKey?: string | null;\n\n expectJson?: boolean; // default true\n};\n\nexport class InternalHttpError extends Error {\n status: number;\n code: string;\n details: any;\n\n constructor(status: number, code: string, message: string, details?: any) {\n super(message);\n this.status = status;\n this.code = code;\n this.details = details ?? null;\n }\n}\n\nfunction readSecretFile(path?: string): string | null {\n if (!path) return null;\n try {\n const v = fs.readFileSync(path, \"utf8\").trim();\n return v.length ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction splitKeys(v?: string | null): string[] {\n if (!v) return [];\n return v.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * ✅ MISMA lógica que internalAuth.ts:\n * - INTERNAL_API_KEY_FILE tiene prioridad\n * - fallback a INTERNAL_API_KEY\n * - permite CSV\n *\n * Nota: Para enviar, usamos la primera key disponible.\n */\nfunction getInternalApiKey(override?: string | null): string | null {\n if (override && override.trim()) return override.trim();\n\n const fileKey = readSecretFile(process.env.INTERNAL_API_KEY_FILE);\n const envKey = (process.env.INTERNAL_API_KEY || \"\").trim();\n const raw = fileKey || envKey;\n const keys = splitKeys(raw);\n return keys[0] || null;\n}\n\nfunction normalizeBaseURL(baseURL: string): string {\n const b = (baseURL || \"\").trim();\n if (!b) throw new Error(\"InternalHttpClient: baseURL is required\");\n return b.replace(/\\/+$/g, \"\");\n}\n\nfunction normalizePrefix(prefix?: string): string {\n const p = (prefix || \"\").trim();\n if (!p) return \"\";\n const withSlash = p.startsWith(\"/\") ? p : `/${p}`;\n return withSlash.replace(/\\/+$/g, \"\");\n}\n\nfunction buildQuery(query?: InternalRequestOptions[\"query\"]): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === null || v === undefined) continue;\n params.set(k, String(v));\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * ✅ Propaga contexto estándar (SDK)\n * - x-request-id\n * - x-company\n * - x-branch\n * - x-employee-uid\n */\nexport function buildInternalHeaders(\n ctx?: RequestContext | null,\n extra?: Record<string, string | undefined>,\n idempotencyKey?: string | null\n): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (ctx?.requestId) h[HEADER_REQUEST_ID] = String(ctx.requestId);\n if (ctx?.company_uid) h[HEADER_COMPANY_UID] = String(ctx.company_uid);\n if (ctx?.branch_uid) h[HEADER_BRANCH_UID] = String(ctx.branch_uid);\n if (ctx?.employee_uid) h[HEADER_EMPLOYEE_UID] = String(ctx.employee_uid);\n\n if (idempotencyKey && idempotencyKey.trim()) {\n h[\"Idempotency-Key\"] = idempotencyKey.trim();\n }\n\n for (const [k, v] of Object.entries(extra || {})) {\n if (v === undefined) continue;\n const vv = String(v).trim();\n if (!vv) continue;\n h[k] = vv;\n }\n\n return h;\n}\n\nasync function sleep(ms: number) {\n await new Promise((r) => setTimeout(r, ms));\n}\n\nfunction shouldRetry(status: number | null, err: any): boolean {\n if (err?.name === \"AbortError\") return true;\n if (!status) return true;\n if (status >= 500) return true;\n if (status === 429) return true;\n return false;\n}\n\nasync function safeReadJson(res: Response): Promise<any> {\n const text = await res.text();\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return {raw: text};\n }\n}\n\n/**\n * Cliente interno universal (fetch)\n */\nexport function createInternalHttpClient(opts: InternalHttpClientOptions) {\n const baseURL = normalizeBaseURL(opts.baseURL);\n const apiPrefix = normalizePrefix(opts.apiPrefix);\n const timeoutMs = typeof opts.timeoutMs === \"number\" ? opts.timeoutMs : 15000;\n const retries = typeof opts.retries === \"number\" ? opts.retries : 2;\n const retryDelayMs = typeof opts.retryDelayMs === \"number\" ? opts.retryDelayMs : 250;\n\n const apiKey = getInternalApiKey(opts.apiKey ?? null);\n if (!apiKey) {\n throw new Error(\n \"InternalHttpClient: INTERNAL_API_KEY or INTERNAL_API_KEY_FILE is required to call internal endpoints.\"\n );\n }\n\n async function request<T = any>(r: InternalRequestOptions): Promise<T> {\n const path = (r.path || \"\").trim();\n if (!path.startsWith(\"/\")) {\n throw new Error(`InternalHttpClient: path must start with '/': ${path}`);\n }\n\n const url = `${baseURL}${apiPrefix}${path}${buildQuery(r.query)}`;\n\n const headers = buildInternalHeaders(r.ctx ?? null, r.headers, r.idempotencyKey ?? null);\n if (apiKey != null) {\n headers[HEADER_INTERNAL_API_KEY] = apiKey;\n }\n\n const method = r.method;\n const expectJson = r.expectJson !== false;\n\n const body =\n method === \"GET\" || method === \"DELETE\"\n ? undefined\n : r.body !== undefined\n ? JSON.stringify(r.body)\n : undefined;\n\n let attempt = 0;\n let lastErr: any = null;\n\n while (attempt <= retries) {\n attempt++;\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers,\n body,\n signal: ac.signal,\n });\n\n clearTimeout(to);\n\n if (res.ok) {\n if (!expectJson) return (undefined as any) as T;\n const data = await safeReadJson(res);\n return data as T;\n }\n\n const errBody = await safeReadJson(res);\n const status = res.status;\n\n if (attempt <= retries && shouldRetry(status, null)) {\n lastErr = new InternalHttpError(\n status,\n \"INTERNAL_HTTP_RETRY\",\n `Retryable internal HTTP error (${status})`,\n {url, status, response: errBody, attempt}\n );\n await sleep(retryDelayMs * attempt);\n continue;\n }\n\n throw new InternalHttpError(\n status,\n \"INTERNAL_HTTP_ERROR\",\n `Internal HTTP error (${status})`,\n {url, status, response: errBody}\n );\n } catch (e: any) {\n clearTimeout(to);\n\n if (attempt <= retries && shouldRetry(null, e)) {\n lastErr = e;\n await sleep(retryDelayMs * attempt);\n continue;\n }\n\n if (e instanceof InternalHttpError) throw e;\n\n throw new InternalHttpError(\n 0,\n \"INTERNAL_HTTP_NETWORK_ERROR\",\n e?.message || \"Internal HTTP network error\",\n {url, attempt, error: String(e)}\n );\n }\n }\n\n throw lastErr || new InternalHttpError(0, \"INTERNAL_HTTP_FAILED\", \"Internal request failed\");\n }\n\n return {\n request,\n get: <T = any>(path: string, o?: Omit<InternalRequestOptions, \"method\" | \"path\">) =>\n request<T>({...(o || {}), method: \"GET\", path}),\n post: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"POST\", path, body}),\n put: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"PUT\", path, body}),\n patch: <T = any>(path: string, body?: any, o?: Omit<InternalRequestOptions, \"method\" | \"path\" | \"body\">) =>\n request<T>({...(o || {}), method: \"PATCH\", path, body}),\n del: <T = any>(path: string, o?: Omit<InternalRequestOptions, \"method\" | \"path\">) =>\n request<T>({...(o || {}), method: \"DELETE\", path}),\n };\n}\n","// packages/sdk/src/clients/env.ts\nimport type {ServiceClientEnv} from \"./types\";\n\nfunction must(v: string | undefined, name: string): string {\n const s = (v || \"\").trim();\n if (!s) throw new Error(`Missing env var: ${name}`);\n return s;\n}\n\nexport function readServiceEnv(prefix: string, defaults?: Partial<ServiceClientEnv>): ServiceClientEnv {\n const baseURL = (process.env[`${prefix}_BASE_URL`] || defaults?.baseURL || \"\").trim();\n const apiPrefix = (process.env[`${prefix}_API_PREFIX`] || defaults?.apiPrefix || \"/internal/v1\").trim();\n\n return {\n baseURL: must(baseURL, `${prefix}_BASE_URL`),\n apiPrefix,\n };\n}\n","// packages/sdk/src/clients/cacheFactory.ts\nimport {TwoLevelCache} from \"../cache\";\nimport {createCacheProvider} from \"../cache/cacheProvider\";\n\n/**\n * Crea un TwoLevelCache por \"namespace\" (ej: \"res:variety\")\n * - L1: in-memory (TTL corto)\n * - L2: redis (TTL medio)\n *\n * Nota: createCacheProvider ya aplica REDIS_KEY_PREFIX desde env,\n * y además TwoLevelCache agrega namespace como prefijo lógico.\n */\nexport function makeRefsCache<T>(namespace: string) {\n const l2 = createCacheProvider(); // redis o noop según env\n return new TwoLevelCache<T>(l2, {\n namespace,\n ttlMsL1: 30_000,\n ttlMsL2: 300_000,\n negativeTtlMsL1: 30_000,\n negativeTtlMsL2: 30_000,\n });\n}\n","// packages/sdk/src/clients/bulkRefsClient.ts\nimport type {RequestContext} from \"../headers\";\nimport {createInternalHttpClient} from \"../internalHttpClient\";\nimport type {BulkRefsResponse, BulkUidsRequest, InternalBulkRefsOptions} from \"./types\";\nimport {makeRefsCache} from \"./cacheFactory\";\n\nfunction uniq(arr: string[]) {\n return Array.from(new Set(arr.filter(Boolean)));\n}\n\nexport function createBulkRefsClient<TRef extends { uid: string }>(args: {\n namespace: string; // cache namespace e.g. \"res:variety\"\n baseURL: string;\n apiPrefix: string;\n path: string; // e.g. \"/refs/varieties\"\n defaultTtlMsL1?: number;\n defaultTtlMsL2?: number;\n}) {\n const http = createInternalHttpClient({\n baseURL: args.baseURL,\n apiPrefix: args.apiPrefix,\n });\n\n // ✅ cache tipado\n const cache = makeRefsCache<TRef>(args.namespace);\n\n async function bulkRefs(\n uids: string[],\n opts?: InternalBulkRefsOptions\n ): Promise<BulkRefsResponse<TRef>> {\n const list = uniq(uids);\n if (list.length === 0) {\n return {ok: true, refs: [], meta: {requested: 0, returned: 0, missing: []}};\n }\n\n // 1) cache hits\n const hits: TRef[] = [];\n const missing: string[] = [];\n\n for (const uid of list) {\n const v = await cache.get(uid); // ✅ sin genéricos\n if (v) hits.push(v);\n else missing.push(uid);\n }\n\n // 2) fetch missing\n let fetched: TRef[] = [];\n if (missing.length) {\n const resp = await http.post<BulkRefsResponse<TRef>>(\n args.path,\n {uids: missing} as BulkUidsRequest,\n {\n ctx: (opts?.ctx ?? null) as RequestContext | null,\n }\n );\n\n const refs = (resp.refs ?? resp.items ?? []) as TRef[];\n fetched = refs;\n\n const ttlMsL1 = opts?.ttlMsL1 ?? args.defaultTtlMsL1;\n const ttlMsL2 = opts?.ttlMsL2 ?? args.defaultTtlMsL2;\n\n for (const ref of refs) {\n const uid = String(ref?.uid || \"\").trim();\n if (!uid) continue;\n\n await cache.set(uid, ref, {\n ttlMsL1,\n ttlMsL2,\n });\n }\n }\n\n const all = [...hits, ...fetched];\n\n // missing final (uids requested but not returned)\n const returnedSet = new Set(all.map((r) => String(r?.uid || \"\")));\n const missingFinal = list.filter((u) => !returnedSet.has(u));\n\n return {\n ok: true,\n refs: all,\n meta: {\n requested: list.length,\n returned: all.length,\n missing: missingFinal,\n },\n };\n }\n\n return {bulkRefs};\n}\n","// packages/sdk/src/clients/platformClient.ts\nimport type {PlatformResolveTenantResponse, PlatformServiceCode} from \"@innvoid/getmarket-contracts\";\nimport type {RequestContext} from \"../headers\";\nimport {createInternalHttpClient} from \"../internalHttpClient\";\nimport {makeRefsCache} from \"./cacheFactory\";\n\nexport function createPlatformClient(env: { baseURL: string; apiPrefix: string }) {\n const http = createInternalHttpClient(env);\n\n // ✅ cache tipado\n const cache = makeRefsCache<PlatformResolveTenantResponse>(\"platform:tenant\");\n\n async function resolveTenant(\n input: { company_uid: string; service: PlatformServiceCode },\n ctx?: RequestContext | null\n ) {\n const key = `${input.company_uid}:${input.service}`;\n\n const cached = await cache.get(key); // ✅ sin genéricos\n if (cached) return cached;\n\n const resp = await http.post<PlatformResolveTenantResponse>(\n \"/tenants/resolve\",\n input,\n {ctx: ctx ?? null}\n );\n\n await cache.set(key, resp);\n return resp;\n }\n\n return {resolveTenant};\n}\n","// packages/sdk/src/clients/resClient.ts\nimport type {\n ResVarietyRef,\n ResVarietiesRefsResponse,\n ResResourceRef,\n ResResourcesRefsResponse,\n ResCategoryRef,\n ResCategoriesRefsResponse,\n ResAttributeRef,\n ResAttributesRefsResponse,\n ResAttributeOptionRef,\n ResAttributeOptionsRefsResponse,\n ResAttributeValueRef,\n ResAttributeValuesRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createResClient() {\n const env = readServiceEnv(\"RES\", {apiPrefix: \"/internal/v1\"});\n\n const varieties = createBulkRefsClient<ResVarietyRef>({\n namespace: \"res:variety\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/varieties\",\n });\n\n const resources = createBulkRefsClient<ResResourceRef>({\n namespace: \"res:resource\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/resources\",\n });\n\n const categories = createBulkRefsClient<ResCategoryRef>({\n namespace: \"res:category\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/categories\",\n });\n\n const attributes = createBulkRefsClient<ResAttributeRef>({\n namespace: \"res:attribute\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attributes\",\n });\n\n const attributeOptions = createBulkRefsClient<ResAttributeOptionRef>({\n namespace: \"res:attribute_option\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attribute-options\",\n });\n\n const attributeValues = createBulkRefsClient<ResAttributeValueRef>({\n namespace: \"res:attribute_value\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attribute-values\",\n });\n\n return {\n varietiesRefs: (uids: string[], opts?: any) =>\n varieties.bulkRefs(uids, opts) as Promise<ResVarietiesRefsResponse>,\n\n resourcesRefs: (uids: string[], opts?: any) =>\n resources.bulkRefs(uids, opts) as Promise<ResResourcesRefsResponse>,\n\n categoriesRefs: (uids: string[], opts?: any) =>\n categories.bulkRefs(uids, opts) as Promise<ResCategoriesRefsResponse>,\n\n attributesRefs: (uids: string[], opts?: any) =>\n attributes.bulkRefs(uids, opts) as Promise<ResAttributesRefsResponse>,\n\n attributeOptionsRefs: (uids: string[], opts?: any) =>\n attributeOptions.bulkRefs(uids, opts) as Promise<ResAttributeOptionsRefsResponse>,\n\n attributeValuesRefs: (uids: string[], opts?: any) =>\n attributeValues.bulkRefs(uids, opts) as Promise<ResAttributeValuesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/mdClient.ts\nimport type {\n MdMeasureRef,\n MdMeasuresRefsResponse,\n MdMeasureTypeRef,\n MdMeasureTypesRefsResponse,\n MdCountryRef,\n MdCountriesRefsResponse,\n MdCurrencyRef,\n MdCurrenciesRefsResponse,\n MdRegionRef,\n MdRegionsRefsResponse,\n MdCommuneRef,\n MdCommunesRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMdClient() {\n const env = readServiceEnv(\"MD\", {apiPrefix: \"/internal/v1\"});\n\n const measures = createBulkRefsClient<MdMeasureRef>({\n namespace: \"md:measure\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/measures\",\n });\n\n const measureTypes = createBulkRefsClient<MdMeasureTypeRef>({\n namespace: \"md:measure_type\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/measure-types\",\n });\n\n const countries = createBulkRefsClient<MdCountryRef>({\n namespace: \"md:country\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/countries\",\n });\n\n const currencies = createBulkRefsClient<MdCurrencyRef>({\n namespace: \"md:currency\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/currencies\",\n });\n\n const regions = createBulkRefsClient<MdRegionRef>({\n namespace: \"md:region\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/regions\",\n });\n\n const communes = createBulkRefsClient<MdCommuneRef>({\n namespace: \"md:commune\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/communes\",\n });\n\n return {\n measuresRefs: (uids: string[], opts?: any) =>\n measures.bulkRefs(uids, opts) as Promise<MdMeasuresRefsResponse>,\n\n measureTypesRefs: (uids: string[], opts?: any) =>\n measureTypes.bulkRefs(uids, opts) as Promise<MdMeasureTypesRefsResponse>,\n\n countriesRefs: (uids: string[], opts?: any) =>\n countries.bulkRefs(uids, opts) as Promise<MdCountriesRefsResponse>,\n\n currenciesRefs: (uids: string[], opts?: any) =>\n currencies.bulkRefs(uids, opts) as Promise<MdCurrenciesRefsResponse>,\n\n regionsRefs: (uids: string[], opts?: any) =>\n regions.bulkRefs(uids, opts) as Promise<MdRegionsRefsResponse>,\n\n communesRefs: (uids: string[], opts?: any) =>\n communes.bulkRefs(uids, opts) as Promise<MdCommunesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/fisClient.ts\nimport type {\n UID,\n FisProfileRef,\n FisProfilesRefsResponse,\n FisDocumentRef,\n FisDocumentsRefsResponse,\n FisSnapshotRef,\n FisSnapshotsRefsResponse,\n FisSubmissionRef,\n FisSubmissionsRefsResponse,\n FisFolioPoolRef,\n FisFolioPoolsRefsResponse,\n FisTaxRuleRef,\n FisTaxRulesRefsResponse,\n FisCalculateRequest,\n FisCalculateResponse,\n FisTaxCalculateRequest,\n FisTaxCalculateResponse,\n FisBuildDocumentRequest,\n FisBuildDocumentResponse,\n FisSignDocumentRequest,\n FisSignDocumentResponse,\n FisSubmitDocumentRequest,\n FisSubmitDocumentResponse,\n FisCancelDocumentRequest,\n FisCancelDocumentResponse,\n FisReserveFolioRequest,\n FisReserveFolioResponse,\n FisConsumeFolioRequest,\n FisConsumeFolioResponse,\n FisDocumentsQueryRequest,\n FisDocumentsQueryResponse,\n FisSubmissionRetryRequest,\n FisSubmissionRetryResponse,\n FisDocumentResponse,\n FisSnapshotResponse,\n FisSubmissionResponse,\n FisStatusEventsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\nimport {createHttpClient, type HttpClient} from \"../core\";\n\nexport function createFisClient() {\n const env = readServiceEnv(\"FIS\", {apiPrefix: \"/internal/v1\"});\n\n const http: HttpClient = createHttpClient({\n baseURL: `${env.baseURL}${env.apiPrefix}`,\n timeoutMs: 8000,\n });\n\n const profiles = createBulkRefsClient<FisProfileRef>({\n namespace: \"fis:profile\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/profiles\",\n });\n\n const documents = createBulkRefsClient<FisDocumentRef>({\n namespace: \"fis:document\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/documents\",\n });\n\n const snapshots = createBulkRefsClient<FisSnapshotRef>({\n namespace: \"fis:snapshot\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/snapshots\",\n });\n\n const submissions = createBulkRefsClient<FisSubmissionRef>({\n namespace: \"fis:submission\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/submissions\",\n });\n\n const folioPools = createBulkRefsClient<FisFolioPoolRef>({\n namespace: \"fis:folio_pool\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/folio-pools\",\n });\n\n const taxRules = createBulkRefsClient<FisTaxRuleRef>({\n namespace: \"fis:tax_rule\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/tax-rules\",\n });\n\n return {\n // -----------------------------------------------------------------------\n // Bulk refs\n // -----------------------------------------------------------------------\n profilesRefs: (uids: string[], opts?: any) =>\n profiles.bulkRefs(uids, opts) as Promise<FisProfilesRefsResponse>,\n\n documentsRefs: (uids: string[], opts?: any) =>\n documents.bulkRefs(uids, opts) as Promise<FisDocumentsRefsResponse>,\n\n snapshotsRefs: (uids: string[], opts?: any) =>\n snapshots.bulkRefs(uids, opts) as Promise<FisSnapshotsRefsResponse>,\n\n submissionsRefs: (uids: string[], opts?: any) =>\n submissions.bulkRefs(uids, opts) as Promise<FisSubmissionsRefsResponse>,\n\n folioPoolsRefs: (uids: string[], opts?: any) =>\n folioPools.bulkRefs(uids, opts) as Promise<FisFolioPoolsRefsResponse>,\n\n taxRulesRefs: (uids: string[], opts?: any) =>\n taxRules.bulkRefs(uids, opts) as Promise<FisTaxRulesRefsResponse>,\n\n // -----------------------------------------------------------------------\n // Fiscal calculation / build / lifecycle\n // -----------------------------------------------------------------------\n async calculate(body: FisCalculateRequest): Promise<FisCalculateResponse> {\n const {data} = await http.post<FisCalculateResponse>(\"/calculate\", body);\n return data;\n },\n\n async calculateTaxes(body: FisTaxCalculateRequest): Promise<FisTaxCalculateResponse> {\n const {data} = await http.post<FisTaxCalculateResponse>(\"/tax/calculate\", body);\n return data;\n },\n\n async buildDocument(body: FisBuildDocumentRequest): Promise<FisBuildDocumentResponse> {\n const {data} = await http.post<FisBuildDocumentResponse>(\"/documents\", body);\n return data;\n },\n\n async signDocument(body: FisSignDocumentRequest): Promise<FisSignDocumentResponse> {\n const {data} = await http.post<FisSignDocumentResponse>(\n `/documents/${body.document_uid}/sign`,\n body\n );\n return data;\n },\n\n async submitDocument(body: FisSubmitDocumentRequest): Promise<FisSubmitDocumentResponse> {\n const {data} = await http.post<FisSubmitDocumentResponse>(\n `/documents/${body.document_uid}/submit`,\n body\n );\n return data;\n },\n\n async cancelDocument(body: FisCancelDocumentRequest): Promise<FisCancelDocumentResponse> {\n const {data} = await http.post<FisCancelDocumentResponse>(\n `/documents/${body.document_uid}/cancel`,\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Folios / series\n // -----------------------------------------------------------------------\n async reserveFolio(body: FisReserveFolioRequest): Promise<FisReserveFolioResponse> {\n const {data} = await http.post<FisReserveFolioResponse>(\"/folios/reserve\", body);\n return data;\n },\n\n async consumeFolio(body: FisConsumeFolioRequest): Promise<FisConsumeFolioResponse> {\n const {data} = await http.post<FisConsumeFolioResponse>(\"/folios/consume\", body);\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Queries / detail\n // -----------------------------------------------------------------------\n async queryDocuments(body: FisDocumentsQueryRequest): Promise<FisDocumentsQueryResponse> {\n const {data} = await http.post<FisDocumentsQueryResponse>(\"/documents/query\", body);\n return data;\n },\n\n async getDocumentByUid(uid: UID): Promise<FisDocumentResponse> {\n const {data} = await http.get<FisDocumentResponse>(`/documents/${uid}`);\n return data;\n },\n\n async getSnapshotByUid(uid: UID): Promise<FisSnapshotResponse> {\n const {data} = await http.get<FisSnapshotResponse>(`/snapshots/${uid}`);\n return data;\n },\n\n async getSubmissionByUid(uid: UID): Promise<FisSubmissionResponse> {\n const {data} = await http.get<FisSubmissionResponse>(`/submissions/${uid}`);\n return data;\n },\n\n async getStatusEventsByDocumentUid(documentUid: UID): Promise<FisStatusEventsResponse> {\n const {data} = await http.get<FisStatusEventsResponse>(\n `/documents/${documentUid}/status-events`\n );\n return data;\n },\n\n async retrySubmission(body: FisSubmissionRetryRequest): Promise<FisSubmissionRetryResponse> {\n const {data} = await http.post<FisSubmissionRetryResponse>(\"/submissions/retry\", body);\n return data;\n },\n };\n}\n","// packages/sdk/src/clients/mediaClient.ts\nimport type {MediaFileRef, MediaFilesRefsResponse} from \"@innvoid/getmarket-contracts\";\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMediaClient() {\n const env = readServiceEnv(\"MEDIA\", {apiPrefix: \"/internal/v1\"});\n\n const files = createBulkRefsClient<MediaFileRef>({\n namespace: \"media:file\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/files\",\n });\n\n return {\n filesRefs: (uids: string[], opts?: any) =>\n files.bulkRefs(uids, opts) as Promise<MediaFilesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/mkpClient.ts\nimport type {\n MkpPublicationRef,\n MkpPublicationsRefsResponse,\n MkpEventRef,\n MkpEventsRefsResponse,\n MkpPromotionRef,\n MkpPromotionsRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createMkpClient() {\n const env = readServiceEnv(\"MKP\", {apiPrefix: \"/internal/v1\"});\n\n const publications = createBulkRefsClient<MkpPublicationRef>({\n namespace: \"mkp:publication\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/publications\",\n });\n\n const events = createBulkRefsClient<MkpEventRef>({\n namespace: \"mkp:event\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/events\",\n });\n\n const promotions = createBulkRefsClient<MkpPromotionRef>({\n namespace: \"mkp:promotion\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/promotions\",\n });\n\n return {\n publicationsRefs: (uids: string[], opts?: any) =>\n publications.bulkRefs(uids, opts) as Promise<MkpPublicationsRefsResponse>,\n\n eventsRefs: (uids: string[], opts?: any) =>\n events.bulkRefs(uids, opts) as Promise<MkpEventsRefsResponse>,\n\n promotionsRefs: (uids: string[], opts?: any) =>\n promotions.bulkRefs(uids, opts) as Promise<MkpPromotionsRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/payClient.ts\nimport type {\n UID,\n PayCreateIntentRequest,\n PayCreateIntentResponse,\n PayConfirmIntentRequest,\n PayConfirmIntentResponse,\n PayStartAttemptRequest,\n PayStartAttemptResponse,\n PayIntentResponse,\n PayMethodsAvailabilityQuery,\n PayMethodsAvailabilityResponse,\n PayPaymentsQueryRequest,\n PayPaymentsQueryResponse,\n PayAllocationsByTargetRequest,\n PayAllocationsByTargetResponse,\n PayIntentRef,\n PayAttemptRef,\n PayTransactionRef,\n PayRefundRef,\n PayAllocationRef,\n PayProviderAccountRef,\n PayPaymentMethodRef,\n PayIntentsRefsResponse,\n PayAttemptsRefsResponse,\n PayTransactionsRefsResponse,\n PayRefundsRefsResponse,\n PayAllocationsRefsResponse,\n PayProviderAccountsRefsResponse,\n PayPaymentMethodsRefsResponse,\n} from \"@innvoid/getmarket-contracts\";\n\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\nimport {createHttpClient, type HttpClient} from \"../core\";\n\nexport function createPayClient() {\n const env = readServiceEnv(\"PAY\", {apiPrefix: \"/internal/v1\"});\n\n const http: HttpClient = createHttpClient({\n baseURL: `${env.baseURL}${env.apiPrefix}`,\n timeoutMs: 8000,\n });\n\n const intents = createBulkRefsClient<PayIntentRef>({\n namespace: \"pay:intent\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/intents\",\n });\n\n const attempts = createBulkRefsClient<PayAttemptRef>({\n namespace: \"pay:attempt\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/attempts\",\n });\n\n const transactions = createBulkRefsClient<PayTransactionRef>({\n namespace: \"pay:transaction\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/transactions\",\n });\n\n const refunds = createBulkRefsClient<PayRefundRef>({\n namespace: \"pay:refund\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/refunds\",\n });\n\n const allocations = createBulkRefsClient<PayAllocationRef>({\n namespace: \"pay:allocation\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/allocations\",\n });\n\n const providerAccounts = createBulkRefsClient<PayProviderAccountRef>({\n namespace: \"pay:provider_account\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/provider-accounts\",\n });\n\n const paymentMethods = createBulkRefsClient<PayPaymentMethodRef>({\n namespace: \"pay:payment_method\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/payment-methods\",\n });\n\n return {\n // -----------------------------------------------------------------------\n // Payment intents\n // -----------------------------------------------------------------------\n async createIntent(body: PayCreateIntentRequest): Promise<PayCreateIntentResponse> {\n const {data} = await http.post<PayCreateIntentResponse>(\"/payment-intents\", body);\n return data;\n },\n\n async getIntentByUid(uid: UID): Promise<PayIntentResponse> {\n const {data} = await http.get<PayIntentResponse>(`/payment-intents/${uid}`);\n return data;\n },\n\n async confirmIntent(body: PayConfirmIntentRequest): Promise<PayConfirmIntentResponse> {\n const {data} = await http.post<PayConfirmIntentResponse>(\n `/payment-intents/${body.intent_uid}/confirm`,\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Attempts\n // -----------------------------------------------------------------------\n async startAttempt(body: PayStartAttemptRequest): Promise<PayStartAttemptResponse> {\n const {data} = await http.post<PayStartAttemptResponse>(\"/attempts\", body);\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Methods / availability\n // -----------------------------------------------------------------------\n async getAvailableMethods(\n params: PayMethodsAvailabilityQuery\n ): Promise<PayMethodsAvailabilityResponse> {\n const {data} = await http.get<PayMethodsAvailabilityResponse>(\"/methods/available\", {\n params,\n });\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Queries / allocations\n // -----------------------------------------------------------------------\n async queryPayments(body: PayPaymentsQueryRequest): Promise<PayPaymentsQueryResponse> {\n const {data} = await http.post<PayPaymentsQueryResponse>(\"/payments/query\", body);\n return data;\n },\n\n async getAllocationsByTarget(\n body: PayAllocationsByTargetRequest\n ): Promise<PayAllocationsByTargetResponse> {\n const {data} = await http.post<PayAllocationsByTargetResponse>(\n \"/allocations/by-target\",\n body\n );\n return data;\n },\n\n // -----------------------------------------------------------------------\n // Bulk refs\n // -----------------------------------------------------------------------\n intentsRefs: (uids: string[], opts?: any) =>\n intents.bulkRefs(uids, opts) as Promise<PayIntentsRefsResponse>,\n\n attemptsRefs: (uids: string[], opts?: any) =>\n attempts.bulkRefs(uids, opts) as Promise<PayAttemptsRefsResponse>,\n\n transactionsRefs: (uids: string[], opts?: any) =>\n transactions.bulkRefs(uids, opts) as Promise<PayTransactionsRefsResponse>,\n\n refundsRefs: (uids: string[], opts?: any) =>\n refunds.bulkRefs(uids, opts) as Promise<PayRefundsRefsResponse>,\n\n allocationsRefs: (uids: string[], opts?: any) =>\n allocations.bulkRefs(uids, opts) as Promise<PayAllocationsRefsResponse>,\n\n providerAccountsRefs: (uids: string[], opts?: any) =>\n providerAccounts.bulkRefs(uids, opts) as Promise<PayProviderAccountsRefsResponse>,\n\n paymentMethodsRefs: (uids: string[], opts?: any) =>\n paymentMethods.bulkRefs(uids, opts) as Promise<PayPaymentMethodsRefsResponse>,\n };\n}\n","// packages/sdk/src/common/ids.ts\nimport {v7 as uuidv7, v4 as uuidv4, validate as uuidValidate, version as uuidVersion} from \"uuid\";\n\n/**\n * UID canónico GetMarket.\n * - Por defecto genera UUIDv7 (time-ordered).\n * - Durante transición, aceptamos v4 y v7 como válidos.\n */\nexport function newUid(): string {\n return uuidv7();\n}\n\n/** Útil si necesitas generar v4 puntualmente (idealmente no usarlo). */\nexport function newUidV4(): string {\n return uuidv4();\n}\n\n/** Validación para inputs que vengan de DB/requests durante migración. */\nexport function isUid(value: string): boolean {\n return uuidValidate(value) && (uuidVersion(value) === 7 || uuidVersion(value) === 4);\n}\n"],"mappings":"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","names":["axios","requestId","safeJsonStringify","text","import_crypto","fs","crypto","import_fs","fs","jwt","isSysAdmin","getAuth","import_fs","readSecretFile","fs","splitKeys","h","sleep","uuidv7","uuidv4","uuidValidate","uuidVersion"]}