@innvoid/getmarket-sdk 0.2.2 → 0.2.4

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.
Files changed (36) hide show
  1. package/dist/cache/index.js +1 -1
  2. package/dist/{chunk-OSYBK5AN.js → chunk-5S2JP7PR.js} +4 -22
  3. package/dist/chunk-5S2JP7PR.js.map +1 -0
  4. package/dist/{chunk-IYFWQDHD.js → chunk-QVPPDOXY.js} +2 -1
  5. package/dist/chunk-UK6LHHJQ.js +413 -0
  6. package/dist/chunk-UK6LHHJQ.js.map +1 -0
  7. package/dist/{chunk-S44JVJZS.js → chunk-WM2QICZQ.js} +16 -1
  8. package/dist/{chunk-S44JVJZS.js.map → chunk-WM2QICZQ.js.map} +1 -1
  9. package/dist/clients/index.cjs +699 -0
  10. package/dist/clients/index.cjs.map +1 -0
  11. package/dist/clients/index.d.cts +75 -0
  12. package/dist/clients/index.d.ts +75 -0
  13. package/dist/clients/index.js +23 -0
  14. package/dist/clients/index.js.map +1 -0
  15. package/dist/core/index.cjs +5 -26
  16. package/dist/core/index.cjs.map +1 -1
  17. package/dist/core/index.d.cts +5 -17
  18. package/dist/core/index.d.ts +5 -17
  19. package/dist/core/index.js +3 -8
  20. package/dist/headers/index.d.cts +3 -16
  21. package/dist/headers/index.d.ts +3 -16
  22. package/dist/index.cjs +428 -37
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +52 -3
  25. package/dist/index.d.ts +52 -3
  26. package/dist/index.js +34 -16
  27. package/dist/middlewares/index.cjs +4 -7
  28. package/dist/middlewares/index.cjs.map +1 -1
  29. package/dist/middlewares/index.js +2 -4
  30. package/dist/parse-C4vk-fmH.d.cts +16 -0
  31. package/dist/parse-C4vk-fmH.d.ts +16 -0
  32. package/package.json +11 -3
  33. package/dist/chunk-KJ64O2EG.js +0 -19
  34. package/dist/chunk-KJ64O2EG.js.map +0 -1
  35. package/dist/chunk-OSYBK5AN.js.map +0 -1
  36. /package/dist/{chunk-IYFWQDHD.js.map → chunk-QVPPDOXY.js.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  closeCache,
4
4
  getOrSet,
5
5
  getTwoLevelCache
6
- } from "../chunk-IYFWQDHD.js";
6
+ } from "../chunk-QVPPDOXY.js";
7
7
  export {
8
8
  TwoLevelCache,
9
9
  closeCache,
@@ -1,7 +1,3 @@
1
- import {
2
- REQUEST_ID_HEADER
3
- } from "./chunk-KJ64O2EG.js";
4
-
5
1
  // src/core/errors.ts
6
2
  var UpstreamError = class extends Error {
7
3
  code;
@@ -36,23 +32,11 @@ function mapAxiosToUpstreamError(err, svc) {
36
32
 
37
33
  // src/core/http.ts
38
34
  import axios from "axios";
39
- function withRequestId(headers, requestId) {
40
- const h = headers && typeof headers === "object" ? { ...headers } : {};
41
- const rid = (requestId || "").trim();
42
- if (rid) h[REQUEST_ID_HEADER] = rid;
43
- return h;
44
- }
45
- function withRequestIdConfig(config = {}, requestId) {
46
- return {
47
- ...config,
48
- headers: withRequestId(config.headers, requestId)
49
- };
50
- }
51
35
  function createHttpClient(opts) {
52
36
  return axios.create({
53
- baseURL: opts.baseURL,
54
- timeout: opts.timeoutMs ?? 4e3,
55
- headers: { "Content-Type": "application/json" }
37
+ baseURL: opts.baseURL.replace(/\/+$/, ""),
38
+ timeout: opts.timeoutMs ?? 8e3,
39
+ headers: opts.headers ?? {}
56
40
  });
57
41
  }
58
42
 
@@ -163,9 +147,7 @@ var InternalHttp = class {
163
147
  export {
164
148
  UpstreamError,
165
149
  mapAxiosToUpstreamError,
166
- withRequestId,
167
- withRequestIdConfig,
168
150
  createHttpClient,
169
151
  InternalHttp
170
152
  };
171
- //# sourceMappingURL=chunk-OSYBK5AN.js.map
153
+ //# sourceMappingURL=chunk-5S2JP7PR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/http.ts","../src/core/internalHttp.ts"],"sourcesContent":["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","// sdk/src/core/http.ts\nimport 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","// 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"],"mappings":";AASO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,SAAiB,MAAuB,QAAiB,SAAe;AAChF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AACJ;AAEO,SAAS,wBAAwB,KAAU,KAA4B;AAC1E,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,OAAO,KAAK,UAAU;AAC5B,QAAM,YAAY,KAAK,SAAS,kBAAkB,OAAO,KAAK,WAAW,EAAE,EAAE,SAAS,SAAS;AAE/F,MAAI,WAAW;AACX,WAAO,IAAI,cAAc,IAAI,GAAG,aAAa,oBAAoB,KAAK,EAAC,OAAO,KAAK,QAAO,CAAC;AAAA,EAC/F;AACA,MAAI,CAAC,KAAK,UAAU;AAChB,WAAO,IAAI,cAAc,IAAI,GAAG,iBAAiB,wBAAwB,KAAK,EAAC,OAAO,KAAK,QAAO,CAAC;AAAA,EACvG;AACA,MAAI,WAAW,IAAK,QAAO,IAAI,cAAc,IAAI,GAAG,eAAe,sBAAsB,KAAK,IAAI;AAClG,MAAI,WAAW,IAAK,QAAO,IAAI,cAAc,IAAI,GAAG,kBAAkB,yBAAyB,KAAK,IAAI;AACxG,MAAI,WAAW,IAAK,QAAO,IAAI,cAAc,IAAI,GAAG,eAAe,sBAAsB,KAAK,IAAI;AAClG,MAAI,UAAU,OAAO,SAAS,KAAK;AAC/B,WAAO,IAAI,cAAc,IAAI,GAAG,kBAAkB,yBAAyB,QAAQ,IAAI;AAAA,EAC3F;AACA,SAAO,IAAI,cAAc,IAAI,GAAG,mBAAmB,oBAAoB,QAAQ,IAAI;AACvF;;;ACxCA,OAAO,WAAgD;AAUhD,SAAS,iBAAiB,MAAkC;AACjE,SAAO,MAAM,OAAO;AAAA,IAClB,SAAS,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IACxC,SAAS,KAAK,aAAa;AAAA,IAC3B,SAAS,KAAK,WAAW,CAAC;AAAA,EAC5B,CAA8B;AAChC;;;ACDA,IAAM,gBAA6B;AAAA,EAC/B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,iBAAiB,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,EACpC,sBAAsB;AAC1B;AAEA,SAAS,MAAM,IAAY;AACvB,SAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC/C;AAEA,SAAS,kBAAkB,GAAQ;AAC/B,MAAI;AACA,WAAO,KAAK,UAAU,CAAC;AAAA,EAC3B,QAAQ;AACJ,WAAO,OAAO,CAAC;AAAA,EACnB;AACJ;AAEA,SAAS,UAAU,MAA6B;AAC5C,SAAO,IAAI,QAAQ,QAAQ,CAAC,CAAC;AACjC;AAEA,SAAS,kBAAkB,aAAqC;AAC5D,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,KAAK,YAAY,YAAY;AACnC,SAAO,GAAG,SAAS,kBAAkB,KAAK,GAAG,SAAS,OAAO;AACjE;AAEA,SAAS,aAAa,GAAiB;AACnC,SAAO,GAAG,SAAS;AACvB;AAEA,SAAS,WAAW,IAAoB;AAEpC,QAAM,SAAS,KAAK;AACpB,QAAM,SAAS,KAAK,OAAO,IAAI,IAAI,KAAK;AACxC,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAC7C;AAEO,IAAM,eAAN,MAAmB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,MAA2B;AACnC,SAAK,UAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAC9C,SAAK,SAAS,KAAK;AAGnB,SAAK,YAAY,KAAK,aAAa;AAEnC,SAAK,QAAQ,EAAC,GAAG,eAAe,GAAI,KAAK,SAAS,CAAC,EAAE;AAAA,EACzD;AAAA,EAEA,MAAM,QACF,MACA,OAII,CAAC,GACK;AACV,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI;AAEpE,UAAM,cAAc,UAAU,KAAK,OAAO;AAE1C,QAAI,CAAC,YAAY,IAAI,cAAc,EAAG,aAAY,IAAI,gBAAgB,kBAAkB;AACxF,QAAI,KAAK,OAAQ,aAAY,IAAI,sBAAsB,KAAK,MAAM;AAElE,QAAI,KAAK,UAAW,aAAY,IAAI,gBAAgB,KAAK,SAAS;AAClE,QAAI,KAAK,eAAgB,aAAY,IAAI,mBAAmB,KAAK,cAAc;AAE/E,UAAM,EAAC,SAAS,UAAU,GAAG,SAAQ,IAAI;AAEzC,UAAM,cAAc,YAAY;AAC5B,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAEnE,UAAI;AACA,cAAM,MAAM,MAAM,MAAM,KAAK;AAAA,UACzB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,QAAQ,WAAW;AAAA,QACvB,CAAC;AAED,YAAI,CAAC,IAAI,IAAI;AACT,gBAAMA,QAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,gBAAM,MAAW,IAAI;AAAA,YACjB,QAAQ,IAAI,MAAM,IAAI,IAAI,UAAU,GAAGA,QAAO,MAAMA,KAAI,KAAK,EAAE;AAAA,UACnE;AACA,cAAI,SAAS,IAAI;AACjB,cAAI,OAAOA;AACX,gBAAM;AAAA,QACV;AAEA,YAAI,IAAI,WAAW,IAAK,QAAO;AAE/B,cAAM,cAAc,IAAI,QAAQ,IAAI,cAAc;AAClD,YAAI,kBAAkB,WAAW,GAAG;AAChC,iBAAQ,MAAM,IAAI,KAAK;AAAA,QAC3B;AAEA,cAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,eAAO;AAAA,MACX,UAAE;AACE,qBAAa,OAAO;AAAA,MACxB;AAAA,IACJ;AAEA,QAAI,UAAU;AAEd,WAAO,MAAM;AACT,UAAI;AACA,eAAO,MAAM,YAAY;AAAA,MAC7B,SAAS,GAAQ;AACb;AAEA,cAAM,SAAS,GAAG;AAClB,cAAM,kBAAkB,CAAC,CAAC,UAAU,KAAK,MAAM,gBAAgB,SAAS,MAAM;AAE9E,cAAM,mBACF,KAAK,MAAM,yBACV,aAAa,CAAC,KAAK,CAAC;AAEzB,cAAM,cAAc,mBAAmB;AAEvC,YAAI,CAAC,eAAe,UAAU,KAAK,MAAM,SAAS;AAC9C,kBAAQ;AAAA,YACJ,kCAAkC,GAAG,YAAY,OAAO,WAAW,UAAU,KAAK,QAAQ,GAAG,OAC7F,SAAS,kBAAkB,GAAG,IAAI,CAAC;AAAA,UACvC;AACA,gBAAM;AAAA,QACV;AAEA,cAAM,UAAU,WAAW,KAAK,MAAM,cAAc,OAAO;AAC3D,cAAM,MAAM,OAAO;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AACJ;","names":["text"]}
@@ -286,9 +286,10 @@ async function closeCache() {
286
286
  }
287
287
 
288
288
  export {
289
+ createCacheProvider,
289
290
  TwoLevelCache,
290
291
  getTwoLevelCache,
291
292
  getOrSet,
292
293
  closeCache
293
294
  };
294
- //# sourceMappingURL=chunk-IYFWQDHD.js.map
295
+ //# sourceMappingURL=chunk-QVPPDOXY.js.map
@@ -0,0 +1,413 @@
1
+ import {
2
+ TwoLevelCache,
3
+ createCacheProvider
4
+ } from "./chunk-QVPPDOXY.js";
5
+ import {
6
+ HEADER_BRANCH_UID,
7
+ HEADER_COMPANY_UID,
8
+ HEADER_EMPLOYEE_UID,
9
+ HEADER_INTERNAL_API_KEY,
10
+ HEADER_REQUEST_ID
11
+ } from "./chunk-KXXIMSON.js";
12
+
13
+ // src/clients/env.ts
14
+ function must(v, name) {
15
+ const s = (v || "").trim();
16
+ if (!s) throw new Error(`Missing env var: ${name}`);
17
+ return s;
18
+ }
19
+ function readServiceEnv(prefix, defaults) {
20
+ const baseURL = (process.env[`${prefix}_BASE_URL`] || defaults?.baseURL || "").trim();
21
+ const apiPrefix = (process.env[`${prefix}_API_PREFIX`] || defaults?.apiPrefix || "/internal/v1").trim();
22
+ return {
23
+ baseURL: must(baseURL, `${prefix}_BASE_URL`),
24
+ apiPrefix
25
+ };
26
+ }
27
+
28
+ // src/internalHttpClient.ts
29
+ import fs from "fs";
30
+ var InternalHttpError = class extends Error {
31
+ status;
32
+ code;
33
+ details;
34
+ constructor(status, code, message, details) {
35
+ super(message);
36
+ this.status = status;
37
+ this.code = code;
38
+ this.details = details ?? null;
39
+ }
40
+ };
41
+ function readSecretFile(path) {
42
+ if (!path) return null;
43
+ try {
44
+ const v = fs.readFileSync(path, "utf8").trim();
45
+ return v.length ? v : null;
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+ function splitKeys(v) {
51
+ if (!v) return [];
52
+ return v.split(",").map((s) => s.trim()).filter(Boolean);
53
+ }
54
+ function getInternalApiKey(override) {
55
+ if (override && override.trim()) return override.trim();
56
+ const fileKey = readSecretFile(process.env.INTERNAL_API_KEY_FILE);
57
+ const envKey = (process.env.INTERNAL_API_KEY || "").trim();
58
+ const raw = fileKey || envKey;
59
+ const keys = splitKeys(raw);
60
+ return keys[0] || null;
61
+ }
62
+ function normalizeBaseURL(baseURL) {
63
+ const b = (baseURL || "").trim();
64
+ if (!b) throw new Error("InternalHttpClient: baseURL is required");
65
+ return b.replace(/\/+$/g, "");
66
+ }
67
+ function normalizePrefix(prefix) {
68
+ const p = (prefix || "").trim();
69
+ if (!p) return "";
70
+ const withSlash = p.startsWith("/") ? p : `/${p}`;
71
+ return withSlash.replace(/\/+$/g, "");
72
+ }
73
+ function buildQuery(query) {
74
+ if (!query) return "";
75
+ const params = new URLSearchParams();
76
+ for (const [k, v] of Object.entries(query)) {
77
+ if (v === null || v === void 0) continue;
78
+ params.set(k, String(v));
79
+ }
80
+ const s = params.toString();
81
+ return s ? `?${s}` : "";
82
+ }
83
+ function buildInternalHeaders(ctx, extra, idempotencyKey) {
84
+ const h = {
85
+ "Content-Type": "application/json"
86
+ };
87
+ if (ctx?.requestId) h[HEADER_REQUEST_ID] = String(ctx.requestId);
88
+ if (ctx?.company_uid) h[HEADER_COMPANY_UID] = String(ctx.company_uid);
89
+ if (ctx?.branch_uid) h[HEADER_BRANCH_UID] = String(ctx.branch_uid);
90
+ if (ctx?.employee_uid) h[HEADER_EMPLOYEE_UID] = String(ctx.employee_uid);
91
+ if (idempotencyKey && idempotencyKey.trim()) {
92
+ h["Idempotency-Key"] = idempotencyKey.trim();
93
+ }
94
+ for (const [k, v] of Object.entries(extra || {})) {
95
+ if (v === void 0) continue;
96
+ const vv = String(v).trim();
97
+ if (!vv) continue;
98
+ h[k] = vv;
99
+ }
100
+ return h;
101
+ }
102
+ async function sleep(ms) {
103
+ await new Promise((r) => setTimeout(r, ms));
104
+ }
105
+ function shouldRetry(status, err) {
106
+ if (err?.name === "AbortError") return true;
107
+ if (!status) return true;
108
+ if (status >= 500) return true;
109
+ if (status === 429) return true;
110
+ return false;
111
+ }
112
+ async function safeReadJson(res) {
113
+ const text = await res.text();
114
+ if (!text) return null;
115
+ try {
116
+ return JSON.parse(text);
117
+ } catch {
118
+ return { raw: text };
119
+ }
120
+ }
121
+ function createInternalHttpClient(opts) {
122
+ const baseURL = normalizeBaseURL(opts.baseURL);
123
+ const apiPrefix = normalizePrefix(opts.apiPrefix);
124
+ const timeoutMs = typeof opts.timeoutMs === "number" ? opts.timeoutMs : 15e3;
125
+ const retries = typeof opts.retries === "number" ? opts.retries : 2;
126
+ const retryDelayMs = typeof opts.retryDelayMs === "number" ? opts.retryDelayMs : 250;
127
+ const apiKey = getInternalApiKey(opts.apiKey ?? null);
128
+ if (!apiKey) {
129
+ throw new Error(
130
+ "InternalHttpClient: INTERNAL_API_KEY or INTERNAL_API_KEY_FILE is required to call internal endpoints."
131
+ );
132
+ }
133
+ async function request(r) {
134
+ const path = (r.path || "").trim();
135
+ if (!path.startsWith("/")) {
136
+ throw new Error(`InternalHttpClient: path must start with '/': ${path}`);
137
+ }
138
+ const url = `${baseURL}${apiPrefix}${path}${buildQuery(r.query)}`;
139
+ const headers = buildInternalHeaders(r.ctx ?? null, r.headers, r.idempotencyKey ?? null);
140
+ if (apiKey != null) {
141
+ headers[HEADER_INTERNAL_API_KEY] = apiKey;
142
+ }
143
+ const method = r.method;
144
+ const expectJson = r.expectJson !== false;
145
+ const body = method === "GET" || method === "DELETE" ? void 0 : r.body !== void 0 ? JSON.stringify(r.body) : void 0;
146
+ let attempt = 0;
147
+ let lastErr = null;
148
+ while (attempt <= retries) {
149
+ attempt++;
150
+ const ac = new AbortController();
151
+ const to = setTimeout(() => ac.abort(), timeoutMs);
152
+ try {
153
+ const res = await fetch(url, {
154
+ method,
155
+ headers,
156
+ body,
157
+ signal: ac.signal
158
+ });
159
+ clearTimeout(to);
160
+ if (res.ok) {
161
+ if (!expectJson) return void 0;
162
+ const data = await safeReadJson(res);
163
+ return data;
164
+ }
165
+ const errBody = await safeReadJson(res);
166
+ const status = res.status;
167
+ if (attempt <= retries && shouldRetry(status, null)) {
168
+ lastErr = new InternalHttpError(
169
+ status,
170
+ "INTERNAL_HTTP_RETRY",
171
+ `Retryable internal HTTP error (${status})`,
172
+ { url, status, response: errBody, attempt }
173
+ );
174
+ await sleep(retryDelayMs * attempt);
175
+ continue;
176
+ }
177
+ throw new InternalHttpError(
178
+ status,
179
+ "INTERNAL_HTTP_ERROR",
180
+ `Internal HTTP error (${status})`,
181
+ { url, status, response: errBody }
182
+ );
183
+ } catch (e) {
184
+ clearTimeout(to);
185
+ if (attempt <= retries && shouldRetry(null, e)) {
186
+ lastErr = e;
187
+ await sleep(retryDelayMs * attempt);
188
+ continue;
189
+ }
190
+ if (e instanceof InternalHttpError) throw e;
191
+ throw new InternalHttpError(
192
+ 0,
193
+ "INTERNAL_HTTP_NETWORK_ERROR",
194
+ e?.message || "Internal HTTP network error",
195
+ { url, attempt, error: String(e) }
196
+ );
197
+ }
198
+ }
199
+ throw lastErr || new InternalHttpError(0, "INTERNAL_HTTP_FAILED", "Internal request failed");
200
+ }
201
+ return {
202
+ request,
203
+ get: (path, o) => request({ ...o || {}, method: "GET", path }),
204
+ post: (path, body, o) => request({ ...o || {}, method: "POST", path, body }),
205
+ put: (path, body, o) => request({ ...o || {}, method: "PUT", path, body }),
206
+ patch: (path, body, o) => request({ ...o || {}, method: "PATCH", path, body }),
207
+ del: (path, o) => request({ ...o || {}, method: "DELETE", path })
208
+ };
209
+ }
210
+
211
+ // src/clients/cacheFactory.ts
212
+ function makeRefsCache(namespace) {
213
+ const l2 = createCacheProvider();
214
+ return new TwoLevelCache(l2, {
215
+ namespace,
216
+ ttlMsL1: 3e4,
217
+ ttlMsL2: 3e5,
218
+ negativeTtlMsL1: 3e4,
219
+ negativeTtlMsL2: 3e4
220
+ });
221
+ }
222
+
223
+ // src/clients/bulkRefsClient.ts
224
+ function uniq(arr) {
225
+ return Array.from(new Set(arr.filter(Boolean)));
226
+ }
227
+ function createBulkRefsClient(args) {
228
+ const http = createInternalHttpClient({
229
+ baseURL: args.baseURL,
230
+ apiPrefix: args.apiPrefix
231
+ });
232
+ const cache = makeRefsCache(args.namespace);
233
+ async function bulkRefs(uids, opts) {
234
+ const list = uniq(uids);
235
+ if (list.length === 0) {
236
+ return { ok: true, refs: [], meta: { requested: 0, returned: 0, missing: [] } };
237
+ }
238
+ const hits = [];
239
+ const missing = [];
240
+ for (const uid of list) {
241
+ const v = await cache.get(uid);
242
+ if (v) hits.push(v);
243
+ else missing.push(uid);
244
+ }
245
+ let fetched = [];
246
+ if (missing.length) {
247
+ const resp = await http.post(
248
+ args.path,
249
+ { uids: missing },
250
+ {
251
+ ctx: opts?.ctx ?? null
252
+ }
253
+ );
254
+ const refs = resp.refs ?? resp.items ?? [];
255
+ fetched = refs;
256
+ const ttlMsL1 = opts?.ttlMsL1 ?? args.defaultTtlMsL1;
257
+ const ttlMsL2 = opts?.ttlMsL2 ?? args.defaultTtlMsL2;
258
+ for (const ref of refs) {
259
+ const uid = String(ref?.uid || "").trim();
260
+ if (!uid) continue;
261
+ await cache.set(uid, ref, {
262
+ ttlMsL1,
263
+ ttlMsL2
264
+ });
265
+ }
266
+ }
267
+ const all = [...hits, ...fetched];
268
+ const returnedSet = new Set(all.map((r) => String(r?.uid || "")));
269
+ const missingFinal = list.filter((u) => !returnedSet.has(u));
270
+ return {
271
+ ok: true,
272
+ refs: all,
273
+ meta: {
274
+ requested: list.length,
275
+ returned: all.length,
276
+ missing: missingFinal
277
+ }
278
+ };
279
+ }
280
+ return { bulkRefs };
281
+ }
282
+
283
+ // src/clients/platformClient.ts
284
+ function createPlatformClient(env) {
285
+ const http = createInternalHttpClient(env);
286
+ const cache = makeRefsCache("platform:tenant");
287
+ async function resolveTenant(input, ctx) {
288
+ const key = `${input.company_uid}:${input.service}`;
289
+ const cached = await cache.get(key);
290
+ if (cached) return cached;
291
+ const resp = await http.post(
292
+ "/tenants/resolve",
293
+ input,
294
+ { ctx: ctx ?? null }
295
+ );
296
+ await cache.set(key, resp);
297
+ return resp;
298
+ }
299
+ return { resolveTenant };
300
+ }
301
+
302
+ // src/clients/resClient.ts
303
+ function createResClient() {
304
+ const env = readServiceEnv("RES", { apiPrefix: "/internal/v1" });
305
+ const varieties = createBulkRefsClient({
306
+ namespace: "res:variety",
307
+ baseURL: env.baseURL,
308
+ apiPrefix: env.apiPrefix,
309
+ path: "/refs/varieties"
310
+ });
311
+ return {
312
+ varietiesRefs: (uids, opts) => varieties.bulkRefs(uids, opts)
313
+ };
314
+ }
315
+
316
+ // src/clients/mdClient.ts
317
+ function createMdClient() {
318
+ const env = readServiceEnv("MD", { apiPrefix: "/internal/v1" });
319
+ const measures = createBulkRefsClient({
320
+ namespace: "md:measure",
321
+ baseURL: env.baseURL,
322
+ apiPrefix: env.apiPrefix,
323
+ path: "/refs/measures"
324
+ });
325
+ const measureTypes = createBulkRefsClient({
326
+ namespace: "md:measure_type",
327
+ baseURL: env.baseURL,
328
+ apiPrefix: env.apiPrefix,
329
+ path: "/refs/measure-types"
330
+ });
331
+ const countries = createBulkRefsClient({
332
+ namespace: "md:country",
333
+ baseURL: env.baseURL,
334
+ apiPrefix: env.apiPrefix,
335
+ path: "/refs/countries"
336
+ });
337
+ return {
338
+ measuresRefs: (uids, opts) => measures.bulkRefs(uids, opts),
339
+ measureTypesRefs: (uids, opts) => measureTypes.bulkRefs(uids, opts),
340
+ countriesRefs: (uids, opts) => countries.bulkRefs(uids, opts)
341
+ };
342
+ }
343
+
344
+ // src/clients/fisClient.ts
345
+ function createFisClient() {
346
+ const env = readServiceEnv("FIS", { apiPrefix: "/internal/v1" });
347
+ const taxes = createBulkRefsClient({
348
+ namespace: "fis:tax",
349
+ baseURL: env.baseURL,
350
+ apiPrefix: env.apiPrefix,
351
+ path: "/refs/taxes"
352
+ });
353
+ return {
354
+ taxesRefs: (uids, opts) => taxes.bulkRefs(uids, opts)
355
+ };
356
+ }
357
+
358
+ // src/clients/mediaClient.ts
359
+ function createMediaClient() {
360
+ const env = readServiceEnv("MEDIA", { apiPrefix: "/internal/v1" });
361
+ const files = createBulkRefsClient({
362
+ namespace: "media:file",
363
+ baseURL: env.baseURL,
364
+ apiPrefix: env.apiPrefix,
365
+ path: "/refs/files"
366
+ });
367
+ return {
368
+ filesRefs: (uids, opts) => files.bulkRefs(uids, opts)
369
+ };
370
+ }
371
+
372
+ // src/clients/mkpClient.ts
373
+ function createMkpClient() {
374
+ const env = readServiceEnv("MKP", { apiPrefix: "/internal/v1" });
375
+ const publications = createBulkRefsClient({
376
+ namespace: "mkp:publication",
377
+ baseURL: env.baseURL,
378
+ apiPrefix: env.apiPrefix,
379
+ path: "/refs/publications"
380
+ });
381
+ const events = createBulkRefsClient({
382
+ namespace: "mkp:event",
383
+ baseURL: env.baseURL,
384
+ apiPrefix: env.apiPrefix,
385
+ path: "/refs/events"
386
+ });
387
+ const promotions = createBulkRefsClient({
388
+ namespace: "mkp:promotion",
389
+ baseURL: env.baseURL,
390
+ apiPrefix: env.apiPrefix,
391
+ path: "/refs/promotions"
392
+ });
393
+ return {
394
+ publicationsRefs: (uids, opts) => publications.bulkRefs(uids, opts),
395
+ eventsRefs: (uids, opts) => events.bulkRefs(uids, opts),
396
+ promotionsRefs: (uids, opts) => promotions.bulkRefs(uids, opts)
397
+ };
398
+ }
399
+
400
+ export {
401
+ InternalHttpError,
402
+ buildInternalHeaders,
403
+ createInternalHttpClient,
404
+ readServiceEnv,
405
+ createBulkRefsClient,
406
+ createPlatformClient,
407
+ createResClient,
408
+ createMdClient,
409
+ createFisClient,
410
+ createMediaClient,
411
+ createMkpClient
412
+ };
413
+ //# sourceMappingURL=chunk-UK6LHHJQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/clients/env.ts","../src/internalHttpClient.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"],"sourcesContent":["// 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/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/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 {ResVarietyRef, ResVarietiesRefsResponse} from \"@innvoid/getmarket-contracts\";\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 return {\n varietiesRefs: (uids: string[], opts?: any) => varieties.bulkRefs(uids, opts) as Promise<ResVarietiesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/mdClient.ts\nimport type {\n MdMeasureRef,\n MdMeasuresRefsResponse,\n MdMeasureTypeRef,\n MdMeasureTypesRefsResponse,\n MdCountryRef,\n MdCountriesRefsResponse,\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 return {\n measuresRefs: (uids: string[], opts?: any) => measures.bulkRefs(uids, opts) as Promise<MdMeasuresRefsResponse>,\n measureTypesRefs: (uids: string[], opts?: any) => measureTypes.bulkRefs(uids, opts) as Promise<MdMeasureTypesRefsResponse>,\n countriesRefs: (uids: string[], opts?: any) => countries.bulkRefs(uids, opts) as Promise<MdCountriesRefsResponse>,\n };\n}\n","// packages/sdk/src/clients/fisClient.ts\nimport type {FisTaxRef, FisTaxesRefsResponse} from \"@innvoid/getmarket-contracts\";\nimport {readServiceEnv} from \"./env\";\nimport {createBulkRefsClient} from \"./bulkRefsClient\";\n\nexport function createFisClient() {\n const env = readServiceEnv(\"FIS\", {apiPrefix: \"/internal/v1\"});\n\n const taxes = createBulkRefsClient<FisTaxRef>({\n namespace: \"fis:tax\",\n baseURL: env.baseURL,\n apiPrefix: env.apiPrefix,\n path: \"/refs/taxes\",\n });\n\n return {\n taxesRefs: (uids: string[], opts?: any) => taxes.bulkRefs(uids, opts) as Promise<FisTaxesRefsResponse>,\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"],"mappings":"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","names":[]}
@@ -9,6 +9,20 @@ function parseHeaders(req, _res, next) {
9
9
  next();
10
10
  }
11
11
 
12
+ // src/middlewares/requestId.ts
13
+ import { randomUUID, randomBytes } from "crypto";
14
+ var REQUEST_ID_HEADER = "x-request-id";
15
+ var REQUEST_ID_HEADER_ALT = "x-requestid";
16
+ var RESPONSE_REQUEST_ID_HEADER = "X-Request-Id";
17
+ function requestId(req, res, next) {
18
+ const headerId = req.headers[REQUEST_ID_HEADER] || req.headers[REQUEST_ID_HEADER_ALT];
19
+ const id = headerId?.trim() || randomUUID();
20
+ req.requestId = id;
21
+ res.locals.requestId = id;
22
+ res.setHeader(RESPONSE_REQUEST_ID_HEADER, id);
23
+ next();
24
+ }
25
+
12
26
  // src/middlewares/internalAuth.ts
13
27
  import fs from "fs";
14
28
  import crypto from "crypto";
@@ -626,6 +640,7 @@ function allowAuthAdminOrPerm(permission) {
626
640
 
627
641
  export {
628
642
  parseHeaders,
643
+ requestId,
629
644
  sendOk,
630
645
  sendError,
631
646
  internalAuth,
@@ -648,4 +663,4 @@ export {
648
663
  allowSysAdminOrRolesOrAnyPermission,
649
664
  allowAuthAdminOrPerm
650
665
  };
651
- //# sourceMappingURL=chunk-S44JVJZS.js.map
666
+ //# sourceMappingURL=chunk-WM2QICZQ.js.map