@xenia-martech/sdk-js 1.0.1-dev.1 → 1.1.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -4
- package/dist/{actions-CcBYV--3.d.cts → actions-CKeiofxJ.d.cts} +19 -1
- package/dist/{actions-CcBYV--3.d.ts → actions-CKeiofxJ.d.ts} +19 -1
- package/dist/{cookie-names-B3b0XNc2.d.cts → api-URhxxi4x.d.cts} +19 -42
- package/dist/{cookie-names-B3b0XNc2.d.ts → api-URhxxi4x.d.ts} +19 -42
- package/dist/chunk-5D7SJIO4.cjs +109 -0
- package/dist/chunk-5D7SJIO4.cjs.map +1 -0
- package/dist/{chunk-XXNDHYAS.js → chunk-FYSEKFIY.js} +45 -103
- package/dist/chunk-FYSEKFIY.js.map +1 -0
- package/dist/{chunk-WYM4CQVG.cjs → chunk-JEKVN7HK.cjs} +46 -106
- package/dist/chunk-JEKVN7HK.cjs.map +1 -0
- package/dist/chunk-TLTG3BTC.js +104 -0
- package/dist/chunk-TLTG3BTC.js.map +1 -0
- package/dist/chunk-U2WBBOYT.cjs +233 -0
- package/dist/chunk-U2WBBOYT.cjs.map +1 -0
- package/dist/chunk-WYAMPEVV.js +227 -0
- package/dist/chunk-WYAMPEVV.js.map +1 -0
- package/dist/client/index.cjs +60 -6
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +25 -3
- package/dist/client/index.d.ts +25 -3
- package/dist/client/index.js +59 -7
- package/dist/client/index.js.map +1 -1
- package/dist/client/react/index.cjs +58 -6
- package/dist/client/react/index.cjs.map +1 -1
- package/dist/client/react/index.d.cts +2 -2
- package/dist/client/react/index.d.ts +2 -2
- package/dist/client/react/index.js +58 -6
- package/dist/client/react/index.js.map +1 -1
- package/dist/cookie-names-8FxbGKGS.d.ts +127 -0
- package/dist/cookie-names-QYMiEMAq.d.cts +127 -0
- package/dist/index.cjs +41 -32
- package/dist/index.d.cts +4 -71
- package/dist/index.d.ts +4 -71
- package/dist/index.js +2 -1
- package/dist/next/index.cjs +59 -0
- package/dist/next/index.cjs.map +1 -0
- package/dist/next/index.d.cts +45 -0
- package/dist/next/index.d.ts +45 -0
- package/dist/next/index.js +54 -0
- package/dist/next/index.js.map +1 -0
- package/dist/server/index.cjs +38 -214
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +5 -104
- package/dist/server/index.d.ts +5 -104
- package/dist/server/index.js +5 -204
- package/dist/server/index.js.map +1 -1
- package/dist/xenia-sdk.iife.js +3 -3
- package/dist/xenia-sdk.iife.js.map +1 -1
- package/dist/xenia-server-D-ozqSgv.d.ts +126 -0
- package/dist/xenia-server-rs3Gpbw7.d.cts +126 -0
- package/package.json +26 -7
- package/dist/chunk-WYM4CQVG.cjs.map +0 -1
- package/dist/chunk-XXNDHYAS.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/actions.ts","../src/core/http-client.ts","../src/core/token-provider.ts","../src/core/api.ts","../src/core/id.ts","../src/core/cookie-names.ts","../src/core/request-context.ts"],"names":[],"mappings":"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","file":"chunk-FYSEKFIY.js","sourcesContent":["import type {\n JsonValue,\n MessagePlacement,\n MessagePosition,\n WidgetFormSubmit,\n WidgetSegment,\n WidgetStyle,\n WidgetType,\n XeniaAction,\n} from \"./types\";\n\nconst MESSAGE_TYPES: ReadonlySet<string> = new Set<MessagePlacement>([\n \"banner\",\n \"popup\",\n \"modal\",\n \"inline\",\n]);\n\nconst MESSAGE_POSITIONS: ReadonlySet<string> = new Set<MessagePosition>([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top\",\n \"bottom\",\n]);\n\n// NOTE: `widgetType` is deliberately NOT added to `ALL_TYPES`/`MESSAGE_TYPES` below — it is an\n// orthogonal field on message-placement actions, not a new `type` value. Keeping `type`'s\n// allowlist untouched is exactly what keeps the PHP SDK's `XeniaActions::KNOWN_TYPES` (same value\n// set) valid with zero PHP changes.\nconst WIDGET_TYPES: ReadonlySet<string> = new Set<WidgetType>([\"standard\", \"spin-wheel\"]);\n\nconst ALL_TYPES: ReadonlySet<string> = new Set<string>([\n \"swap\",\n \"hide\",\n \"show\",\n \"setContent\",\n \"redirect\",\n ...MESSAGE_TYPES,\n]);\n\n/** Type guard for a plain JSON object. */\nfunction isObject(v: JsonValue | undefined): v is { [k: string]: JsonValue } {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction asString(v: JsonValue | undefined): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\nfunction asNumber(v: JsonValue | undefined): number | undefined {\n return typeof v === \"number\" ? v : undefined;\n}\n\n/**\n * Validate and narrow a single raw entry into a {@link XeniaAction}.\n * Returns null for anything malformed so a bad entry can't crash the renderer.\n */\nfunction toAction(raw: JsonValue): XeniaAction | null {\n if (!isObject(raw)) return null;\n const type = asString(raw.type);\n if (!type || !ALL_TYPES.has(type)) return null;\n\n if (type === \"redirect\") {\n const url = asString(raw.url);\n return url ? { type, url } : null;\n }\n\n if (type === \"hide\" || type === \"show\") {\n const target = asString(raw.target);\n return target ? { type, target } : null;\n }\n\n if (type === \"swap\" || type === \"setContent\") {\n const target = asString(raw.target);\n if (!target) return null;\n return { type, target, html: asString(raw.html), text: asString(raw.text) };\n }\n\n // Message placement actions (banner/popup/modal/inline).\n const cta = isObject(raw.cta)\n ? {\n label: asString(raw.cta.label) ?? \"\",\n url: asString(raw.cta.url),\n event: asString(raw.cta.event),\n }\n : undefined;\n\n return {\n type: type as MessagePlacement,\n target: asString(raw.target),\n title: asString(raw.title),\n message: asString(raw.message),\n imageUrl: asString(raw.imageUrl),\n html: asString(raw.html),\n // A link-only CTA (empty label, e.g. a spin-wheel's data-xenia-wheel-cta —\n // label is meaningless there, the winHtml/lossHtml design supplies its own button text)\n // must still parse through — gating on `cta.label` alone silently dropped it.\n cta: cta && (cta.label || cta.url) ? cta : undefined,\n dismissAfterMs: asNumber(raw.dismissAfterMs),\n position: asMessagePosition(raw.position),\n widgetType: asWidgetType(raw.widgetType),\n segments: asSegments(raw.segments),\n formSubmit: asFormSubmit(raw.formSubmit),\n style: asWidgetStyle(raw.style),\n spinnerHtml: asString(raw.spinnerHtml),\n winHtml: asString(raw.winHtml),\n lossHtml: asString(raw.lossHtml),\n };\n}\n\nfunction asMessagePosition(v: JsonValue | undefined): MessagePosition | undefined {\n const s = asString(v);\n return s && MESSAGE_POSITIONS.has(s) ? (s as MessagePosition) : undefined;\n}\n\nfunction asWidgetType(v: JsonValue | undefined): WidgetType | undefined {\n const s = asString(v);\n return s && WIDGET_TYPES.has(s) ? (s as WidgetType) : undefined;\n}\n\n/** Narrow a raw `segments` array to label/color/isLoss-only entries — drops anything malformed. */\nfunction asSegments(v: JsonValue | undefined): WidgetSegment[] | undefined {\n if (!Array.isArray(v)) return undefined;\n const segments: WidgetSegment[] = [];\n for (const entry of v) {\n if (!isObject(entry)) continue;\n const id = asString(entry.id);\n const label = asString(entry.label);\n if (!id || !label) continue;\n segments.push({\n id,\n label,\n colorHex: asString(entry.colorHex),\n isLoss: entry.isLoss === true,\n });\n }\n return segments.length ? segments : undefined;\n}\n\n/**\n * Narrow a raw `formSubmit` envelope. Defensive by design (same as the rest of this\n * module) — a malformed envelope (missing `mode`) is dropped entirely rather than\n * passed through half-formed, since the SDK's endpoint-selection logic depends on it.\n */\nfunction asFormSubmit(v: JsonValue | undefined): WidgetFormSubmit | undefined {\n if (!isObject(v)) return undefined;\n const mode = asString(v.mode);\n if (!mode) return undefined;\n return {\n requiresResolve: v.requiresResolve === true,\n mode,\n flowRef: asString(v.flowRef),\n bindingRef: asString(v.bindingRef),\n successDisplayMs: asNumber(v.successDisplayMs),\n };\n}\n\n/**\n * Narrow a raw `style` override. Every field is independently optional/defensive (same\n * philosophy as the rest of this module) — a malformed value for one field just drops that\n * field, it never discards the whole `style` object.\n */\nfunction asWidgetStyle(v: JsonValue | undefined): WidgetStyle | undefined {\n if (!isObject(v)) return undefined;\n const style: WidgetStyle = {\n hideCloseButton: v.hideCloseButton === true,\n hideOverlay: v.hideOverlay === true,\n };\n const hasAny = style.hideCloseButton || style.hideOverlay;\n return hasAny ? style : undefined;\n}\n\n/**\n * Parse render actions out of a webhook-response body.\n *\n * The convention: marketers return `{ \"xeniaActions\": [ ... ] }` (or a bare\n * array) from the `webhook-response` node. Any body without a recognizable\n * `xeniaActions` array yields an empty list — a safe no-op.\n */\nexport function parseActions(body: JsonValue): XeniaAction[] {\n let list: JsonValue | undefined;\n if (Array.isArray(body)) {\n list = body;\n } else if (isObject(body) && Array.isArray(body.xeniaActions)) {\n list = body.xeniaActions;\n }\n if (!Array.isArray(list)) return [];\n\n const actions: XeniaAction[] = [];\n for (const entry of list) {\n const action = toAction(entry);\n if (action) actions.push(action);\n }\n return actions;\n}\n","import type { CircuitBreakerConfig, HttpMethod, JsonValue, RetryConfig } from \"./types\";\n\n/**\n * Default Xenia backend base URL, used whenever `baseUrl` is omitted from\n * config. Points at the hosted engine — override only for a self-hosted or\n * non-default environment.\n */\nexport const DEFAULT_BASE_URL = \"https://engine.xeniamartech.com/xenia\";\n\n/** Returns true when running in a browser environment (SSR-safe). */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/** Appends query parameters to a URL. Returns the URL unchanged when empty. */\nexport function buildUrl(url: string, queryParams?: Record<string, string>): string {\n if (!queryParams || Object.keys(queryParams).length === 0) return url;\n const params = new URLSearchParams(queryParams);\n const sep = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${sep}${params.toString()}`;\n}\n\n/** Sleep helper used by the retry backoff. */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Options for a single request. */\nexport interface RequestOptions {\n method?: HttpMethod;\n /** Path appended to `baseUrl` (should start with `/`). */\n path: string;\n headers?: Record<string, string>;\n query?: Record<string, string>;\n body?: JsonValue;\n /** Per-request timeout override in ms. */\n timeout?: number;\n /** Disable retry for this request (e.g. long-polling webhook). */\n noRetry?: boolean;\n /** Per-request retry override. */\n retry?: RetryConfig;\n /**\n * Keep the request alive past page unload (`fetch`'s `keepalive` flag).\n * Used for best-effort flushes on `pagehide`, where `sendBeacon` can't be\n * used instead because it doesn't support custom headers (tenant scope).\n */\n keepalive?: boolean;\n}\n\n/** Result of a request: the raw Response plus the parsed JSON (or null). */\nexport interface HttpResult {\n response: Response;\n data: JsonValue;\n}\n\n/** Error thrown for non-2xx responses (after retries are exhausted). */\nexport class HttpError extends Error {\n constructor(\n public readonly status: number,\n public readonly data: JsonValue,\n message?: string,\n ) {\n super(message ?? `Request failed with status ${status}`);\n this.name = \"HttpError\";\n }\n}\n\n/** Thrown without a network call while an endpoint's circuit is open (see {@link CircuitBreakerConfig}). */\nexport class CircuitOpenError extends Error {\n constructor(public readonly endpoint: string) {\n super(`Circuit open for ${endpoint}: failing fast until the cooldown passes`);\n this.name = \"CircuitOpenError\";\n }\n}\n\n/**\n * Per-endpoint breaker state, module-wide so it outlives a single client.\n * ponytail: after the cooldown every concurrent caller probes, not just one; fine for a fail-fast\n * guard, add a probe lock if a thundering herd on recovery ever matters.\n */\nconst breakers = new Map<string, { failures: number; openedAt: number }>();\n\nexport interface HttpClientOptions {\n /** Defaults to {@link DEFAULT_BASE_URL} when omitted. */\n baseUrl?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n retry?: RetryConfig;\n circuitBreaker?: boolean | CircuitBreakerConfig;\n debug?: boolean;\n}\n\n/**\n * Minimal fetch wrapper shared by all runtimes.\n *\n * - Injects default headers (tenant scope, content-type).\n * - Applies an `AbortController` timeout.\n * - Retries transient failures (network error, `429`, `5xx`) with exponential\n * backoff, honoring a `Retry-After` header when present.\n * - Parses JSON, falling back to `null` on empty/invalid bodies.\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n private readonly retry: Required<RetryConfig>;\n private readonly debug: boolean;\n private readonly breaker: Required<CircuitBreakerConfig> | null;\n\n constructor(opts: HttpClientOptions) {\n this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.timeout = opts.timeout ?? 8000;\n this.retry = {\n attempts: opts.retry?.attempts ?? 2,\n baseDelayMs: opts.retry?.baseDelayMs ?? 300,\n };\n this.debug = opts.debug ?? false;\n const cb = opts.circuitBreaker === true ? {} : opts.circuitBreaker || null;\n this.breaker = cb && { failureThreshold: cb.failureThreshold ?? 3, cooldownMs: cb.cooldownMs ?? 30_000 };\n }\n\n async request(opts: RequestOptions): Promise<HttpResult> {\n if (!this.breaker) return this.send(opts);\n // Keyed by full URL, query included: every webhook shares `/flow`, and one slow journey\n // (`?id=`) must not short-circuit the others.\n const key = buildUrl(this.baseUrl + opts.path, opts.query);\n const b = breakers.get(key) ?? { failures: 0, openedAt: 0 };\n if (b.openedAt) {\n if (Date.now() - b.openedAt < this.breaker.cooldownMs) throw new CircuitOpenError(key);\n // Half-open: let this call probe; one more failure re-opens.\n b.openedAt = 0;\n b.failures = this.breaker.failureThreshold - 1;\n }\n try {\n const result = await this.send(opts);\n breakers.delete(key);\n return result;\n } catch (err) {\n if (err instanceof HttpError && !this.isRetryableStatus(err.status)) {\n breakers.delete(key); // the backend answered: it's up\n throw err;\n }\n b.failures += 1;\n if (b.failures >= this.breaker.failureThreshold) {\n b.openedAt = Date.now();\n this.log(`circuit opened for ${opts.path} after ${b.failures} failures`);\n }\n breakers.set(key, b);\n throw err;\n }\n }\n\n private async send(opts: RequestOptions): Promise<HttpResult> {\n const url = buildUrl(this.baseUrl + opts.path, opts.query);\n const method = opts.method ?? \"GET\";\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.defaultHeaders,\n ...opts.headers,\n };\n const body = opts.body !== undefined ? JSON.stringify(opts.body) : undefined;\n const timeout = opts.timeout ?? this.timeout;\n const maxAttempts = opts.noRetry ? 1 : (opts.retry?.attempts ?? this.retry.attempts) + 1;\n const baseDelay = opts.retry?.baseDelayMs ?? this.retry.baseDelayMs;\n\n let lastError: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await this.fetchWithTimeout(\n url,\n { method, headers, body, ...(opts.keepalive ? { keepalive: true } : {}) },\n timeout,\n );\n const data = await this.parseBody(response);\n\n if (response.ok) {\n return { response, data };\n }\n\n // Retry on 429/5xx if attempts remain; otherwise throw.\n if (this.isRetryableStatus(response.status) && attempt < maxAttempts - 1) {\n const wait = this.retryAfterMs(response, baseDelay, attempt);\n this.log(`retrying ${opts.path} after ${wait}ms (status ${response.status})`);\n await delay(wait);\n continue;\n }\n throw new HttpError(response.status, data);\n } catch (err) {\n lastError = err;\n // Non-retryable HttpError → rethrow immediately.\n if (err instanceof HttpError) throw err;\n // Network/timeout error → retry if attempts remain.\n if (attempt < maxAttempts - 1) {\n const wait = baseDelay * 2 ** attempt;\n this.log(`retrying ${opts.path} after ${wait}ms (network error)`);\n await delay(wait);\n continue;\n }\n }\n }\n throw lastError instanceof Error ? lastError : new Error(\"Request failed\");\n }\n\n private async fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeout: number,\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`Request timeout after ${timeout}ms`, { cause: err });\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async parseBody(response: Response): Promise<JsonValue> {\n const text = await response.text().catch(() => \"\");\n if (!text) return null;\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n }\n\n private isRetryableStatus(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n }\n\n private retryAfterMs(response: Response, baseDelay: number, attempt: number): number {\n const header = response.headers.get(\"Retry-After\");\n if (header) {\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n }\n return baseDelay * 2 ** attempt;\n }\n\n private log(msg: string): void {\n if (this.debug) console.warn(`[xenia] ${msg}`);\n }\n}\n","import type { XeniaConfig } from \"./types\";\n\ninterface Cached {\n token: string;\n /** Epoch ms when the token should be considered stale. */\n expiresAt: number;\n}\n\n/** JWT `exp` (seconds) if decodable, else undefined. Best-effort, no verify. */\nfunction decodeExp(token: string): number | undefined {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return undefined;\n const json = JSON.parse(atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\")));\n return typeof json.exp === \"number\" ? json.exp * 1000 : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the Bearer token `XeniaApi` attaches to every request, caching a\n * short-lived token from `config.getToken` until ~30s before expiry. A static\n * `config.token` is returned as-is. Isomorphic (browser + Node ≥18, both have\n * global `atob`).\n */\nexport class TokenProvider {\n private readonly config: XeniaConfig;\n private cached: Cached | null = null;\n private inflight: Promise<string> | null = null;\n\n constructor(config: XeniaConfig) {\n this.config = config;\n }\n\n /** Whether a token source is configured at all — lets callers skip resolution entirely. */\n hasSource(): boolean {\n return Boolean(this.config.token || this.config.getToken);\n }\n\n readonly getToken = async (): Promise<string> => {\n if (this.config.token && !this.config.getToken) return this.config.token;\n\n const now = Date.now();\n if (this.cached && this.cached.expiresAt > now) return this.cached.token;\n if (this.inflight) return this.inflight;\n\n if (!this.config.getToken) {\n throw new Error(\"No token source: set config.token or config.getToken.\");\n }\n\n this.inflight = Promise.resolve(this.config.getToken())\n .then((token) => {\n const exp = decodeExp(token);\n // Refresh 30s before real expiry; default 5 min if the token is opaque.\n const expiresAt = exp ? exp - 30_000 : now + 5 * 60_000;\n this.cached = { token, expiresAt };\n return token;\n })\n .finally(() => {\n this.inflight = null;\n });\n\n return this.inflight;\n };\n}\n","import { parseActions } from \"./actions\";\nimport { HttpClient } from \"./http-client\";\nimport { TokenProvider } from \"./token-provider\";\nimport type {\n AnalyticsIngestResponse,\n ConsentState,\n IdentifyRequest,\n IdentifyResponse,\n JsonObject,\n JsonValue,\n ResolveBatchItem,\n ResolveBatchResult,\n ResolveOptions,\n ResolveResult,\n WebhookResponse,\n WidgetPrize,\n WidgetSubmitResponse,\n WidgetType,\n XeniaConfig,\n XeniaEvent,\n} from \"./types\";\n\n/** Type guard for a plain JSON object (as opposed to an array/primitive/null). */\nfunction isJsonObject(v: JsonValue): v is JsonObject {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/** Narrow a raw `prize` field off a `/widget-submissions` response body. */\nfunction asWidgetPrize(v: JsonValue | undefined): WidgetPrize | undefined {\n return v !== undefined && isJsonObject(v) ? (v as WidgetPrize) : undefined;\n}\n\n/** Drop `undefined` values so the JSON body stays clean. */\nexport function compact(obj: Record<string, JsonValue | undefined>): JsonObject {\n const out: JsonObject = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k] = v;\n }\n return out;\n}\n\n/**\n * Low-level, isomorphic Xenia API client. Wraps the raw endpoints; identity,\n * UTM capture, and action rendering are layered on top by the client runtime.\n * All paths are relative to `baseUrl`, which defaults to the hosted engine\n * (`https://engine.xeniamartech.com/xenia`) when omitted from config.\n */\nexport class XeniaApi {\n private readonly http: HttpClient;\n private readonly tenantId: string;\n private readonly environmentKey: string;\n private readonly tokenProvider: TokenProvider;\n\n constructor(config: XeniaConfig) {\n this.tenantId = config.tenantId;\n this.environmentKey = config.environmentKey;\n this.tokenProvider = new TokenProvider(config);\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n defaultHeaders: config.headers,\n timeout: config.timeout,\n retry: config.retry,\n circuitBreaker: config.circuitBreaker,\n debug: config.debug,\n });\n }\n\n /** Tenant-scope headers required by header-scoped endpoints. */\n private tenantHeaders(): Record<string, string> {\n return {\n \"X-Tenant-Id\": this.tenantId,\n \"X-Environment\": this.environmentKey,\n };\n }\n\n /**\n * Tenant headers plus a resolved `Authorization: Bearer` header when\n * `config.token`/`config.getToken` is set — e.g. required by a webhook\n * trigger node configured with its own auth token. No-op (tenant headers\n * only) when no token source is configured, so this is safe to call\n * unconditionally on every request.\n */\n private async authHeaders(): Promise<Record<string, string>> {\n const headers = this.tenantHeaders();\n if (!this.tokenProvider.hasSource()) return headers;\n const token = await this.tokenProvider.getToken();\n if (token) headers.Authorization = `Bearer ${token}`;\n return headers;\n }\n\n /**\n * Webhook request/response — `GET|POST /flow?id={triggerId}`. Held open by the\n * backend until a `webhook-response` node resolves. Returns the normalized\n * response, including any `xeniaActions` parsed from the body.\n *\n * Not retried by default: the backend long-polls this call, so a retry would\n * duplicate the journey run.\n */\n async webhook(\n triggerId: string,\n data?: JsonValue,\n method: \"GET\" | \"POST\" = \"POST\",\n ): Promise<WebhookResponse> {\n const { response, data: rawBody } = await this.http.request({\n method,\n path: \"/flow\",\n query: { id: triggerId },\n headers: await this.authHeaders(),\n body: method === \"POST\" ? (data ?? {}) : undefined,\n noRetry: true,\n });\n return {\n status: response.status,\n body: rawBody,\n actions: parseActions(rawBody),\n receivedAt: Date.now(),\n };\n }\n\n /**\n * Widget form submission — `POST /widget-submissions?ref={bindingRef}`. Used whenever the\n * action's `formSubmit.requiresResolve` is true (spin-wheel, which must have a\n * server-resolved outcome before anything renders) or `mode === \"endpoint\"` — the common\n * plain-popup case (`mode === \"journey\" && !requiresResolve`) bypasses this entirely and calls\n * {@link webhook} against `flowRef` instead (see `XeniaClient.submitWidgetForm`'s endpoint\n * selection).\n *\n * Not retried (`noRetry: true`), styled like {@link webhook} — a retried POST must never\n * double-fire a journey or double-resolve a prize server-side.\n */\n async submitWidget(ref: string, body?: JsonValue): Promise<WidgetSubmitResponse> {\n const { response, data: rawBody } = await this.http.request({\n method: \"POST\",\n path: \"/widget-submissions\",\n query: { ref },\n headers: await this.authHeaders(),\n body: body ?? {},\n noRetry: true,\n });\n const obj = isJsonObject(rawBody) ? rawBody : {};\n return {\n status: response.status,\n body: rawBody,\n actions: parseActions(rawBody),\n prize: asWidgetPrize(obj.prize),\n alreadyPlayed: obj.alreadyPlayed === true,\n dispatched: obj.dispatched === true,\n dispatchError: typeof obj.dispatchError === \"string\" ? obj.dispatchError : undefined,\n widgetType: typeof obj.widgetType === \"string\" ? (obj.widgetType as WidgetType) : undefined,\n receivedAt: Date.now(),\n };\n }\n\n /**\n * Unified event batch (max 100/request per the backend) — `POST /api/events/v1`.\n * Records analytics for every event and matches/advances a journey for any\n * event with `trigger: true`. Replaces the old `sendEvent()` (journey trigger)\n * and `sendAnalytics()` (CDP) calls.\n */\n async sendEvents(\n events: XeniaEvent[],\n opts?: { keepalive?: boolean },\n ): Promise<AnalyticsIngestResponse> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1\",\n headers: await this.authHeaders(),\n body: { events } as unknown as JsonObject,\n keepalive: opts?.keepalive,\n });\n return data as unknown as AnalyticsIngestResponse;\n }\n\n /** Bind visitor→user — `POST /api/events/v1/identify`. */\n async identify(body: IdentifyRequest): Promise<IdentifyResponse> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1/identify\",\n headers: await this.authHeaders(),\n body: body as unknown as JsonObject,\n });\n return data as unknown as IdentifyResponse;\n }\n\n /**\n * Update consent — `POST /api/events/v1/consent`.\n *\n * The three scope flags are required (non-null) by the backend, so an omitted\n * one is sent as an explicit `false` rather than left out: a partial body like\n * `consent({ analytics: true })` — the shape most callers actually write — is\n * otherwise rejected with a 400 and the consent record is never stored.\n */\n async consent(xeniaVisitorId: string, consent: ConsentState): Promise<JsonValue> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1/consent\",\n headers: await this.authHeaders(),\n body: compact({\n xeniaVisitorId,\n analytics: consent.analytics === true,\n marketing: consent.marketing === true,\n personalization: consent.personalization === true,\n consentSource: consent.consentSource,\n consentVersion: consent.consentVersion,\n }),\n });\n return data;\n }\n\n /**\n * Resolve in-entry content personalization for one content key —\n * `POST /api/personalization/resolve?merge=<bool>`. Requires the SDK Bearer\n * token (same credential as events; resolve is auth-required). `merge=true`\n * returns server-spliced `content`; otherwise splice `swaps` client-side.\n */\n async resolve(contentKey: string, opts: ResolveOptions = {}): Promise<ResolveResult> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/personalization/resolve\",\n query: opts.merge !== undefined ? { merge: String(opts.merge) } : undefined,\n headers: await this.authHeaders(),\n body: compact({\n contentKey,\n data: opts.data as JsonValue,\n locale: opts.locale,\n }),\n });\n return data as unknown as ResolveResult;\n }\n\n /**\n * Resolve several content keys in one round-trip (≤50) —\n * `POST /api/personalization/resolve-batch?merge=<bool>`. Same auth/merge\n * semantics as {@link resolve}.\n */\n async resolveBatch(\n items: ResolveBatchItem[],\n opts: ResolveOptions = {},\n ): Promise<ResolveBatchResult[]> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/personalization/resolve-batch\",\n query: opts.merge !== undefined ? { merge: String(opts.merge) } : undefined,\n headers: await this.authHeaders(),\n body: compact({\n items: items as unknown as JsonValue,\n data: opts.data as JsonValue,\n locale: opts.locale,\n }),\n });\n return data as unknown as ResolveBatchResult[];\n }\n}\n","/** Crockford base32 alphabet (no I/L/O/U, avoids visual ambiguity) — used by ULID. */\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\n/**\n * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):\n * a 48-bit timestamp (10 Crockford-base32 chars) + 80 bits of randomness (16\n * chars), 26 chars total — matches the backend's `eventId` field (`≤26`\n * chars). No dependency; implemented inline to keep the SDK lean.\n */\nexport function generateUlid(time: number = Date.now()): string {\n let timePart = \"\";\n let t = time;\n for (let i = 9; i >= 0; i--) {\n timePart = ENCODING[t % 32] + timePart;\n t = Math.floor(t / 32);\n }\n\n const random = randomBytes(16);\n let randomPart = \"\";\n for (let i = 0; i < 16; i++) {\n randomPart += ENCODING[random[i] % 32];\n }\n\n return timePart + randomPart;\n}\n\n/** Backend cap on `eventId` (`@Size(max = 26)`), which a ULID exactly fills. */\nexport const MAX_EVENT_ID_LENGTH = 26;\n\n/**\n * Coerce a caller-supplied dedup key into something the backend will accept.\n *\n * `eventId` is capped at 26 characters server-side, and an over-length value\n * rejects the ENTIRE batch it rides in — not just its own event. That is easy to\n * hit: `\"ord-\" + <uuid>` is 40. Rather than drop the caller's idempotency key or\n * let the batch 400, fold anything longer into a deterministic 26-char digest.\n * Deterministic is the point — the same order id always yields the same event id,\n * so re-firing it still de-dupes to one conversion, which is what the key is for.\n *\n * Truncation is deliberately not used: `\"ord-<uuid>\"` values share a long common\n * prefix, so cutting to 26 chars can map two different orders onto one id.\n */\nexport function toEventId(raw: string): string {\n if (raw.length <= MAX_EVENT_ID_LENGTH) return raw;\n\n // Two independently-seeded FNV-1a passes → 128 bits, encoded Crockford base32.\n let out = \"\";\n for (const seed of [0x811c9dc5, 0x01000193]) {\n let hash = seed >>> 0;\n for (let i = 0; i < raw.length; i++) {\n hash ^= raw.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n out += ENCODING[hash % 32];\n }\n }\n // Fold the accumulated stream down to exactly the cap, order-dependently.\n let digest = \"\";\n for (let i = 0; i < MAX_EVENT_ID_LENGTH; i++) {\n let acc = i + 1;\n for (let j = i; j < out.length; j += MAX_EVENT_ID_LENGTH) {\n acc = (acc * 31 + ENCODING.indexOf(out[j])) >>> 0;\n }\n digest += ENCODING[acc % 32];\n }\n return digest;\n}\n","/**\n * Cookie names shared by the browser and server halves of the SDK.\n *\n * The visitor cookie is the one channel where two runtimes must agree on a literal string: the\n * browser writes it, a same-origin server reads it back, and that match is what lets a server-side\n * conversion attribute to a browser-entered journey. `config.prefix` namespaces it — so two Xenia\n * apps on one domain keep separate visitors — which means **both halves must derive the name the\n * same way**. Deriving it on one side and hardcoding it on the other silently breaks the link for\n * anyone using a custom prefix: the server just finds no cookie and falls back to no visitor.\n *\n * Always build the name with these helpers rather than interpolating it by hand.\n */\n\nimport type { ConsentState } from \"./types\";\n\n/** Default storage/cookie prefix, matching `XeniaConfig.prefix`. */\nexport const DEFAULT_PREFIX = \"xenia\";\n\n/** Name of the first-party cookie carrying the SDK-owned visitor id, for a given prefix. */\nexport function visitorCookieName(prefix: string = DEFAULT_PREFIX): string {\n return `${prefix || DEFAULT_PREFIX}_vid`;\n}\n\n/** Name of the first-party cookie carrying consent scopes, for a given prefix. */\nexport function consentCookieName(prefix: string = DEFAULT_PREFIX): string {\n return `${prefix || DEFAULT_PREFIX}_consent`;\n}\n\n/**\n * The visitor cookie name for the DEFAULT prefix (`\"xenia_vid\"`).\n *\n * Correct for the common case, and kept so existing code (e.g. reading the cookie straight out of a\n * framework's cookie jar) keeps working. If you set `config.prefix`, use {@link visitorCookieName}\n * instead — this constant will not match what the browser wrote.\n */\nexport const VISITOR_COOKIE = visitorCookieName();\n\n/**\n * The consent cookie name for the DEFAULT prefix (`\"xenia_consent\"`). Same custom-prefix caveat as\n * {@link VISITOR_COOKIE}.\n */\nexport const CONSENT_COOKIE = consentCookieName();\n\n/**\n * A `document.cookie` string carrying consent, in the JSON form the server SDK's `getConsent()`\n * reads back. The browser client's `consent()` writes it; a page with its own consent banner and no\n * browser client can write it directly, so server-side calls see the visitor's choice.\n */\nexport function consentCookie(state: ConsentState, prefix?: string, maxAgeDays = 365): string {\n return `${consentCookieName(prefix)}=${encodeURIComponent(JSON.stringify(state))}; path=/; max-age=${Math.floor(maxAgeDays * 86400)}; SameSite=Lax`;\n}\n","import type { EventContext } from \"./types\";\n\n/**\n * Derive the SDK-provided page/campaign fields from a URL — the server-side counterpart to the\n * browser client's `Identity.collectContext()`, which reads the same fields off `window.location`.\n *\n * Exists because a server runtime has no ambient `window`: a Node client is constructed per request,\n * so the one thing it needs handed over is the URL being served. Everything a journey rule can\n * reference — `path`, `query.<name>`, `url`, `referrer`, `utmSource`/`utmMedium`/`utmCampaign`/\n * `utmContent`/`utmId` — is derived here rather than by each app, so a server-rendered page gets the\n * same field set a browser page does without hand-rolling UTM parsing at every call site.\n *\n * Field names and semantics deliberately mirror `collectContext()` exactly: `query` is the flattened\n * search params, UTMs come from the standard `utm_*` params, and absent values are omitted rather\n * than set to `\"\"` (a blank string is a value a condition could accidentally match).\n *\n * @param url Absolute URL of the request being served (e.g. `https://shop.example/product/x?ref=a`).\n * A relative or unparseable value yields an empty context rather than throwing.\n * @param referrer Optional referring URL, typically the request's `Referer` header.\n */\nexport function contextFromUrl(url: string | null | undefined, referrer?: string | null): EventContext {\n const ctx: EventContext = {};\n if (referrer) ctx.referrer = referrer;\n if (!url) return ctx;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return ctx; // not an absolute URL — nothing safely derivable\n }\n\n ctx.url = parsed.href;\n ctx.path = parsed.pathname;\n ctx.query = Object.fromEntries(parsed.searchParams);\n\n const utm = (name: string) => parsed.searchParams.get(name) || undefined;\n const utmSource = utm(\"utm_source\");\n const utmMedium = utm(\"utm_medium\");\n const utmCampaign = utm(\"utm_campaign\");\n const utmContent = utm(\"utm_content\");\n const utmId = utm(\"utm_id\");\n if (utmSource) ctx.utmSource = utmSource;\n if (utmMedium) ctx.utmMedium = utmMedium;\n if (utmCampaign) ctx.utmCampaign = utmCampaign;\n if (utmContent) ctx.utmContent = utmContent;\n if (utmId) ctx.utmId = utmId;\n\n return ctx;\n}\n"]}
|
|
@@ -163,12 +163,22 @@ var HttpError = class extends Error {
|
|
|
163
163
|
status;
|
|
164
164
|
data;
|
|
165
165
|
};
|
|
166
|
+
var CircuitOpenError = class extends Error {
|
|
167
|
+
constructor(endpoint) {
|
|
168
|
+
super(`Circuit open for ${endpoint}: failing fast until the cooldown passes`);
|
|
169
|
+
this.endpoint = endpoint;
|
|
170
|
+
this.name = "CircuitOpenError";
|
|
171
|
+
}
|
|
172
|
+
endpoint;
|
|
173
|
+
};
|
|
174
|
+
var breakers = /* @__PURE__ */ new Map();
|
|
166
175
|
var HttpClient = class {
|
|
167
176
|
baseUrl;
|
|
168
177
|
defaultHeaders;
|
|
169
178
|
timeout;
|
|
170
179
|
retry;
|
|
171
180
|
debug;
|
|
181
|
+
breaker;
|
|
172
182
|
constructor(opts) {
|
|
173
183
|
this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
174
184
|
this.defaultHeaders = opts.defaultHeaders ?? {};
|
|
@@ -178,8 +188,37 @@ var HttpClient = class {
|
|
|
178
188
|
baseDelayMs: opts.retry?.baseDelayMs ?? 300
|
|
179
189
|
};
|
|
180
190
|
this.debug = opts.debug ?? false;
|
|
191
|
+
const cb = opts.circuitBreaker === true ? {} : opts.circuitBreaker || null;
|
|
192
|
+
this.breaker = cb && { failureThreshold: cb.failureThreshold ?? 3, cooldownMs: cb.cooldownMs ?? 3e4 };
|
|
181
193
|
}
|
|
182
194
|
async request(opts) {
|
|
195
|
+
if (!this.breaker) return this.send(opts);
|
|
196
|
+
const key = buildUrl(this.baseUrl + opts.path, opts.query);
|
|
197
|
+
const b = breakers.get(key) ?? { failures: 0, openedAt: 0 };
|
|
198
|
+
if (b.openedAt) {
|
|
199
|
+
if (Date.now() - b.openedAt < this.breaker.cooldownMs) throw new CircuitOpenError(key);
|
|
200
|
+
b.openedAt = 0;
|
|
201
|
+
b.failures = this.breaker.failureThreshold - 1;
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
const result = await this.send(opts);
|
|
205
|
+
breakers.delete(key);
|
|
206
|
+
return result;
|
|
207
|
+
} catch (err) {
|
|
208
|
+
if (err instanceof HttpError && !this.isRetryableStatus(err.status)) {
|
|
209
|
+
breakers.delete(key);
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
b.failures += 1;
|
|
213
|
+
if (b.failures >= this.breaker.failureThreshold) {
|
|
214
|
+
b.openedAt = Date.now();
|
|
215
|
+
this.log(`circuit opened for ${opts.path} after ${b.failures} failures`);
|
|
216
|
+
}
|
|
217
|
+
breakers.set(key, b);
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async send(opts) {
|
|
183
222
|
const url = buildUrl(this.baseUrl + opts.path, opts.query);
|
|
184
223
|
const method = opts.method ?? "GET";
|
|
185
224
|
const headers = {
|
|
@@ -332,6 +371,7 @@ var XeniaApi = class {
|
|
|
332
371
|
defaultHeaders: config.headers,
|
|
333
372
|
timeout: config.timeout,
|
|
334
373
|
retry: config.retry,
|
|
374
|
+
circuitBreaker: config.circuitBreaker,
|
|
335
375
|
debug: config.debug
|
|
336
376
|
});
|
|
337
377
|
}
|
|
@@ -562,52 +602,8 @@ function consentCookieName(prefix = DEFAULT_PREFIX) {
|
|
|
562
602
|
}
|
|
563
603
|
var VISITOR_COOKIE = visitorCookieName();
|
|
564
604
|
var CONSENT_COOKIE = consentCookieName();
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
function isPlainObject(v) {
|
|
568
|
-
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
569
|
-
}
|
|
570
|
-
function cloneJson(value) {
|
|
571
|
-
return value === null || typeof value !== "object" ? value : JSON.parse(JSON.stringify(value));
|
|
572
|
-
}
|
|
573
|
-
function setAtPath(node, path, value, mode) {
|
|
574
|
-
if (path.length === 0) {
|
|
575
|
-
if (mode === "merge" && isPlainObject(node) && isPlainObject(value)) {
|
|
576
|
-
return { ...node, ...value };
|
|
577
|
-
}
|
|
578
|
-
return value;
|
|
579
|
-
}
|
|
580
|
-
const [key, ...rest] = path;
|
|
581
|
-
if (Array.isArray(node)) {
|
|
582
|
-
const index = Number(key);
|
|
583
|
-
if (!Number.isInteger(index) || index < 0 || index >= node.length) return node;
|
|
584
|
-
const next = node.slice();
|
|
585
|
-
next[index] = setAtPath(next[index], rest, value, mode);
|
|
586
|
-
return next;
|
|
587
|
-
}
|
|
588
|
-
if (isPlainObject(node)) {
|
|
589
|
-
if (!(key in node)) return node;
|
|
590
|
-
return { ...node, [key]: setAtPath(node[key], rest, value, mode) };
|
|
591
|
-
}
|
|
592
|
-
return node;
|
|
593
|
-
}
|
|
594
|
-
function spliceSlots(slots, swaps) {
|
|
595
|
-
const result = {};
|
|
596
|
-
for (const [key, value] of Object.entries(slots)) {
|
|
597
|
-
result[key] = cloneJson(value);
|
|
598
|
-
}
|
|
599
|
-
if (!swaps) return result;
|
|
600
|
-
for (const swap of swaps) {
|
|
601
|
-
const [slotKey, ...pathParts] = swap.identifier.split(".");
|
|
602
|
-
if (!(slotKey in result)) continue;
|
|
603
|
-
result[slotKey] = setAtPath(result[slotKey], pathParts, swap.replacement, swap.mode ?? "replace");
|
|
604
|
-
}
|
|
605
|
-
return result;
|
|
606
|
-
}
|
|
607
|
-
function extractContentSwaps(body) {
|
|
608
|
-
if (!isPlainObject(body)) return void 0;
|
|
609
|
-
const swaps = body.xeniaContentSwaps;
|
|
610
|
-
return Array.isArray(swaps) ? swaps : void 0;
|
|
605
|
+
function consentCookie(state, prefix, maxAgeDays = 365) {
|
|
606
|
+
return `${consentCookieName(prefix)}=${encodeURIComponent(JSON.stringify(state))}; path=/; max-age=${Math.floor(maxAgeDays * 86400)}; SameSite=Lax`;
|
|
611
607
|
}
|
|
612
608
|
|
|
613
609
|
// src/core/request-context.ts
|
|
@@ -638,79 +634,23 @@ function contextFromUrl(url, referrer) {
|
|
|
638
634
|
return ctx;
|
|
639
635
|
}
|
|
640
636
|
|
|
641
|
-
// src/core/response-store.ts
|
|
642
|
-
var MemoryResponseStore = class {
|
|
643
|
-
map = /* @__PURE__ */ new Map();
|
|
644
|
-
set(key, value) {
|
|
645
|
-
this.map.set(key, value);
|
|
646
|
-
}
|
|
647
|
-
get(key) {
|
|
648
|
-
return this.map.get(key);
|
|
649
|
-
}
|
|
650
|
-
keys() {
|
|
651
|
-
return [...this.map.keys()];
|
|
652
|
-
}
|
|
653
|
-
clear() {
|
|
654
|
-
this.map.clear();
|
|
655
|
-
}
|
|
656
|
-
};
|
|
657
|
-
var LocalStorageResponseStore = class {
|
|
658
|
-
nsKey;
|
|
659
|
-
constructor(prefix = "xenia") {
|
|
660
|
-
this.nsKey = `${prefix}_responses`;
|
|
661
|
-
}
|
|
662
|
-
read() {
|
|
663
|
-
try {
|
|
664
|
-
const raw = localStorage.getItem(this.nsKey);
|
|
665
|
-
return raw ? JSON.parse(raw) : {};
|
|
666
|
-
} catch {
|
|
667
|
-
return {};
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
write(data) {
|
|
671
|
-
try {
|
|
672
|
-
localStorage.setItem(this.nsKey, JSON.stringify(data));
|
|
673
|
-
} catch {
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
set(key, value) {
|
|
677
|
-
const data = this.read();
|
|
678
|
-
data[key] = value;
|
|
679
|
-
this.write(data);
|
|
680
|
-
}
|
|
681
|
-
get(key) {
|
|
682
|
-
return this.read()[key];
|
|
683
|
-
}
|
|
684
|
-
keys() {
|
|
685
|
-
return Object.keys(this.read());
|
|
686
|
-
}
|
|
687
|
-
clear() {
|
|
688
|
-
try {
|
|
689
|
-
localStorage.removeItem(this.nsKey);
|
|
690
|
-
} catch {
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
};
|
|
694
|
-
|
|
695
637
|
exports.CONSENT_COOKIE = CONSENT_COOKIE;
|
|
638
|
+
exports.CircuitOpenError = CircuitOpenError;
|
|
696
639
|
exports.DEFAULT_PREFIX = DEFAULT_PREFIX;
|
|
697
640
|
exports.HttpClient = HttpClient;
|
|
698
641
|
exports.HttpError = HttpError;
|
|
699
|
-
exports.LocalStorageResponseStore = LocalStorageResponseStore;
|
|
700
642
|
exports.MAX_EVENT_ID_LENGTH = MAX_EVENT_ID_LENGTH;
|
|
701
|
-
exports.MemoryResponseStore = MemoryResponseStore;
|
|
702
643
|
exports.VISITOR_COOKIE = VISITOR_COOKIE;
|
|
703
644
|
exports.XeniaApi = XeniaApi;
|
|
704
645
|
exports.buildUrl = buildUrl;
|
|
705
646
|
exports.compact = compact;
|
|
647
|
+
exports.consentCookie = consentCookie;
|
|
706
648
|
exports.consentCookieName = consentCookieName;
|
|
707
649
|
exports.contextFromUrl = contextFromUrl;
|
|
708
|
-
exports.extractContentSwaps = extractContentSwaps;
|
|
709
650
|
exports.generateUlid = generateUlid;
|
|
710
651
|
exports.isBrowser = isBrowser;
|
|
711
652
|
exports.parseActions = parseActions;
|
|
712
|
-
exports.spliceSlots = spliceSlots;
|
|
713
653
|
exports.toEventId = toEventId;
|
|
714
654
|
exports.visitorCookieName = visitorCookieName;
|
|
715
|
-
//# sourceMappingURL=chunk-
|
|
716
|
-
//# sourceMappingURL=chunk-
|
|
655
|
+
//# sourceMappingURL=chunk-JEKVN7HK.cjs.map
|
|
656
|
+
//# sourceMappingURL=chunk-JEKVN7HK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/actions.ts","../src/core/http-client.ts","../src/core/token-provider.ts","../src/core/api.ts","../src/core/id.ts","../src/core/cookie-names.ts","../src/core/request-context.ts"],"names":[],"mappings":"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","file":"chunk-JEKVN7HK.cjs","sourcesContent":["import type {\n JsonValue,\n MessagePlacement,\n MessagePosition,\n WidgetFormSubmit,\n WidgetSegment,\n WidgetStyle,\n WidgetType,\n XeniaAction,\n} from \"./types\";\n\nconst MESSAGE_TYPES: ReadonlySet<string> = new Set<MessagePlacement>([\n \"banner\",\n \"popup\",\n \"modal\",\n \"inline\",\n]);\n\nconst MESSAGE_POSITIONS: ReadonlySet<string> = new Set<MessagePosition>([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top\",\n \"bottom\",\n]);\n\n// NOTE: `widgetType` is deliberately NOT added to `ALL_TYPES`/`MESSAGE_TYPES` below — it is an\n// orthogonal field on message-placement actions, not a new `type` value. Keeping `type`'s\n// allowlist untouched is exactly what keeps the PHP SDK's `XeniaActions::KNOWN_TYPES` (same value\n// set) valid with zero PHP changes.\nconst WIDGET_TYPES: ReadonlySet<string> = new Set<WidgetType>([\"standard\", \"spin-wheel\"]);\n\nconst ALL_TYPES: ReadonlySet<string> = new Set<string>([\n \"swap\",\n \"hide\",\n \"show\",\n \"setContent\",\n \"redirect\",\n ...MESSAGE_TYPES,\n]);\n\n/** Type guard for a plain JSON object. */\nfunction isObject(v: JsonValue | undefined): v is { [k: string]: JsonValue } {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction asString(v: JsonValue | undefined): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\nfunction asNumber(v: JsonValue | undefined): number | undefined {\n return typeof v === \"number\" ? v : undefined;\n}\n\n/**\n * Validate and narrow a single raw entry into a {@link XeniaAction}.\n * Returns null for anything malformed so a bad entry can't crash the renderer.\n */\nfunction toAction(raw: JsonValue): XeniaAction | null {\n if (!isObject(raw)) return null;\n const type = asString(raw.type);\n if (!type || !ALL_TYPES.has(type)) return null;\n\n if (type === \"redirect\") {\n const url = asString(raw.url);\n return url ? { type, url } : null;\n }\n\n if (type === \"hide\" || type === \"show\") {\n const target = asString(raw.target);\n return target ? { type, target } : null;\n }\n\n if (type === \"swap\" || type === \"setContent\") {\n const target = asString(raw.target);\n if (!target) return null;\n return { type, target, html: asString(raw.html), text: asString(raw.text) };\n }\n\n // Message placement actions (banner/popup/modal/inline).\n const cta = isObject(raw.cta)\n ? {\n label: asString(raw.cta.label) ?? \"\",\n url: asString(raw.cta.url),\n event: asString(raw.cta.event),\n }\n : undefined;\n\n return {\n type: type as MessagePlacement,\n target: asString(raw.target),\n title: asString(raw.title),\n message: asString(raw.message),\n imageUrl: asString(raw.imageUrl),\n html: asString(raw.html),\n // A link-only CTA (empty label, e.g. a spin-wheel's data-xenia-wheel-cta —\n // label is meaningless there, the winHtml/lossHtml design supplies its own button text)\n // must still parse through — gating on `cta.label` alone silently dropped it.\n cta: cta && (cta.label || cta.url) ? cta : undefined,\n dismissAfterMs: asNumber(raw.dismissAfterMs),\n position: asMessagePosition(raw.position),\n widgetType: asWidgetType(raw.widgetType),\n segments: asSegments(raw.segments),\n formSubmit: asFormSubmit(raw.formSubmit),\n style: asWidgetStyle(raw.style),\n spinnerHtml: asString(raw.spinnerHtml),\n winHtml: asString(raw.winHtml),\n lossHtml: asString(raw.lossHtml),\n };\n}\n\nfunction asMessagePosition(v: JsonValue | undefined): MessagePosition | undefined {\n const s = asString(v);\n return s && MESSAGE_POSITIONS.has(s) ? (s as MessagePosition) : undefined;\n}\n\nfunction asWidgetType(v: JsonValue | undefined): WidgetType | undefined {\n const s = asString(v);\n return s && WIDGET_TYPES.has(s) ? (s as WidgetType) : undefined;\n}\n\n/** Narrow a raw `segments` array to label/color/isLoss-only entries — drops anything malformed. */\nfunction asSegments(v: JsonValue | undefined): WidgetSegment[] | undefined {\n if (!Array.isArray(v)) return undefined;\n const segments: WidgetSegment[] = [];\n for (const entry of v) {\n if (!isObject(entry)) continue;\n const id = asString(entry.id);\n const label = asString(entry.label);\n if (!id || !label) continue;\n segments.push({\n id,\n label,\n colorHex: asString(entry.colorHex),\n isLoss: entry.isLoss === true,\n });\n }\n return segments.length ? segments : undefined;\n}\n\n/**\n * Narrow a raw `formSubmit` envelope. Defensive by design (same as the rest of this\n * module) — a malformed envelope (missing `mode`) is dropped entirely rather than\n * passed through half-formed, since the SDK's endpoint-selection logic depends on it.\n */\nfunction asFormSubmit(v: JsonValue | undefined): WidgetFormSubmit | undefined {\n if (!isObject(v)) return undefined;\n const mode = asString(v.mode);\n if (!mode) return undefined;\n return {\n requiresResolve: v.requiresResolve === true,\n mode,\n flowRef: asString(v.flowRef),\n bindingRef: asString(v.bindingRef),\n successDisplayMs: asNumber(v.successDisplayMs),\n };\n}\n\n/**\n * Narrow a raw `style` override. Every field is independently optional/defensive (same\n * philosophy as the rest of this module) — a malformed value for one field just drops that\n * field, it never discards the whole `style` object.\n */\nfunction asWidgetStyle(v: JsonValue | undefined): WidgetStyle | undefined {\n if (!isObject(v)) return undefined;\n const style: WidgetStyle = {\n hideCloseButton: v.hideCloseButton === true,\n hideOverlay: v.hideOverlay === true,\n };\n const hasAny = style.hideCloseButton || style.hideOverlay;\n return hasAny ? style : undefined;\n}\n\n/**\n * Parse render actions out of a webhook-response body.\n *\n * The convention: marketers return `{ \"xeniaActions\": [ ... ] }` (or a bare\n * array) from the `webhook-response` node. Any body without a recognizable\n * `xeniaActions` array yields an empty list — a safe no-op.\n */\nexport function parseActions(body: JsonValue): XeniaAction[] {\n let list: JsonValue | undefined;\n if (Array.isArray(body)) {\n list = body;\n } else if (isObject(body) && Array.isArray(body.xeniaActions)) {\n list = body.xeniaActions;\n }\n if (!Array.isArray(list)) return [];\n\n const actions: XeniaAction[] = [];\n for (const entry of list) {\n const action = toAction(entry);\n if (action) actions.push(action);\n }\n return actions;\n}\n","import type { CircuitBreakerConfig, HttpMethod, JsonValue, RetryConfig } from \"./types\";\n\n/**\n * Default Xenia backend base URL, used whenever `baseUrl` is omitted from\n * config. Points at the hosted engine — override only for a self-hosted or\n * non-default environment.\n */\nexport const DEFAULT_BASE_URL = \"https://engine.xeniamartech.com/xenia\";\n\n/** Returns true when running in a browser environment (SSR-safe). */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/** Appends query parameters to a URL. Returns the URL unchanged when empty. */\nexport function buildUrl(url: string, queryParams?: Record<string, string>): string {\n if (!queryParams || Object.keys(queryParams).length === 0) return url;\n const params = new URLSearchParams(queryParams);\n const sep = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${sep}${params.toString()}`;\n}\n\n/** Sleep helper used by the retry backoff. */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Options for a single request. */\nexport interface RequestOptions {\n method?: HttpMethod;\n /** Path appended to `baseUrl` (should start with `/`). */\n path: string;\n headers?: Record<string, string>;\n query?: Record<string, string>;\n body?: JsonValue;\n /** Per-request timeout override in ms. */\n timeout?: number;\n /** Disable retry for this request (e.g. long-polling webhook). */\n noRetry?: boolean;\n /** Per-request retry override. */\n retry?: RetryConfig;\n /**\n * Keep the request alive past page unload (`fetch`'s `keepalive` flag).\n * Used for best-effort flushes on `pagehide`, where `sendBeacon` can't be\n * used instead because it doesn't support custom headers (tenant scope).\n */\n keepalive?: boolean;\n}\n\n/** Result of a request: the raw Response plus the parsed JSON (or null). */\nexport interface HttpResult {\n response: Response;\n data: JsonValue;\n}\n\n/** Error thrown for non-2xx responses (after retries are exhausted). */\nexport class HttpError extends Error {\n constructor(\n public readonly status: number,\n public readonly data: JsonValue,\n message?: string,\n ) {\n super(message ?? `Request failed with status ${status}`);\n this.name = \"HttpError\";\n }\n}\n\n/** Thrown without a network call while an endpoint's circuit is open (see {@link CircuitBreakerConfig}). */\nexport class CircuitOpenError extends Error {\n constructor(public readonly endpoint: string) {\n super(`Circuit open for ${endpoint}: failing fast until the cooldown passes`);\n this.name = \"CircuitOpenError\";\n }\n}\n\n/**\n * Per-endpoint breaker state, module-wide so it outlives a single client.\n * ponytail: after the cooldown every concurrent caller probes, not just one; fine for a fail-fast\n * guard, add a probe lock if a thundering herd on recovery ever matters.\n */\nconst breakers = new Map<string, { failures: number; openedAt: number }>();\n\nexport interface HttpClientOptions {\n /** Defaults to {@link DEFAULT_BASE_URL} when omitted. */\n baseUrl?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n retry?: RetryConfig;\n circuitBreaker?: boolean | CircuitBreakerConfig;\n debug?: boolean;\n}\n\n/**\n * Minimal fetch wrapper shared by all runtimes.\n *\n * - Injects default headers (tenant scope, content-type).\n * - Applies an `AbortController` timeout.\n * - Retries transient failures (network error, `429`, `5xx`) with exponential\n * backoff, honoring a `Retry-After` header when present.\n * - Parses JSON, falling back to `null` on empty/invalid bodies.\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n private readonly retry: Required<RetryConfig>;\n private readonly debug: boolean;\n private readonly breaker: Required<CircuitBreakerConfig> | null;\n\n constructor(opts: HttpClientOptions) {\n this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.timeout = opts.timeout ?? 8000;\n this.retry = {\n attempts: opts.retry?.attempts ?? 2,\n baseDelayMs: opts.retry?.baseDelayMs ?? 300,\n };\n this.debug = opts.debug ?? false;\n const cb = opts.circuitBreaker === true ? {} : opts.circuitBreaker || null;\n this.breaker = cb && { failureThreshold: cb.failureThreshold ?? 3, cooldownMs: cb.cooldownMs ?? 30_000 };\n }\n\n async request(opts: RequestOptions): Promise<HttpResult> {\n if (!this.breaker) return this.send(opts);\n // Keyed by full URL, query included: every webhook shares `/flow`, and one slow journey\n // (`?id=`) must not short-circuit the others.\n const key = buildUrl(this.baseUrl + opts.path, opts.query);\n const b = breakers.get(key) ?? { failures: 0, openedAt: 0 };\n if (b.openedAt) {\n if (Date.now() - b.openedAt < this.breaker.cooldownMs) throw new CircuitOpenError(key);\n // Half-open: let this call probe; one more failure re-opens.\n b.openedAt = 0;\n b.failures = this.breaker.failureThreshold - 1;\n }\n try {\n const result = await this.send(opts);\n breakers.delete(key);\n return result;\n } catch (err) {\n if (err instanceof HttpError && !this.isRetryableStatus(err.status)) {\n breakers.delete(key); // the backend answered: it's up\n throw err;\n }\n b.failures += 1;\n if (b.failures >= this.breaker.failureThreshold) {\n b.openedAt = Date.now();\n this.log(`circuit opened for ${opts.path} after ${b.failures} failures`);\n }\n breakers.set(key, b);\n throw err;\n }\n }\n\n private async send(opts: RequestOptions): Promise<HttpResult> {\n const url = buildUrl(this.baseUrl + opts.path, opts.query);\n const method = opts.method ?? \"GET\";\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.defaultHeaders,\n ...opts.headers,\n };\n const body = opts.body !== undefined ? JSON.stringify(opts.body) : undefined;\n const timeout = opts.timeout ?? this.timeout;\n const maxAttempts = opts.noRetry ? 1 : (opts.retry?.attempts ?? this.retry.attempts) + 1;\n const baseDelay = opts.retry?.baseDelayMs ?? this.retry.baseDelayMs;\n\n let lastError: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await this.fetchWithTimeout(\n url,\n { method, headers, body, ...(opts.keepalive ? { keepalive: true } : {}) },\n timeout,\n );\n const data = await this.parseBody(response);\n\n if (response.ok) {\n return { response, data };\n }\n\n // Retry on 429/5xx if attempts remain; otherwise throw.\n if (this.isRetryableStatus(response.status) && attempt < maxAttempts - 1) {\n const wait = this.retryAfterMs(response, baseDelay, attempt);\n this.log(`retrying ${opts.path} after ${wait}ms (status ${response.status})`);\n await delay(wait);\n continue;\n }\n throw new HttpError(response.status, data);\n } catch (err) {\n lastError = err;\n // Non-retryable HttpError → rethrow immediately.\n if (err instanceof HttpError) throw err;\n // Network/timeout error → retry if attempts remain.\n if (attempt < maxAttempts - 1) {\n const wait = baseDelay * 2 ** attempt;\n this.log(`retrying ${opts.path} after ${wait}ms (network error)`);\n await delay(wait);\n continue;\n }\n }\n }\n throw lastError instanceof Error ? lastError : new Error(\"Request failed\");\n }\n\n private async fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeout: number,\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`Request timeout after ${timeout}ms`, { cause: err });\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async parseBody(response: Response): Promise<JsonValue> {\n const text = await response.text().catch(() => \"\");\n if (!text) return null;\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n }\n\n private isRetryableStatus(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n }\n\n private retryAfterMs(response: Response, baseDelay: number, attempt: number): number {\n const header = response.headers.get(\"Retry-After\");\n if (header) {\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n }\n return baseDelay * 2 ** attempt;\n }\n\n private log(msg: string): void {\n if (this.debug) console.warn(`[xenia] ${msg}`);\n }\n}\n","import type { XeniaConfig } from \"./types\";\n\ninterface Cached {\n token: string;\n /** Epoch ms when the token should be considered stale. */\n expiresAt: number;\n}\n\n/** JWT `exp` (seconds) if decodable, else undefined. Best-effort, no verify. */\nfunction decodeExp(token: string): number | undefined {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return undefined;\n const json = JSON.parse(atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\")));\n return typeof json.exp === \"number\" ? json.exp * 1000 : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the Bearer token `XeniaApi` attaches to every request, caching a\n * short-lived token from `config.getToken` until ~30s before expiry. A static\n * `config.token` is returned as-is. Isomorphic (browser + Node ≥18, both have\n * global `atob`).\n */\nexport class TokenProvider {\n private readonly config: XeniaConfig;\n private cached: Cached | null = null;\n private inflight: Promise<string> | null = null;\n\n constructor(config: XeniaConfig) {\n this.config = config;\n }\n\n /** Whether a token source is configured at all — lets callers skip resolution entirely. */\n hasSource(): boolean {\n return Boolean(this.config.token || this.config.getToken);\n }\n\n readonly getToken = async (): Promise<string> => {\n if (this.config.token && !this.config.getToken) return this.config.token;\n\n const now = Date.now();\n if (this.cached && this.cached.expiresAt > now) return this.cached.token;\n if (this.inflight) return this.inflight;\n\n if (!this.config.getToken) {\n throw new Error(\"No token source: set config.token or config.getToken.\");\n }\n\n this.inflight = Promise.resolve(this.config.getToken())\n .then((token) => {\n const exp = decodeExp(token);\n // Refresh 30s before real expiry; default 5 min if the token is opaque.\n const expiresAt = exp ? exp - 30_000 : now + 5 * 60_000;\n this.cached = { token, expiresAt };\n return token;\n })\n .finally(() => {\n this.inflight = null;\n });\n\n return this.inflight;\n };\n}\n","import { parseActions } from \"./actions\";\nimport { HttpClient } from \"./http-client\";\nimport { TokenProvider } from \"./token-provider\";\nimport type {\n AnalyticsIngestResponse,\n ConsentState,\n IdentifyRequest,\n IdentifyResponse,\n JsonObject,\n JsonValue,\n ResolveBatchItem,\n ResolveBatchResult,\n ResolveOptions,\n ResolveResult,\n WebhookResponse,\n WidgetPrize,\n WidgetSubmitResponse,\n WidgetType,\n XeniaConfig,\n XeniaEvent,\n} from \"./types\";\n\n/** Type guard for a plain JSON object (as opposed to an array/primitive/null). */\nfunction isJsonObject(v: JsonValue): v is JsonObject {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/** Narrow a raw `prize` field off a `/widget-submissions` response body. */\nfunction asWidgetPrize(v: JsonValue | undefined): WidgetPrize | undefined {\n return v !== undefined && isJsonObject(v) ? (v as WidgetPrize) : undefined;\n}\n\n/** Drop `undefined` values so the JSON body stays clean. */\nexport function compact(obj: Record<string, JsonValue | undefined>): JsonObject {\n const out: JsonObject = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k] = v;\n }\n return out;\n}\n\n/**\n * Low-level, isomorphic Xenia API client. Wraps the raw endpoints; identity,\n * UTM capture, and action rendering are layered on top by the client runtime.\n * All paths are relative to `baseUrl`, which defaults to the hosted engine\n * (`https://engine.xeniamartech.com/xenia`) when omitted from config.\n */\nexport class XeniaApi {\n private readonly http: HttpClient;\n private readonly tenantId: string;\n private readonly environmentKey: string;\n private readonly tokenProvider: TokenProvider;\n\n constructor(config: XeniaConfig) {\n this.tenantId = config.tenantId;\n this.environmentKey = config.environmentKey;\n this.tokenProvider = new TokenProvider(config);\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n defaultHeaders: config.headers,\n timeout: config.timeout,\n retry: config.retry,\n circuitBreaker: config.circuitBreaker,\n debug: config.debug,\n });\n }\n\n /** Tenant-scope headers required by header-scoped endpoints. */\n private tenantHeaders(): Record<string, string> {\n return {\n \"X-Tenant-Id\": this.tenantId,\n \"X-Environment\": this.environmentKey,\n };\n }\n\n /**\n * Tenant headers plus a resolved `Authorization: Bearer` header when\n * `config.token`/`config.getToken` is set — e.g. required by a webhook\n * trigger node configured with its own auth token. No-op (tenant headers\n * only) when no token source is configured, so this is safe to call\n * unconditionally on every request.\n */\n private async authHeaders(): Promise<Record<string, string>> {\n const headers = this.tenantHeaders();\n if (!this.tokenProvider.hasSource()) return headers;\n const token = await this.tokenProvider.getToken();\n if (token) headers.Authorization = `Bearer ${token}`;\n return headers;\n }\n\n /**\n * Webhook request/response — `GET|POST /flow?id={triggerId}`. Held open by the\n * backend until a `webhook-response` node resolves. Returns the normalized\n * response, including any `xeniaActions` parsed from the body.\n *\n * Not retried by default: the backend long-polls this call, so a retry would\n * duplicate the journey run.\n */\n async webhook(\n triggerId: string,\n data?: JsonValue,\n method: \"GET\" | \"POST\" = \"POST\",\n ): Promise<WebhookResponse> {\n const { response, data: rawBody } = await this.http.request({\n method,\n path: \"/flow\",\n query: { id: triggerId },\n headers: await this.authHeaders(),\n body: method === \"POST\" ? (data ?? {}) : undefined,\n noRetry: true,\n });\n return {\n status: response.status,\n body: rawBody,\n actions: parseActions(rawBody),\n receivedAt: Date.now(),\n };\n }\n\n /**\n * Widget form submission — `POST /widget-submissions?ref={bindingRef}`. Used whenever the\n * action's `formSubmit.requiresResolve` is true (spin-wheel, which must have a\n * server-resolved outcome before anything renders) or `mode === \"endpoint\"` — the common\n * plain-popup case (`mode === \"journey\" && !requiresResolve`) bypasses this entirely and calls\n * {@link webhook} against `flowRef` instead (see `XeniaClient.submitWidgetForm`'s endpoint\n * selection).\n *\n * Not retried (`noRetry: true`), styled like {@link webhook} — a retried POST must never\n * double-fire a journey or double-resolve a prize server-side.\n */\n async submitWidget(ref: string, body?: JsonValue): Promise<WidgetSubmitResponse> {\n const { response, data: rawBody } = await this.http.request({\n method: \"POST\",\n path: \"/widget-submissions\",\n query: { ref },\n headers: await this.authHeaders(),\n body: body ?? {},\n noRetry: true,\n });\n const obj = isJsonObject(rawBody) ? rawBody : {};\n return {\n status: response.status,\n body: rawBody,\n actions: parseActions(rawBody),\n prize: asWidgetPrize(obj.prize),\n alreadyPlayed: obj.alreadyPlayed === true,\n dispatched: obj.dispatched === true,\n dispatchError: typeof obj.dispatchError === \"string\" ? obj.dispatchError : undefined,\n widgetType: typeof obj.widgetType === \"string\" ? (obj.widgetType as WidgetType) : undefined,\n receivedAt: Date.now(),\n };\n }\n\n /**\n * Unified event batch (max 100/request per the backend) — `POST /api/events/v1`.\n * Records analytics for every event and matches/advances a journey for any\n * event with `trigger: true`. Replaces the old `sendEvent()` (journey trigger)\n * and `sendAnalytics()` (CDP) calls.\n */\n async sendEvents(\n events: XeniaEvent[],\n opts?: { keepalive?: boolean },\n ): Promise<AnalyticsIngestResponse> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1\",\n headers: await this.authHeaders(),\n body: { events } as unknown as JsonObject,\n keepalive: opts?.keepalive,\n });\n return data as unknown as AnalyticsIngestResponse;\n }\n\n /** Bind visitor→user — `POST /api/events/v1/identify`. */\n async identify(body: IdentifyRequest): Promise<IdentifyResponse> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1/identify\",\n headers: await this.authHeaders(),\n body: body as unknown as JsonObject,\n });\n return data as unknown as IdentifyResponse;\n }\n\n /**\n * Update consent — `POST /api/events/v1/consent`.\n *\n * The three scope flags are required (non-null) by the backend, so an omitted\n * one is sent as an explicit `false` rather than left out: a partial body like\n * `consent({ analytics: true })` — the shape most callers actually write — is\n * otherwise rejected with a 400 and the consent record is never stored.\n */\n async consent(xeniaVisitorId: string, consent: ConsentState): Promise<JsonValue> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/events/v1/consent\",\n headers: await this.authHeaders(),\n body: compact({\n xeniaVisitorId,\n analytics: consent.analytics === true,\n marketing: consent.marketing === true,\n personalization: consent.personalization === true,\n consentSource: consent.consentSource,\n consentVersion: consent.consentVersion,\n }),\n });\n return data;\n }\n\n /**\n * Resolve in-entry content personalization for one content key —\n * `POST /api/personalization/resolve?merge=<bool>`. Requires the SDK Bearer\n * token (same credential as events; resolve is auth-required). `merge=true`\n * returns server-spliced `content`; otherwise splice `swaps` client-side.\n */\n async resolve(contentKey: string, opts: ResolveOptions = {}): Promise<ResolveResult> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/personalization/resolve\",\n query: opts.merge !== undefined ? { merge: String(opts.merge) } : undefined,\n headers: await this.authHeaders(),\n body: compact({\n contentKey,\n data: opts.data as JsonValue,\n locale: opts.locale,\n }),\n });\n return data as unknown as ResolveResult;\n }\n\n /**\n * Resolve several content keys in one round-trip (≤50) —\n * `POST /api/personalization/resolve-batch?merge=<bool>`. Same auth/merge\n * semantics as {@link resolve}.\n */\n async resolveBatch(\n items: ResolveBatchItem[],\n opts: ResolveOptions = {},\n ): Promise<ResolveBatchResult[]> {\n const { data } = await this.http.request({\n method: \"POST\",\n path: \"/api/personalization/resolve-batch\",\n query: opts.merge !== undefined ? { merge: String(opts.merge) } : undefined,\n headers: await this.authHeaders(),\n body: compact({\n items: items as unknown as JsonValue,\n data: opts.data as JsonValue,\n locale: opts.locale,\n }),\n });\n return data as unknown as ResolveBatchResult[];\n }\n}\n","/** Crockford base32 alphabet (no I/L/O/U, avoids visual ambiguity) — used by ULID. */\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\n/**\n * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):\n * a 48-bit timestamp (10 Crockford-base32 chars) + 80 bits of randomness (16\n * chars), 26 chars total — matches the backend's `eventId` field (`≤26`\n * chars). No dependency; implemented inline to keep the SDK lean.\n */\nexport function generateUlid(time: number = Date.now()): string {\n let timePart = \"\";\n let t = time;\n for (let i = 9; i >= 0; i--) {\n timePart = ENCODING[t % 32] + timePart;\n t = Math.floor(t / 32);\n }\n\n const random = randomBytes(16);\n let randomPart = \"\";\n for (let i = 0; i < 16; i++) {\n randomPart += ENCODING[random[i] % 32];\n }\n\n return timePart + randomPart;\n}\n\n/** Backend cap on `eventId` (`@Size(max = 26)`), which a ULID exactly fills. */\nexport const MAX_EVENT_ID_LENGTH = 26;\n\n/**\n * Coerce a caller-supplied dedup key into something the backend will accept.\n *\n * `eventId` is capped at 26 characters server-side, and an over-length value\n * rejects the ENTIRE batch it rides in — not just its own event. That is easy to\n * hit: `\"ord-\" + <uuid>` is 40. Rather than drop the caller's idempotency key or\n * let the batch 400, fold anything longer into a deterministic 26-char digest.\n * Deterministic is the point — the same order id always yields the same event id,\n * so re-firing it still de-dupes to one conversion, which is what the key is for.\n *\n * Truncation is deliberately not used: `\"ord-<uuid>\"` values share a long common\n * prefix, so cutting to 26 chars can map two different orders onto one id.\n */\nexport function toEventId(raw: string): string {\n if (raw.length <= MAX_EVENT_ID_LENGTH) return raw;\n\n // Two independently-seeded FNV-1a passes → 128 bits, encoded Crockford base32.\n let out = \"\";\n for (const seed of [0x811c9dc5, 0x01000193]) {\n let hash = seed >>> 0;\n for (let i = 0; i < raw.length; i++) {\n hash ^= raw.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n out += ENCODING[hash % 32];\n }\n }\n // Fold the accumulated stream down to exactly the cap, order-dependently.\n let digest = \"\";\n for (let i = 0; i < MAX_EVENT_ID_LENGTH; i++) {\n let acc = i + 1;\n for (let j = i; j < out.length; j += MAX_EVENT_ID_LENGTH) {\n acc = (acc * 31 + ENCODING.indexOf(out[j])) >>> 0;\n }\n digest += ENCODING[acc % 32];\n }\n return digest;\n}\n","/**\n * Cookie names shared by the browser and server halves of the SDK.\n *\n * The visitor cookie is the one channel where two runtimes must agree on a literal string: the\n * browser writes it, a same-origin server reads it back, and that match is what lets a server-side\n * conversion attribute to a browser-entered journey. `config.prefix` namespaces it — so two Xenia\n * apps on one domain keep separate visitors — which means **both halves must derive the name the\n * same way**. Deriving it on one side and hardcoding it on the other silently breaks the link for\n * anyone using a custom prefix: the server just finds no cookie and falls back to no visitor.\n *\n * Always build the name with these helpers rather than interpolating it by hand.\n */\n\nimport type { ConsentState } from \"./types\";\n\n/** Default storage/cookie prefix, matching `XeniaConfig.prefix`. */\nexport const DEFAULT_PREFIX = \"xenia\";\n\n/** Name of the first-party cookie carrying the SDK-owned visitor id, for a given prefix. */\nexport function visitorCookieName(prefix: string = DEFAULT_PREFIX): string {\n return `${prefix || DEFAULT_PREFIX}_vid`;\n}\n\n/** Name of the first-party cookie carrying consent scopes, for a given prefix. */\nexport function consentCookieName(prefix: string = DEFAULT_PREFIX): string {\n return `${prefix || DEFAULT_PREFIX}_consent`;\n}\n\n/**\n * The visitor cookie name for the DEFAULT prefix (`\"xenia_vid\"`).\n *\n * Correct for the common case, and kept so existing code (e.g. reading the cookie straight out of a\n * framework's cookie jar) keeps working. If you set `config.prefix`, use {@link visitorCookieName}\n * instead — this constant will not match what the browser wrote.\n */\nexport const VISITOR_COOKIE = visitorCookieName();\n\n/**\n * The consent cookie name for the DEFAULT prefix (`\"xenia_consent\"`). Same custom-prefix caveat as\n * {@link VISITOR_COOKIE}.\n */\nexport const CONSENT_COOKIE = consentCookieName();\n\n/**\n * A `document.cookie` string carrying consent, in the JSON form the server SDK's `getConsent()`\n * reads back. The browser client's `consent()` writes it; a page with its own consent banner and no\n * browser client can write it directly, so server-side calls see the visitor's choice.\n */\nexport function consentCookie(state: ConsentState, prefix?: string, maxAgeDays = 365): string {\n return `${consentCookieName(prefix)}=${encodeURIComponent(JSON.stringify(state))}; path=/; max-age=${Math.floor(maxAgeDays * 86400)}; SameSite=Lax`;\n}\n","import type { EventContext } from \"./types\";\n\n/**\n * Derive the SDK-provided page/campaign fields from a URL — the server-side counterpart to the\n * browser client's `Identity.collectContext()`, which reads the same fields off `window.location`.\n *\n * Exists because a server runtime has no ambient `window`: a Node client is constructed per request,\n * so the one thing it needs handed over is the URL being served. Everything a journey rule can\n * reference — `path`, `query.<name>`, `url`, `referrer`, `utmSource`/`utmMedium`/`utmCampaign`/\n * `utmContent`/`utmId` — is derived here rather than by each app, so a server-rendered page gets the\n * same field set a browser page does without hand-rolling UTM parsing at every call site.\n *\n * Field names and semantics deliberately mirror `collectContext()` exactly: `query` is the flattened\n * search params, UTMs come from the standard `utm_*` params, and absent values are omitted rather\n * than set to `\"\"` (a blank string is a value a condition could accidentally match).\n *\n * @param url Absolute URL of the request being served (e.g. `https://shop.example/product/x?ref=a`).\n * A relative or unparseable value yields an empty context rather than throwing.\n * @param referrer Optional referring URL, typically the request's `Referer` header.\n */\nexport function contextFromUrl(url: string | null | undefined, referrer?: string | null): EventContext {\n const ctx: EventContext = {};\n if (referrer) ctx.referrer = referrer;\n if (!url) return ctx;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return ctx; // not an absolute URL — nothing safely derivable\n }\n\n ctx.url = parsed.href;\n ctx.path = parsed.pathname;\n ctx.query = Object.fromEntries(parsed.searchParams);\n\n const utm = (name: string) => parsed.searchParams.get(name) || undefined;\n const utmSource = utm(\"utm_source\");\n const utmMedium = utm(\"utm_medium\");\n const utmCampaign = utm(\"utm_campaign\");\n const utmContent = utm(\"utm_content\");\n const utmId = utm(\"utm_id\");\n if (utmSource) ctx.utmSource = utmSource;\n if (utmMedium) ctx.utmMedium = utmMedium;\n if (utmCampaign) ctx.utmCampaign = utmCampaign;\n if (utmContent) ctx.utmContent = utmContent;\n if (utmId) ctx.utmId = utmId;\n\n return ctx;\n}\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// src/core/content-splice.ts
|
|
2
|
+
function isPlainObject(v) {
|
|
3
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
4
|
+
}
|
|
5
|
+
function cloneJson(value) {
|
|
6
|
+
return value === null || typeof value !== "object" ? value : JSON.parse(JSON.stringify(value));
|
|
7
|
+
}
|
|
8
|
+
function setAtPath(node, path, value, mode) {
|
|
9
|
+
if (path.length === 0) {
|
|
10
|
+
if (mode === "merge" && isPlainObject(node) && isPlainObject(value)) {
|
|
11
|
+
return { ...node, ...value };
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
const [key, ...rest] = path;
|
|
16
|
+
if (Array.isArray(node)) {
|
|
17
|
+
const index = Number(key);
|
|
18
|
+
if (!Number.isInteger(index) || index < 0 || index >= node.length) return node;
|
|
19
|
+
const next = node.slice();
|
|
20
|
+
next[index] = setAtPath(next[index], rest, value, mode);
|
|
21
|
+
return next;
|
|
22
|
+
}
|
|
23
|
+
if (isPlainObject(node)) {
|
|
24
|
+
if (!(key in node)) return node;
|
|
25
|
+
return { ...node, [key]: setAtPath(node[key], rest, value, mode) };
|
|
26
|
+
}
|
|
27
|
+
return node;
|
|
28
|
+
}
|
|
29
|
+
function spliceSlots(slots, swaps) {
|
|
30
|
+
const result = {};
|
|
31
|
+
for (const [key, value] of Object.entries(slots)) {
|
|
32
|
+
result[key] = cloneJson(value);
|
|
33
|
+
}
|
|
34
|
+
if (!swaps) return result;
|
|
35
|
+
for (const swap of swaps) {
|
|
36
|
+
const [slotKey, ...pathParts] = swap.identifier.split(".");
|
|
37
|
+
if (!(slotKey in result)) continue;
|
|
38
|
+
result[slotKey] = setAtPath(result[slotKey], pathParts, swap.replacement, swap.mode ?? "replace");
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
function extractContentSwaps(body) {
|
|
43
|
+
if (!isPlainObject(body)) return void 0;
|
|
44
|
+
const swaps = body.xeniaContentSwaps;
|
|
45
|
+
return Array.isArray(swaps) ? swaps : void 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/core/response-store.ts
|
|
49
|
+
var MemoryResponseStore = class {
|
|
50
|
+
map = /* @__PURE__ */ new Map();
|
|
51
|
+
set(key, value) {
|
|
52
|
+
this.map.set(key, value);
|
|
53
|
+
}
|
|
54
|
+
get(key) {
|
|
55
|
+
return this.map.get(key);
|
|
56
|
+
}
|
|
57
|
+
keys() {
|
|
58
|
+
return [...this.map.keys()];
|
|
59
|
+
}
|
|
60
|
+
clear() {
|
|
61
|
+
this.map.clear();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var LocalStorageResponseStore = class {
|
|
65
|
+
nsKey;
|
|
66
|
+
constructor(prefix = "xenia") {
|
|
67
|
+
this.nsKey = `${prefix}_responses`;
|
|
68
|
+
}
|
|
69
|
+
read() {
|
|
70
|
+
try {
|
|
71
|
+
const raw = localStorage.getItem(this.nsKey);
|
|
72
|
+
return raw ? JSON.parse(raw) : {};
|
|
73
|
+
} catch {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
write(data) {
|
|
78
|
+
try {
|
|
79
|
+
localStorage.setItem(this.nsKey, JSON.stringify(data));
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
set(key, value) {
|
|
84
|
+
const data = this.read();
|
|
85
|
+
data[key] = value;
|
|
86
|
+
this.write(data);
|
|
87
|
+
}
|
|
88
|
+
get(key) {
|
|
89
|
+
return this.read()[key];
|
|
90
|
+
}
|
|
91
|
+
keys() {
|
|
92
|
+
return Object.keys(this.read());
|
|
93
|
+
}
|
|
94
|
+
clear() {
|
|
95
|
+
try {
|
|
96
|
+
localStorage.removeItem(this.nsKey);
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export { LocalStorageResponseStore, MemoryResponseStore, extractContentSwaps, spliceSlots };
|
|
103
|
+
//# sourceMappingURL=chunk-TLTG3BTC.js.map
|
|
104
|
+
//# sourceMappingURL=chunk-TLTG3BTC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/content-splice.ts","../src/core/response-store.ts"],"names":[],"mappings":"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","file":"chunk-TLTG3BTC.js","sourcesContent":["import type { JsonValue } from \"./types\";\n\n/**\n * A single content swap, as emitted in a webhook-response body's\n * `xeniaContentSwaps` array (the multi-slot personalization analogue of\n * `xeniaActions`). `identifier` is `\"<slotKey>\"` (whole-slot replace) or\n * `\"<slotKey>.<dotted.path>\"` addressing a node inside that slot's JSON\n * (object keys or array indices).\n *\n * NOTE: this field name/shape is a proposed contract, not yet emitted by any\n * journey node — confirm with the Journey Orchestrator (FE/BE) team before\n * relying on it in production.\n */\nexport interface ContentSwap {\n identifier: string;\n replacement: JsonValue;\n /** `\"replace\"` (default) swaps the whole matched node; `\"merge\"` shallow-merges when both sides are objects. */\n mode?: \"replace\" | \"merge\";\n}\n\nfunction isPlainObject(v: JsonValue): v is { [key: string]: JsonValue } {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\nfunction cloneJson<T extends JsonValue>(value: T): T {\n return value === null || typeof value !== \"object\" ? value : (JSON.parse(JSON.stringify(value)) as T);\n}\n\nfunction setAtPath(node: JsonValue, path: string[], value: JsonValue, mode: \"replace\" | \"merge\"): JsonValue {\n if (path.length === 0) {\n if (mode === \"merge\" && isPlainObject(node) && isPlainObject(value)) {\n return { ...node, ...value };\n }\n return value;\n }\n\n const [key, ...rest] = path;\n if (Array.isArray(node)) {\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= node.length) return node;\n const next = node.slice();\n next[index] = setAtPath(next[index], rest, value, mode);\n return next;\n }\n if (isPlainObject(node)) {\n if (!(key in node)) return node;\n return { ...node, [key]: setAtPath(node[key], rest, value, mode) };\n }\n return node;\n}\n\n/**\n * Splice `swaps` into a base map of named content slots, recursively at any\n * nesting depth. Defensive by design (mirrors the PHP SDK's personalization\n * client): a swap whose `identifier` doesn't resolve to an existing slot/path\n * is silently ignored rather than thrown — this never fails, it degrades to\n * the base slot value. Slots are deep-cloned; inputs are never mutated.\n */\nexport function spliceSlots(\n slots: Record<string, JsonValue>,\n swaps: ContentSwap[] | undefined,\n): Record<string, JsonValue> {\n const result: Record<string, JsonValue> = {};\n for (const [key, value] of Object.entries(slots)) {\n result[key] = cloneJson(value);\n }\n if (!swaps) return result;\n\n for (const swap of swaps) {\n const [slotKey, ...pathParts] = swap.identifier.split(\".\");\n if (!(slotKey in result)) continue;\n result[slotKey] = setAtPath(result[slotKey], pathParts, swap.replacement, swap.mode ?? \"replace\");\n }\n return result;\n}\n\n/** Extract `xeniaContentSwaps` from a webhook-response body, if present and well-formed. */\nexport function extractContentSwaps(body: JsonValue): ContentSwap[] | undefined {\n if (!isPlainObject(body)) return undefined;\n const swaps = body.xeniaContentSwaps;\n return Array.isArray(swaps) ? (swaps as unknown as ContentSwap[]) : undefined;\n}\n","import type { WebhookResponse } from \"./types\";\n\n/**\n * Persists webhook responses the SDK receives, keyed by an arbitrary string\n * (typically the eventId, triggerId, or journeyId). Lets the app read back the\n * last server response for a given interaction without re-firing it.\n */\nexport interface ResponseStore {\n set(key: string, value: WebhookResponse): void;\n get(key: string): WebhookResponse | undefined;\n keys(): string[];\n clear(): void;\n}\n\n/** In-memory store. Default; lost on reload. */\nexport class MemoryResponseStore implements ResponseStore {\n private readonly map = new Map<string, WebhookResponse>();\n\n set(key: string, value: WebhookResponse): void {\n this.map.set(key, value);\n }\n get(key: string): WebhookResponse | undefined {\n return this.map.get(key);\n }\n keys(): string[] {\n return [...this.map.keys()];\n }\n clear(): void {\n this.map.clear();\n }\n}\n\n/**\n * localStorage-backed store — survives reloads. Falls back to memory semantics\n * (silent no-op reads/writes) when localStorage is unavailable or throws.\n */\nexport class LocalStorageResponseStore implements ResponseStore {\n private readonly nsKey: string;\n\n constructor(prefix = \"xenia\") {\n this.nsKey = `${prefix}_responses`;\n }\n\n private read(): Record<string, WebhookResponse> {\n try {\n const raw = localStorage.getItem(this.nsKey);\n return raw ? (JSON.parse(raw) as Record<string, WebhookResponse>) : {};\n } catch {\n return {};\n }\n }\n\n private write(data: Record<string, WebhookResponse>): void {\n try {\n localStorage.setItem(this.nsKey, JSON.stringify(data));\n } catch {\n /* storage full / unavailable — ignore */\n }\n }\n\n set(key: string, value: WebhookResponse): void {\n const data = this.read();\n data[key] = value;\n this.write(data);\n }\n get(key: string): WebhookResponse | undefined {\n return this.read()[key];\n }\n keys(): string[] {\n return Object.keys(this.read());\n }\n clear(): void {\n try {\n localStorage.removeItem(this.nsKey);\n } catch {\n /* ignore */\n }\n }\n}\n"]}
|