@crelora/mark 0.1.1 → 0.2.1
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 +73 -1
- package/dist/browser.es.js +284 -192
- package/dist/browser.es.js.map +1 -1
- package/dist/browser.umd.js +1 -1
- package/dist/browser.umd.js.map +1 -1
- package/dist/node.cjs +1 -1
- package/dist/node.cjs.map +1 -1
- package/dist/node.es.js +65 -12
- package/dist/node.es.js.map +1 -1
- package/dist/types/browser/BrowserStorage.d.ts +2 -0
- package/dist/types/browser/Mark.d.ts +17 -1
- package/dist/types/browser/pageviewDedupeKey.d.ts +15 -0
- package/dist/types/core/MarkCore.d.ts +24 -0
- package/dist/types/core/adapters.d.ts +2 -0
- package/dist/types/node/StatelessStorage.d.ts +2 -0
- package/dist/types/node/index.d.ts +6 -0
- package/dist/types/types.d.ts +12 -0
- package/package.json +1 -1
package/dist/browser.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.umd.js","sources":["../src/core/constants.ts","../src/core/TransportError.ts","../src/core/DeliveryQueue.ts","../src/core/MarkCore.ts","../src/core/HttpTransport.ts","../src/browser/BrowserStorage.ts","../src/browser/urlAttribution.ts","../src/browser/Mark.ts","../src/browser/index.ts","../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["export const DEFAULT_ENDPOINT = 'https://ingest.onelence.com';\n\n","export class TransportError extends Error {\r\n public readonly status?: number;\r\n public readonly retryAfterMs?: number;\r\n\r\n constructor(message: string, options: { status?: number; retryAfterMs?: number } = {}) {\r\n super(message);\r\n this.name = 'TransportError';\r\n this.status = options.status;\r\n this.retryAfterMs = options.retryAfterMs;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true when a TransportError status should NOT be retried by the queue.\r\n * 4xx client errors (other than 408 Request Timeout and 429 Too Many Requests)\r\n * indicate a request problem that re-sending will not fix.\r\n */\r\nexport function isNonRetriableStatus(status: number | undefined): boolean {\r\n if (typeof status !== 'number') return false;\r\n if (status < 400 || status >= 500) return false;\r\n if (status === 408 || status === 429) return false;\r\n return true;\r\n}\r\n\r\nexport function parseRetryAfter(headerValue: string | null | undefined): number | undefined {\r\n if (!headerValue) return undefined;\r\n const trimmed = headerValue.trim();\r\n if (!trimmed) return undefined;\r\n const numeric = Number(trimmed);\r\n if (Number.isFinite(numeric) && numeric >= 0) {\r\n return Math.floor(numeric * 1000);\r\n }\r\n const dateMs = Date.parse(trimmed);\r\n if (Number.isFinite(dateMs)) {\r\n const diff = dateMs - Date.now();\r\n return diff > 0 ? diff : 0;\r\n }\r\n return undefined;\r\n}\r\n","import type { TransportAdapter } from './adapters';\r\nimport { TransportError, isNonRetriableStatus } from './TransportError';\r\n\r\ninterface QueueItem {\r\n path: string;\r\n data: Record<string, unknown>;\r\n attempts: number;\r\n nextAttemptAt: number;\r\n enqueuedAt: number;\r\n}\r\n\r\nexport interface DeliveryQueueOptions {\r\n debug?: boolean;\r\n maxAttempts?: number;\r\n baseBackoffMs?: number;\r\n maxBackoffMs?: number;\r\n /**\r\n * Maximum age (ms) for persisted queue items before they are dropped on load\r\n * or next process tick. Defaults to 48 hours.\r\n */\r\n maxItemAgeMs?: number;\r\n loadPersisted?: () => QueueItem[];\r\n savePersisted?: (items: QueueItem[]) => void;\r\n onError?: (error: unknown, event?: Record<string, unknown>) => void;\r\n}\r\n\r\nconst DEFAULT_MAX_ATTEMPTS = 5;\r\nconst DEFAULT_BASE_BACKOFF_MS = 300;\r\nconst DEFAULT_MAX_BACKOFF_MS = 15000;\r\nconst DEFAULT_MAX_ITEM_AGE_MS = 48 * 60 * 60 * 1000;\r\n\r\nexport class DeliveryQueue {\r\n private readonly queue: QueueItem[] = [];\r\n private flushing = false;\r\n private sent = 0;\r\n private failed = 0;\r\n private dropped = 0;\r\n private readonly maxAttempts: number;\r\n private readonly baseBackoffMs: number;\r\n private readonly maxBackoffMs: number;\r\n private readonly maxItemAgeMs: number;\r\n private readonly debug: boolean;\r\n private readonly loadPersisted?: () => QueueItem[];\r\n private readonly savePersisted?: (items: QueueItem[]) => void;\r\n private readonly onError?: (error: unknown, event?: Record<string, unknown>) => void;\r\n\r\n constructor(private readonly transport: TransportAdapter, options: DeliveryQueueOptions = {}) {\r\n this.maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\r\n this.baseBackoffMs = options.baseBackoffMs ?? DEFAULT_BASE_BACKOFF_MS;\r\n this.maxBackoffMs = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\r\n this.maxItemAgeMs = options.maxItemAgeMs ?? DEFAULT_MAX_ITEM_AGE_MS;\r\n this.debug = options.debug ?? false;\r\n this.loadPersisted = options.loadPersisted;\r\n this.savePersisted = options.savePersisted;\r\n this.onError = options.onError;\r\n const persisted = this.loadPersisted?.() ?? [];\r\n if (persisted.length > 0) {\r\n const now = Date.now();\r\n for (const item of persisted) {\r\n const enqueuedAt = item.enqueuedAt ?? now;\r\n if (now - enqueuedAt > this.maxItemAgeMs) {\r\n this.dropped += 1;\r\n continue;\r\n }\r\n this.queue.push({ ...item, enqueuedAt });\r\n }\r\n this.persist();\r\n }\r\n }\r\n\r\n public enqueue(path: string, data: Record<string, unknown>) {\r\n this.queue.push({\r\n path,\r\n data,\r\n attempts: 0,\r\n nextAttemptAt: Date.now(),\r\n enqueuedAt: Date.now(),\r\n });\r\n this.persist();\r\n void this.process();\r\n }\r\n\r\n public async flush() {\r\n await this.process(true);\r\n await this.transport.flush?.();\r\n }\r\n\r\n /**\r\n * Best-effort synchronous drain using sendBeacon. Intended for page unload;\r\n * errors are swallowed because the tab is going away.\r\n */\r\n public drainViaBeacon() {\r\n if (this.queue.length === 0) return;\r\n const items = this.queue.splice(0, this.queue.length);\r\n this.persist();\r\n for (const item of items) {\r\n const eventData = { ...item.data };\r\n delete eventData.__prefer_beacon;\r\n try {\r\n void this.transport.send(item.path, eventData, { preferBeacon: true });\r\n } catch {\r\n // ignore: browser is unloading\r\n }\r\n }\r\n }\r\n\r\n public getStats() {\r\n return {\r\n queued: this.queue.length,\r\n sent: this.sent,\r\n failed: this.failed,\r\n dropped: this.dropped,\r\n };\r\n }\r\n\r\n public clear() {\r\n this.queue.splice(0, this.queue.length);\r\n this.persist();\r\n }\r\n\r\n private persist() {\r\n this.savePersisted?.(this.queue);\r\n }\r\n\r\n private evictExpired() {\r\n if (this.queue.length === 0) return;\r\n const now = Date.now();\r\n const cutoff = now - this.maxItemAgeMs;\r\n let removed = 0;\r\n for (let i = this.queue.length - 1; i >= 0; i -= 1) {\r\n if (this.queue[i].enqueuedAt <= cutoff) {\r\n this.queue.splice(i, 1);\r\n this.dropped += 1;\r\n removed += 1;\r\n }\r\n }\r\n if (removed > 0) {\r\n this.persist();\r\n }\r\n }\r\n\r\n private async process(force = false): Promise<void> {\r\n if (this.flushing) {\r\n return;\r\n }\r\n this.flushing = true;\r\n try {\r\n this.evictExpired();\r\n while (this.queue.length > 0) {\r\n const item = this.queue[0];\r\n if (!force && item.nextAttemptAt > Date.now()) {\r\n break;\r\n }\r\n try {\r\n const eventData = { ...item.data };\r\n const preferBeacon = eventData.__prefer_beacon === true;\r\n delete eventData.__prefer_beacon;\r\n await this.transport.send(item.path, eventData, { preferBeacon });\r\n this.queue.shift();\r\n this.sent += 1;\r\n this.persist();\r\n } catch (error) {\r\n this.failed += 1;\r\n this.onError?.(error, item.data);\r\n\r\n const status = error instanceof TransportError ? error.status : undefined;\r\n if (isNonRetriableStatus(status)) {\r\n this.queue.shift();\r\n this.dropped += 1;\r\n this.persist();\r\n if (this.debug) {\r\n console.error('[Mark] Dropping event after non-retriable status', status, item.path);\r\n }\r\n continue;\r\n }\r\n\r\n item.attempts += 1;\r\n if (item.attempts >= this.maxAttempts) {\r\n this.queue.shift();\r\n this.dropped += 1;\r\n this.persist();\r\n if (this.debug) {\r\n console.error('[Mark] Dropping event after max retries', item.path, error);\r\n }\r\n continue;\r\n }\r\n const retryAfterMs = error instanceof TransportError ? error.retryAfterMs : undefined;\r\n let delay: number;\r\n if (typeof retryAfterMs === 'number') {\r\n delay = Math.min(this.maxBackoffMs, Math.max(0, retryAfterMs));\r\n } else {\r\n const jitter = Math.random() * this.baseBackoffMs;\r\n delay = Math.min(\r\n this.maxBackoffMs,\r\n this.baseBackoffMs * 2 ** (item.attempts - 1) + jitter\r\n );\r\n }\r\n item.nextAttemptAt = Date.now() + delay;\r\n this.persist();\r\n break;\r\n }\r\n }\r\n } finally {\r\n this.flushing = false;\r\n }\r\n }\r\n}\r\n","import type {\r\n MarkConfig,\r\n TrackEventData,\r\n ConversionProperties,\r\n IdentifyTraits,\r\n ConsentStatus,\r\n JsonValue,\r\n} from '../types';\r\nimport type { MarkDependencies } from './adapters';\r\nimport { DEFAULT_ENDPOINT } from './constants';\r\nimport { DeliveryQueue } from './DeliveryQueue';\r\n\r\ntype ResolvedConfig = MarkConfig & { endpoint: string };\r\nconst TRACK_RESERVED_FIELDS = new Set(['event_name', 'user_id', 'consent_state', 'source', 'is_conversion']);\r\nconst IDENTIFY_RESERVED_FIELDS = new Set([\r\n 'user_id',\r\n 'visitor_id',\r\n 'click_id',\r\n 'campaign_id',\r\n 'query',\r\n 'consent_state',\r\n 'source',\r\n]);\r\n\r\nexport class MarkCore {\r\n private config: ResolvedConfig;\r\n private consentRequirement: boolean | 'auto';\r\n private siteId?: string;\r\n private siteHost?: string;\r\n private readonly queue: DeliveryQueue;\r\n private readonly sessionTimeoutMs: number;\r\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly batchedEvents: Array<Record<string, unknown>> = [];\r\n private tcfCachedAllowed = false;\r\n\r\n constructor(config: MarkConfig, private readonly deps: MarkDependencies) {\r\n this.validateConfig(config);\r\n this.config = {\r\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\r\n ...config,\r\n include_page_context: config.include_page_context ?? true,\r\n };\r\n this.consentRequirement = config.require_consent ?? false;\r\n this.siteId = config.site_id;\r\n this.siteHost = config.site_host;\r\n this.sessionTimeoutMs = config.session_timeout_ms ?? 30 * 60 * 1000;\r\n this.queue = new DeliveryQueue(this.deps.transport, {\r\n debug: this.config.debug,\r\n loadPersisted: () => (this.deps.storage.getOutbox?.() as any[]) ?? [],\r\n savePersisted: (items) => this.deps.storage.setOutbox?.(items as unknown[]),\r\n onError: (error, event) => this.config.on_error?.(error, event),\r\n });\r\n this.warnMisconfiguredSiteHost();\r\n this.subscribeTcf();\r\n }\r\n\r\n /**\r\n * Best-effort synchronous drain that dispatches all queued events via\r\n * sendBeacon. Intended for use on page unload (visibilitychange=hidden,\r\n * pagehide) where async fetch may be cancelled by the browser.\r\n */\r\n public drainViaBeacon() {\r\n this.flushBatch();\r\n this.queue.drainViaBeacon();\r\n }\r\n\r\n /**\r\n * Kicks the queue to retry any pending items now. Safe to call repeatedly;\r\n * used by the browser wrapper in response to `online` events or periodic\r\n * timers.\r\n */\r\n public kickQueue() {\r\n void this.queue.flush();\r\n }\r\n\r\n public track(eventName: string, data: TrackEventData = {}) {\r\n return this.trackInternal(eventName, data, false);\r\n }\r\n\r\n private trackInternal(\r\n eventName: string,\r\n data: TrackEventData = {},\r\n isConversion = false,\r\n options?: { preferBeacon?: boolean }\r\n ) {\r\n if (!eventName) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] track called without event name');\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.hasConsent() || this.isDntBlocked()) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] Tracking blocked due to consent requirement.');\r\n }\r\n return false;\r\n }\r\n\r\n if (!isConversion && !this.shouldSampleTrack()) {\r\n return true;\r\n }\r\n\r\n const sanitizedData = this.sanitizeTrackData(data);\r\n const restData: TrackEventData = { ...sanitizedData };\r\n if ('query' in restData) {\r\n delete restData.query;\r\n }\r\n if ('site_id' in restData) {\r\n delete restData.site_id;\r\n }\r\n if ('site_host' in restData) {\r\n delete restData.site_host;\r\n }\r\n const payload: Record<string, unknown> = {\r\n event_name: eventName,\r\n message_id: this.createMessageId(),\r\n ...this.getIdentityFields(sanitizedData),\r\n ...restData,\r\n };\r\n if (isConversion) {\r\n payload.is_conversion = true;\r\n }\r\n\r\n // Add site_id and site_host if configured (event-level overrides init-level)\r\n const siteId = sanitizedData.site_id ?? this.siteId;\r\n const siteHost = sanitizedData.site_host ?? this.siteHost;\r\n\r\n if (siteId) {\r\n payload.site_id = siteId;\r\n }\r\n if (siteHost) {\r\n payload.site_host = siteHost;\r\n }\r\n\r\n if (this.config.include_page_context && typeof window !== 'undefined') {\r\n this.applyPageContext(payload);\r\n // If site_host wasn't explicitly set, use the host from page context\r\n if (!siteHost && payload.site) {\r\n payload.site_host = payload.site;\r\n }\r\n }\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) {\r\n return true;\r\n }\r\n\r\n this.ensureSession();\r\n if (this.config.batching?.enabled && !isConversion && !options?.preferBeacon) {\r\n this.enqueueBatch(transformed);\r\n return true;\r\n }\r\n this.queue.enqueue('/event', { ...transformed, __prefer_beacon: options?.preferBeacon === true });\r\n return true;\r\n }\r\n\r\n public identify(userId: string, traits: IdentifyTraits = {}) {\r\n if (!userId) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] identify called without userId');\r\n }\r\n return;\r\n }\r\n\r\n if (!this.hasConsent() || this.isDntBlocked()) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] Identify blocked due to consent requirement.');\r\n }\r\n return;\r\n }\r\n\r\n this.deps.storage.update({ user_id: userId });\r\n\r\n const payload: Record<string, unknown> = {\r\n user_id: userId,\r\n message_id: this.createMessageId(),\r\n ...this.sanitizeIdentifyTraits(traits),\r\n ...this.getIdentityFields(),\r\n };\r\n\r\n // Add site_id and site_host if configured\r\n if (this.siteId) {\r\n payload.site_id = this.siteId;\r\n }\r\n if (this.siteHost) {\r\n payload.site_host = this.siteHost;\r\n }\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) return;\r\n this.queue.enqueue('/identify', transformed);\r\n }\r\n\r\n public conversion(eventName: string, data: ConversionProperties = {}) {\r\n return this.trackInternal(eventName, data, true);\r\n }\r\n\r\n public trackWithOptions(eventName: string, data: TrackEventData = {}, options?: { preferBeacon?: boolean }) {\r\n return this.trackInternal(eventName, data, false, options);\r\n }\r\n\r\n /**\r\n * Returns the current visitor ID from storage, if any.\r\n * Used by browser/Node wrappers to expose a stable pseudonymous ID for server-side attribution.\r\n */\r\n public getVisitorId(): string | undefined {\r\n return this.deps.storage.getVisitorId();\r\n }\r\n\r\n public setConsent(status: ConsentStatus) {\r\n const previous = this.deps.storage.getConsentStatus();\r\n this.deps.storage.setConsentStatus(status);\r\n if (status === 'denied') {\r\n this.deps.storage.clearAttribution?.();\r\n this.deps.storage.clearCookieVisitorId?.();\r\n } else if (\r\n status === 'granted' &&\r\n previous === 'denied' &&\r\n this.config.rotate_visitor_on_consent_change\r\n ) {\r\n this.deps.storage.rotateVisitorId?.();\r\n }\r\n const payload: Record<string, unknown> = {\r\n visitor_id: this.deps.storage.getVisitorId(),\r\n consent_state: status,\r\n source: 'sdk',\r\n message_id: this.createMessageId(),\r\n };\r\n\r\n // Add site_id and site_host if configured\r\n if (this.siteId) {\r\n payload.site_id = this.siteId;\r\n }\r\n if (this.siteHost) {\r\n payload.site_host = this.siteHost;\r\n }\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) return;\r\n this.queue.enqueue('/consent', transformed);\r\n }\r\n\r\n public reset() {\r\n this.deps.storage.update({\r\n user_id: undefined,\r\n last_click_id: undefined,\r\n campaign_id: undefined,\r\n query_params: undefined,\r\n session_id: undefined,\r\n session_started_at: undefined,\r\n last_activity_at: undefined,\r\n });\r\n this.deps.storage.rotateVisitorId?.();\r\n }\r\n\r\n public flush() {\r\n this.flushBatch();\r\n return this.queue.flush();\r\n }\r\n\r\n public getStats() {\r\n return this.queue.getStats();\r\n }\r\n\r\n private getIdentityFields(data?: TrackEventData) {\r\n const visitorId = data?.visitor_id ?? this.deps.storage.getVisitorId();\r\n const userId = data?.user_id ?? this.deps.storage.getUserId?.();\r\n const clickId = data?.click_id ?? this.deps.storage.getLastClickId();\r\n const campaignId = data?.campaign_id ?? this.deps.storage.getCampaignId();\r\n const sessionId = data?.session_id ?? this.deps.storage.getSessionId?.();\r\n\r\n // Auto-capture query params from storage or event data\r\n const storedQuery = this.deps.storage.getQueryParams() ?? {};\r\n const inputQuery = (data?.query as Record<string, string> | undefined) ?? {};\r\n\r\n // Merge: stored values serve as defaults, input values override/append\r\n const query = { ...storedQuery, ...inputQuery };\r\n\r\n const identity: Record<string, unknown> = {};\r\n\r\n if (visitorId) identity.visitor_id = visitorId;\r\n if (userId) identity.user_id = userId;\r\n if (clickId) identity.click_id = clickId;\r\n if (campaignId) identity.campaign_id = campaignId;\r\n if (sessionId) identity.session_id = sessionId;\r\n\r\n if (Object.keys(query).length > 0) {\r\n identity.query = query;\r\n }\r\n\r\n return identity;\r\n }\r\n\r\n private hasConsent() {\r\n if (this.config.consent_source?.type === 'tcf' && typeof window !== 'undefined') {\r\n if (!this.tcfCachedAllowed) {\r\n return false;\r\n }\r\n }\r\n if (!this.consentRequirement) {\r\n return true;\r\n }\r\n\r\n const stored = this.deps.storage.getConsentStatus();\r\n const state = stored;\r\n\r\n if (this.consentRequirement === 'auto') {\r\n // In auto mode, default to deny until consent is explicitly granted.\r\n return state === 'granted';\r\n }\r\n\r\n return state === 'granted';\r\n }\r\n\r\n private sanitizeTrackData(data: TrackEventData) {\r\n const sanitized: Record<string, JsonValue | undefined> = {};\r\n for (const [key, value] of Object.entries(data)) {\r\n if (TRACK_RESERVED_FIELDS.has(key)) {\r\n continue;\r\n }\r\n sanitized[key] = value;\r\n }\r\n return sanitized as TrackEventData;\r\n }\r\n\r\n private sanitizeIdentifyTraits(traits: IdentifyTraits) {\r\n const sanitized: Record<string, JsonValue | undefined> = {};\r\n for (const [key, value] of Object.entries(traits)) {\r\n if (IDENTIFY_RESERVED_FIELDS.has(key)) {\r\n continue;\r\n }\r\n sanitized[key] = value;\r\n }\r\n return sanitized as IdentifyTraits;\r\n }\r\n\r\n private validateConfig(config: MarkConfig) {\r\n if (!config.key || !config.key.trim()) {\r\n throw new Error('[Mark] `key` must be a non-empty string.');\r\n }\r\n if (config.endpoint) {\r\n try {\r\n // eslint-disable-next-line no-new\r\n new URL(config.endpoint);\r\n } catch {\r\n throw new Error('[Mark] `endpoint` must be a valid absolute URL.');\r\n }\r\n }\r\n if (typeof config.site_id === 'string' && !config.site_id.trim()) {\r\n throw new Error('[Mark] `site_id` cannot be an empty string.');\r\n }\r\n if (typeof config.site_host === 'string' && !config.site_host.trim()) {\r\n throw new Error('[Mark] `site_host` cannot be an empty string.');\r\n }\r\n }\r\n\r\n private applyPageContext(payload: Record<string, unknown>) {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n if (!payload.site) payload.site = window.location.host;\r\n if (!payload.page) payload.page = window.location.pathname;\r\n if (!payload.title) payload.title = document.title;\r\n if (!payload.referrer && document.referrer) {\r\n payload.referrer = this.scrubReferrer(document.referrer);\r\n }\r\n // full URL omitted for privacy; include only if explicitly provided by the caller\r\n }\r\n\r\n private enqueueBatch(event: Record<string, unknown>) {\r\n this.batchedEvents.push(event);\r\n const maxSize = this.config.batching?.max_size ?? 20;\r\n if (this.batchedEvents.length >= maxSize) {\r\n this.flushBatch();\r\n return;\r\n }\r\n if (!this.batchTimer) {\r\n const intervalMs = this.config.batching?.flush_interval_ms ?? 2000;\r\n this.batchTimer = setTimeout(() => {\r\n this.batchTimer = null;\r\n this.flushBatch();\r\n }, intervalMs);\r\n }\r\n }\r\n\r\n private flushBatch() {\r\n if (this.batchedEvents.length === 0) return;\r\n const path = this.config.batching?.endpoint_path ?? '/events';\r\n const payload = this.batchedEvents.splice(0, this.batchedEvents.length);\r\n this.queue.enqueue(path, { events: payload, message_id: this.createMessageId() });\r\n }\r\n\r\n private createMessageId() {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID();\r\n }\r\n return `msg_${Date.now()}_${Math.random().toString(16).slice(2)}`;\r\n }\r\n\r\n private ensureSession() {\r\n const now = Date.now();\r\n const currentId = this.deps.storage.getSessionId?.();\r\n const lastActivityIso = this.deps.storage.getLastActivityAt?.();\r\n const lastActivity = lastActivityIso ? Date.parse(lastActivityIso) : 0;\r\n const shouldRotate =\r\n !currentId ||\r\n !lastActivity ||\r\n now - lastActivity >= this.sessionTimeoutMs ||\r\n this.crossedUtcDay(lastActivity, now);\r\n if (shouldRotate) {\r\n const newSessionId = this.createMessageId();\r\n const nowIso = new Date(now).toISOString();\r\n this.deps.storage.update({\r\n session_id: newSessionId,\r\n session_started_at: nowIso,\r\n last_activity_at: nowIso,\r\n });\r\n return;\r\n }\r\n this.deps.storage.update({ last_activity_at: new Date(now).toISOString() });\r\n }\r\n\r\n private crossedUtcDay(previousTs: number, currentTs: number) {\r\n const prev = new Date(previousTs);\r\n const next = new Date(currentTs);\r\n return (\r\n prev.getUTCFullYear() !== next.getUTCFullYear() ||\r\n prev.getUTCMonth() !== next.getUTCMonth() ||\r\n prev.getUTCDate() !== next.getUTCDate()\r\n );\r\n }\r\n\r\n private shouldSampleTrack() {\r\n if (typeof this.config.sample_rate !== 'number') return true;\r\n if (this.config.sample_rate <= 0) return false;\r\n if (this.config.sample_rate >= 1) return true;\r\n return Math.random() <= this.config.sample_rate;\r\n }\r\n\r\n private isDntBlocked() {\r\n if (!this.config.honor_dnt || typeof navigator === 'undefined') {\r\n return false;\r\n }\r\n const dnt = navigator.doNotTrack;\r\n const gpc = (navigator as Navigator & { globalPrivacyControl?: boolean }).globalPrivacyControl;\r\n return dnt === '1' || gpc === true;\r\n }\r\n\r\n private scrubReferrer(referrer: string) {\r\n try {\r\n const refUrl = new URL(referrer);\r\n if (typeof window === 'undefined') return referrer;\r\n const currentUrl = new URL(window.location.href);\r\n if (refUrl.origin !== currentUrl.origin) {\r\n refUrl.search = '';\r\n return refUrl.toString();\r\n }\r\n return referrer;\r\n } catch {\r\n return referrer;\r\n }\r\n }\r\n\r\n private warnMisconfiguredSiteHost() {\r\n if (!this.config.debug || !this.siteHost || typeof window === 'undefined') {\r\n return;\r\n }\r\n if (window.location.host !== this.siteHost) {\r\n console.warn('[Mark] config.site_host does not match current host', {\r\n expected: this.siteHost,\r\n actual: window.location.host,\r\n });\r\n }\r\n if (this.siteId && !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(this.siteId)) {\r\n console.warn('[Mark] config.site_id does not look like UUID v4', this.siteId);\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to the IAB TCF v2 CMP via `__tcfapi('addEventListener', ...)`.\r\n * Result is cached in `tcfCachedAllowed` so the synchronous `hasConsent()`\r\n * path does not need to await the CMP. If the CMP is not yet present, we\r\n * poll briefly (CMPs commonly load asynchronously) and give up after ~2s.\r\n */\r\n private subscribeTcf() {\r\n const source = this.config.consent_source;\r\n if (source?.type !== 'tcf' || typeof window === 'undefined') return;\r\n const purposes = source.purposes;\r\n\r\n const attempt = (retries: number) => {\r\n try {\r\n const w = window as Window & {\r\n __tcfapi?: (\r\n command: string,\r\n version: number,\r\n callback: (\r\n tcData?: {\r\n eventStatus?: string;\r\n gdprApplies?: boolean;\r\n listenerId?: number;\r\n purpose?: { consents?: Record<string, boolean> };\r\n },\r\n ok?: boolean\r\n ) => void,\r\n parameter?: number\r\n ) => void;\r\n };\r\n if (typeof w.__tcfapi !== 'function') {\r\n if (retries > 0) {\r\n setTimeout(() => attempt(retries - 1), 200);\r\n }\r\n return;\r\n }\r\n w.__tcfapi('addEventListener', 2, (tcData, ok) => {\r\n if (!ok || !tcData) {\r\n this.tcfCachedAllowed = false;\r\n return;\r\n }\r\n if (tcData.gdprApplies === false) {\r\n this.tcfCachedAllowed = true;\r\n return;\r\n }\r\n const consents = tcData.purpose?.consents ?? {};\r\n this.tcfCachedAllowed = purposes.every((p) => consents[String(p)] === true);\r\n });\r\n } catch {\r\n this.tcfCachedAllowed = false;\r\n }\r\n };\r\n\r\n attempt(10);\r\n }\r\n}\r\n\r\n","import type { MarkConfig } from '../types';\r\nimport { DEFAULT_ENDPOINT } from './constants';\r\nimport type { TransportAdapter } from './adapters';\r\nimport { TransportError, parseRetryAfter } from './TransportError';\r\n\r\nexport class HttpTransport implements TransportAdapter {\r\n private readonly config: MarkConfig;\r\n private readonly endpoint: string;\r\n private readonly pending = new Set<Promise<void>>();\r\n\r\n constructor(config: MarkConfig) {\r\n this.config = config;\r\n this.endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\r\n }\r\n\r\n public async send(path: string, data: unknown, options?: { preferBeacon?: boolean }) {\r\n const request = this.sendInternal(path, data, options);\r\n this.pending.add(request);\r\n try {\r\n await request;\r\n } finally {\r\n this.pending.delete(request);\r\n }\r\n }\r\n\r\n public async flush() {\r\n if (this.pending.size === 0) {\r\n return;\r\n }\r\n await Promise.allSettled(Array.from(this.pending));\r\n }\r\n\r\n private async sendInternal(path: string, data: unknown, options?: { preferBeacon?: boolean }) {\r\n const url = this.joinUrl(this.endpoint, path);\r\n const key = this.config.key;\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n [key.startsWith('sk_') ? 'x-secret-key' : 'x-publishable-key']: key,\r\n };\r\n\r\n if (this.config.debug) {\r\n console.log('[Mark] Sending', url, data);\r\n }\r\n\r\n const body = JSON.stringify(data);\r\n if (options?.preferBeacon && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\r\n const blob = new Blob([body], { type: 'application/json' });\r\n const sent = navigator.sendBeacon(url, blob);\r\n if (sent) {\r\n return;\r\n }\r\n }\r\n\r\n if (typeof fetch !== 'function') {\r\n if (this.config.debug) {\r\n console.error('[Mark] Global fetch is not available in this runtime.');\r\n }\r\n throw new TransportError('[Mark] Global fetch is not available in this runtime.');\r\n }\r\n\r\n const timeoutMs = this.config.request_timeout_ms ?? 10000;\r\n const controller = new AbortController();\r\n let timedOut = false;\r\n const timer = setTimeout(() => {\r\n timedOut = true;\r\n controller.abort();\r\n }, timeoutMs);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers,\r\n body,\r\n keepalive: true,\r\n signal: controller.signal,\r\n });\r\n if (!response.ok) {\r\n const snippet = await this.readErrorSnippet(response);\r\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\r\n if (this.config.debug) {\r\n console.error('[Mark] Request rejected', {\r\n url,\r\n status: response.status,\r\n statusText: response.statusText,\r\n body: snippet,\r\n retryAfterMs,\r\n });\r\n }\r\n throw new TransportError(\r\n `[Mark] Request rejected with status ${response.status}: ${snippet}`,\r\n { status: response.status, retryAfterMs }\r\n );\r\n }\r\n } catch (error) {\r\n if (this.config.debug) {\r\n console.error('[Mark] Failed to send', url, error);\r\n }\r\n if (error instanceof TransportError) {\r\n throw error;\r\n }\r\n if (timedOut) {\r\n throw new TransportError(`[Mark] Request timed out after ${timeoutMs}ms`, { status: 408 });\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new TransportError(`[Mark] Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private joinUrl(endpoint: string, path: string) {\r\n const normalizedEndpoint = endpoint.replace(/\\/+$/, '');\r\n const normalizedPath = path.replace(/^\\/+/, '');\r\n return `${normalizedEndpoint}/${normalizedPath}`;\r\n }\r\n\r\n private async readErrorSnippet(response: Response) {\r\n try {\r\n const text = await response.text();\r\n return text.slice(0, 300);\r\n } catch {\r\n return '';\r\n }\r\n }\r\n}\r\n","import type { ConsentStatus, CrossDomainConfig, StorageData } from '../types';\nimport type { StorageAdapter } from '../core/adapters';\n\nconst STORAGE_KEY = 'crelora_mark_data';\nconst OUTBOX_KEY = 'crelora_mark_outbox';\nconst COOKIE_NAME = 'crelora_mark_vid';\n\ninterface BrowserStorageOptions extends CrossDomainConfig {\n storageKey?: string;\n outboxKey?: string;\n}\n\ninterface BridgeMessage {\n type: 'MARK_SYNC_REQUEST' | 'MARK_SYNC_RESPONSE' | 'MARK_SYNC_UPDATE';\n visitorId?: string;\n}\n\nexport class BrowserStorage implements StorageAdapter {\n private data: StorageData;\n private readonly storageKey: string;\n private readonly outboxKey: string;\n private readonly options: BrowserStorageOptions;\n private bridgeFrame?: HTMLIFrameElement;\n private bridgeReady = false;\n private bridgeOrigin?: string;\n\n constructor(options?: BrowserStorageOptions) {\n this.options = options ?? {};\n this.storageKey = this.options.storageKey ?? STORAGE_KEY;\n this.outboxKey = this.options.outboxKey ?? OUTBOX_KEY;\n if (typeof window === 'undefined') {\n this.data = {};\n return;\n }\n this.data = this.load();\n\n if (!this.data.visitor_id) {\n this.data.visitor_id = this.generateUUID();\n this.save();\n }\n\n if (typeof window !== 'undefined' && this.options.bridge?.url) {\n this.setupBridge(this.options.bridge);\n }\n window.addEventListener('storage', this.handleStorageEvent);\n }\n\n public getVisitorId(): string | undefined {\n return this.data.visitor_id;\n }\n\n public getLastClickId(): string | undefined {\n return this.data.last_click_id;\n }\n\n public getCampaignId(): string | undefined {\n return this.data.campaign_id;\n }\n\n public getQueryParams(): Record<string, string> | undefined {\n return this.data.query_params;\n }\n\n public getConsentStatus(): ConsentStatus | undefined {\n return this.data.consent_status;\n }\n\n public getUserId(): string | undefined {\n return this.data.user_id;\n }\n\n public getSessionId(): string | undefined {\n return this.data.session_id;\n }\n\n public getSessionStartedAt(): string | undefined {\n return this.data.session_started_at;\n }\n\n public getLastActivityAt(): string | undefined {\n return this.data.last_activity_at;\n }\n\n public update(updates: Partial<StorageData>) {\n this.data = { ...this.data, ...updates };\n this.save();\n }\n\n public setConsentStatus(status: ConsentStatus) {\n this.data.consent_status = status;\n this.save();\n }\n\n public clearAttribution() {\n this.update({\n last_click_id: undefined,\n campaign_id: undefined,\n query_params: undefined,\n });\n }\n\n public clearCookieVisitorId() {\n this.setCookie(COOKIE_NAME, '', -1);\n }\n\n public rotateVisitorId() {\n this.update({ visitor_id: this.generateUUID() });\n }\n\n public getOutbox(): unknown[] {\n if (typeof window === 'undefined') return [];\n try {\n const raw = localStorage.getItem(this.outboxKey);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n public setOutbox(items: unknown[]) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(this.outboxKey, JSON.stringify(items.slice(-200)));\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n }\n\n private load(): StorageData {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n\n const cookieVid = this.getCookie(COOKIE_NAME);\n if (cookieVid) {\n return { visitor_id: cookieVid };\n }\n\n return {};\n }\n\n private save() {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.data));\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n\n if (this.data.visitor_id && this.isCookieEnabled()) {\n this.setCookie(COOKIE_NAME, this.data.visitor_id, 365);\n if (this.options.bridge?.url && this.bridgeReady) {\n this.postBridgeMessage({\n type: 'MARK_SYNC_UPDATE',\n visitorId: this.data.visitor_id,\n });\n }\n }\n }\n\n private getCookie(name: string): string | null {\n if (typeof document === 'undefined') {\n return null;\n }\n try {\n const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`));\n if (match) return match[2];\n } catch {\n // Ignore cookie access errors.\n }\n return null;\n }\n\n private setCookie(name: string, value: string, days: number) {\n if (typeof document === 'undefined') {\n return;\n }\n try {\n const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n const domainPart = this.options.cookie_domain\n ? `;domain=${this.options.cookie_domain}`\n : '';\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax${domainPart}`;\n } catch {\n // Ignore cookie access errors.\n }\n }\n\n private generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = ((Date.now() + Math.random() * 16) % 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n private isCookieEnabled() {\n if (!this.options.mode) return true;\n return this.options.mode === 'single' || this.options.mode === 'subdomain';\n }\n\n private setupBridge(bridge: NonNullable<CrossDomainConfig['bridge']>) {\n if (typeof document === 'undefined') return;\n let bridgeUrl: URL;\n try {\n bridgeUrl = new URL(bridge.url, window.location.href);\n } catch {\n return;\n }\n this.bridgeOrigin = bridgeUrl.origin;\n this.bridgeFrame = document.createElement('iframe');\n this.bridgeFrame.style.display = 'none';\n this.bridgeFrame.setAttribute('aria-hidden', 'true');\n this.bridgeFrame.src = bridgeUrl.toString();\n\n const timeout = bridge.timeout_ms ?? 3000;\n const timer = setTimeout(() => {\n window.removeEventListener('message', this.handleBridgeMessage);\n }, timeout);\n\n window.addEventListener('message', this.handleBridgeMessage);\n const appendFrame = () => {\n if (!this.bridgeFrame) return;\n if (!document.body) return;\n document.body.appendChild(this.bridgeFrame);\n };\n if (document.body) {\n appendFrame();\n } else {\n document.addEventListener('DOMContentLoaded', appendFrame, { once: true });\n }\n\n this.bridgeFrame.addEventListener('load', () => {\n clearTimeout(timer);\n this.bridgeReady = true;\n this.postBridgeMessage({\n type: 'MARK_SYNC_REQUEST',\n visitorId: this.data.visitor_id,\n });\n });\n }\n\n private handleBridgeMessage = (event: MessageEvent<BridgeMessage>) => {\n if (!this.bridgeFrame?.contentWindow || event.source !== this.bridgeFrame.contentWindow) {\n return;\n }\n if (!this.isDomainAllowed(event.origin)) {\n return;\n }\n\n const message = event.data;\n if (!message || !message.type) return;\n\n if (message.type === 'MARK_SYNC_RESPONSE' && message.visitorId) {\n if (message.visitorId !== this.data.visitor_id) {\n this.data.visitor_id = message.visitorId;\n this.save();\n }\n }\n };\n\n private postBridgeMessage(message: BridgeMessage) {\n if (!this.bridgeFrame?.contentWindow) return;\n this.bridgeFrame.contentWindow.postMessage(message, this.bridgeOrigin ?? '*');\n }\n\n private isDomainAllowed(origin: string) {\n try {\n const originUrl = new URL(origin);\n if (this.options.allowed_domains?.length) {\n return this.options.allowed_domains.some((domain) =>\n originUrl.hostname === domain || originUrl.hostname.endsWith(`.${domain}`)\n );\n }\n if (!this.bridgeOrigin) {\n return false;\n }\n const bridgeUrl = new URL(this.bridgeOrigin);\n return originUrl.hostname === bridgeUrl.hostname;\n } catch {\n return false;\n }\n }\n\n private handleStorageEvent = (event: StorageEvent) => {\n if (event.key !== this.storageKey || typeof event.newValue !== 'string') {\n return;\n }\n try {\n this.data = JSON.parse(event.newValue);\n } catch {\n // Ignore malformed storage updates.\n }\n };\n}\n\n","import type { StorageAdapter } from '../core/adapters';\r\nimport type { MarkConfig, StorageData } from '../types';\r\n\r\nconst CLICK_PARAM_CANDIDATES = [\r\n 'click_id',\r\n 'ch_click_id',\r\n 'gclid',\r\n 'gbraid',\r\n 'wbraid',\r\n 'dclid',\r\n 'msclkid',\r\n 'fbclid',\r\n 'ttclid',\r\n 'twclid',\r\n 'li_fat_id',\r\n];\r\nconst CAMPAIGN_PARAM_CANDIDATES = ['cid', 'campaign_id'];\r\n\r\nconst DEFAULT_CAPTURE_QUERY_KEYS = [\r\n 'utm_source',\r\n 'utm_medium',\r\n 'utm_campaign',\r\n 'utm_term',\r\n 'utm_content',\r\n 'ref',\r\n 'referral',\r\n 'affiliate_id',\r\n 'click_id',\r\n 'ch_click_id',\r\n 'cid',\r\n 'campaign_id',\r\n 'gclid',\r\n 'gbraid',\r\n 'wbraid',\r\n 'dclid',\r\n 'msclkid',\r\n 'fbclid',\r\n 'ttclid',\r\n 'twclid',\r\n 'li_fat_id',\r\n] as const;\r\n\r\nconst QUERY_KEY_ALIASES: Record<string, string> = {\r\n referral: 'ref',\r\n affiliate_id: 'ref',\r\n ch_click_id: 'click_id',\r\n cid: 'campaign_id',\r\n};\r\n\r\nconst DEFAULT_DENYLIST = ['email', 'phone', 'token', 'auth', 'password', 'code'] as const;\r\nconst DEFAULT_MAX_CAPTURED_QUERY_PARAMS = 30;\r\nconst DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH = 256;\r\n\r\ntype AttributionCaptureConfig = Pick<\r\n MarkConfig,\r\n | 'capture_query_params'\r\n | 'capture_all_query_params'\r\n | 'query_param_denylist'\r\n | 'max_captured_query_params'\r\n | 'max_query_param_value_length'\r\n>;\r\n\r\nexport function captureAttributionFromUrl(\r\n storage: StorageAdapter,\r\n config: AttributionCaptureConfig = {}\r\n) {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const updates = extractAttributionFromSearch(window.location.search, config);\r\n if (Object.keys(updates).length > 0) {\r\n storage.update(updates);\r\n }\r\n}\r\n\r\nexport function extractAttributionFromSearch(\r\n search: string,\r\n config: AttributionCaptureConfig = {}\r\n): Partial<StorageData> {\r\n const params = new URLSearchParams(search);\r\n const normalizedParamMap = buildNormalizedParamMap(params);\r\n const clickId = findFirst(normalizedParamMap, CLICK_PARAM_CANDIDATES);\r\n const campaignId = findFirst(normalizedParamMap, CAMPAIGN_PARAM_CANDIDATES);\r\n const queryParams = captureQueryParams(params, config);\r\n\r\n const updates: Partial<StorageData> = {};\r\n if (clickId) updates.last_click_id = clickId;\r\n if (campaignId) updates.campaign_id = campaignId;\r\n if (Object.keys(queryParams).length > 0) updates.query_params = queryParams;\r\n\r\n return updates;\r\n}\r\n\r\nfunction captureQueryParams(\r\n params: URLSearchParams,\r\n config: AttributionCaptureConfig\r\n): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const denylist = new Set(getNormalizedKeys(config.query_param_denylist, DEFAULT_DENYLIST));\r\n const maxParams = normalizeNonNegativeInteger(\r\n config.max_captured_query_params,\r\n DEFAULT_MAX_CAPTURED_QUERY_PARAMS\r\n );\r\n const maxValueLength = normalizeNonNegativeInteger(\r\n config.max_query_param_value_length,\r\n DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH\r\n );\r\n const captureAll = config.capture_all_query_params ?? false;\r\n\r\n const allowedKeys = captureAll\r\n ? null\r\n : new Set([\r\n ...DEFAULT_CAPTURE_QUERY_KEYS.map(normalizeKey),\r\n ...getNormalizedKeys(config.capture_query_params, []),\r\n ]);\r\n\r\n for (const [rawKey, rawValue] of params.entries()) {\r\n const key = normalizeKey(rawKey);\r\n if (!key) {\r\n continue;\r\n }\r\n const canonicalKey = QUERY_KEY_ALIASES[key] ?? key;\r\n if (denylist.has(key) || denylist.has(canonicalKey)) {\r\n continue;\r\n }\r\n\r\n if (allowedKeys && !allowedKeys.has(key)) {\r\n continue;\r\n }\r\n const value = rawValue.trim();\r\n if (!value) {\r\n continue;\r\n }\r\n\r\n if (!(canonicalKey in queryParams) && Object.keys(queryParams).length >= maxParams) {\r\n break;\r\n }\r\n\r\n queryParams[canonicalKey] = value.slice(0, maxValueLength);\r\n }\r\n\r\n return queryParams;\r\n}\r\n\r\nfunction findFirst(params: Record<string, string>, candidates: readonly string[]) {\r\n for (const key of candidates) {\r\n const normalizedCandidate = normalizeKey(key);\r\n const value = params[normalizedCandidate]?.trim();\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction buildNormalizedParamMap(params: URLSearchParams) {\r\n const map: Record<string, string> = {};\r\n for (const [rawKey, rawValue] of params.entries()) {\r\n const key = normalizeKey(rawKey);\r\n if (!key || key in map) {\r\n continue;\r\n }\r\n map[key] = rawValue;\r\n }\r\n return map;\r\n}\r\n\r\nfunction normalizeKey(key: string) {\r\n return key.trim().toLowerCase();\r\n}\r\n\r\nfunction getNormalizedKeys(\r\n keys: readonly string[] | undefined,\r\n defaults: readonly string[]\r\n): string[] {\r\n const source = keys ?? defaults;\r\n const values = new Set<string>();\r\n for (const key of source) {\r\n if (typeof key !== 'string') continue;\r\n const normalized = normalizeKey(key);\r\n if (normalized) {\r\n values.add(normalized);\r\n }\r\n }\r\n return Array.from(values);\r\n}\r\n\r\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number) {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n const normalized = Math.floor(value);\r\n if (normalized < 0) {\r\n return fallback;\r\n }\r\n return normalized;\r\n}\r\n\r\n\r\n","import type {\n MarkConfig,\n TrackEventData,\n IdentifyTraits,\n ConsentStatus,\n StorageData,\n} from '../types';\nimport { MarkCore } from '../core/MarkCore';\nimport { HttpTransport } from '../core/HttpTransport';\nimport { BrowserStorage } from './BrowserStorage';\nimport { extractAttributionFromSearch } from './urlAttribution';\n\nexport class Mark {\n private static client: MarkCore | null = null;\n private static storage: BrowserStorage | null = null;\n private static config: MarkConfig | null = null;\n private static pageviewTrackerInstalled = false;\n private static lastPageviewHref: string | null = null;\n private static emitAutoPageview: (() => void) | null = null;\n private static pendingAttribution: Partial<StorageData> = {};\n private static originalPushState: History['pushState'] | null = null;\n private static originalReplaceState: History['replaceState'] | null = null;\n private static popstateHandler: (() => void) | null = null;\n private static beaconDrainHandler: (() => void) | null = null;\n private static visibilityHandler: (() => void) | null = null;\n private static onlineHandler: (() => void) | null = null;\n private static kickTimer: ReturnType<typeof setInterval> | null = null;\n\n public static init(config: MarkConfig) {\n if (!Mark.client) {\n const storage = new BrowserStorage(config.cross_domain);\n const transport = new HttpTransport(config);\n Mark.client = new MarkCore(config, { storage, transport });\n Mark.storage = storage;\n Mark.config = config;\n Mark.refreshAttribution(storage, config);\n if (typeof window !== 'undefined' && config.autocapture?.pageview) {\n Mark.installPageviewTracking(config, storage);\n }\n if (typeof window !== 'undefined') {\n Mark.installExtendedAutocapture(config);\n Mark.installLifecycleFlushing();\n }\n }\n return Mark.client;\n }\n\n private static installLifecycleFlushing() {\n if (typeof window === 'undefined') return;\n if (Mark.beaconDrainHandler) return;\n\n const drain = () => {\n Mark.client?.drainViaBeacon();\n };\n const onVisibility = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n drain();\n }\n };\n const onOnline = () => {\n Mark.client?.kickQueue();\n };\n\n Mark.beaconDrainHandler = drain;\n Mark.visibilityHandler = onVisibility;\n Mark.onlineHandler = onOnline;\n\n if (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {\n document.addEventListener('visibilitychange', onVisibility);\n }\n if (typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', drain);\n window.addEventListener('beforeunload', drain);\n window.addEventListener('online', onOnline);\n }\n\n if (typeof setInterval === 'function') {\n Mark.kickTimer = setInterval(() => {\n Mark.client?.kickQueue();\n }, 30000);\n }\n }\n\n public static track(eventName: string, data: TrackEventData = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.track(eventName, data);\n }\n\n public static identify(userId: string, traits: IdentifyTraits = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.identify(userId, traits);\n }\n\n public static conversion(eventName: string, data: TrackEventData = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.conversion(eventName, data);\n }\n\n public static setConsent(status: ConsentStatus) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.setConsent(status);\n if (status === 'granted') {\n Mark.flushPendingAttribution();\n // When auto pageview is enabled, attempt a page_view immediately after consent grant.\n Mark.emitAutoPageview?.();\n }\n }\n\n /**\n * Returns the current visitor ID when available.\n * When consent is required (`require_consent: true` or `'auto'`), returns `undefined` until consent is granted.\n * Use this to pass the visitor ID to your backend (e.g. in a header or request body) for server-side attribution\n * when you do not have an authenticated user ID.\n */\n public static getVisitorId(): string | undefined {\n if (!Mark.client || !Mark.storage || !Mark.config) {\n return undefined;\n }\n const requirement = Mark.config.require_consent ?? false;\n if (requirement && Mark.storage.getConsentStatus() !== 'granted') {\n return undefined;\n }\n return Mark.client.getVisitorId();\n }\n\n public static flush(): Promise<void> {\n if (!Mark.client) {\n return Promise.resolve();\n }\n return Mark.client.flush();\n }\n\n public static reset() {\n Mark.client?.reset();\n Mark.pendingAttribution = {};\n Mark.lastPageviewHref = null;\n }\n\n public static getStats() {\n return Mark.client?.getStats() ?? { queued: 0, sent: 0, failed: 0, dropped: 0 };\n }\n\n public static destroy() {\n if (typeof window === 'undefined') return;\n if (Mark.originalPushState) history.pushState = Mark.originalPushState;\n if (Mark.originalReplaceState) history.replaceState = Mark.originalReplaceState;\n if (Mark.popstateHandler) window.removeEventListener('popstate', Mark.popstateHandler);\n if (Mark.beaconDrainHandler) {\n window.removeEventListener('pagehide', Mark.beaconDrainHandler);\n window.removeEventListener('beforeunload', Mark.beaconDrainHandler);\n }\n if (Mark.visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', Mark.visibilityHandler);\n }\n if (Mark.onlineHandler) {\n window.removeEventListener('online', Mark.onlineHandler);\n }\n if (Mark.kickTimer) {\n clearInterval(Mark.kickTimer);\n }\n Mark.originalPushState = null;\n Mark.originalReplaceState = null;\n Mark.popstateHandler = null;\n Mark.beaconDrainHandler = null;\n Mark.visibilityHandler = null;\n Mark.onlineHandler = null;\n Mark.kickTimer = null;\n Mark.pageviewTrackerInstalled = false;\n }\n\n private static installPageviewTracking(config: MarkConfig, storage: BrowserStorage) {\n if (Mark.pageviewTrackerInstalled) return;\n Mark.pageviewTrackerInstalled = true;\n\n const emit = () => {\n if (!Mark.client) return;\n Mark.refreshAttribution(storage, config);\n const href = window.location.href;\n if (href === Mark.lastPageviewHref) return;\n const sent = Mark.client.track('page_view', {\n site: window.location.host,\n page: window.location.pathname,\n title: document.title,\n referrer: document.referrer || undefined,\n });\n if (sent) {\n Mark.lastPageviewHref = href;\n }\n };\n Mark.emitAutoPageview = emit;\n\n // Initial page view\n emit();\n\n const trackRoutes = config.track_route_changes ?? true;\n if (!trackRoutes) return;\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n Mark.originalPushState = originalPushState;\n Mark.originalReplaceState = originalReplaceState;\n\n history.pushState = function (...args) {\n const result = originalPushState.apply(this, args as [data: any, unused: string, url?: string | URL | null]);\n emit();\n return result;\n };\n\n history.replaceState = function (...args) {\n const result = originalReplaceState.apply(this, args as [data: any, unused: string, url?: string | URL | null]);\n emit();\n return result;\n };\n\n Mark.popstateHandler = emit;\n window.addEventListener('popstate', emit);\n }\n\n private static refreshAttribution(storage: BrowserStorage, config: MarkConfig) {\n if (typeof window === 'undefined') {\n return;\n }\n const updates = extractAttributionFromSearch(window.location.search, config);\n if (Object.keys(updates).length === 0) {\n return;\n }\n if (Mark.shouldPersistAttribution(storage, config)) {\n const merged = Mark.mergeAttributionUpdates(Mark.pendingAttribution, updates);\n storage.update(merged);\n Mark.pendingAttribution = {};\n return;\n }\n Mark.pendingAttribution = Mark.mergeAttributionUpdates(Mark.pendingAttribution, updates);\n }\n\n private static flushPendingAttribution() {\n const storage = Mark.storage;\n const config = Mark.config;\n if (!storage || !config || typeof window === 'undefined') {\n return;\n }\n const fromUrl = extractAttributionFromSearch(window.location.search, config);\n const merged = Mark.mergeAttributionUpdates(Mark.pendingAttribution, fromUrl);\n if (Object.keys(merged).length > 0) {\n storage.update(merged);\n }\n Mark.pendingAttribution = {};\n }\n\n private static shouldPersistAttribution(storage: BrowserStorage, config: MarkConfig) {\n const requirement = config.require_consent ?? false;\n if (!requirement) {\n return true;\n }\n return storage.getConsentStatus() === 'granted';\n }\n\n private static mergeAttributionUpdates(\n previous: Partial<StorageData>,\n next: Partial<StorageData>\n ): Partial<StorageData> {\n return {\n ...previous,\n ...next,\n query_params: {\n ...(previous.query_params ?? {}),\n ...(next.query_params ?? {}),\n },\n };\n }\n\n private static installExtendedAutocapture(config: MarkConfig) {\n if (!Mark.client || typeof document === 'undefined') return;\n const auto = config.autocapture;\n if (!auto) return;\n\n if (auto.click) {\n document.addEventListener('click', (event) => {\n const target = event.target as HTMLElement | null;\n if (!target) return;\n const selector = typeof auto.click === 'object' ? auto.click.selector : undefined;\n const element = selector ? target.closest(selector) : target.closest('[data-mark-event]');\n if (!element) return;\n const eventName = element.getAttribute('data-mark-event') || 'click';\n Mark.client?.track(eventName, {\n element_id: element.id || undefined,\n element_classes: element.className || undefined,\n text: element.textContent?.trim().slice(0, 120) || undefined,\n href: (element as HTMLAnchorElement).href || undefined,\n });\n });\n }\n\n if (auto.form_submit) {\n document.addEventListener('submit', (event) => {\n const form = event.target as HTMLFormElement | null;\n if (!form) return;\n Mark.client?.track('form_submit', {\n form_id: form.id || undefined,\n form_name: form.name || undefined,\n action: form.action || undefined,\n });\n });\n }\n\n if (auto.outbound_link) {\n document.addEventListener('click', (event) => {\n const anchor = (event.target as HTMLElement | null)?.closest('a[href]') as HTMLAnchorElement | null;\n if (!anchor || !anchor.href) return;\n try {\n const targetUrl = new URL(anchor.href, window.location.href);\n const current = new URL(window.location.href);\n if (targetUrl.origin !== current.origin) {\n Mark.client?.trackWithOptions('outbound_link_click', { href: targetUrl.toString() }, { preferBeacon: true });\n }\n } catch {\n // ignore malformed URLs\n }\n });\n }\n\n if (auto.scroll_depth) {\n const thresholds = [25, 50, 75, 100];\n const emitted = new Set<number>();\n window.addEventListener(\n 'scroll',\n () => {\n const doc = document.documentElement;\n const scrollTop = window.scrollY || doc.scrollTop;\n const max = Math.max(1, doc.scrollHeight - window.innerHeight);\n const depth = Math.min(100, Math.round((scrollTop / max) * 100));\n for (const threshold of thresholds) {\n if (depth >= threshold && !emitted.has(threshold)) {\n emitted.add(threshold);\n Mark.client?.track('scroll_depth', { percent: threshold });\n }\n }\n },\n { passive: true }\n );\n }\n\n if (auto.web_vitals) {\n void import('web-vitals')\n .then((mod) => {\n const emit = (metric: { name: string; value: number; rating?: string; id?: string }) => {\n Mark.client?.track('web_vital', {\n metric: metric.name,\n value: metric.value,\n rating: metric.rating,\n metric_id: metric.id,\n });\n };\n mod.onLCP(emit);\n mod.onCLS(emit);\n mod.onINP(emit);\n mod.onTTFB(emit);\n })\n .catch(() => {\n if (config.debug) {\n console.warn('[Mark] web-vitals package not available; skipping autocapture.web_vitals.');\n }\n });\n }\n }\n}\n\n","import { Mark } from './Mark';\r\n\r\nif (typeof window !== 'undefined') {\r\n (window as any).Mark = Mark;\r\n}\r\n\r\nexport { Mark };\r\nexport default Mark;\r\n\r\n\r\n","let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n"],"names":["DEFAULT_ENDPOINT","TransportError","message","options","isNonRetriableStatus","status","parseRetryAfter","headerValue","trimmed","numeric","dateMs","diff","DEFAULT_MAX_ATTEMPTS","DEFAULT_BASE_BACKOFF_MS","DEFAULT_MAX_BACKOFF_MS","DEFAULT_MAX_ITEM_AGE_MS","DeliveryQueue","transport","persisted","now","item","enqueuedAt","path","data","items","eventData","cutoff","removed","i","force","preferBeacon","error","retryAfterMs","delay","jitter","TRACK_RESERVED_FIELDS","IDENTIFY_RESERVED_FIELDS","MarkCore","config","deps","event","eventName","isConversion","sanitizedData","restData","payload","siteId","siteHost","transformed","userId","traits","previous","visitorId","clickId","campaignId","sessionId","storedQuery","inputQuery","query","identity","state","sanitized","key","value","maxSize","intervalMs","currentId","lastActivityIso","lastActivity","newSessionId","nowIso","previousTs","currentTs","prev","next","dnt","gpc","referrer","refUrl","currentUrl","source","purposes","attempt","retries","w","tcData","ok","consents","p","HttpTransport","request","url","headers","body","blob","timeoutMs","controller","timedOut","timer","response","snippet","endpoint","normalizedEndpoint","normalizedPath","STORAGE_KEY","OUTBOX_KEY","COOKIE_NAME","BrowserStorage","updates","raw","parsed","stored","cookieVid","name","match","days","expires","domainPart","bytes","hex","b","c","r","bridge","bridgeUrl","timeout","appendFrame","origin","originUrl","domain","CLICK_PARAM_CANDIDATES","CAMPAIGN_PARAM_CANDIDATES","DEFAULT_CAPTURE_QUERY_KEYS","QUERY_KEY_ALIASES","DEFAULT_DENYLIST","DEFAULT_MAX_CAPTURED_QUERY_PARAMS","DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH","extractAttributionFromSearch","search","params","normalizedParamMap","buildNormalizedParamMap","findFirst","queryParams","captureQueryParams","denylist","getNormalizedKeys","maxParams","normalizeNonNegativeInteger","maxValueLength","allowedKeys","normalizeKey","rawKey","rawValue","canonicalKey","candidates","normalizedCandidate","map","keys","defaults","values","normalized","fallback","Mark","storage","drain","onVisibility","onOnline","emit","href","originalPushState","originalReplaceState","args","result","merged","fromUrl","auto","target","selector","element","form","anchor","targetUrl","current","thresholds","emitted","doc","scrollTop","max","depth","threshold","webVitals","mod","metric","e","t","n","s","o","a","d","h","f","l","u","m","g","v","y","T","E","L","P","_","M","C","I","F","k","A","B","S","q","x","H","O"],"mappings":"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","x_google_ignoreList":[9]}
|
|
1
|
+
{"version":3,"file":"browser.umd.js","sources":["../src/core/constants.ts","../src/core/TransportError.ts","../src/core/DeliveryQueue.ts","../src/core/MarkCore.ts","../src/core/HttpTransport.ts","../src/browser/BrowserStorage.ts","../src/browser/urlAttribution.ts","../src/browser/pageviewDedupeKey.ts","../src/browser/Mark.ts","../src/browser/index.ts","../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["export const DEFAULT_ENDPOINT = 'https://ingest.onelence.com';\n\n","export class TransportError extends Error {\r\n public readonly status?: number;\r\n public readonly retryAfterMs?: number;\r\n\r\n constructor(message: string, options: { status?: number; retryAfterMs?: number } = {}) {\r\n super(message);\r\n this.name = 'TransportError';\r\n this.status = options.status;\r\n this.retryAfterMs = options.retryAfterMs;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true when a TransportError status should NOT be retried by the queue.\r\n * 4xx client errors (other than 408 Request Timeout and 429 Too Many Requests)\r\n * indicate a request problem that re-sending will not fix.\r\n */\r\nexport function isNonRetriableStatus(status: number | undefined): boolean {\r\n if (typeof status !== 'number') return false;\r\n if (status < 400 || status >= 500) return false;\r\n if (status === 408 || status === 429) return false;\r\n return true;\r\n}\r\n\r\nexport function parseRetryAfter(headerValue: string | null | undefined): number | undefined {\r\n if (!headerValue) return undefined;\r\n const trimmed = headerValue.trim();\r\n if (!trimmed) return undefined;\r\n const numeric = Number(trimmed);\r\n if (Number.isFinite(numeric) && numeric >= 0) {\r\n return Math.floor(numeric * 1000);\r\n }\r\n const dateMs = Date.parse(trimmed);\r\n if (Number.isFinite(dateMs)) {\r\n const diff = dateMs - Date.now();\r\n return diff > 0 ? diff : 0;\r\n }\r\n return undefined;\r\n}\r\n","import type { TransportAdapter } from './adapters';\r\nimport { TransportError, isNonRetriableStatus } from './TransportError';\r\n\r\ninterface QueueItem {\r\n path: string;\r\n data: Record<string, unknown>;\r\n attempts: number;\r\n nextAttemptAt: number;\r\n enqueuedAt: number;\r\n}\r\n\r\nexport interface DeliveryQueueOptions {\r\n debug?: boolean;\r\n maxAttempts?: number;\r\n baseBackoffMs?: number;\r\n maxBackoffMs?: number;\r\n /**\r\n * Maximum age (ms) for persisted queue items before they are dropped on load\r\n * or next process tick. Defaults to 48 hours.\r\n */\r\n maxItemAgeMs?: number;\r\n loadPersisted?: () => QueueItem[];\r\n savePersisted?: (items: QueueItem[]) => void;\r\n onError?: (error: unknown, event?: Record<string, unknown>) => void;\r\n}\r\n\r\nconst DEFAULT_MAX_ATTEMPTS = 5;\r\nconst DEFAULT_BASE_BACKOFF_MS = 300;\r\nconst DEFAULT_MAX_BACKOFF_MS = 15000;\r\nconst DEFAULT_MAX_ITEM_AGE_MS = 48 * 60 * 60 * 1000;\r\n\r\nexport class DeliveryQueue {\r\n private readonly queue: QueueItem[] = [];\r\n private flushing = false;\r\n private sent = 0;\r\n private failed = 0;\r\n private dropped = 0;\r\n private readonly maxAttempts: number;\r\n private readonly baseBackoffMs: number;\r\n private readonly maxBackoffMs: number;\r\n private readonly maxItemAgeMs: number;\r\n private readonly debug: boolean;\r\n private readonly loadPersisted?: () => QueueItem[];\r\n private readonly savePersisted?: (items: QueueItem[]) => void;\r\n private readonly onError?: (error: unknown, event?: Record<string, unknown>) => void;\r\n\r\n constructor(private readonly transport: TransportAdapter, options: DeliveryQueueOptions = {}) {\r\n this.maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\r\n this.baseBackoffMs = options.baseBackoffMs ?? DEFAULT_BASE_BACKOFF_MS;\r\n this.maxBackoffMs = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\r\n this.maxItemAgeMs = options.maxItemAgeMs ?? DEFAULT_MAX_ITEM_AGE_MS;\r\n this.debug = options.debug ?? false;\r\n this.loadPersisted = options.loadPersisted;\r\n this.savePersisted = options.savePersisted;\r\n this.onError = options.onError;\r\n const persisted = this.loadPersisted?.() ?? [];\r\n if (persisted.length > 0) {\r\n const now = Date.now();\r\n for (const item of persisted) {\r\n const enqueuedAt = item.enqueuedAt ?? now;\r\n if (now - enqueuedAt > this.maxItemAgeMs) {\r\n this.dropped += 1;\r\n continue;\r\n }\r\n this.queue.push({ ...item, enqueuedAt });\r\n }\r\n this.persist();\r\n }\r\n }\r\n\r\n public enqueue(path: string, data: Record<string, unknown>) {\r\n this.queue.push({\r\n path,\r\n data,\r\n attempts: 0,\r\n nextAttemptAt: Date.now(),\r\n enqueuedAt: Date.now(),\r\n });\r\n this.persist();\r\n void this.process();\r\n }\r\n\r\n public async flush() {\r\n await this.process(true);\r\n await this.transport.flush?.();\r\n }\r\n\r\n /**\r\n * Best-effort synchronous drain using sendBeacon. Intended for page unload;\r\n * errors are swallowed because the tab is going away.\r\n */\r\n public drainViaBeacon() {\r\n if (this.queue.length === 0) return;\r\n const items = this.queue.splice(0, this.queue.length);\r\n this.persist();\r\n for (const item of items) {\r\n const eventData = { ...item.data };\r\n delete eventData.__prefer_beacon;\r\n try {\r\n void this.transport.send(item.path, eventData, { preferBeacon: true });\r\n } catch {\r\n // ignore: browser is unloading\r\n }\r\n }\r\n }\r\n\r\n public getStats() {\r\n return {\r\n queued: this.queue.length,\r\n sent: this.sent,\r\n failed: this.failed,\r\n dropped: this.dropped,\r\n };\r\n }\r\n\r\n public clear() {\r\n this.queue.splice(0, this.queue.length);\r\n this.persist();\r\n }\r\n\r\n private persist() {\r\n this.savePersisted?.(this.queue);\r\n }\r\n\r\n private evictExpired() {\r\n if (this.queue.length === 0) return;\r\n const now = Date.now();\r\n const cutoff = now - this.maxItemAgeMs;\r\n let removed = 0;\r\n for (let i = this.queue.length - 1; i >= 0; i -= 1) {\r\n if (this.queue[i].enqueuedAt <= cutoff) {\r\n this.queue.splice(i, 1);\r\n this.dropped += 1;\r\n removed += 1;\r\n }\r\n }\r\n if (removed > 0) {\r\n this.persist();\r\n }\r\n }\r\n\r\n private async process(force = false): Promise<void> {\r\n if (this.flushing) {\r\n return;\r\n }\r\n this.flushing = true;\r\n try {\r\n this.evictExpired();\r\n while (this.queue.length > 0) {\r\n const item = this.queue[0];\r\n if (!force && item.nextAttemptAt > Date.now()) {\r\n break;\r\n }\r\n try {\r\n const eventData = { ...item.data };\r\n const preferBeacon = eventData.__prefer_beacon === true;\r\n delete eventData.__prefer_beacon;\r\n await this.transport.send(item.path, eventData, { preferBeacon });\r\n this.queue.shift();\r\n this.sent += 1;\r\n this.persist();\r\n } catch (error) {\r\n this.failed += 1;\r\n this.onError?.(error, item.data);\r\n\r\n const status = error instanceof TransportError ? error.status : undefined;\r\n if (isNonRetriableStatus(status)) {\r\n this.queue.shift();\r\n this.dropped += 1;\r\n this.persist();\r\n if (this.debug) {\r\n console.error('[Mark] Dropping event after non-retriable status', status, item.path);\r\n }\r\n continue;\r\n }\r\n\r\n item.attempts += 1;\r\n if (item.attempts >= this.maxAttempts) {\r\n this.queue.shift();\r\n this.dropped += 1;\r\n this.persist();\r\n if (this.debug) {\r\n console.error('[Mark] Dropping event after max retries', item.path, error);\r\n }\r\n continue;\r\n }\r\n const retryAfterMs = error instanceof TransportError ? error.retryAfterMs : undefined;\r\n let delay: number;\r\n if (typeof retryAfterMs === 'number') {\r\n delay = Math.min(this.maxBackoffMs, Math.max(0, retryAfterMs));\r\n } else {\r\n const jitter = Math.random() * this.baseBackoffMs;\r\n delay = Math.min(\r\n this.maxBackoffMs,\r\n this.baseBackoffMs * 2 ** (item.attempts - 1) + jitter\r\n );\r\n }\r\n item.nextAttemptAt = Date.now() + delay;\r\n this.persist();\r\n break;\r\n }\r\n }\r\n } finally {\r\n this.flushing = false;\r\n }\r\n }\r\n}\r\n","import type {\r\n MarkConfig,\r\n TrackEventData,\r\n ConversionProperties,\r\n IdentifyTraits,\r\n ConsentStatus,\r\n JsonValue,\r\n} from '../types';\r\nimport type { MarkDependencies } from './adapters';\r\nimport { DEFAULT_ENDPOINT } from './constants';\r\nimport { DeliveryQueue } from './DeliveryQueue';\r\n\r\ntype ResolvedConfig = MarkConfig & { endpoint: string };\r\nconst TRACK_RESERVED_FIELDS = new Set(['event_name', 'user_id', 'consent_state', 'source', 'is_conversion']);\r\nconst IDENTIFY_RESERVED_FIELDS = new Set([\r\n 'user_id',\r\n 'visitor_id',\r\n 'click_id',\r\n 'campaign_id',\r\n 'query',\r\n 'consent_state',\r\n 'source',\r\n]);\r\n\r\nexport class MarkCore {\r\n private config: ResolvedConfig;\r\n private consentRequirement: boolean | 'auto';\r\n private siteId?: string;\r\n private siteHost?: string;\r\n private readonly queue: DeliveryQueue;\r\n private readonly sessionTimeoutMs: number;\r\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly batchedEvents: Array<Record<string, unknown>> = [];\r\n private tcfCachedAllowed = false;\r\n\r\n constructor(config: MarkConfig, private readonly deps: MarkDependencies) {\r\n this.validateConfig(config);\r\n this.config = {\r\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\r\n ...config,\r\n include_page_context: config.include_page_context ?? true,\r\n };\r\n this.consentRequirement = config.require_consent ?? false;\r\n this.siteId = config.site_id;\r\n this.siteHost = config.site_host;\r\n this.sessionTimeoutMs = config.session_timeout_ms ?? 30 * 60 * 1000;\r\n this.queue = new DeliveryQueue(this.deps.transport, {\r\n debug: this.config.debug,\r\n loadPersisted: () => (this.deps.storage.getOutbox?.() as any[]) ?? [],\r\n savePersisted: (items) => this.deps.storage.setOutbox?.(items as unknown[]),\r\n onError: (error, event) => this.config.on_error?.(error, event),\r\n });\r\n this.warnMisconfiguredSiteHost();\r\n this.subscribeTcf();\r\n }\r\n\r\n /**\r\n * Best-effort synchronous drain that dispatches all queued events via\r\n * sendBeacon. Intended for use on page unload (visibilitychange=hidden,\r\n * pagehide) where async fetch may be cancelled by the browser.\r\n */\r\n public drainViaBeacon() {\r\n this.flushBatch();\r\n this.queue.drainViaBeacon();\r\n }\r\n\r\n /**\r\n * Kicks the queue to retry any pending items now. Safe to call repeatedly;\r\n * used by the browser wrapper in response to `online` events or periodic\r\n * timers.\r\n */\r\n public kickQueue() {\r\n void this.queue.flush();\r\n }\r\n\r\n public track(eventName: string, data: TrackEventData = {}) {\r\n return this.trackInternal(eventName, data, false);\r\n }\r\n\r\n private trackInternal(\r\n eventName: string,\r\n data: TrackEventData = {},\r\n isConversion = false,\r\n options?: { preferBeacon?: boolean }\r\n ) {\r\n if (!eventName) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] track called without event name');\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.hasConsent() || this.isDntBlocked()) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] Tracking blocked due to consent requirement.');\r\n }\r\n return false;\r\n }\r\n\r\n if (!isConversion && !this.shouldSampleTrack()) {\r\n return true;\r\n }\r\n\r\n const sanitizedData = this.sanitizeTrackData(data);\r\n const restData: TrackEventData = { ...sanitizedData };\r\n if ('query' in restData) {\r\n delete restData.query;\r\n }\r\n if ('site_id' in restData) {\r\n delete restData.site_id;\r\n }\r\n if ('site_host' in restData) {\r\n delete restData.site_host;\r\n }\r\n const payload: Record<string, unknown> = {\r\n event_name: eventName,\r\n message_id: this.createMessageId(),\r\n ...this.getIdentityFields(sanitizedData),\r\n ...restData,\r\n };\r\n if (isConversion) {\r\n payload.is_conversion = true;\r\n }\r\n\r\n // Add site_id and site_host if configured (event-level overrides init-level)\r\n const siteId = sanitizedData.site_id ?? this.siteId;\r\n const siteHost = sanitizedData.site_host ?? this.siteHost;\r\n\r\n if (siteId) {\r\n payload.site_id = siteId;\r\n }\r\n if (siteHost) {\r\n payload.site_host = siteHost;\r\n }\r\n\r\n if (this.config.include_page_context && typeof window !== 'undefined') {\r\n this.applyPageContext(payload);\r\n // If site_host wasn't explicitly set, use the host from page context\r\n if (!siteHost && payload.site) {\r\n payload.site_host = payload.site;\r\n }\r\n }\r\n\r\n this.applyInternalFlag(payload, sanitizedData.is_internal);\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) {\r\n return true;\r\n }\r\n\r\n this.ensureSession();\r\n if (this.config.batching?.enabled && !isConversion && !options?.preferBeacon) {\r\n this.enqueueBatch(transformed);\r\n return true;\r\n }\r\n this.queue.enqueue('/event', { ...transformed, __prefer_beacon: options?.preferBeacon === true });\r\n return true;\r\n }\r\n\r\n public identify(userId: string, traits: IdentifyTraits = {}) {\r\n if (!userId) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] identify called without userId');\r\n }\r\n return;\r\n }\r\n\r\n if (!this.hasConsent() || this.isDntBlocked()) {\r\n if (this.config.debug) {\r\n console.warn('[Mark] Identify blocked due to consent requirement.');\r\n }\r\n return;\r\n }\r\n\r\n this.deps.storage.update({ user_id: userId });\r\n\r\n const payload: Record<string, unknown> = {\r\n user_id: userId,\r\n message_id: this.createMessageId(),\r\n ...this.sanitizeIdentifyTraits(traits),\r\n ...this.getIdentityFields(),\r\n };\r\n\r\n // Add site_id and site_host if configured\r\n if (this.siteId) {\r\n payload.site_id = this.siteId;\r\n }\r\n if (this.siteHost) {\r\n payload.site_host = this.siteHost;\r\n }\r\n\r\n this.applyInternalFlag(payload);\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) return;\r\n this.queue.enqueue('/identify', transformed);\r\n }\r\n\r\n public conversion(eventName: string, data: ConversionProperties = {}) {\r\n return this.trackInternal(eventName, data, true);\r\n }\r\n\r\n public trackWithOptions(eventName: string, data: TrackEventData = {}, options?: { preferBeacon?: boolean }) {\r\n return this.trackInternal(eventName, data, false, options);\r\n }\r\n\r\n /**\r\n * Returns the current visitor ID from storage, if any.\r\n * Used by browser/Node wrappers to expose a stable pseudonymous ID for server-side attribution.\r\n */\r\n public getVisitorId(): string | undefined {\r\n return this.deps.storage.getVisitorId();\r\n }\r\n\r\n public setConsent(status: ConsentStatus) {\r\n const previous = this.deps.storage.getConsentStatus();\r\n this.deps.storage.setConsentStatus(status);\r\n if (status === 'denied') {\r\n this.deps.storage.clearAttribution?.();\r\n this.deps.storage.clearCookieVisitorId?.();\r\n this.deps.storage.setInternal?.(false);\r\n } else if (\r\n status === 'granted' &&\r\n previous === 'denied' &&\r\n this.config.rotate_visitor_on_consent_change\r\n ) {\r\n this.deps.storage.rotateVisitorId?.();\r\n }\r\n const payload: Record<string, unknown> = {\r\n visitor_id: this.deps.storage.getVisitorId(),\r\n consent_state: status,\r\n source: 'sdk',\r\n message_id: this.createMessageId(),\r\n };\r\n\r\n // Add site_id and site_host if configured\r\n if (this.siteId) {\r\n payload.site_id = this.siteId;\r\n }\r\n if (this.siteHost) {\r\n payload.site_host = this.siteHost;\r\n }\r\n\r\n this.applyInternalFlag(payload);\r\n\r\n const transformed = this.config.before_send ? this.config.before_send(payload) : payload;\r\n if (!transformed) return;\r\n this.queue.enqueue('/consent', transformed);\r\n }\r\n\r\n public reset() {\r\n this.deps.storage.update({\r\n user_id: undefined,\r\n last_click_id: undefined,\r\n campaign_id: undefined,\r\n query_params: undefined,\r\n session_id: undefined,\r\n session_started_at: undefined,\r\n last_activity_at: undefined,\r\n is_internal: undefined,\r\n });\r\n this.deps.storage.rotateVisitorId?.();\r\n }\r\n\r\n /**\r\n * Marks or unmarks the current visitor as internal traffic. While set, every\r\n * subsequent event (track/identify/conversion/consent) is stamped with\r\n * `is_internal: true`, so the backend can exclude it from customer-facing\r\n * reports by default.\r\n *\r\n * The flag is persisted via the storage adapter (browser: localStorage) so\r\n * it survives reloads, and is cleared by `reset()` and by\r\n * `setConsent('denied')`.\r\n */\r\n public setInternal(value: boolean) {\r\n this.deps.storage.setInternal?.(Boolean(value));\r\n }\r\n\r\n /**\r\n * Returns the currently persisted internal-traffic flag, if any.\r\n */\r\n public getInternal(): boolean {\r\n return Boolean(this.deps.storage.getInternal?.());\r\n }\r\n\r\n public flush() {\r\n this.flushBatch();\r\n return this.queue.flush();\r\n }\r\n\r\n public getStats() {\r\n return this.queue.getStats();\r\n }\r\n\r\n /**\r\n * Stamps `is_internal: true` on the payload when either:\r\n * - the persistent visitor flag is set (via setInternal), or\r\n * - the caller passed `is_internal: true` on this specific event.\r\n *\r\n * Explicit `is_internal: false` on a single event wins over the visitor flag\r\n * so individual calls can opt out.\r\n */\r\n private applyInternalFlag(payload: Record<string, unknown>, eventValue?: boolean) {\r\n if (eventValue === false) {\r\n delete payload.is_internal;\r\n return;\r\n }\r\n const stored = this.deps.storage.getInternal?.() === true;\r\n if (eventValue === true || stored) {\r\n payload.is_internal = true;\r\n } else {\r\n delete payload.is_internal;\r\n }\r\n }\r\n\r\n private getIdentityFields(data?: TrackEventData) {\r\n const visitorId = data?.visitor_id ?? this.deps.storage.getVisitorId();\r\n const userId = data?.user_id ?? this.deps.storage.getUserId?.();\r\n const clickId = data?.click_id ?? this.deps.storage.getLastClickId();\r\n const campaignId = data?.campaign_id ?? this.deps.storage.getCampaignId();\r\n const sessionId = data?.session_id ?? this.deps.storage.getSessionId?.();\r\n\r\n // Auto-capture query params from storage or event data\r\n const storedQuery = this.deps.storage.getQueryParams() ?? {};\r\n const inputQuery = (data?.query as Record<string, string> | undefined) ?? {};\r\n\r\n // Merge: stored values serve as defaults, input values override/append\r\n const query = { ...storedQuery, ...inputQuery };\r\n\r\n const identity: Record<string, unknown> = {};\r\n\r\n if (visitorId) identity.visitor_id = visitorId;\r\n if (userId) identity.user_id = userId;\r\n if (clickId) identity.click_id = clickId;\r\n if (campaignId) identity.campaign_id = campaignId;\r\n if (sessionId) identity.session_id = sessionId;\r\n\r\n if (Object.keys(query).length > 0) {\r\n identity.query = query;\r\n }\r\n\r\n return identity;\r\n }\r\n\r\n private hasConsent() {\r\n if (this.config.consent_source?.type === 'tcf' && typeof window !== 'undefined') {\r\n if (!this.tcfCachedAllowed) {\r\n return false;\r\n }\r\n }\r\n if (!this.consentRequirement) {\r\n return true;\r\n }\r\n\r\n const stored = this.deps.storage.getConsentStatus();\r\n const state = stored;\r\n\r\n if (this.consentRequirement === 'auto') {\r\n // In auto mode, default to deny until consent is explicitly granted.\r\n return state === 'granted';\r\n }\r\n\r\n return state === 'granted';\r\n }\r\n\r\n private sanitizeTrackData(data: TrackEventData) {\r\n const sanitized: Record<string, JsonValue | undefined> = {};\r\n for (const [key, value] of Object.entries(data)) {\r\n if (TRACK_RESERVED_FIELDS.has(key)) {\r\n continue;\r\n }\r\n sanitized[key] = value;\r\n }\r\n return sanitized as TrackEventData;\r\n }\r\n\r\n private sanitizeIdentifyTraits(traits: IdentifyTraits) {\r\n const sanitized: Record<string, JsonValue | undefined> = {};\r\n for (const [key, value] of Object.entries(traits)) {\r\n if (IDENTIFY_RESERVED_FIELDS.has(key)) {\r\n continue;\r\n }\r\n sanitized[key] = value;\r\n }\r\n return sanitized as IdentifyTraits;\r\n }\r\n\r\n private validateConfig(config: MarkConfig) {\r\n if (!config.key || !config.key.trim()) {\r\n throw new Error('[Mark] `key` must be a non-empty string.');\r\n }\r\n if (config.endpoint) {\r\n try {\r\n // eslint-disable-next-line no-new\r\n new URL(config.endpoint);\r\n } catch {\r\n throw new Error('[Mark] `endpoint` must be a valid absolute URL.');\r\n }\r\n }\r\n if (typeof config.site_id === 'string' && !config.site_id.trim()) {\r\n throw new Error('[Mark] `site_id` cannot be an empty string.');\r\n }\r\n if (typeof config.site_host === 'string' && !config.site_host.trim()) {\r\n throw new Error('[Mark] `site_host` cannot be an empty string.');\r\n }\r\n }\r\n\r\n private applyPageContext(payload: Record<string, unknown>) {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n if (!payload.site) payload.site = window.location.host;\r\n if (!payload.page) payload.page = window.location.pathname;\r\n if (!payload.title) payload.title = document.title;\r\n if (!payload.referrer && document.referrer) {\r\n payload.referrer = this.scrubReferrer(document.referrer);\r\n }\r\n // full URL omitted for privacy; include only if explicitly provided by the caller\r\n }\r\n\r\n private enqueueBatch(event: Record<string, unknown>) {\r\n this.batchedEvents.push(event);\r\n const maxSize = this.config.batching?.max_size ?? 20;\r\n if (this.batchedEvents.length >= maxSize) {\r\n this.flushBatch();\r\n return;\r\n }\r\n if (!this.batchTimer) {\r\n const intervalMs = this.config.batching?.flush_interval_ms ?? 2000;\r\n this.batchTimer = setTimeout(() => {\r\n this.batchTimer = null;\r\n this.flushBatch();\r\n }, intervalMs);\r\n }\r\n }\r\n\r\n private flushBatch() {\r\n if (this.batchedEvents.length === 0) return;\r\n const path = this.config.batching?.endpoint_path ?? '/events';\r\n const payload = this.batchedEvents.splice(0, this.batchedEvents.length);\r\n this.queue.enqueue(path, { events: payload, message_id: this.createMessageId() });\r\n }\r\n\r\n private createMessageId() {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID();\r\n }\r\n return `msg_${Date.now()}_${Math.random().toString(16).slice(2)}`;\r\n }\r\n\r\n private ensureSession() {\r\n const now = Date.now();\r\n const currentId = this.deps.storage.getSessionId?.();\r\n const lastActivityIso = this.deps.storage.getLastActivityAt?.();\r\n const lastActivity = lastActivityIso ? Date.parse(lastActivityIso) : 0;\r\n const shouldRotate =\r\n !currentId ||\r\n !lastActivity ||\r\n now - lastActivity >= this.sessionTimeoutMs ||\r\n this.crossedUtcDay(lastActivity, now);\r\n if (shouldRotate) {\r\n const newSessionId = this.createMessageId();\r\n const nowIso = new Date(now).toISOString();\r\n this.deps.storage.update({\r\n session_id: newSessionId,\r\n session_started_at: nowIso,\r\n last_activity_at: nowIso,\r\n });\r\n return;\r\n }\r\n this.deps.storage.update({ last_activity_at: new Date(now).toISOString() });\r\n }\r\n\r\n private crossedUtcDay(previousTs: number, currentTs: number) {\r\n const prev = new Date(previousTs);\r\n const next = new Date(currentTs);\r\n return (\r\n prev.getUTCFullYear() !== next.getUTCFullYear() ||\r\n prev.getUTCMonth() !== next.getUTCMonth() ||\r\n prev.getUTCDate() !== next.getUTCDate()\r\n );\r\n }\r\n\r\n private shouldSampleTrack() {\r\n if (typeof this.config.sample_rate !== 'number') return true;\r\n if (this.config.sample_rate <= 0) return false;\r\n if (this.config.sample_rate >= 1) return true;\r\n return Math.random() <= this.config.sample_rate;\r\n }\r\n\r\n private isDntBlocked() {\r\n if (!this.config.honor_dnt || typeof navigator === 'undefined') {\r\n return false;\r\n }\r\n const dnt = navigator.doNotTrack;\r\n const gpc = (navigator as Navigator & { globalPrivacyControl?: boolean }).globalPrivacyControl;\r\n return dnt === '1' || gpc === true;\r\n }\r\n\r\n private scrubReferrer(referrer: string) {\r\n try {\r\n const refUrl = new URL(referrer);\r\n if (typeof window === 'undefined') return referrer;\r\n const currentUrl = new URL(window.location.href);\r\n if (refUrl.origin !== currentUrl.origin) {\r\n refUrl.search = '';\r\n return refUrl.toString();\r\n }\r\n return referrer;\r\n } catch {\r\n return referrer;\r\n }\r\n }\r\n\r\n private warnMisconfiguredSiteHost() {\r\n if (!this.config.debug || !this.siteHost || typeof window === 'undefined') {\r\n return;\r\n }\r\n if (window.location.host !== this.siteHost) {\r\n console.warn('[Mark] config.site_host does not match current host', {\r\n expected: this.siteHost,\r\n actual: window.location.host,\r\n });\r\n }\r\n if (this.siteId && !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(this.siteId)) {\r\n console.warn('[Mark] config.site_id does not look like UUID v4', this.siteId);\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to the IAB TCF v2 CMP via `__tcfapi('addEventListener', ...)`.\r\n * Result is cached in `tcfCachedAllowed` so the synchronous `hasConsent()`\r\n * path does not need to await the CMP. If the CMP is not yet present, we\r\n * poll briefly (CMPs commonly load asynchronously) and give up after ~2s.\r\n */\r\n private subscribeTcf() {\r\n const source = this.config.consent_source;\r\n if (source?.type !== 'tcf' || typeof window === 'undefined') return;\r\n const purposes = source.purposes;\r\n\r\n const attempt = (retries: number) => {\r\n try {\r\n const w = window as Window & {\r\n __tcfapi?: (\r\n command: string,\r\n version: number,\r\n callback: (\r\n tcData?: {\r\n eventStatus?: string;\r\n gdprApplies?: boolean;\r\n listenerId?: number;\r\n purpose?: { consents?: Record<string, boolean> };\r\n },\r\n ok?: boolean\r\n ) => void,\r\n parameter?: number\r\n ) => void;\r\n };\r\n if (typeof w.__tcfapi !== 'function') {\r\n if (retries > 0) {\r\n setTimeout(() => attempt(retries - 1), 200);\r\n }\r\n return;\r\n }\r\n w.__tcfapi('addEventListener', 2, (tcData, ok) => {\r\n if (!ok || !tcData) {\r\n this.tcfCachedAllowed = false;\r\n return;\r\n }\r\n if (tcData.gdprApplies === false) {\r\n this.tcfCachedAllowed = true;\r\n return;\r\n }\r\n const consents = tcData.purpose?.consents ?? {};\r\n this.tcfCachedAllowed = purposes.every((p) => consents[String(p)] === true);\r\n });\r\n } catch {\r\n this.tcfCachedAllowed = false;\r\n }\r\n };\r\n\r\n attempt(10);\r\n }\r\n}\r\n\r\n","import type { MarkConfig } from '../types';\r\nimport { DEFAULT_ENDPOINT } from './constants';\r\nimport type { TransportAdapter } from './adapters';\r\nimport { TransportError, parseRetryAfter } from './TransportError';\r\n\r\nexport class HttpTransport implements TransportAdapter {\r\n private readonly config: MarkConfig;\r\n private readonly endpoint: string;\r\n private readonly pending = new Set<Promise<void>>();\r\n\r\n constructor(config: MarkConfig) {\r\n this.config = config;\r\n this.endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\r\n }\r\n\r\n public async send(path: string, data: unknown, options?: { preferBeacon?: boolean }) {\r\n const request = this.sendInternal(path, data, options);\r\n this.pending.add(request);\r\n try {\r\n await request;\r\n } finally {\r\n this.pending.delete(request);\r\n }\r\n }\r\n\r\n public async flush() {\r\n if (this.pending.size === 0) {\r\n return;\r\n }\r\n await Promise.allSettled(Array.from(this.pending));\r\n }\r\n\r\n private async sendInternal(path: string, data: unknown, options?: { preferBeacon?: boolean }) {\r\n const url = this.joinUrl(this.endpoint, path);\r\n const key = this.config.key;\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n [key.startsWith('sk_') ? 'x-secret-key' : 'x-publishable-key']: key,\r\n };\r\n\r\n if (this.config.debug) {\r\n console.log('[Mark] Sending', url, data);\r\n }\r\n\r\n const body = JSON.stringify(data);\r\n if (options?.preferBeacon && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\r\n const blob = new Blob([body], { type: 'application/json' });\r\n const sent = navigator.sendBeacon(url, blob);\r\n if (sent) {\r\n return;\r\n }\r\n }\r\n\r\n if (typeof fetch !== 'function') {\r\n if (this.config.debug) {\r\n console.error('[Mark] Global fetch is not available in this runtime.');\r\n }\r\n throw new TransportError('[Mark] Global fetch is not available in this runtime.');\r\n }\r\n\r\n const timeoutMs = this.config.request_timeout_ms ?? 10000;\r\n const controller = new AbortController();\r\n let timedOut = false;\r\n const timer = setTimeout(() => {\r\n timedOut = true;\r\n controller.abort();\r\n }, timeoutMs);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers,\r\n body,\r\n keepalive: true,\r\n signal: controller.signal,\r\n });\r\n if (!response.ok) {\r\n const snippet = await this.readErrorSnippet(response);\r\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\r\n if (this.config.debug) {\r\n console.error('[Mark] Request rejected', {\r\n url,\r\n status: response.status,\r\n statusText: response.statusText,\r\n body: snippet,\r\n retryAfterMs,\r\n });\r\n }\r\n throw new TransportError(\r\n `[Mark] Request rejected with status ${response.status}: ${snippet}`,\r\n { status: response.status, retryAfterMs }\r\n );\r\n }\r\n } catch (error) {\r\n if (this.config.debug) {\r\n console.error('[Mark] Failed to send', url, error);\r\n }\r\n if (error instanceof TransportError) {\r\n throw error;\r\n }\r\n if (timedOut) {\r\n throw new TransportError(`[Mark] Request timed out after ${timeoutMs}ms`, { status: 408 });\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new TransportError(`[Mark] Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private joinUrl(endpoint: string, path: string) {\r\n const normalizedEndpoint = endpoint.replace(/\\/+$/, '');\r\n const normalizedPath = path.replace(/^\\/+/, '');\r\n return `${normalizedEndpoint}/${normalizedPath}`;\r\n }\r\n\r\n private async readErrorSnippet(response: Response) {\r\n try {\r\n const text = await response.text();\r\n return text.slice(0, 300);\r\n } catch {\r\n return '';\r\n }\r\n }\r\n}\r\n","import type { ConsentStatus, CrossDomainConfig, StorageData } from '../types';\nimport type { StorageAdapter } from '../core/adapters';\n\nconst STORAGE_KEY = 'crelora_mark_data';\nconst OUTBOX_KEY = 'crelora_mark_outbox';\nconst COOKIE_NAME = 'crelora_mark_vid';\n\ninterface BrowserStorageOptions extends CrossDomainConfig {\n storageKey?: string;\n outboxKey?: string;\n}\n\ninterface BridgeMessage {\n type: 'MARK_SYNC_REQUEST' | 'MARK_SYNC_RESPONSE' | 'MARK_SYNC_UPDATE';\n visitorId?: string;\n}\n\nexport class BrowserStorage implements StorageAdapter {\n private data: StorageData;\n private readonly storageKey: string;\n private readonly outboxKey: string;\n private readonly options: BrowserStorageOptions;\n private bridgeFrame?: HTMLIFrameElement;\n private bridgeReady = false;\n private bridgeOrigin?: string;\n\n constructor(options?: BrowserStorageOptions) {\n this.options = options ?? {};\n this.storageKey = this.options.storageKey ?? STORAGE_KEY;\n this.outboxKey = this.options.outboxKey ?? OUTBOX_KEY;\n if (typeof window === 'undefined') {\n this.data = {};\n return;\n }\n this.data = this.load();\n\n if (!this.data.visitor_id) {\n this.data.visitor_id = this.generateUUID();\n this.save();\n }\n\n if (typeof window !== 'undefined' && this.options.bridge?.url) {\n this.setupBridge(this.options.bridge);\n }\n window.addEventListener('storage', this.handleStorageEvent);\n }\n\n public getVisitorId(): string | undefined {\n return this.data.visitor_id;\n }\n\n public getLastClickId(): string | undefined {\n return this.data.last_click_id;\n }\n\n public getCampaignId(): string | undefined {\n return this.data.campaign_id;\n }\n\n public getQueryParams(): Record<string, string> | undefined {\n return this.data.query_params;\n }\n\n public getConsentStatus(): ConsentStatus | undefined {\n return this.data.consent_status;\n }\n\n public getUserId(): string | undefined {\n return this.data.user_id;\n }\n\n public getSessionId(): string | undefined {\n return this.data.session_id;\n }\n\n public getSessionStartedAt(): string | undefined {\n return this.data.session_started_at;\n }\n\n public getLastActivityAt(): string | undefined {\n return this.data.last_activity_at;\n }\n\n public getInternal(): boolean | undefined {\n return this.data.is_internal;\n }\n\n public setInternal(value: boolean) {\n if (value) {\n this.update({ is_internal: true });\n } else {\n this.update({ is_internal: undefined });\n }\n }\n\n public update(updates: Partial<StorageData>) {\n this.data = { ...this.data, ...updates };\n this.save();\n }\n\n public setConsentStatus(status: ConsentStatus) {\n this.data.consent_status = status;\n this.save();\n }\n\n public clearAttribution() {\n this.update({\n last_click_id: undefined,\n campaign_id: undefined,\n query_params: undefined,\n });\n }\n\n public clearCookieVisitorId() {\n this.setCookie(COOKIE_NAME, '', -1);\n }\n\n public rotateVisitorId() {\n this.update({ visitor_id: this.generateUUID() });\n }\n\n public getOutbox(): unknown[] {\n if (typeof window === 'undefined') return [];\n try {\n const raw = localStorage.getItem(this.outboxKey);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n public setOutbox(items: unknown[]) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(this.outboxKey, JSON.stringify(items.slice(-200)));\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n }\n\n private load(): StorageData {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n\n const cookieVid = this.getCookie(COOKIE_NAME);\n if (cookieVid) {\n return { visitor_id: cookieVid };\n }\n\n return {};\n }\n\n private save() {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.data));\n } catch {\n // Ignore storage failures caused by privacy settings.\n }\n\n if (this.data.visitor_id && this.isCookieEnabled()) {\n this.setCookie(COOKIE_NAME, this.data.visitor_id, 365);\n if (this.options.bridge?.url && this.bridgeReady) {\n this.postBridgeMessage({\n type: 'MARK_SYNC_UPDATE',\n visitorId: this.data.visitor_id,\n });\n }\n }\n }\n\n private getCookie(name: string): string | null {\n if (typeof document === 'undefined') {\n return null;\n }\n try {\n const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`));\n if (match) return match[2];\n } catch {\n // Ignore cookie access errors.\n }\n return null;\n }\n\n private setCookie(name: string, value: string, days: number) {\n if (typeof document === 'undefined') {\n return;\n }\n try {\n const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n const domainPart = this.options.cookie_domain\n ? `;domain=${this.options.cookie_domain}`\n : '';\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax${domainPart}`;\n } catch {\n // Ignore cookie access errors.\n }\n }\n\n private generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = ((Date.now() + Math.random() * 16) % 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n private isCookieEnabled() {\n if (!this.options.mode) return true;\n return this.options.mode === 'single' || this.options.mode === 'subdomain';\n }\n\n private setupBridge(bridge: NonNullable<CrossDomainConfig['bridge']>) {\n if (typeof document === 'undefined') return;\n let bridgeUrl: URL;\n try {\n bridgeUrl = new URL(bridge.url, window.location.href);\n } catch {\n return;\n }\n this.bridgeOrigin = bridgeUrl.origin;\n this.bridgeFrame = document.createElement('iframe');\n this.bridgeFrame.style.display = 'none';\n this.bridgeFrame.setAttribute('aria-hidden', 'true');\n this.bridgeFrame.src = bridgeUrl.toString();\n\n const timeout = bridge.timeout_ms ?? 3000;\n const timer = setTimeout(() => {\n window.removeEventListener('message', this.handleBridgeMessage);\n }, timeout);\n\n window.addEventListener('message', this.handleBridgeMessage);\n const appendFrame = () => {\n if (!this.bridgeFrame) return;\n if (!document.body) return;\n document.body.appendChild(this.bridgeFrame);\n };\n if (document.body) {\n appendFrame();\n } else {\n document.addEventListener('DOMContentLoaded', appendFrame, { once: true });\n }\n\n this.bridgeFrame.addEventListener('load', () => {\n clearTimeout(timer);\n this.bridgeReady = true;\n this.postBridgeMessage({\n type: 'MARK_SYNC_REQUEST',\n visitorId: this.data.visitor_id,\n });\n });\n }\n\n private handleBridgeMessage = (event: MessageEvent<BridgeMessage>) => {\n if (!this.bridgeFrame?.contentWindow || event.source !== this.bridgeFrame.contentWindow) {\n return;\n }\n if (!this.isDomainAllowed(event.origin)) {\n return;\n }\n\n const message = event.data;\n if (!message || !message.type) return;\n\n if (message.type === 'MARK_SYNC_RESPONSE' && message.visitorId) {\n if (message.visitorId !== this.data.visitor_id) {\n this.data.visitor_id = message.visitorId;\n this.save();\n }\n }\n };\n\n private postBridgeMessage(message: BridgeMessage) {\n if (!this.bridgeFrame?.contentWindow) return;\n this.bridgeFrame.contentWindow.postMessage(message, this.bridgeOrigin ?? '*');\n }\n\n private isDomainAllowed(origin: string) {\n try {\n const originUrl = new URL(origin);\n if (this.options.allowed_domains?.length) {\n return this.options.allowed_domains.some((domain) =>\n originUrl.hostname === domain || originUrl.hostname.endsWith(`.${domain}`)\n );\n }\n if (!this.bridgeOrigin) {\n return false;\n }\n const bridgeUrl = new URL(this.bridgeOrigin);\n return originUrl.hostname === bridgeUrl.hostname;\n } catch {\n return false;\n }\n }\n\n private handleStorageEvent = (event: StorageEvent) => {\n if (event.key !== this.storageKey || typeof event.newValue !== 'string') {\n return;\n }\n try {\n this.data = JSON.parse(event.newValue);\n } catch {\n // Ignore malformed storage updates.\n }\n };\n}\n\n","import type { StorageAdapter } from '../core/adapters';\r\nimport type { MarkConfig, StorageData } from '../types';\r\n\r\nconst CLICK_PARAM_CANDIDATES = [\r\n 'click_id',\r\n 'ch_click_id',\r\n 'gclid',\r\n 'gbraid',\r\n 'wbraid',\r\n 'dclid',\r\n 'msclkid',\r\n 'fbclid',\r\n 'ttclid',\r\n 'twclid',\r\n 'li_fat_id',\r\n];\r\nconst CAMPAIGN_PARAM_CANDIDATES = ['cid', 'campaign_id'];\r\n\r\nconst DEFAULT_CAPTURE_QUERY_KEYS = [\r\n 'utm_source',\r\n 'utm_medium',\r\n 'utm_campaign',\r\n 'utm_term',\r\n 'utm_content',\r\n 'ref',\r\n 'referral',\r\n 'affiliate_id',\r\n 'click_id',\r\n 'ch_click_id',\r\n 'cid',\r\n 'campaign_id',\r\n 'gclid',\r\n 'gbraid',\r\n 'wbraid',\r\n 'dclid',\r\n 'msclkid',\r\n 'fbclid',\r\n 'ttclid',\r\n 'twclid',\r\n 'li_fat_id',\r\n] as const;\r\n\r\nconst QUERY_KEY_ALIASES: Record<string, string> = {\r\n referral: 'ref',\r\n affiliate_id: 'ref',\r\n ch_click_id: 'click_id',\r\n cid: 'campaign_id',\r\n};\r\n\r\nconst DEFAULT_DENYLIST = ['email', 'phone', 'token', 'auth', 'password', 'code'] as const;\r\nconst DEFAULT_MAX_CAPTURED_QUERY_PARAMS = 30;\r\nconst DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH = 256;\r\n\r\ntype AttributionCaptureConfig = Pick<\r\n MarkConfig,\r\n | 'capture_query_params'\r\n | 'capture_all_query_params'\r\n | 'query_param_denylist'\r\n | 'max_captured_query_params'\r\n | 'max_query_param_value_length'\r\n>;\r\n\r\nexport function captureAttributionFromUrl(\r\n storage: StorageAdapter,\r\n config: AttributionCaptureConfig = {}\r\n) {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const updates = extractAttributionFromSearch(window.location.search, config);\r\n if (Object.keys(updates).length > 0) {\r\n storage.update(updates);\r\n }\r\n}\r\n\r\nexport function extractAttributionFromSearch(\r\n search: string,\r\n config: AttributionCaptureConfig = {}\r\n): Partial<StorageData> {\r\n const params = new URLSearchParams(search);\r\n const normalizedParamMap = buildNormalizedParamMap(params);\r\n const clickId = findFirst(normalizedParamMap, CLICK_PARAM_CANDIDATES);\r\n const campaignId = findFirst(normalizedParamMap, CAMPAIGN_PARAM_CANDIDATES);\r\n const queryParams = captureQueryParams(params, config);\r\n\r\n const updates: Partial<StorageData> = {};\r\n if (clickId) updates.last_click_id = clickId;\r\n if (campaignId) updates.campaign_id = campaignId;\r\n if (Object.keys(queryParams).length > 0) updates.query_params = queryParams;\r\n\r\n return updates;\r\n}\r\n\r\nfunction captureQueryParams(\r\n params: URLSearchParams,\r\n config: AttributionCaptureConfig\r\n): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const denylist = new Set(getNormalizedKeys(config.query_param_denylist, DEFAULT_DENYLIST));\r\n const maxParams = normalizeNonNegativeInteger(\r\n config.max_captured_query_params,\r\n DEFAULT_MAX_CAPTURED_QUERY_PARAMS\r\n );\r\n const maxValueLength = normalizeNonNegativeInteger(\r\n config.max_query_param_value_length,\r\n DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH\r\n );\r\n const captureAll = config.capture_all_query_params ?? false;\r\n\r\n const allowedKeys = captureAll\r\n ? null\r\n : new Set([\r\n ...DEFAULT_CAPTURE_QUERY_KEYS.map(normalizeKey),\r\n ...getNormalizedKeys(config.capture_query_params, []),\r\n ]);\r\n\r\n for (const [rawKey, rawValue] of params.entries()) {\r\n const key = normalizeKey(rawKey);\r\n if (!key) {\r\n continue;\r\n }\r\n const canonicalKey = QUERY_KEY_ALIASES[key] ?? key;\r\n if (denylist.has(key) || denylist.has(canonicalKey)) {\r\n continue;\r\n }\r\n\r\n if (allowedKeys && !allowedKeys.has(key)) {\r\n continue;\r\n }\r\n const value = rawValue.trim();\r\n if (!value) {\r\n continue;\r\n }\r\n\r\n if (!(canonicalKey in queryParams) && Object.keys(queryParams).length >= maxParams) {\r\n break;\r\n }\r\n\r\n queryParams[canonicalKey] = value.slice(0, maxValueLength);\r\n }\r\n\r\n return queryParams;\r\n}\r\n\r\nfunction findFirst(params: Record<string, string>, candidates: readonly string[]) {\r\n for (const key of candidates) {\r\n const normalizedCandidate = normalizeKey(key);\r\n const value = params[normalizedCandidate]?.trim();\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction buildNormalizedParamMap(params: URLSearchParams) {\r\n const map: Record<string, string> = {};\r\n for (const [rawKey, rawValue] of params.entries()) {\r\n const key = normalizeKey(rawKey);\r\n if (!key || key in map) {\r\n continue;\r\n }\r\n map[key] = rawValue;\r\n }\r\n return map;\r\n}\r\n\r\nfunction normalizeKey(key: string) {\r\n return key.trim().toLowerCase();\r\n}\r\n\r\nfunction getNormalizedKeys(\r\n keys: readonly string[] | undefined,\r\n defaults: readonly string[]\r\n): string[] {\r\n const source = keys ?? defaults;\r\n const values = new Set<string>();\r\n for (const key of source) {\r\n if (typeof key !== 'string') continue;\r\n const normalized = normalizeKey(key);\r\n if (normalized) {\r\n values.add(normalized);\r\n }\r\n }\r\n return Array.from(values);\r\n}\r\n\r\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number) {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n const normalized = Math.floor(value);\r\n if (normalized < 0) {\r\n return fallback;\r\n }\r\n return normalized;\r\n}\r\n\r\n\r\n","/**\r\n * Normalizes pathname for page_view comparison and payloads: removes a trailing\r\n * slash except for the root path \"/\".\r\n */\r\nexport function normalizePathnameForPageview(pathname: string): string {\r\n if (pathname.length > 1 && pathname.endsWith('/')) {\r\n return pathname.slice(0, -1);\r\n }\r\n return pathname;\r\n}\r\n\r\n/**\r\n * Builds a stable search string: same key/value pairs in any order compare equal.\r\n * Preserves duplicate keys (order among pairs is sorted; repeated keys stay grouped by sort order).\r\n */\r\nexport function canonicalizeSearch(search: string): string {\r\n if (!search || search === '?') {\r\n return '';\r\n }\r\n const raw = search.startsWith('?') ? search.slice(1) : search;\r\n if (!raw) {\r\n return '';\r\n }\r\n const params = new URLSearchParams(raw);\r\n const pairs: [string, string][] = [];\r\n params.forEach((value, key) => {\r\n pairs.push([key, value]);\r\n });\r\n pairs.sort(([k1, v1], [k2, v2]) => {\r\n const c = k1.localeCompare(k2);\r\n return c !== 0 ? c : v1.localeCompare(v2);\r\n });\r\n const next = new URLSearchParams();\r\n for (const [k, v] of pairs) {\r\n next.append(k, v);\r\n }\r\n const s = next.toString();\r\n return s === '' ? '' : `?${s}`;\r\n}\r\n\r\n/**\r\n * Identity for autocapture `page_view` deduplication: same logical URL (any framework)\r\n * maps to one key. Uses origin + normalized pathname + canonical query + hash.\r\n */\r\nexport function getPageviewDedupeKey(\r\n location: Pick<Location, 'origin' | 'pathname' | 'search' | 'hash'>,\r\n): string {\r\n const path = normalizePathnameForPageview(location.pathname);\r\n const search = canonicalizeSearch(location.search);\r\n return `${location.origin}${path}${search}${location.hash}`;\r\n}\r\n","import type {\n MarkConfig,\n TrackEventData,\n IdentifyTraits,\n ConsentStatus,\n StorageData,\n} from '../types';\nimport { MarkCore } from '../core/MarkCore';\nimport { HttpTransport } from '../core/HttpTransport';\nimport { BrowserStorage } from './BrowserStorage';\nimport { extractAttributionFromSearch } from './urlAttribution';\nimport { getPageviewDedupeKey, normalizePathnameForPageview } from './pageviewDedupeKey';\n\nexport class Mark {\n private static client: MarkCore | null = null;\n private static storage: BrowserStorage | null = null;\n private static config: MarkConfig | null = null;\n private static pageviewTrackerInstalled = false;\n private static lastPageviewDedupeKey: string | null = null;\n private static emitAutoPageview: (() => void) | null = null;\n private static pendingAttribution: Partial<StorageData> = {};\n private static originalPushState: History['pushState'] | null = null;\n private static originalReplaceState: History['replaceState'] | null = null;\n private static popstateHandler: (() => void) | null = null;\n private static beaconDrainHandler: (() => void) | null = null;\n private static visibilityHandler: (() => void) | null = null;\n private static onlineHandler: (() => void) | null = null;\n private static kickTimer: ReturnType<typeof setInterval> | null = null;\n\n public static init(config: MarkConfig) {\n if (!Mark.client) {\n const storage = new BrowserStorage(config.cross_domain);\n const transport = new HttpTransport(config);\n Mark.client = new MarkCore(config, { storage, transport });\n Mark.storage = storage;\n Mark.config = config;\n Mark.refreshAttribution(storage, config);\n if (typeof window !== 'undefined' && config.autocapture?.pageview) {\n Mark.installPageviewTracking(config, storage);\n }\n if (typeof window !== 'undefined') {\n Mark.installExtendedAutocapture(config);\n Mark.installLifecycleFlushing();\n }\n }\n return Mark.client;\n }\n\n private static installLifecycleFlushing() {\n if (typeof window === 'undefined') return;\n if (Mark.beaconDrainHandler) return;\n\n const drain = () => {\n Mark.client?.drainViaBeacon();\n };\n const onVisibility = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n drain();\n }\n };\n const onOnline = () => {\n Mark.client?.kickQueue();\n };\n\n Mark.beaconDrainHandler = drain;\n Mark.visibilityHandler = onVisibility;\n Mark.onlineHandler = onOnline;\n\n if (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {\n document.addEventListener('visibilitychange', onVisibility);\n }\n if (typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', drain);\n window.addEventListener('beforeunload', drain);\n window.addEventListener('online', onOnline);\n }\n\n if (typeof setInterval === 'function') {\n Mark.kickTimer = setInterval(() => {\n Mark.client?.kickQueue();\n }, 30000);\n }\n }\n\n public static track(eventName: string, data: TrackEventData = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.track(eventName, data);\n }\n\n public static identify(userId: string, traits: IdentifyTraits = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.identify(userId, traits);\n }\n\n public static conversion(eventName: string, data: TrackEventData = {}) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.conversion(eventName, data);\n }\n\n public static setConsent(status: ConsentStatus) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.setConsent(status);\n if (status === 'granted') {\n Mark.flushPendingAttribution();\n // When auto pageview is enabled, attempt a page_view immediately after consent grant.\n Mark.emitAutoPageview?.();\n }\n }\n\n /**\n * Returns the current visitor ID when available.\n * When consent is required (`require_consent: true` or `'auto'`), returns `undefined` until consent is granted.\n * Use this to pass the visitor ID to your backend (e.g. in a header or request body) for server-side attribution\n * when you do not have an authenticated user ID.\n */\n public static getVisitorId(): string | undefined {\n if (!Mark.client || !Mark.storage || !Mark.config) {\n return undefined;\n }\n const requirement = Mark.config.require_consent ?? false;\n if (requirement && Mark.storage.getConsentStatus() !== 'granted') {\n return undefined;\n }\n return Mark.client.getVisitorId();\n }\n\n public static flush(): Promise<void> {\n if (!Mark.client) {\n return Promise.resolve();\n }\n return Mark.client.flush();\n }\n\n /**\n * Flags (or un-flags) the current visitor as internal traffic. Persists\n * across reloads via the SDK's browser storage. Cleared by `reset()` and by\n * `setConsent('denied')`.\n *\n * The policy for deciding *when* to call this (URL query parameter, auth\n * role, IP, feature flag, etc.) is intentionally left to the host app.\n *\n * @example\n * // URL-based opt-in: call once during app bootstrap, after Mark.init()\n * const params = new URLSearchParams(window.location.search);\n * if (params.get('onelence_internal') === '1') Mark.setInternal(true);\n * if (params.get('onelence_internal') === '0') Mark.setInternal(false);\n */\n public static setInternal(value: boolean) {\n if (!Mark.client) {\n if (Mark.config?.debug) {\n console.warn('[Mark] Not initialized. Call init() first.');\n }\n return;\n }\n Mark.client.setInternal(value);\n }\n\n public static getInternal(): boolean {\n return Mark.client?.getInternal() ?? false;\n }\n\n public static reset() {\n Mark.client?.reset();\n Mark.pendingAttribution = {};\n Mark.lastPageviewDedupeKey = null;\n }\n\n public static getStats() {\n return Mark.client?.getStats() ?? { queued: 0, sent: 0, failed: 0, dropped: 0 };\n }\n\n public static destroy() {\n if (typeof window === 'undefined') return;\n if (Mark.originalPushState) history.pushState = Mark.originalPushState;\n if (Mark.originalReplaceState) history.replaceState = Mark.originalReplaceState;\n if (Mark.popstateHandler) window.removeEventListener('popstate', Mark.popstateHandler);\n if (Mark.beaconDrainHandler) {\n window.removeEventListener('pagehide', Mark.beaconDrainHandler);\n window.removeEventListener('beforeunload', Mark.beaconDrainHandler);\n }\n if (Mark.visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', Mark.visibilityHandler);\n }\n if (Mark.onlineHandler) {\n window.removeEventListener('online', Mark.onlineHandler);\n }\n if (Mark.kickTimer) {\n clearInterval(Mark.kickTimer);\n }\n Mark.originalPushState = null;\n Mark.originalReplaceState = null;\n Mark.popstateHandler = null;\n Mark.beaconDrainHandler = null;\n Mark.visibilityHandler = null;\n Mark.onlineHandler = null;\n Mark.kickTimer = null;\n Mark.pageviewTrackerInstalled = false;\n }\n\n private static installPageviewTracking(config: MarkConfig, storage: BrowserStorage) {\n if (Mark.pageviewTrackerInstalled) return;\n Mark.pageviewTrackerInstalled = true;\n\n const emit = () => {\n if (!Mark.client) return;\n Mark.refreshAttribution(storage, config);\n const dedupeKey = getPageviewDedupeKey(window.location);\n if (dedupeKey === Mark.lastPageviewDedupeKey) return;\n const sent = Mark.client.track('page_view', {\n site: window.location.host,\n page: normalizePathnameForPageview(window.location.pathname),\n title: document.title,\n referrer: document.referrer || undefined,\n });\n if (sent) {\n Mark.lastPageviewDedupeKey = dedupeKey;\n }\n };\n Mark.emitAutoPageview = emit;\n\n // Initial page view\n emit();\n\n const trackRoutes = config.track_route_changes ?? true;\n if (!trackRoutes) return;\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n Mark.originalPushState = originalPushState;\n Mark.originalReplaceState = originalReplaceState;\n\n history.pushState = function (...args) {\n const result = originalPushState.apply(this, args as [data: any, unused: string, url?: string | URL | null]);\n emit();\n return result;\n };\n\n history.replaceState = function (...args) {\n const result = originalReplaceState.apply(this, args as [data: any, unused: string, url?: string | URL | null]);\n emit();\n return result;\n };\n\n Mark.popstateHandler = emit;\n window.addEventListener('popstate', emit);\n }\n\n private static refreshAttribution(storage: BrowserStorage, config: MarkConfig) {\n if (typeof window === 'undefined') {\n return;\n }\n const updates = extractAttributionFromSearch(window.location.search, config);\n if (Object.keys(updates).length === 0) {\n return;\n }\n if (Mark.shouldPersistAttribution(storage, config)) {\n const merged = Mark.mergeAttributionUpdates(Mark.pendingAttribution, updates);\n storage.update(merged);\n Mark.pendingAttribution = {};\n return;\n }\n Mark.pendingAttribution = Mark.mergeAttributionUpdates(Mark.pendingAttribution, updates);\n }\n\n private static flushPendingAttribution() {\n const storage = Mark.storage;\n const config = Mark.config;\n if (!storage || !config || typeof window === 'undefined') {\n return;\n }\n const fromUrl = extractAttributionFromSearch(window.location.search, config);\n const merged = Mark.mergeAttributionUpdates(Mark.pendingAttribution, fromUrl);\n if (Object.keys(merged).length > 0) {\n storage.update(merged);\n }\n Mark.pendingAttribution = {};\n }\n\n private static shouldPersistAttribution(storage: BrowserStorage, config: MarkConfig) {\n const requirement = config.require_consent ?? false;\n if (!requirement) {\n return true;\n }\n return storage.getConsentStatus() === 'granted';\n }\n\n private static mergeAttributionUpdates(\n previous: Partial<StorageData>,\n next: Partial<StorageData>\n ): Partial<StorageData> {\n return {\n ...previous,\n ...next,\n query_params: {\n ...(previous.query_params ?? {}),\n ...(next.query_params ?? {}),\n },\n };\n }\n\n private static installExtendedAutocapture(config: MarkConfig) {\n if (!Mark.client || typeof document === 'undefined') return;\n const auto = config.autocapture;\n if (!auto) return;\n\n if (auto.click) {\n document.addEventListener('click', (event) => {\n const target = event.target as HTMLElement | null;\n if (!target) return;\n const selector = typeof auto.click === 'object' ? auto.click.selector : undefined;\n const element = selector ? target.closest(selector) : target.closest('[data-mark-event]');\n if (!element) return;\n const eventName = element.getAttribute('data-mark-event') || 'click';\n Mark.client?.track(eventName, {\n element_id: element.id || undefined,\n element_classes: element.className || undefined,\n text: element.textContent?.trim().slice(0, 120) || undefined,\n href: (element as HTMLAnchorElement).href || undefined,\n });\n });\n }\n\n if (auto.form_submit) {\n document.addEventListener('submit', (event) => {\n const form = event.target as HTMLFormElement | null;\n if (!form) return;\n Mark.client?.track('form_submit', {\n form_id: form.id || undefined,\n form_name: form.name || undefined,\n action: form.action || undefined,\n });\n });\n }\n\n if (auto.outbound_link) {\n document.addEventListener('click', (event) => {\n const anchor = (event.target as HTMLElement | null)?.closest('a[href]') as HTMLAnchorElement | null;\n if (!anchor || !anchor.href) return;\n try {\n const targetUrl = new URL(anchor.href, window.location.href);\n const current = new URL(window.location.href);\n if (targetUrl.origin !== current.origin) {\n Mark.client?.trackWithOptions('outbound_link_click', { href: targetUrl.toString() }, { preferBeacon: true });\n }\n } catch {\n // ignore malformed URLs\n }\n });\n }\n\n if (auto.scroll_depth) {\n const thresholds = [25, 50, 75, 100];\n const emitted = new Set<number>();\n window.addEventListener(\n 'scroll',\n () => {\n const doc = document.documentElement;\n const scrollTop = window.scrollY || doc.scrollTop;\n const max = Math.max(1, doc.scrollHeight - window.innerHeight);\n const depth = Math.min(100, Math.round((scrollTop / max) * 100));\n for (const threshold of thresholds) {\n if (depth >= threshold && !emitted.has(threshold)) {\n emitted.add(threshold);\n Mark.client?.track('scroll_depth', { percent: threshold });\n }\n }\n },\n { passive: true }\n );\n }\n\n if (auto.web_vitals) {\n void import('web-vitals')\n .then((mod) => {\n const emit = (metric: { name: string; value: number; rating?: string; id?: string }) => {\n Mark.client?.track('web_vital', {\n metric: metric.name,\n value: metric.value,\n rating: metric.rating,\n metric_id: metric.id,\n });\n };\n mod.onLCP(emit);\n mod.onCLS(emit);\n mod.onINP(emit);\n mod.onTTFB(emit);\n })\n .catch(() => {\n if (config.debug) {\n console.warn('[Mark] web-vitals package not available; skipping autocapture.web_vitals.');\n }\n });\n }\n }\n}\n\n","import { Mark } from './Mark';\r\n\r\nif (typeof window !== 'undefined') {\r\n (window as any).Mark = Mark;\r\n}\r\n\r\nexport { Mark };\r\nexport default Mark;\r\n\r\n\r\n","let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n"],"names":["DEFAULT_ENDPOINT","TransportError","message","options","isNonRetriableStatus","status","parseRetryAfter","headerValue","trimmed","numeric","dateMs","diff","DEFAULT_MAX_ATTEMPTS","DEFAULT_BASE_BACKOFF_MS","DEFAULT_MAX_BACKOFF_MS","DEFAULT_MAX_ITEM_AGE_MS","DeliveryQueue","transport","persisted","now","item","enqueuedAt","path","data","items","eventData","cutoff","removed","i","force","preferBeacon","error","retryAfterMs","delay","jitter","TRACK_RESERVED_FIELDS","IDENTIFY_RESERVED_FIELDS","MarkCore","config","deps","event","eventName","isConversion","sanitizedData","restData","payload","siteId","siteHost","transformed","userId","traits","previous","value","eventValue","stored","visitorId","clickId","campaignId","sessionId","storedQuery","inputQuery","query","identity","state","sanitized","key","maxSize","intervalMs","currentId","lastActivityIso","lastActivity","newSessionId","nowIso","previousTs","currentTs","prev","next","dnt","gpc","referrer","refUrl","currentUrl","source","purposes","attempt","retries","w","tcData","ok","consents","p","HttpTransport","request","url","headers","body","blob","timeoutMs","controller","timedOut","timer","response","snippet","endpoint","normalizedEndpoint","normalizedPath","STORAGE_KEY","OUTBOX_KEY","COOKIE_NAME","BrowserStorage","updates","raw","parsed","cookieVid","name","match","days","expires","domainPart","bytes","hex","b","c","r","bridge","bridgeUrl","timeout","appendFrame","origin","originUrl","domain","CLICK_PARAM_CANDIDATES","CAMPAIGN_PARAM_CANDIDATES","DEFAULT_CAPTURE_QUERY_KEYS","QUERY_KEY_ALIASES","DEFAULT_DENYLIST","DEFAULT_MAX_CAPTURED_QUERY_PARAMS","DEFAULT_MAX_QUERY_PARAM_VALUE_LENGTH","extractAttributionFromSearch","search","params","normalizedParamMap","buildNormalizedParamMap","findFirst","queryParams","captureQueryParams","denylist","getNormalizedKeys","maxParams","normalizeNonNegativeInteger","maxValueLength","allowedKeys","normalizeKey","rawKey","rawValue","canonicalKey","candidates","normalizedCandidate","map","keys","defaults","values","normalized","fallback","normalizePathnameForPageview","pathname","canonicalizeSearch","pairs","k1","v1","k2","v2","k","v","s","getPageviewDedupeKey","location","Mark","storage","drain","onVisibility","onOnline","emit","dedupeKey","originalPushState","originalReplaceState","args","result","merged","fromUrl","auto","target","selector","element","form","anchor","targetUrl","current","thresholds","emitted","doc","scrollTop","max","depth","threshold","webVitals","mod","metric","e","t","n","o","a","d","h","f","l","u","m","g","y","T","E","L","P","_","M","C","I","F","A","B","S","q","x","H","O"],"mappings":"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","x_google_ignoreList":[10]}
|