@drivemetadata-ai/sdk 0.1.1-beta.2 → 0.1.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular/index.cjs +780 -94
- package/dist/angular/index.cjs.map +1 -1
- package/dist/angular/index.d.cts +2 -2
- package/dist/angular/index.d.ts +2 -2
- package/dist/angular/index.js +780 -94
- package/dist/angular/index.js.map +1 -1
- package/dist/browser/index.cjs +781 -95
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +2 -2
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.js +781 -95
- package/dist/browser/index.js.map +1 -1
- package/dist/next/index.cjs +780 -94
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +1 -1
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.js +780 -94
- package/dist/next/index.js.map +1 -1
- package/dist/node/index.cjs +81 -9
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +81 -9
- package/dist/node/index.js.map +1 -1
- package/dist/react/index.cjs +780 -94
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +780 -94
- package/dist/react/index.js.map +1 -1
- package/dist/{types--V8TVIqT.d.cts → types-mgbdL1V7.d.cts} +17 -4
- package/dist/{types--V8TVIqT.d.ts → types-mgbdL1V7.d.ts} +17 -4
- package/docs/architecture.md +109 -0
- package/docs/index.md +1 -0
- package/docs/integration.md +26 -0
- package/docs/npm-browser-sdk.md +4 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/angular/dmd-analytics.service.ts","../../src/core/backend-payload.ts","../../src/core/environment.ts","../../src/browser/core/consent.ts","../../src/browser/core/delivery.ts","../../src/browser/core/privacy.ts","../../src/browser/core/schema.ts","../../src/browser/core/DriveMetaDataSDK.ts","../../src/browser/client.ts","../../src/angular/tokens.ts","../../src/angular/provider.ts"],"sourcesContent":["import { Inject, Injectable, Optional } from '@angular/core';\nimport {\n alias,\n flush,\n getDmdHealth,\n getDmdSDK,\n group,\n identify,\n initDmdSDK,\n page,\n reset,\n setConsent,\n track\n} from '../browser/client';\nimport type { DmdBrowserClient, DmdBrowserConfig, DmdConsentInput, DmdHealthStatus } from '../core/types';\nimport { DMD_BROWSER_CONFIG } from './tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class DmdAnalyticsService {\n constructor(@Optional() @Inject(DMD_BROWSER_CONFIG) private readonly config?: DmdBrowserConfig) {}\n\n init(config: DmdBrowserConfig = this.requireConfig()): DmdBrowserClient {\n return initDmdSDK(config);\n }\n\n getClient(): DmdBrowserClient | undefined {\n return getDmdSDK();\n }\n\n track(event: string, properties?: Record<string, unknown>): void {\n track(event, properties);\n }\n\n identify(userId: string, traits?: Record<string, unknown>): void {\n identify(userId, traits);\n }\n\n page(name?: string, properties?: Record<string, unknown>): void {\n page(name, properties);\n }\n\n group(groupId: string, traits?: Record<string, unknown>): void {\n group(groupId, traits);\n }\n\n alias(previousId: string, userId: string): void {\n alias(previousId, userId);\n }\n\n async flush(): Promise<void> {\n await flush();\n }\n\n setConsent(consent: DmdConsentInput): void {\n setConsent(consent);\n }\n\n reset(): void {\n reset();\n }\n\n getHealth(): DmdHealthStatus {\n return getDmdHealth();\n }\n\n private requireConfig(): DmdBrowserConfig {\n if (!this.config) {\n throw new Error('DMD Angular SDK requires config when init is called');\n }\n\n return this.config;\n }\n}\n","function formatUtcTimestamp(value: unknown): string {\n if (typeof value !== 'string') return new Date().toISOString().replace('T', ' ').slice(0, 19);\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toISOString().replace('T', ' ').slice(0, 19);\n}\n\nfunction cleanObject(value: unknown): unknown {\n if (Array.isArray(value)) {\n const cleaned = value\n .map(item => cleanObject(item))\n .filter(item => item !== null && item !== undefined && item !== '');\n return cleaned.length > 0 ? cleaned : undefined;\n }\n\n if (value && typeof value === 'object') {\n const cleaned = Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .map(([key, item]) => [key, cleanObject(item)])\n .filter(([, item]) => {\n if (item === null || item === undefined || item === '') return false;\n if (typeof item === 'object' && !Array.isArray(item) && Object.keys(item).length === 0) return false;\n return true;\n })\n );\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n }\n\n return value;\n}\n\nexport function createBackendCollectorPayload(input: Record<string, unknown>): Record<string, unknown> {\n const eventData = input.eventData && typeof input.eventData === 'object'\n ? input.eventData as Record<string, unknown>\n : {};\n const page = eventData.page && typeof eventData.page === 'object'\n ? eventData.page as Record<string, unknown>\n : {};\n const timestamp = formatUtcTimestamp(eventData.timestamp ?? input.timestamp);\n const normalizedEventData = {\n ...eventData,\n timestamp,\n requestSentAt: formatUtcTimestamp(eventData.requestSentAt ?? input.requestSentAt ?? timestamp),\n requestReceivedAt: formatUtcTimestamp(eventData.requestReceivedAt ?? input.requestReceivedAt ?? timestamp)\n };\n\n const metaData: Record<string, unknown> = {\n ...normalizedEventData,\n requestId: input.requestId,\n timestamp,\n eventType: input.eventType,\n requestFrom: input.requestFrom ?? '3',\n clientId: input.clientId,\n workspaceId: input.workspaceId,\n token: input.token,\n anonymousId: eventData.anonymousId ?? input.anonymousId,\n sessionId: eventData.sessionId ?? input.sessionId,\n ua: input.ua,\n appDetails: { app_id: input.appId },\n page: { ...page, url: page.url ?? input.pageUrl },\n requestSentAt: normalizedEventData.requestSentAt,\n requestReceivedAt: normalizedEventData.requestReceivedAt\n };\n\n const payload = { metaData };\n\n return cleanObject(payload) as Record<string, unknown>;\n}\n","export function isBrowserRuntime(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function getBrowserWindow(): Window | undefined {\n return typeof window === 'undefined' ? undefined : window;\n}\n","import type {\n DmdConsentInput,\n DmdConsentPurpose,\n DmdConsentState,\n DmdPurposeConsent\n} from './types';\n\nexport type DmdResolvedConsent = Record<DmdConsentPurpose, DmdConsentState>;\n\nconst purposes: DmdConsentPurpose[] = [\n 'analytics',\n 'advertising',\n 'personalization',\n 'functional',\n 'saleOfData'\n];\n\nfunction normalizeConsentValue(value: unknown): DmdConsentState {\n if (value === true) return 'granted';\n if (value === false) return 'denied';\n if (value === 'granted' || value === 'denied' || value === 'pending') return value;\n return 'pending';\n}\n\nexport function normalizeConsent(input: DmdConsentInput | undefined): DmdResolvedConsent {\n const defaultValue = normalizeConsentValue(input ?? 'pending');\n const resolved = Object.fromEntries(\n purposes.map(purpose => [purpose, defaultValue])\n ) as DmdResolvedConsent;\n\n if (input && typeof input === 'object') {\n for (const purpose of purposes) {\n const value = input[purpose];\n if (value !== undefined) {\n resolved[purpose] = normalizeConsentValue(value);\n }\n }\n }\n\n return resolved;\n}\n\nexport function mergeConsent(current: DmdResolvedConsent, update: DmdPurposeConsent): DmdResolvedConsent {\n const next = { ...current };\n for (const [purpose, value] of Object.entries(update) as Array<[DmdConsentPurpose, DmdConsentState]>) {\n next[purpose] = normalizeConsentValue(value);\n }\n return next;\n}\n\nexport function canCollectPurpose(consent: DmdResolvedConsent, purpose: DmdConsentPurpose): boolean {\n return consent[purpose] === 'granted';\n}\n","export interface DmdQueuedRecord {\n messageId: string;\n savedAt: number;\n attempts: number;\n lastError?: string;\n payload: Record<string, unknown>;\n}\n\nexport interface DmdDeliveryDiagnostics {\n queued: number;\n inFlight: number;\n dropped: Array<{ messageId?: string; reason: string; timestamp: string }>;\n lastError?: string;\n}\n\nexport interface DmdDeliveryManager {\n send(payload: Record<string, unknown>): Promise<void>;\n flushQueue(): Promise<void>;\n clearQueue(reason: string): void;\n enqueueForTests(record: DmdQueuedRecord): void;\n flushExpired(): void;\n acquireFlushLease(): boolean;\n releaseFlushLease(): void;\n getDiagnostics(): DmdDeliveryDiagnostics;\n}\n\nexport interface DmdDeliveryStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): unknown;\n removeItem(key: string): unknown;\n}\n\nfunction createId(prefix: string): string {\n return `${prefix}_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return JSON.stringify(value);\n }\n return JSON.stringify(\n Object.fromEntries(\n Object.entries(value as Record<string, unknown>).sort(([left], [right]) => left.localeCompare(right))\n )\n );\n}\n\nfunction createIdempotencyKey(payload: Record<string, unknown>, messageId: string): string {\n const metaData = payload.metaData as Record<string, unknown> | undefined;\n const event = String(metaData?.eventType ?? payload.event ?? payload.type ?? 'event');\n const properties = (metaData ?? payload.properties) as Record<string, unknown> | undefined;\n const orderId = properties?.orderId ?? properties?.order_id ?? properties?.transaction_id;\n if (orderId !== undefined) return `${event}:${String(orderId)}`;\n return `${event}:${stableStringify(properties ?? {}) || messageId}`;\n}\n\nexport function createDeliveryManager(config: {\n endpoint: string;\n fetch?: typeof fetch;\n queueTtlMs?: number;\n maxQueueSize?: number;\n storage?: DmdDeliveryStorage;\n queueKey?: string;\n lockKey?: string;\n lockTtlMs?: number;\n tabId?: string;\n retryDelayMs?: number;\n maxRetryDelayMs?: number;\n maxPayloadBytes?: number;\n batchSize?: number;\n onDrop?: (event: { messageId?: string; reason: string; timestamp: string }) => void;\n onError?: (error: Error) => void;\n}): DmdDeliveryManager {\n const queue: DmdQueuedRecord[] = [];\n const diagnostics: DmdDeliveryDiagnostics = { queued: 0, inFlight: 0, dropped: [] };\n const maxQueueSize = config.maxQueueSize ?? 100;\n const queueKey = config.queueKey ?? 'dmd_delivery_queue';\n const lockKey = config.lockKey ?? 'dmd_delivery_flush_lock';\n const lockTtlMs = config.lockTtlMs ?? 5_000;\n const tabId = config.tabId ?? createId('tab');\n const batchSize = config.batchSize ?? 25;\n const maxPayloadBytes = config.maxPayloadBytes ?? 64_000;\n\n function recordDrop(event: { messageId?: string; reason: string; timestamp: string }): void {\n diagnostics.dropped.push(event);\n config.onDrop?.(event);\n }\n\n function recordError(error: Error): void {\n diagnostics.lastError = error.message;\n config.onError?.(error);\n }\n\n function payloadByteLength(payload: Record<string, unknown>): number {\n const serialized = JSON.stringify(payload);\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(serialized).length;\n }\n return serialized.length;\n }\n\n function recordStorageUnavailable(): void {\n recordDrop({\n reason: 'storage_unavailable',\n timestamp: new Date().toISOString()\n });\n }\n\n function safeGetItem(key: string): string | null {\n try {\n return config.storage?.getItem(key) ?? null;\n } catch {\n recordStorageUnavailable();\n return null;\n }\n }\n\n function safeSetItem(key: string, value: string): boolean {\n try {\n config.storage?.setItem(key, value);\n return true;\n } catch {\n recordStorageUnavailable();\n return false;\n }\n }\n\n function safeRemoveItem(key: string): boolean {\n try {\n config.storage?.removeItem(key);\n return true;\n } catch {\n recordStorageUnavailable();\n return false;\n }\n }\n\n function persistQueue(): void {\n if (!config.storage) return;\n if (queue.length === 0) {\n safeRemoveItem(queueKey);\n return;\n }\n safeSetItem(queueKey, JSON.stringify(queue));\n }\n\n function loadQueue(): void {\n if (!config.storage) return;\n const rawQueue = safeGetItem(queueKey);\n if (!rawQueue) return;\n try {\n const records = JSON.parse(rawQueue) as DmdQueuedRecord[];\n queue.splice(0, queue.length, ...records.filter(record => record && typeof record.messageId === 'string'));\n diagnostics.queued = queue.length;\n } catch {\n safeRemoveItem(queueKey);\n recordDrop({\n reason: 'queue_corrupt',\n timestamp: new Date().toISOString()\n });\n }\n }\n\n function enqueue(record: DmdQueuedRecord): void {\n queue.push(record);\n while (queue.length > maxQueueSize) {\n const dropped = queue.shift();\n const diagnostic: { messageId?: string; reason: string; timestamp: string } = {\n reason: 'queue_limit_exceeded',\n timestamp: new Date().toISOString()\n };\n if (dropped?.messageId !== undefined) diagnostic.messageId = dropped.messageId;\n recordDrop(diagnostic);\n }\n diagnostics.queued = queue.length;\n persistQueue();\n }\n\n function withEnvelope(payload: Record<string, unknown>): Record<string, unknown> {\n const metaData = payload.metaData as Record<string, unknown> | undefined;\n const messageId = String(metaData?.requestId ?? payload.messageId ?? createId('msg'));\n if (metaData) {\n return {\n ...payload,\n metaData: {\n ...metaData,\n requestId: messageId\n }\n };\n }\n return {\n ...payload,\n messageId,\n idempotencyKey: String(payload.idempotencyKey ?? createIdempotencyKey(payload, messageId))\n };\n }\n\n async function deliver(body: Record<string, unknown>): Promise<void> {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new Error('fetch_unavailable');\n }\n\n const response = await fetchImpl(config.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n keepalive: true\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n }\n\n loadQueue();\n\n return {\n async send(payload: Record<string, unknown>): Promise<void> {\n const body = withEnvelope(payload);\n\n if (payloadByteLength(body) > maxPayloadBytes) {\n recordDrop({\n messageId: String((body.metaData as Record<string, unknown> | undefined)?.requestId ?? body.messageId),\n reason: 'payload_too_large',\n timestamp: new Date().toISOString()\n });\n return;\n }\n\n diagnostics.inFlight += 1;\n try {\n await deliver(body);\n } catch (error) {\n const deliveryError = error instanceof Error ? error : new Error(String(error));\n recordError(deliveryError);\n enqueue({\n messageId: String((body.metaData as Record<string, unknown> | undefined)?.requestId ?? body.messageId),\n savedAt: Date.now(),\n attempts: 1,\n lastError: deliveryError.message,\n payload: body\n });\n } finally {\n diagnostics.inFlight -= 1;\n diagnostics.queued = queue.length;\n }\n },\n async flushQueue(): Promise<void> {\n this.flushExpired();\n if (queue.length === 0 || !this.acquireFlushLease()) return;\n\n diagnostics.inFlight += 1;\n try {\n let sentInBatch = 0;\n for (let index = 0; index < queue.length && sentInBatch < batchSize;) {\n const record = queue[index];\n if (!record) {\n index += 1;\n continue;\n }\n\n try {\n await deliver(record.payload);\n queue.splice(index, 1);\n sentInBatch += 1;\n persistQueue();\n } catch (error) {\n const deliveryError = error instanceof Error ? error : new Error(String(error));\n record.attempts += 1;\n record.lastError = deliveryError.message;\n recordError(deliveryError);\n index += 1;\n persistQueue();\n break;\n }\n }\n } finally {\n diagnostics.inFlight -= 1;\n diagnostics.queued = queue.length;\n this.releaseFlushLease();\n }\n },\n clearQueue(reason: string): void {\n for (const record of queue) {\n recordDrop({\n messageId: record.messageId,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n queue.splice(0, queue.length);\n diagnostics.queued = 0;\n persistQueue();\n },\n enqueueForTests(record: DmdQueuedRecord): void {\n enqueue(record);\n },\n flushExpired(): void {\n const ttl = config.queueTtlMs ?? 86_400_000;\n const now = Date.now();\n for (let index = queue.length - 1; index >= 0; index -= 1) {\n const record = queue[index];\n if (record && now - record.savedAt > ttl) {\n recordDrop({\n messageId: record.messageId,\n reason: 'queue_ttl_expired',\n timestamp: new Date().toISOString()\n });\n queue.splice(index, 1);\n }\n }\n diagnostics.queued = queue.length;\n persistQueue();\n },\n acquireFlushLease(): boolean {\n if (!config.storage) return true;\n\n const now = Date.now();\n const rawLock = safeGetItem(lockKey);\n let existingLock: { owner?: string; expiresAt?: number } | undefined;\n if (rawLock) {\n try {\n existingLock = JSON.parse(rawLock) as { owner?: string; expiresAt?: number };\n } catch {\n existingLock = undefined;\n }\n }\n\n const lockExpired = !existingLock?.expiresAt || existingLock.expiresAt <= now;\n const lockOwnedByThisTab = existingLock?.owner === tabId;\n if (!existingLock || lockExpired || lockOwnedByThisTab) {\n if (!safeSetItem(lockKey, JSON.stringify({ owner: tabId, expiresAt: now + lockTtlMs }))) {\n return true;\n }\n return true;\n }\n\n return false;\n },\n releaseFlushLease(): void {\n if (!config.storage) return;\n const rawLock = safeGetItem(lockKey);\n if (!rawLock) return;\n\n try {\n const existingLock = JSON.parse(rawLock) as { owner?: string };\n if (existingLock.owner === tabId) {\n safeRemoveItem(lockKey);\n }\n } catch {\n safeRemoveItem(lockKey);\n }\n },\n getDiagnostics(): DmdDeliveryDiagnostics {\n return diagnostics;\n }\n };\n}\n","const sensitiveKeys = new Set([\n 'email',\n 'phone',\n 'mobile',\n 'address',\n 'address1',\n 'address2',\n 'first_name',\n 'last_name',\n 'name',\n 'token',\n 'secret',\n 'password',\n 'session',\n 'cookie'\n]);\n\nexport function redactUrl(\n url: string,\n allowQueryKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']\n): string {\n const parsed = new URL(url, 'https://placeholder.local');\n for (const key of Array.from(parsed.searchParams.keys())) {\n if (!allowQueryKeys.includes(key)) {\n parsed.searchParams.set(key, '[REDACTED]');\n }\n }\n return url.startsWith('http') ? parsed.toString() : `${parsed.pathname}${parsed.search}`;\n}\n\nfunction sanitizeValue(value: unknown, allow: Set<string>): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sanitizeValue(item, allow));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => !sensitiveKeys.has(key.toLowerCase()) || allow.has(key.toLowerCase()))\n .map(([key, nestedValue]) => [key, sanitizeValue(nestedValue, allow)])\n );\n }\n\n return value;\n}\n\nexport function sanitizeProperties(input: Record<string, unknown>, allowRawKeys: string[] = []): Record<string, unknown> {\n const allow = new Set(allowRawKeys.map(key => key.toLowerCase()));\n return sanitizeValue(input, allow) as Record<string, unknown>;\n}\n\nexport async function sha256LowerTrimmed(value: string): Promise<string> {\n const bytes = new TextEncoder().encode(value.trim().toLowerCase());\n const digest = await crypto.subtle.digest('SHA-256', bytes);\n return Array.from(new Uint8Array(digest)).map(byte => byte.toString(16).padStart(2, '0')).join('');\n}\n","const reservedKeys = new Set(['messageId', 'timestamp', 'type', 'event', 'anonymousId', 'userId', 'context']);\n\nexport interface DmdSchemaValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nexport function validateEventEnvelope(\n envelope: {\n type?: unknown;\n event?: unknown;\n properties?: Record<string, unknown>;\n messageId?: unknown;\n timestamp?: unknown;\n },\n options: { mode?: 'off' | 'warn' | 'strict' } = {}\n): DmdSchemaValidationResult {\n if (options.mode === 'off') return { ok: true, errors: [] };\n const errors: string[] = [];\n if (typeof envelope.type !== 'string') errors.push('type must be a string');\n if (envelope.type === 'track' && typeof envelope.event !== 'string') {\n errors.push('track event must include event name');\n }\n if (typeof envelope.messageId !== 'string') errors.push('messageId must be a string');\n if (typeof envelope.timestamp !== 'string') errors.push('timestamp must be an ISO string');\n for (const key of Object.keys(envelope.properties ?? {})) {\n if (reservedKeys.has(key)) errors.push(`properties.${key} is reserved`);\n }\n return { ok: errors.length === 0, errors };\n}\n","import type { DmdDroppedEventDiagnostic, DmdDroppedEventReason, DmdDroppedEventType } from '../../core/diagnostics';\nimport type { DmdBrowserConfig, DmdConsentInput, DmdEventOptions, DmdHealthStatus } from '../../core/types';\nimport { createBackendCollectorPayload } from '../../core/backend-payload';\nimport { getBrowserWindow } from '../../core/environment';\nimport { canCollectPurpose, mergeConsent, normalizeConsent, type DmdResolvedConsent } from './consent';\nimport { createDeliveryManager, type DmdDeliveryManager } from './delivery';\nimport { sanitizeProperties } from './privacy';\nimport { validateEventEnvelope } from './schema';\nimport type { DmdIdentityState } from './types';\n\ninterface DmdPreparedEvent {\n type: 'track' | 'page' | 'identify' | 'group' | 'alias';\n event: string;\n properties: Record<string, unknown>;\n messageId: string;\n timestamp: string;\n context: Record<string, unknown>;\n anonymousId: string;\n userId?: string;\n groupId?: string;\n clientId: string;\n workspaceId: string;\n appId: string;\n writeKey: string;\n consent: DmdResolvedConsent;\n sessionId: string;\n}\n\nfunction createId(prefix: string): string {\n return `${prefix}_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction endpointFromConfig(config: DmdBrowserConfig): string {\n const host = config.apiHost ?? 'https://sdk.drivemetadata.com/v2';\n return `${host.replace(/\\/$/, '')}/data-collector`;\n}\n\nfunction requireConfigString(value: string | undefined, field: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`DMD SDK config ${field} is required`);\n }\n return value;\n}\n\nfunction getBrowserStorage() {\n const browserWindow = getBrowserWindow();\n try {\n return browserWindow?.localStorage;\n } catch {\n return undefined;\n }\n}\n\nexport class DriveMetaDataSDK {\n public initialized = true;\n public queue: unknown[] = [];\n public offline = false;\n public gdprConsent: 'granted' | 'denied' | 'pending';\n\n private readonly endpoint: string;\n private readonly config: DmdBrowserConfig;\n private readonly writeKey: string;\n private readonly sessionId: string;\n private readonly delivery: DmdDeliveryManager;\n private identity: DmdIdentityState;\n private consentState: DmdResolvedConsent;\n private droppedEvents = 0;\n private lastError: string | undefined;\n private lastDroppedEvent: DmdDroppedEventDiagnostic | undefined;\n private retryTimer: ReturnType<typeof setTimeout> | undefined;\n private retryDelayMs: number;\n private readonly initialRetryDelayMs: number;\n private readonly maxRetryDelayMs: number;\n private lifecycleCleanup: (() => void) | undefined;\n\n constructor(config: DmdBrowserConfig) {\n requireConfigString(config.clientId, 'clientId');\n requireConfigString(config.workspaceId, 'workspaceId');\n requireConfigString(config.appId, 'appId');\n requireConfigString(config.writeKey || config.token, 'writeKey or token');\n this.config = config;\n this.endpoint = endpointFromConfig(config);\n const storage = getBrowserStorage();\n const deliveryConfig: Parameters<typeof createDeliveryManager>[0] = {\n endpoint: this.endpoint,\n };\n if (config.delivery?.maxQueueSize !== undefined) deliveryConfig.maxQueueSize = config.delivery.maxQueueSize;\n if (config.delivery?.queueTtlMs !== undefined) deliveryConfig.queueTtlMs = config.delivery.queueTtlMs;\n if (config.delivery?.retryDelayMs !== undefined) deliveryConfig.retryDelayMs = config.delivery.retryDelayMs;\n if (config.delivery?.maxRetryDelayMs !== undefined) deliveryConfig.maxRetryDelayMs = config.delivery.maxRetryDelayMs;\n if (config.delivery?.maxPayloadBytes !== undefined) deliveryConfig.maxPayloadBytes = config.delivery.maxPayloadBytes;\n if (config.delivery?.batchSize !== undefined) deliveryConfig.batchSize = config.delivery.batchSize;\n if (config.onDrop !== undefined) deliveryConfig.onDrop = config.onDrop;\n if (config.onError !== undefined) deliveryConfig.onError = config.onError;\n this.delivery = createDeliveryManager(storage ? {\n ...deliveryConfig,\n storage\n } : deliveryConfig);\n this.initialRetryDelayMs = config.delivery?.retryDelayMs ?? 1_000;\n this.retryDelayMs = this.initialRetryDelayMs;\n this.maxRetryDelayMs = config.delivery?.maxRetryDelayMs ?? 30_000;\n this.writeKey = config.writeKey || config.token || '';\n this.identity = { anonymousId: createId('anon') };\n this.sessionId = createId('session');\n this.consentState = normalizeConsent(config.gdprConsent ?? config.consent);\n this.gdprConsent = this.consentState.analytics;\n if (!config.delivery?.disableLifecycleFlush) {\n this.installLifecycleFlush();\n }\n }\n\n trackEvent(event: string, properties: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('track', event, properties, options);\n }\n\n page(name?: string, properties: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('page', 'page_view', { name, ...properties }, options);\n }\n\n trackPageview(): void {\n this.page();\n }\n\n identify(userId: string, traits: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.identity = { ...this.identity, userId, traits };\n this.sendPreparedEvent('identify', 'identify', { userId, traits }, options);\n }\n\n identifyUser(userId: string, traits: Record<string, unknown> = {}): void {\n this.identify(userId, traits);\n }\n\n group(groupId: string, traits: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.identity = { ...this.identity, groupId };\n this.sendPreparedEvent('group', 'group', { groupId, traits }, options);\n }\n\n alias(previousId: string, userId: string, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('alias', 'alias', { previousId, userId }, options);\n }\n\n async flush(): Promise<void> {\n await this.delivery.flushQueue();\n const diagnostics = this.delivery.getDiagnostics();\n this.offline = diagnostics.queued > 0;\n this.lastError = diagnostics.lastError;\n if (diagnostics.queued > 0) {\n this.scheduleRetryFlush();\n } else {\n this.retryDelayMs = this.initialRetryDelayMs;\n }\n }\n\n reset(): void {\n this.identity = { anonymousId: createId('anon') };\n this.queue = [];\n this.offline = false;\n if (this.retryTimer !== undefined) {\n clearTimeout(this.retryTimer);\n this.retryTimer = undefined;\n }\n this.lifecycleCleanup?.();\n this.lifecycleCleanup = undefined;\n this.delivery.clearQueue('manual_clear');\n }\n\n setConsent(consent: DmdConsentInput): void {\n this.consentState = typeof consent === 'object'\n ? mergeConsent(this.consentState, consent)\n : normalizeConsent(consent);\n this.gdprConsent = this.consentState.analytics;\n if (!canCollectPurpose(this.consentState, 'analytics')) {\n this.queue = [];\n this.delivery.clearQueue('consent_revoked');\n }\n }\n\n getHealth(): DmdHealthStatus {\n const deliveryDiagnostics = this.delivery.getDiagnostics();\n const health: DmdHealthStatus = {\n initialized: this.initialized,\n consent: this.gdprConsent,\n consentPurposes: this.consentState,\n queueSize: deliveryDiagnostics.queued,\n offline: this.offline || deliveryDiagnostics.queued > 0,\n droppedEvents: this.droppedEvents + deliveryDiagnostics.dropped.length,\n delivery: deliveryDiagnostics\n };\n const lastError = this.lastError ?? deliveryDiagnostics.lastError;\n if (lastError !== undefined) health.lastError = lastError;\n if (this.lastDroppedEvent !== undefined) health.lastDroppedEvent = this.lastDroppedEvent;\n return health;\n }\n\n sendEvent(payload: unknown): void {\n void this.delivery.send(payload as Record<string, unknown>).then(() => {\n const diagnostics = this.delivery.getDiagnostics();\n this.offline = diagnostics.queued > 0;\n this.lastError = diagnostics.lastError;\n if (diagnostics.queued > 0) {\n this.scheduleRetryFlush();\n }\n });\n }\n\n private installLifecycleFlush(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow) return;\n if (typeof browserWindow.addEventListener !== 'function') return;\n if (typeof browserWindow.removeEventListener !== 'function') return;\n\n const flushOnLifecycle = () => {\n void this.flush();\n };\n const flushOnVisibility = () => {\n if (browserWindow.document?.visibilityState === 'hidden') {\n void this.flush();\n }\n };\n\n browserWindow.addEventListener('online', flushOnLifecycle);\n browserWindow.addEventListener('pagehide', flushOnLifecycle);\n if (typeof browserWindow.document?.addEventListener === 'function') {\n browserWindow.document.addEventListener('visibilitychange', flushOnVisibility);\n }\n\n this.lifecycleCleanup = () => {\n browserWindow.removeEventListener('online', flushOnLifecycle);\n browserWindow.removeEventListener('pagehide', flushOnLifecycle);\n if (typeof browserWindow.document?.removeEventListener === 'function') {\n browserWindow.document.removeEventListener('visibilitychange', flushOnVisibility);\n }\n };\n }\n\n private scheduleRetryFlush(): void {\n if (this.retryTimer !== undefined) return;\n\n const delay = Math.min(this.retryDelayMs, this.maxRetryDelayMs);\n this.retryTimer = setTimeout(() => {\n this.retryTimer = undefined;\n void this.flush().then(() => {\n if (this.delivery.getDiagnostics().queued > 0) {\n this.retryDelayMs = Math.min(this.retryDelayMs * 2, this.maxRetryDelayMs);\n this.scheduleRetryFlush();\n }\n });\n }, delay);\n }\n\n private sendPreparedEvent(\n type: DmdPreparedEvent['type'],\n event: string,\n properties: Record<string, unknown>,\n options: DmdEventOptions\n ): void {\n void this.prepareAndSendEvent(type, event, properties, options);\n }\n\n private async prepareAndSendEvent(\n type: DmdPreparedEvent['type'],\n event: string,\n properties: Record<string, unknown>,\n options: DmdEventOptions\n ): Promise<void> {\n if (!canCollectPurpose(this.consentState, 'analytics')) {\n this.recordDrop(type, 'consent_denied', event);\n return;\n }\n\n let prepared: DmdPreparedEvent = {\n type,\n event,\n properties: sanitizeProperties(properties),\n messageId: options.messageId ?? createId('msg'),\n timestamp: options.timestamp ?? new Date().toISOString(),\n context: options.context ?? {},\n anonymousId: this.identity.anonymousId,\n clientId: this.config.clientId,\n workspaceId: this.config.workspaceId,\n appId: this.config.appId,\n writeKey: this.writeKey,\n consent: this.consentState,\n sessionId: this.sessionId\n };\n\n if (this.identity.userId !== undefined) prepared.userId = this.identity.userId;\n if (this.identity.groupId !== undefined) prepared.groupId = this.identity.groupId;\n\n if (this.config.beforeSend !== undefined) {\n const beforeSendResult = await this.config.beforeSend(prepared);\n if (beforeSendResult === null) {\n this.recordDrop(type, 'before_send_dropped', event);\n return;\n }\n prepared = {\n ...prepared,\n ...beforeSendResult,\n properties: sanitizeProperties(beforeSendResult.properties ?? prepared.properties)\n };\n }\n\n const validation = validateEventEnvelope(prepared, { mode: this.config.schemaValidation ?? 'warn' });\n if (!validation.ok && this.config.schemaValidation === 'strict') {\n this.recordDrop(type, 'invalid_payload', event);\n return;\n }\n if (!validation.ok) {\n this.lastError = `DMD SDK schema warning: ${validation.errors.join(', ')}`;\n }\n\n this.sendEvent(this.toCollectorPayload(prepared));\n }\n\n private toCollectorPayload(prepared: DmdPreparedEvent): Record<string, unknown> {\n const browserWindow = getBrowserWindow();\n return createBackendCollectorPayload({\n requestId: prepared.messageId,\n timestamp: prepared.timestamp,\n eventType: prepared.event,\n clientId: prepared.clientId,\n workspaceId: prepared.workspaceId,\n token: prepared.writeKey,\n anonymousId: prepared.anonymousId,\n sessionId: prepared.sessionId,\n ua: browserWindow?.navigator?.userAgent,\n appId: prepared.appId,\n pageUrl: browserWindow?.location?.href,\n eventData: {\n ...prepared.properties,\n anonymousId: prepared.anonymousId,\n sessionId: prepared.sessionId,\n timestamp: prepared.timestamp,\n requestSentAt: prepared.timestamp,\n requestReceivedAt: prepared.timestamp\n }\n });\n }\n\n private recordDrop(type: DmdDroppedEventType, reason: DmdDroppedEventReason, event?: string): void {\n this.droppedEvents += 1;\n this.lastDroppedEvent = {\n type,\n reason,\n timestamp: new Date().toISOString()\n };\n if (event !== undefined) this.lastDroppedEvent.event = event;\n this.lastError = `DMD SDK ${type} dropped because ${reason}`;\n }\n}\n","import type { DmdDroppedEventDiagnostic, DmdDroppedEventType } from '../core/diagnostics';\nimport type {\n DmdBrowserClient,\n DmdBrowserConfig,\n DmdConsentInput,\n DmdEventOptions,\n DmdHealthStatus\n} from '../core/types';\nimport { DriveMetaDataSDK } from './core/DriveMetaDataSDK';\n\nlet singleton: DriveMetaDataSDK | undefined;\nlet publicSingleton: DmdBrowserClient | undefined;\nlet droppedEvents = 0;\nlet lastError: string | undefined;\nlet lastDroppedEvent: DmdDroppedEventDiagnostic | undefined;\n\nfunction createPublicClient(instance: DriveMetaDataSDK): DmdBrowserClient {\n return {\n track(event, properties, options) {\n instance.trackEvent(event, properties, options);\n },\n identify(userId, traits, options) {\n instance.identify(userId, traits, options);\n },\n page(name, properties, options) {\n instance.page(name, properties, options);\n },\n group(groupId, traits, options) {\n instance.group(groupId, traits, options);\n },\n alias(previousId, userId, options) {\n instance.alias(previousId, userId, options);\n },\n async flush() {\n await instance.flush();\n },\n reset() {\n instance.reset();\n singleton = undefined;\n publicSingleton = undefined;\n },\n setConsent(consent) {\n instance.setConsent(consent);\n },\n getHealth() {\n return instance.getHealth();\n }\n };\n}\n\nfunction setSingleton(instance: DriveMetaDataSDK): DmdBrowserClient {\n singleton = instance;\n publicSingleton = createPublicClient(instance);\n return publicSingleton;\n}\n\nfunction recordDroppedEvent(type: DmdDroppedEventType, event?: string): void {\n droppedEvents += 1;\n lastDroppedEvent = {\n type,\n reason: 'not_initialized',\n timestamp: new Date().toISOString()\n };\n if (event !== undefined) {\n lastDroppedEvent.event = event;\n }\n lastError = `DMD SDK ${type} called before initialization`;\n}\n\nexport function initDmdSDK(config: DmdBrowserConfig): DmdBrowserClient {\n if (publicSingleton) {\n return publicSingleton;\n }\n\n try {\n const instance = new DriveMetaDataSDK(config);\n return setSingleton(instance);\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n}\n\nexport function getDmdSDK(): DmdBrowserClient | undefined {\n return publicSingleton;\n}\n\nexport function track(event: string, properties?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('track', event);\n return;\n }\n sdk.track(event, properties, options);\n}\n\nexport function identify(userId: string, traits?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('identify');\n return;\n }\n sdk.identify(userId, traits, options);\n}\n\nexport function page(name?: string, properties?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('page');\n return;\n }\n sdk.page(name, properties, options);\n}\n\nexport function group(groupId: string, traits?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('group');\n return;\n }\n sdk.group(groupId, traits, options);\n}\n\nexport function alias(previousId: string, userId: string, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('alias');\n return;\n }\n sdk.alias(previousId, userId, options);\n}\n\nexport async function flush(): Promise<void> {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('flush');\n return;\n }\n await sdk.flush();\n}\n\nexport function reset(): void {\n singleton?.reset?.();\n singleton = undefined;\n publicSingleton = undefined;\n}\n\nexport function setConsent(consent: DmdConsentInput): void {\n getDmdSDK()?.setConsent(consent);\n}\n\nexport const consent = {\n update(state: DmdConsentInput): void {\n setConsent(state);\n }\n};\n\nexport async function ready(): Promise<DmdBrowserClient | undefined> {\n return getDmdSDK();\n}\n\nexport function getDmdHealth(): DmdHealthStatus {\n if (singleton) {\n return singleton.getHealth();\n }\n\n const health: DmdHealthStatus = {\n initialized: false,\n consent: 'pending',\n queueSize: 0,\n offline: false,\n droppedEvents\n };\n\n if (lastError !== undefined) {\n health.lastError = lastError;\n }\n if (lastDroppedEvent !== undefined) {\n health.lastDroppedEvent = lastDroppedEvent;\n }\n\n return health;\n}\n\nexport function resetDmdSDKForTests(): void {\n singleton?.reset();\n singleton = undefined;\n publicSingleton = undefined;\n droppedEvents = 0;\n lastError = undefined;\n lastDroppedEvent = undefined;\n}\n","import { InjectionToken } from '@angular/core';\nimport type { DmdBrowserConfig } from '../core/types';\n\nexport const DMD_BROWSER_CONFIG = new InjectionToken<DmdBrowserConfig>('DMD_BROWSER_CONFIG');\n","import type { EnvironmentProviders } from '@angular/core';\nimport { makeEnvironmentProviders } from '@angular/core';\nimport type { DmdBrowserConfig } from '../core/types';\nimport { DMD_BROWSER_CONFIG } from './tokens';\n\nexport function provideDmdAnalytics(config: DmdBrowserConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: DMD_BROWSER_CONFIG,\n useValue: config\n }\n ]);\n}\n"],"mappings":"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","names":["page","createId","lastError"]}
|
|
1
|
+
{"version":3,"sources":["../../src/angular/dmd-analytics.service.ts","../../src/browser/core/browser-config.ts","../../src/core/uuid.ts","../../src/core/backend-payload.ts","../../src/core/backend-schema.ts","../../src/core/consent.ts","../../src/core/event-schema.ts","../../src/core/environment.ts","../../src/core/privacy.ts","../../src/core/attribution.ts","../../src/browser/core/attribution.ts","../../src/browser/core/autocapture.ts","../../src/core/payload-size.ts","../../src/browser/core/delivery.ts","../../src/browser/core/identity.ts","../../src/browser/core/persistence.ts","../../src/browser/core/session.ts","../../src/browser/core/DriveMetaDataSDK.ts","../../src/browser/client.ts","../../src/angular/tokens.ts","../../src/angular/provider.ts"],"sourcesContent":["import { Inject, Injectable, Optional } from '@angular/core';\nimport {\n alias,\n flush,\n getDmdHealth,\n getDmdSDK,\n group,\n identify,\n initDmdSDK,\n page,\n reset,\n setConsent,\n track\n} from '../browser/client';\nimport type { DmdBrowserClient, DmdBrowserConfig, DmdConsentInput, DmdHealthStatus } from '../core/types';\nimport { DMD_BROWSER_CONFIG } from './tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class DmdAnalyticsService {\n constructor(@Optional() @Inject(DMD_BROWSER_CONFIG) private readonly config?: DmdBrowserConfig) {}\n\n init(config: DmdBrowserConfig = this.requireConfig()): DmdBrowserClient {\n return initDmdSDK(config);\n }\n\n getClient(): DmdBrowserClient | undefined {\n return getDmdSDK();\n }\n\n track(event: string, properties?: Record<string, unknown>): void {\n track(event, properties);\n }\n\n identify(userId: string, traits?: Record<string, unknown>): void {\n identify(userId, traits);\n }\n\n page(name?: string, properties?: Record<string, unknown>): void {\n page(name, properties);\n }\n\n group(groupId: string, traits?: Record<string, unknown>): void {\n group(groupId, traits);\n }\n\n alias(previousId: string, userId: string): void {\n alias(previousId, userId);\n }\n\n async flush(): Promise<void> {\n await flush();\n }\n\n setConsent(consent: DmdConsentInput): void {\n setConsent(consent);\n }\n\n reset(): void {\n reset();\n }\n\n getHealth(): DmdHealthStatus {\n return getDmdHealth();\n }\n\n private requireConfig(): DmdBrowserConfig {\n if (!this.config) {\n throw new Error('DMD Angular SDK requires config when init is called');\n }\n\n return this.config;\n }\n}\n","import type { DmdBrowserConfig } from '../../core/types';\n\nexport type DmdBrowserConfigInput = DmdBrowserConfig;\nexport type DmdNormalizedBrowserConfig = DmdBrowserConfig & {\n clientId: string;\n workspaceId: string;\n appId: string;\n};\n\nfunction setIfDefined<T extends object, K extends PropertyKey>(\n target: T,\n key: K,\n value: unknown\n): void {\n if (value !== undefined) {\n (target as Record<PropertyKey, unknown>)[key] = value;\n }\n}\n\nexport function normalizeBrowserConfig(input: DmdBrowserConfigInput): DmdNormalizedBrowserConfig {\n const normalized: DmdNormalizedBrowserConfig = {\n ...input,\n clientId: input.clientId ?? '',\n workspaceId: input.workspaceId ?? '',\n appId: input.appId ?? ''\n };\n\n setIfDefined(normalized, 'apiHost', input.apiHost);\n setIfDefined(normalized, 'capturePageview', input.capturePageview);\n setIfDefined(normalized, 'capturePageleave', input.capturePageleave);\n setIfDefined(normalized, 'captureDeadClicks', input.captureDeadClicks);\n setIfDefined(normalized, 'crossSubdomainCookie', input.crossSubdomainCookie);\n setIfDefined(normalized, 'sessionIdleTimeoutSeconds', input.sessionIdleTimeoutSeconds);\n setIfDefined(normalized, 'schemaValidation', input.schemaValidation);\n setIfDefined(normalized, 'beforeSend', input.beforeSend);\n setIfDefined(normalized, 'persistence', input.disablePersistence === true ? 'none' : input.persistence);\n\n return normalized;\n}\n","export function createUuid(): string {\n const cryptoApi = globalThis.crypto;\n if (typeof cryptoApi?.randomUUID === 'function') {\n return cryptoApi.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (typeof cryptoApi?.getRandomValues === 'function') {\n cryptoApi.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n }\n\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, byte => byte.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\nexport function isUuid(value: unknown): value is string {\n return typeof value === 'string'\n && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nexport function ensureUuid(value?: string): string {\n return isUuid(value) ? value : createUuid();\n}\n","import { ensureUuid } from './uuid';\n\nfunction formatUtcTimestamp(value: unknown): string {\n const date =\n typeof value === 'string' || typeof value === 'number' || value instanceof Date\n ? new Date(value)\n : new Date();\n const safeDate = Number.isNaN(date.getTime()) ? new Date() : date;\n return safeDate.toISOString().replace('T', ' ').slice(0, 19);\n}\n\nfunction cleanObject(value: unknown): unknown {\n if (Array.isArray(value)) {\n const cleaned = value\n .map(item => cleanObject(item))\n .filter(item => item !== null && item !== undefined && item !== '');\n return cleaned.length > 0 ? cleaned : undefined;\n }\n\n if (value && typeof value === 'object') {\n const cleaned = Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .map(([key, item]) => [key, cleanObject(item)])\n .filter(([, item]) => {\n if (item === null || item === undefined || item === '') return false;\n if (typeof item === 'object' && !Array.isArray(item) && Object.keys(item).length === 0) return false;\n return true;\n })\n );\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n }\n\n return value;\n}\n\nexport function createBackendCollectorPayload(input: Record<string, unknown>): Record<string, unknown> {\n const eventData = input.eventData && typeof input.eventData === 'object'\n ? input.eventData as Record<string, unknown>\n : {};\n const page = eventData.page && typeof eventData.page === 'object'\n ? eventData.page as Record<string, unknown>\n : {};\n const timestamp = formatUtcTimestamp(eventData.timestamp ?? input.timestamp);\n const normalizedEventData = {\n ...eventData,\n timestamp,\n requestSentAt: formatUtcTimestamp(eventData.requestSentAt ?? input.requestSentAt ?? timestamp),\n requestReceivedAt: formatUtcTimestamp(eventData.requestReceivedAt ?? input.requestReceivedAt ?? timestamp)\n };\n\n const metaData: Record<string, unknown> = {\n ...normalizedEventData,\n requestId: ensureUuid(typeof input.requestId === 'string' ? input.requestId : undefined),\n timestamp,\n eventType: input.eventType,\n requestFrom: input.requestFrom ?? '3',\n clientId: input.clientId,\n workspaceId: input.workspaceId,\n token: input.token,\n anonymousId: ensureUuid(\n typeof eventData.anonymousId === 'string'\n ? eventData.anonymousId\n : typeof input.anonymousId === 'string'\n ? input.anonymousId\n : undefined\n ),\n sessionId: ensureUuid(\n typeof eventData.sessionId === 'string'\n ? eventData.sessionId\n : typeof input.sessionId === 'string'\n ? input.sessionId\n : undefined\n ),\n ua: input.ua,\n appDetails: { app_id: input.appId },\n page: { ...page, url: page.url ?? input.pageUrl },\n requestSentAt: normalizedEventData.requestSentAt,\n requestReceivedAt: normalizedEventData.requestReceivedAt\n };\n\n const payload = { metaData };\n\n return cleanObject(payload) as Record<string, unknown>;\n}\n","const requiredMetaDataFields = [\n 'requestId',\n 'timestamp',\n 'eventType',\n 'requestFrom',\n 'clientId',\n 'workspaceId',\n 'anonymousId',\n 'sessionId'\n] as const;\n\nexport interface DmdBackendPayloadValidation {\n ok: boolean;\n errors: string[];\n}\n\nfunction isPresent(value: unknown): boolean {\n return value !== null && value !== undefined && value !== '';\n}\n\nexport function validateBackendCollectorPayload(payload: Record<string, unknown>): DmdBackendPayloadValidation {\n const errors: string[] = [];\n const metaData = payload.metaData;\n\n if (!metaData || typeof metaData !== 'object' || Array.isArray(metaData)) {\n return {\n ok: false,\n errors: ['metaData is required']\n };\n }\n\n const metadataRecord = metaData as Record<string, unknown>;\n for (const field of requiredMetaDataFields) {\n if (!isPresent(metadataRecord[field])) {\n errors.push(`metaData.${field} is required`);\n }\n }\n\n if (isPresent(metadataRecord.eventType) && typeof metadataRecord.eventType !== 'string') {\n errors.push('metaData.eventType must be a string');\n }\n\n return {\n ok: errors.length === 0,\n errors\n };\n}\n","import type {\n DmdConsentInput,\n DmdConsentPurpose,\n DmdConsentState,\n DmdPurposeConsent\n} from './types';\n\nexport type DmdResolvedConsent = Record<DmdConsentPurpose, DmdConsentState>;\n\nconst purposes: DmdConsentPurpose[] = [\n 'analytics',\n 'advertising',\n 'personalization',\n 'functional',\n 'saleOfData'\n];\n\nfunction normalizeConsentValue(value: unknown): DmdConsentState {\n if (value === true) return 'granted';\n if (value === false) return 'denied';\n if (value === 'granted' || value === 'denied' || value === 'pending') return value;\n return 'pending';\n}\n\nexport function normalizeConsent(input: DmdConsentInput | undefined): DmdResolvedConsent {\n const defaultValue = normalizeConsentValue(input ?? 'pending');\n const resolved = Object.fromEntries(\n purposes.map(purpose => [purpose, defaultValue])\n ) as DmdResolvedConsent;\n\n if (input && typeof input === 'object') {\n for (const purpose of purposes) {\n const value = input[purpose];\n if (value !== undefined) {\n resolved[purpose] = normalizeConsentValue(value);\n }\n }\n }\n\n return resolved;\n}\n\nexport function mergeConsent(current: DmdResolvedConsent, update: DmdPurposeConsent): DmdResolvedConsent {\n const next = { ...current };\n for (const [purpose, value] of Object.entries(update) as Array<[DmdConsentPurpose, DmdConsentState]>) {\n next[purpose] = normalizeConsentValue(value);\n }\n return next;\n}\n\nexport function canCollectPurpose(consent: DmdResolvedConsent, purpose: DmdConsentPurpose): boolean {\n return consent[purpose] === 'granted';\n}\n","const reservedKeys = new Set(['messageId', 'timestamp', 'type', 'event', 'anonymousId', 'userId', 'context']);\n\nexport interface DmdSchemaValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nexport function validateEventEnvelope(\n envelope: {\n type?: unknown;\n event?: unknown;\n properties?: Record<string, unknown>;\n messageId?: unknown;\n timestamp?: unknown;\n },\n options: { mode?: 'off' | 'warn' | 'strict' } = {}\n): DmdSchemaValidationResult {\n if (options.mode === 'off') return { ok: true, errors: [] };\n const errors: string[] = [];\n if (typeof envelope.type !== 'string') errors.push('type must be a string');\n if (envelope.type === 'track' && typeof envelope.event !== 'string') {\n errors.push('track event must include event name');\n }\n if (typeof envelope.messageId !== 'string') errors.push('messageId must be a string');\n if (typeof envelope.timestamp !== 'string') errors.push('timestamp must be an ISO string');\n for (const key of Object.keys(envelope.properties ?? {})) {\n if (reservedKeys.has(key)) errors.push(`properties.${key} is reserved`);\n }\n return { ok: errors.length === 0, errors };\n}\n","export function isBrowserRuntime(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function getBrowserWindow(): Window | undefined {\n return typeof window === 'undefined' ? undefined : window;\n}\n","const sensitiveKeys = new Set([\n 'email',\n 'phone',\n 'mobile',\n 'address',\n 'address1',\n 'address2',\n 'first_name',\n 'last_name',\n 'name',\n 'token',\n 'secret',\n 'password',\n 'session',\n 'cookie'\n]);\n\nexport function redactUrl(\n url: string,\n allowQueryKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']\n): string {\n const parsed = new URL(url, 'https://placeholder.local');\n for (const key of Array.from(parsed.searchParams.keys())) {\n if (!allowQueryKeys.includes(key)) {\n parsed.searchParams.set(key, '[REDACTED]');\n }\n }\n return url.startsWith('http') ? parsed.toString() : `${parsed.pathname}${parsed.search}`;\n}\n\nfunction sanitizeValue(value: unknown, allow: Set<string>, path: string[] = []): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sanitizeValue(item, allow, path));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => {\n const lowerKey = key.toLowerCase();\n const lowerPath = path.map(item => item.toLowerCase());\n const isEcommerceItemName = lowerKey === 'name'\n && lowerPath.includes('ecommerce')\n && lowerPath.includes('items');\n return isEcommerceItemName || !sensitiveKeys.has(lowerKey) || allow.has(lowerKey);\n })\n .map(([key, nestedValue]) => [key, sanitizeValue(nestedValue, allow, [...path, key])])\n );\n }\n\n return value;\n}\n\nexport function sanitizeProperties(input: Record<string, unknown>, allowRawKeys: string[] = []): Record<string, unknown> {\n const allow = new Set(allowRawKeys.map(key => key.toLowerCase()));\n return sanitizeValue(input, allow) as Record<string, unknown>;\n}\n","export interface DmdClickIds {\n google?: string;\n facebook?: string;\n snapchat?: string;\n linkedin?: string;\n}\n\nexport const dmdUtmKeys = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_term',\n 'utm_content',\n 'utm_id'\n] as const;\n\nexport const dmdCampaignKeys = ['campaign_id', 'ad_id'] as const;\n\nexport const dmdClickIdSources = [\n ['gclid', 2],\n ['fbclid', 3],\n ['ScCid', 1],\n ['li_fat_id', 4]\n] as const;\n\nexport function extractClickIds(url: string): DmdClickIds {\n const params = new URL(url, 'https://placeholder.local').searchParams;\n const ids: DmdClickIds = {};\n const google = params.get('gclid');\n const facebook = params.get('fbclid');\n const snapchat = params.get('ScCid');\n const linkedin = params.get('li_fat_id');\n if (google) ids.google = google;\n if (facebook) ids.facebook = facebook;\n if (snapchat) ids.snapchat = snapchat;\n if (linkedin) ids.linkedin = linkedin;\n return ids;\n}\n\nexport function cleanAttributionRecord(record: Record<string, unknown>): Record<string, unknown> | undefined {\n const cleaned = Object.fromEntries(\n Object.entries(record).filter(([, value]) => value !== null && value !== undefined && value !== '')\n );\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nexport function mergeAttributionRecords(\n explicitProperties: Record<string, unknown>,\n stored: {\n attributionData?: Record<string, unknown>;\n utmParameter?: Record<string, unknown>;\n }\n): Record<string, unknown> {\n const attributionData = objectValue(explicitProperties.attributionData);\n const utmParameter = objectValue(explicitProperties.utmParameter);\n\n return {\n ...explicitProperties,\n ...(stored.attributionData || attributionData\n ? { attributionData: { ...(stored.attributionData ?? {}), ...(attributionData ?? {}) } }\n : {}),\n ...(stored.utmParameter || utmParameter\n ? { utmParameter: { ...(stored.utmParameter ?? {}), ...(utmParameter ?? {}) } }\n : {})\n };\n}\n","import { getBrowserWindow } from '../../core/environment';\nimport {\n cleanAttributionRecord,\n dmdCampaignKeys,\n dmdClickIdSources,\n dmdUtmKeys,\n extractClickIds,\n mergeAttributionRecords,\n type DmdClickIds\n} from '../../core/attribution';\nimport type { DmdBrowserPersistence } from './persistence';\n\nexport { extractClickIds, type DmdClickIds };\n\nexport function safeParseAttributionRecord(value: string | null): unknown | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction getCurrentUrl(): string | undefined {\n return getBrowserWindow()?.location?.href;\n}\n\nfunction getCookie(name: string): string | undefined {\n const cookie = getBrowserWindow()?.document?.cookie;\n if (!cookie) return undefined;\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const match = new RegExp(`(?:^|; )${escapedName}=([^;]*)`).exec(cookie);\n return match ? decodeURIComponent(match[1] ?? '') : undefined;\n}\n\nfunction getParams(url: string): URLSearchParams {\n return new URL(url, 'https://placeholder.local').searchParams;\n}\n\nfunction setIfPresent(persistence: DmdBrowserPersistence, key: string, value: string | null): void {\n if (value !== null && value !== '') {\n persistence.setItem(key, value);\n }\n}\n\nfunction getStoredString(persistence: DmdBrowserPersistence, key: string): string | undefined {\n const value = persistence.getItem(key);\n return value === null || value === '' ? undefined : value;\n}\n\nfunction getStoredNumberOrString(persistence: DmdBrowserPersistence, key: string): number | string | undefined {\n const value = getStoredString(persistence, key);\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? value : parsed;\n}\n\nexport function captureAttributionFromUrl(persistence: DmdBrowserPersistence, url = getCurrentUrl()): void {\n if (!url) return;\n const params = getParams(url);\n\n for (const key of dmdUtmKeys) {\n setIfPresent(persistence, key, params.get(key));\n }\n for (const key of dmdCampaignKeys) {\n setIfPresent(persistence, key, params.get(key));\n }\n\n for (const [param, sdkPubId] of dmdClickIdSources) {\n const value = params.get(param);\n if (value) {\n persistence.setItem('unique_id', value);\n persistence.setItem('sdk_pub_id', String(sdkPubId));\n }\n }\n}\n\nexport function getStoredAttributionData(persistence: DmdBrowserPersistence): Record<string, unknown> | undefined {\n return cleanAttributionRecord({\n unique_id: getStoredString(persistence, 'unique_id'),\n sdk_pub_id: getStoredNumberOrString(persistence, 'sdk_pub_id'),\n fbc: getStoredString(persistence, 'fbc') ?? getCookie('_fbc'),\n fbp: getStoredString(persistence, 'fbp') ?? getCookie('_fbp'),\n campaign_id: getStoredString(persistence, 'campaign_id'),\n ad_id: getStoredString(persistence, 'ad_id')\n });\n}\n\nexport function getStoredUtmParameter(persistence: DmdBrowserPersistence): Record<string, unknown> | undefined {\n return cleanAttributionRecord(Object.fromEntries(dmdUtmKeys.map(key => [key, getStoredString(persistence, key)])));\n}\n\nexport function mergeStoredAttribution(\n properties: Record<string, unknown>,\n persistence: DmdBrowserPersistence\n): Record<string, unknown> {\n const stored: {\n attributionData?: Record<string, unknown>;\n utmParameter?: Record<string, unknown>;\n } = {};\n const attributionData = getStoredAttributionData(persistence);\n const utmParameter = getStoredUtmParameter(persistence);\n if (attributionData !== undefined) stored.attributionData = attributionData;\n if (utmParameter !== undefined) stored.utmParameter = utmParameter;\n return mergeAttributionRecords(properties, stored);\n}\n\nexport function shouldDecorateLink(href: string, allowedDomains: string[]): boolean {\n const base = typeof window !== 'undefined' ? window.location.href : 'https://placeholder.local';\n const host = new URL(href, base).hostname;\n return allowedDomains.includes(host);\n}\n","import type { getBrowserWindow } from '../../core/environment';\n\ntype BrowserWindow = NonNullable<ReturnType<typeof getBrowserWindow>>;\n\nexport interface DmdAutocaptureController {\n cleanup(): void;\n}\n\nexport function installAutocapture(config: {\n browserWindow: BrowserWindow;\n capturePageview: boolean;\n capturePageleave: boolean;\n pageviewDelayMs?: number;\n onPageView: () => void;\n onPageLeave: () => void;\n onRouteChange?: () => void;\n}): DmdAutocaptureController {\n const trackedPageUrls = new Set<string>();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const pageviewDelayMs = config.pageviewDelayMs ?? 500;\n const history = config.browserWindow.history;\n const originalPushState = history?.pushState;\n const originalReplaceState = history?.replaceState;\n\n function clearTimer(timer: ReturnType<typeof setTimeout>): void {\n timers.delete(timer);\n clearTimeout(timer);\n }\n\n function canonicalUrl(): string {\n return config.browserWindow.location.href;\n }\n\n function trackCurrentPageview(): void {\n if (!config.capturePageview) return;\n const url = canonicalUrl();\n if (trackedPageUrls.has(url)) return;\n trackedPageUrls.add(url);\n config.onPageView();\n }\n\n function schedulePageview(delayMs: number): void {\n if (!config.capturePageview) return;\n const timer = setTimeout(() => {\n timers.delete(timer);\n trackCurrentPageview();\n }, delayMs);\n timers.add(timer);\n }\n\n function handleRouteChange(): void {\n config.onRouteChange?.();\n trackCurrentPageview();\n }\n\n function wrapHistoryMethod(method: 'pushState' | 'replaceState'): void {\n if (!history) return;\n const original = history[method];\n if (typeof original !== 'function') return;\n history[method] = function wrappedHistoryMethod(this: History, ...args: Parameters<History['pushState']>) {\n const result = original.apply(this, args);\n const timer = setTimeout(() => {\n timers.delete(timer);\n handleRouteChange();\n }, 0);\n timers.add(timer);\n return result;\n } as History[typeof method];\n }\n\n function handlePopOrHashChange(): void {\n handleRouteChange();\n }\n\n function handlePageLeave(): void {\n if (config.capturePageleave) {\n config.onPageLeave();\n }\n }\n\n schedulePageview(pageviewDelayMs);\n wrapHistoryMethod('pushState');\n wrapHistoryMethod('replaceState');\n const canListen = typeof config.browserWindow.addEventListener === 'function'\n && typeof config.browserWindow.removeEventListener === 'function';\n if (canListen) {\n config.browserWindow.addEventListener('popstate', handlePopOrHashChange);\n config.browserWindow.addEventListener('hashchange', handlePopOrHashChange);\n config.browserWindow.addEventListener('beforeunload', handlePageLeave);\n }\n\n return {\n cleanup() {\n for (const timer of Array.from(timers)) {\n clearTimer(timer);\n }\n if (history && originalPushState) history.pushState = originalPushState;\n if (history && originalReplaceState) history.replaceState = originalReplaceState;\n if (canListen) {\n config.browserWindow.removeEventListener('popstate', handlePopOrHashChange);\n config.browserWindow.removeEventListener('hashchange', handlePopOrHashChange);\n config.browserWindow.removeEventListener('beforeunload', handlePageLeave);\n }\n }\n };\n}\n","export type DmdPayloadSizePolicy = 'drop' | 'truncate';\n\nexport interface DmdPayloadSizePolicyOptions {\n maxPayloadBytes?: number;\n payloadSizePolicy?: DmdPayloadSizePolicy;\n payloadTruncateStringLength?: number;\n}\n\nexport type DmdPayloadSizePolicyResult =\n | { ok: true; payload: Record<string, unknown>; truncated: boolean }\n | { ok: false; reason: 'payload_too_large'; messageId?: string };\n\nconst preserveStringKeys = new Set([\n 'requestId',\n 'eventType',\n 'requestFrom',\n 'clientId',\n 'workspaceId',\n 'anonymousId',\n 'sessionId',\n 'token'\n]);\n\nexport function payloadByteLength(payload: Record<string, unknown>): number {\n const serialized = JSON.stringify(payload);\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(serialized).length;\n }\n return serialized.length;\n}\n\nfunction clonePayload(payload: Record<string, unknown>): Record<string, unknown> | undefined {\n try {\n return JSON.parse(JSON.stringify(payload)) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction truncateValue(value: unknown, truncateStringLength: number, key?: string): unknown {\n if (typeof value === 'string') {\n if (key && preserveStringKeys.has(key)) return value;\n if (value.length <= truncateStringLength) return value;\n return `${value.slice(0, truncateStringLength)}...[TRUNCATED]`;\n }\n if (Array.isArray(value)) {\n return value.map(item => truncateValue(item, truncateStringLength));\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([childKey, childValue]) => [\n childKey,\n truncateValue(childValue, truncateStringLength, childKey)\n ])\n );\n }\n return value;\n}\n\nfunction markPayloadTruncated(payload: Record<string, unknown>): Record<string, unknown> {\n if (payload.metaData && typeof payload.metaData === 'object' && !Array.isArray(payload.metaData)) {\n return {\n ...payload,\n metaData: {\n ...(payload.metaData as Record<string, unknown>),\n payloadTruncated: true\n }\n };\n }\n return {\n ...payload,\n payloadTruncated: true\n };\n}\n\nfunction truncatePayload(payload: Record<string, unknown>, truncateStringLength: number): Record<string, unknown> | undefined {\n const cloned = clonePayload(payload);\n if (!cloned) return undefined;\n return markPayloadTruncated(truncateValue(cloned, truncateStringLength) as Record<string, unknown>);\n}\n\nexport function getPayloadMessageId(payload: Record<string, unknown>): string | undefined {\n const value = (payload.metaData as Record<string, unknown> | undefined)?.requestId ?? payload.messageId;\n return value === undefined ? undefined : String(value);\n}\n\nexport function preparePayloadForSizePolicy(\n payload: Record<string, unknown>,\n options: DmdPayloadSizePolicyOptions = {}\n): DmdPayloadSizePolicyResult {\n const maxPayloadBytes = options.maxPayloadBytes ?? 64_000;\n const payloadSizePolicy = options.payloadSizePolicy ?? 'drop';\n const payloadTruncateStringLength = options.payloadTruncateStringLength ?? 1_024;\n\n if (payloadByteLength(payload) <= maxPayloadBytes) {\n return { ok: true, payload, truncated: false };\n }\n\n if (payloadSizePolicy === 'truncate') {\n const truncatedPayload = truncatePayload(payload, payloadTruncateStringLength);\n if (truncatedPayload && payloadByteLength(truncatedPayload) <= maxPayloadBytes) {\n return { ok: true, payload: truncatedPayload, truncated: true };\n }\n }\n\n const messageId = getPayloadMessageId(payload);\n return messageId === undefined\n ? { ok: false, reason: 'payload_too_large' }\n : { ok: false, reason: 'payload_too_large', messageId };\n}\n","import {\n getPayloadMessageId,\n preparePayloadForSizePolicy,\n type DmdPayloadSizePolicy\n} from '../../core/payload-size';\n\nexport interface DmdQueuedRecord {\n messageId: string;\n savedAt: number;\n attempts: number;\n lastError?: string;\n payload: Record<string, unknown>;\n}\n\nexport interface DmdDeliveryDiagnostics {\n queued: number;\n inFlight: number;\n dropped: Array<{ messageId?: string; reason: string; timestamp: string }>;\n lastError?: string;\n}\n\nexport interface DmdDeliveryManager {\n send(payload: Record<string, unknown>): Promise<void>;\n flushQueue(): Promise<void>;\n clearQueue(reason: string): void;\n enqueueForTests(record: DmdQueuedRecord): void;\n flushExpired(): void;\n acquireFlushLease(): boolean;\n releaseFlushLease(): void;\n getDiagnostics(): DmdDeliveryDiagnostics;\n}\n\nexport interface DmdDeliveryStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): unknown;\n removeItem(key: string): unknown;\n}\n\nfunction createId(prefix: string): string {\n return `${prefix}_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return JSON.stringify(value);\n }\n return JSON.stringify(\n Object.fromEntries(\n Object.entries(value as Record<string, unknown>).sort(([left], [right]) => left.localeCompare(right))\n )\n );\n}\n\nfunction createIdempotencyKey(payload: Record<string, unknown>, messageId: string): string {\n const metaData = payload.metaData as Record<string, unknown> | undefined;\n const event = String(metaData?.eventType ?? payload.event ?? payload.type ?? 'event');\n const properties = (metaData ?? payload.properties) as Record<string, unknown> | undefined;\n const orderId = properties?.orderId ?? properties?.order_id ?? properties?.transaction_id;\n if (orderId !== undefined) return `${event}:${String(orderId)}`;\n return `${event}:${stableStringify(properties ?? {}) || messageId}`;\n}\n\nexport function createDeliveryManager(config: {\n endpoint: string;\n fetch?: typeof fetch;\n queueTtlMs?: number;\n maxQueueSize?: number;\n storage?: DmdDeliveryStorage;\n queueKey?: string;\n lockKey?: string;\n lockTtlMs?: number;\n tabId?: string;\n retryDelayMs?: number;\n maxRetryDelayMs?: number;\n maxPayloadBytes?: number;\n payloadSizePolicy?: DmdPayloadSizePolicy;\n payloadTruncateStringLength?: number;\n useBeacon?: boolean;\n batchSize?: number;\n onDrop?: (event: { messageId?: string; reason: string; timestamp: string }) => void;\n onError?: (error: Error) => void;\n}): DmdDeliveryManager {\n const queue: DmdQueuedRecord[] = [];\n const diagnostics: DmdDeliveryDiagnostics = { queued: 0, inFlight: 0, dropped: [] };\n const maxQueueSize = config.maxQueueSize ?? 100;\n const queueKey = config.queueKey ?? 'dmd_delivery_queue';\n const lockKey = config.lockKey ?? 'dmd_delivery_flush_lock';\n const lockTtlMs = config.lockTtlMs ?? 5_000;\n const tabId = config.tabId ?? createId('tab');\n const batchSize = config.batchSize ?? 25;\n function recordDrop(event: { messageId?: string; reason: string; timestamp: string }): void {\n diagnostics.dropped.push(event);\n config.onDrop?.(event);\n }\n\n function recordError(error: Error): void {\n diagnostics.lastError = error.message;\n config.onError?.(error);\n }\n\n function preparePayloadForSend(payload: Record<string, unknown>): Record<string, unknown> | undefined {\n const sizePolicyOptions: {\n maxPayloadBytes?: number;\n payloadSizePolicy?: DmdPayloadSizePolicy;\n payloadTruncateStringLength?: number;\n } = {};\n if (config.maxPayloadBytes !== undefined) sizePolicyOptions.maxPayloadBytes = config.maxPayloadBytes;\n if (config.payloadSizePolicy !== undefined) sizePolicyOptions.payloadSizePolicy = config.payloadSizePolicy;\n if (config.payloadTruncateStringLength !== undefined) {\n sizePolicyOptions.payloadTruncateStringLength = config.payloadTruncateStringLength;\n }\n const prepared = preparePayloadForSizePolicy(payload, sizePolicyOptions);\n if (prepared.ok) return prepared.payload;\n\n const diagnostic: { messageId?: string; reason: string; timestamp: string } = {\n reason: prepared.reason,\n timestamp: new Date().toISOString()\n };\n if (prepared.messageId !== undefined) diagnostic.messageId = prepared.messageId;\n recordDrop(diagnostic);\n return undefined;\n }\n\n function recordStorageUnavailable(): void {\n recordDrop({\n reason: 'storage_unavailable',\n timestamp: new Date().toISOString()\n });\n }\n\n function safeGetItem(key: string): string | null {\n try {\n return config.storage?.getItem(key) ?? null;\n } catch {\n recordStorageUnavailable();\n return null;\n }\n }\n\n function safeSetItem(key: string, value: string): boolean {\n try {\n config.storage?.setItem(key, value);\n return true;\n } catch {\n recordStorageUnavailable();\n return false;\n }\n }\n\n function safeRemoveItem(key: string): boolean {\n try {\n config.storage?.removeItem(key);\n return true;\n } catch {\n recordStorageUnavailable();\n return false;\n }\n }\n\n function persistQueue(): void {\n if (!config.storage) return;\n if (queue.length === 0) {\n safeRemoveItem(queueKey);\n return;\n }\n safeSetItem(queueKey, JSON.stringify(queue));\n }\n\n function loadQueue(): void {\n if (!config.storage) return;\n const rawQueue = safeGetItem(queueKey);\n if (!rawQueue) return;\n try {\n const records = JSON.parse(rawQueue) as DmdQueuedRecord[];\n queue.splice(0, queue.length, ...records.filter(record => record && typeof record.messageId === 'string'));\n diagnostics.queued = queue.length;\n } catch {\n safeRemoveItem(queueKey);\n recordDrop({\n reason: 'queue_corrupt',\n timestamp: new Date().toISOString()\n });\n }\n }\n\n function enqueue(record: DmdQueuedRecord): void {\n queue.push(record);\n while (queue.length > maxQueueSize) {\n const dropped = queue.shift();\n const diagnostic: { messageId?: string; reason: string; timestamp: string } = {\n reason: 'queue_limit_exceeded',\n timestamp: new Date().toISOString()\n };\n if (dropped?.messageId !== undefined) diagnostic.messageId = dropped.messageId;\n recordDrop(diagnostic);\n }\n diagnostics.queued = queue.length;\n persistQueue();\n }\n\n function withEnvelope(payload: Record<string, unknown>): Record<string, unknown> {\n const metaData = payload.metaData as Record<string, unknown> | undefined;\n const messageId = String(metaData?.requestId ?? payload.messageId ?? createId('msg'));\n if (metaData) {\n return {\n ...payload,\n metaData: {\n ...metaData,\n requestId: messageId\n }\n };\n }\n return {\n ...payload,\n messageId,\n idempotencyKey: String(payload.idempotencyKey ?? createIdempotencyKey(payload, messageId))\n };\n }\n\n function tryBeacon(body: Record<string, unknown>): boolean {\n if (!config.useBeacon) return false;\n const sendBeacon = globalThis.navigator?.sendBeacon;\n if (typeof sendBeacon !== 'function') return false;\n try {\n const blob = new Blob([JSON.stringify(body)], { type: 'application/json' });\n return sendBeacon.call(globalThis.navigator, config.endpoint, blob);\n } catch {\n return false;\n }\n }\n\n async function deliver(body: Record<string, unknown>): Promise<void> {\n if (tryBeacon(body)) return;\n\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new Error('fetch_unavailable');\n }\n\n const response = await fetchImpl(config.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n keepalive: true\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n }\n\n loadQueue();\n\n return {\n async send(payload: Record<string, unknown>): Promise<void> {\n const body = withEnvelope(payload);\n const preparedBody = preparePayloadForSend(body);\n if (!preparedBody) {\n return;\n }\n\n diagnostics.inFlight += 1;\n try {\n await deliver(preparedBody);\n } catch (error) {\n const deliveryError = error instanceof Error ? error : new Error(String(error));\n recordError(deliveryError);\n enqueue({\n messageId: String(getPayloadMessageId(body)),\n savedAt: Date.now(),\n attempts: 1,\n lastError: deliveryError.message,\n payload: preparedBody\n });\n } finally {\n diagnostics.inFlight -= 1;\n diagnostics.queued = queue.length;\n }\n },\n async flushQueue(): Promise<void> {\n this.flushExpired();\n if (queue.length === 0 || !this.acquireFlushLease()) return;\n\n diagnostics.inFlight += 1;\n try {\n let sentInBatch = 0;\n for (let index = 0; index < queue.length && sentInBatch < batchSize;) {\n const record = queue[index];\n if (!record) {\n index += 1;\n continue;\n }\n\n try {\n await deliver(record.payload);\n queue.splice(index, 1);\n sentInBatch += 1;\n persistQueue();\n } catch (error) {\n const deliveryError = error instanceof Error ? error : new Error(String(error));\n record.attempts += 1;\n record.lastError = deliveryError.message;\n recordError(deliveryError);\n index += 1;\n persistQueue();\n break;\n }\n }\n } finally {\n diagnostics.inFlight -= 1;\n diagnostics.queued = queue.length;\n this.releaseFlushLease();\n }\n },\n clearQueue(reason: string): void {\n for (const record of queue) {\n recordDrop({\n messageId: record.messageId,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n queue.splice(0, queue.length);\n diagnostics.queued = 0;\n persistQueue();\n },\n enqueueForTests(record: DmdQueuedRecord): void {\n enqueue(record);\n },\n flushExpired(): void {\n const ttl = config.queueTtlMs ?? 86_400_000;\n const now = Date.now();\n for (let index = queue.length - 1; index >= 0; index -= 1) {\n const record = queue[index];\n if (record && now - record.savedAt > ttl) {\n recordDrop({\n messageId: record.messageId,\n reason: 'queue_ttl_expired',\n timestamp: new Date().toISOString()\n });\n queue.splice(index, 1);\n }\n }\n diagnostics.queued = queue.length;\n persistQueue();\n },\n acquireFlushLease(): boolean {\n if (!config.storage) return true;\n\n const now = Date.now();\n const rawLock = safeGetItem(lockKey);\n let existingLock: { owner?: string; expiresAt?: number } | undefined;\n if (rawLock) {\n try {\n existingLock = JSON.parse(rawLock) as { owner?: string; expiresAt?: number };\n } catch {\n existingLock = undefined;\n }\n }\n\n const lockExpired = !existingLock?.expiresAt || existingLock.expiresAt <= now;\n const lockOwnedByThisTab = existingLock?.owner === tabId;\n if (!existingLock || lockExpired || lockOwnedByThisTab) {\n if (!safeSetItem(lockKey, JSON.stringify({ owner: tabId, expiresAt: now + lockTtlMs }))) {\n return true;\n }\n return true;\n }\n\n return false;\n },\n releaseFlushLease(): void {\n if (!config.storage) return;\n const rawLock = safeGetItem(lockKey);\n if (!rawLock) return;\n\n try {\n const existingLock = JSON.parse(rawLock) as { owner?: string };\n if (existingLock.owner === tabId) {\n safeRemoveItem(lockKey);\n }\n } catch {\n safeRemoveItem(lockKey);\n }\n },\n getDiagnostics(): DmdDeliveryDiagnostics {\n return diagnostics;\n }\n };\n}\n","import { getBrowserWindow } from '../../core/environment';\nimport { createUuid, isUuid } from '../../core/uuid';\nimport type { DmdBrowserPersistence } from './persistence';\n\nconst ANONYMOUS_ID_STORAGE_KEY = 'dmd_anonymous_id';\nconst LEGACY_ANONYMOUS_ID_STORAGE_KEY = 'anonymousId';\n\nfunction getUrlParam(name: string): string | null {\n const href = getBrowserWindow()?.location?.href;\n if (!href) return null;\n try {\n return new URL(href).searchParams.get(name);\n } catch {\n return null;\n }\n}\n\nexport function resolveAnonymousId(persistence: DmdBrowserPersistence): string {\n const urlAnonymousId = getUrlParam('aid');\n if (isUuid(urlAnonymousId)) {\n persistence.setItem(ANONYMOUS_ID_STORAGE_KEY, urlAnonymousId);\n return urlAnonymousId;\n }\n\n const storedAnonymousId = persistence.getItem(ANONYMOUS_ID_STORAGE_KEY);\n if (isUuid(storedAnonymousId)) {\n return storedAnonymousId;\n }\n\n const legacyAnonymousId = persistence.getItem(LEGACY_ANONYMOUS_ID_STORAGE_KEY);\n if (isUuid(legacyAnonymousId)) {\n persistence.setItem(ANONYMOUS_ID_STORAGE_KEY, legacyAnonymousId);\n return legacyAnonymousId;\n }\n\n const anonymousId = createUuid();\n persistence.setItem(ANONYMOUS_ID_STORAGE_KEY, anonymousId);\n return anonymousId;\n}\n\nexport function resetAnonymousId(persistence: DmdBrowserPersistence): string {\n const anonymousId = createUuid();\n persistence.setItem(ANONYMOUS_ID_STORAGE_KEY, anonymousId);\n return anonymousId;\n}\n","import type { DmdPersistenceMode } from '../../core/types';\nimport { getBrowserWindow } from '../../core/environment';\n\nexport interface DmdBrowserPersistence {\n getItem(key: string): string | null;\n setItem(key: string, value: string): boolean;\n removeItem(key: string): void;\n getHealth(): DmdPersistenceHealth;\n}\n\nexport interface DmdPersistenceHealth {\n requested: DmdPersistenceMode;\n cookieFallbackUsed: boolean;\n memoryFallbackUsed: boolean;\n failures: Array<{ backend: string; operation: string; message: string }>;\n}\n\nfunction createPersistenceHealth(requested: DmdPersistenceMode): DmdPersistenceHealth {\n return {\n requested,\n cookieFallbackUsed: false,\n memoryFallbackUsed: requested === 'memory',\n failures: []\n };\n}\n\nfunction recordFailure(\n health: DmdPersistenceHealth,\n backend: string,\n operation: string,\n error: unknown\n): void {\n health.failures.push({\n backend,\n operation,\n message: error instanceof Error ? error.message : String(error)\n });\n if (health.failures.length > 25) {\n health.failures.shift();\n }\n}\n\nfunction createMemoryPersistence(health = createPersistenceHealth('memory')): DmdBrowserPersistence {\n const memory: Record<string, string> = {};\n return {\n getItem(key) {\n return Object.prototype.hasOwnProperty.call(memory, key) ? memory[key] ?? null : null;\n },\n setItem(key, value) {\n memory[key] = value;\n return true;\n },\n removeItem(key) {\n delete memory[key];\n },\n getHealth() {\n return {\n ...health,\n failures: health.failures.map(failure => ({ ...failure }))\n };\n }\n };\n}\n\nfunction getCookie(name: string): string | null {\n const browserWindow = getBrowserWindow();\n const cookie = browserWindow?.document?.cookie;\n if (!cookie) return null;\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const match = new RegExp(`(?:^|; )${escapedName}=([^;]*)`).exec(cookie);\n return match ? decodeURIComponent(match[1] ?? '') : null;\n}\n\nfunction setCookie(name: string, value: string): boolean {\n const browserWindow = getBrowserWindow();\n if (!browserWindow?.document) return false;\n try {\n const expires = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toUTCString();\n const secure = browserWindow.location?.protocol === 'https:' ? '; Secure' : '';\n browserWindow.document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/${secure}; SameSite=Lax`;\n return true;\n } catch {\n return false;\n }\n}\n\nfunction removeCookie(name: string): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow?.document) return;\n browserWindow.document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;\n}\n\nfunction getLocalStorage(): Storage | undefined {\n const browserWindow = getBrowserWindow();\n try {\n return browserWindow?.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction getSessionStorage(): Storage | undefined {\n const browserWindow = getBrowserWindow();\n try {\n return browserWindow?.sessionStorage;\n } catch {\n return undefined;\n }\n}\n\nexport function createBrowserPersistence(mode: DmdPersistenceMode = 'localStorage+cookie'): DmdBrowserPersistence {\n const health = createPersistenceHealth(mode);\n const memory = createMemoryPersistence(health);\n if (mode === 'none') {\n return {\n getItem() {\n return null;\n },\n setItem() {\n return false;\n },\n removeItem() {},\n getHealth() {\n return {\n ...health,\n failures: health.failures.map(failure => ({ ...failure }))\n };\n }\n };\n }\n if (mode === 'memory') return memory;\n\n const primary = mode === 'sessionStorage' ? getSessionStorage() : getLocalStorage();\n const useCookie = mode === 'cookie' || mode === 'localStorage+cookie' || !primary;\n\n return {\n getItem(key) {\n try {\n const stored = primary?.getItem(key);\n if (stored) return stored;\n } catch (error) {\n recordFailure(health, mode === 'sessionStorage' ? 'sessionStorage' : 'localStorage', 'get', error);\n // Fall through to cookie/memory.\n }\n if (useCookie) {\n const cookie = getCookie(key);\n if (cookie) {\n health.cookieFallbackUsed = true;\n return cookie;\n }\n }\n const value = memory.getItem(key);\n if (value !== null) health.memoryFallbackUsed = true;\n return value;\n },\n setItem(key, value) {\n let wrote = false;\n try {\n primary?.setItem(key, value);\n wrote = primary !== undefined;\n } catch (error) {\n recordFailure(health, mode === 'sessionStorage' ? 'sessionStorage' : 'localStorage', 'set', error);\n wrote = false;\n }\n if (useCookie) {\n const cookieWrote = setCookie(key, value);\n if (cookieWrote) health.cookieFallbackUsed = true;\n wrote = cookieWrote || wrote;\n }\n if (!wrote) {\n health.memoryFallbackUsed = true;\n return memory.setItem(key, value);\n }\n if (mode === 'localStorage+cookie') {\n memory.setItem(key, value);\n }\n return true;\n },\n removeItem(key) {\n try {\n primary?.removeItem(key);\n } catch (error) {\n recordFailure(health, mode === 'sessionStorage' ? 'sessionStorage' : 'localStorage', 'remove', error);\n // Ignore storage failures during cleanup.\n }\n if (useCookie) removeCookie(key);\n memory.removeItem(key);\n },\n getHealth() {\n return {\n ...health,\n failures: health.failures.map(failure => ({ ...failure }))\n };\n }\n };\n}\n","import { getBrowserWindow } from '../../core/environment';\nimport { createUuid, isUuid } from '../../core/uuid';\nimport type { DmdBrowserPersistence } from './persistence';\n\nconst SESSION_STORAGE_KEY = 'sessionData';\n\ninterface StoredSession {\n sessionId: string;\n timestamp: number;\n}\n\nfunction getUrlParam(name: string): string | null {\n const href = getBrowserWindow()?.location?.href;\n if (!href) return null;\n try {\n return new URL(href).searchParams.get(name);\n } catch {\n return null;\n }\n}\n\nfunction readStoredSession(persistence: DmdBrowserPersistence): StoredSession | undefined {\n const rawSession = persistence.getItem(SESSION_STORAGE_KEY);\n if (!rawSession) return undefined;\n\n try {\n const parsed = JSON.parse(rawSession) as Partial<StoredSession>;\n if (isUuid(parsed.sessionId) && typeof parsed.timestamp === 'number') {\n return {\n sessionId: parsed.sessionId,\n timestamp: parsed.timestamp\n };\n }\n } catch {\n persistence.removeItem(SESSION_STORAGE_KEY);\n }\n\n return undefined;\n}\n\nfunction writeStoredSession(persistence: DmdBrowserPersistence, sessionId: string, timestamp: number): void {\n persistence.setItem(SESSION_STORAGE_KEY, JSON.stringify({ sessionId, timestamp }));\n}\n\nexport interface DmdSessionManager {\n getSessionId(): string;\n reset(): string;\n}\n\nexport function createSessionManager(\n persistence: DmdBrowserPersistence,\n idleTimeoutSeconds = 30 * 60\n): DmdSessionManager {\n function resolveSessionId(): string {\n const now = Date.now();\n const urlSessionId = getUrlParam('sid') ?? getUrlParam('session_id');\n if (isUuid(urlSessionId)) {\n writeStoredSession(persistence, urlSessionId, now);\n return urlSessionId;\n }\n\n const storedSession = readStoredSession(persistence);\n if (storedSession && now - storedSession.timestamp <= idleTimeoutSeconds * 1000) {\n writeStoredSession(persistence, storedSession.sessionId, now);\n return storedSession.sessionId;\n }\n\n const sessionId = createUuid();\n writeStoredSession(persistence, sessionId, now);\n return sessionId;\n }\n\n return {\n getSessionId() {\n return resolveSessionId();\n },\n reset() {\n const sessionId = createUuid();\n writeStoredSession(persistence, sessionId, Date.now());\n return sessionId;\n }\n };\n}\n","import type { DmdDroppedEventDiagnostic, DmdDroppedEventReason, DmdDroppedEventType } from '../../core/diagnostics';\nimport type { DmdBrowserConfig, DmdConsentInput, DmdEventOptions, DmdHealthStatus } from '../../core/types';\nimport { createBackendCollectorPayload } from '../../core/backend-payload';\nimport { validateBackendCollectorPayload } from '../../core/backend-schema';\nimport { canCollectPurpose, mergeConsent, normalizeConsent, type DmdResolvedConsent } from '../../core/consent';\nimport { validateEventEnvelope } from '../../core/event-schema';\nimport { getBrowserWindow } from '../../core/environment';\nimport { sanitizeProperties } from '../../core/privacy';\nimport { ensureUuid } from '../../core/uuid';\nimport { captureAttributionFromUrl, mergeStoredAttribution } from './attribution';\nimport { installAutocapture, type DmdAutocaptureController } from './autocapture';\nimport type { DmdNormalizedBrowserConfig } from './browser-config';\nimport { createDeliveryManager, type DmdDeliveryManager } from './delivery';\nimport { resolveAnonymousId, resetAnonymousId } from './identity';\nimport { createBrowserPersistence, type DmdBrowserPersistence } from './persistence';\nimport { createSessionManager, type DmdSessionManager } from './session';\nimport type { DmdIdentityState } from './types';\n\ninterface DmdPreparedEvent {\n type: 'track' | 'page' | 'identify' | 'group' | 'alias';\n event: string;\n properties: Record<string, unknown>;\n messageId: string;\n timestamp: string;\n context: Record<string, unknown>;\n anonymousId: string;\n userId?: string;\n groupId?: string;\n clientId: string;\n workspaceId: string;\n appId: string;\n writeKey: string;\n consent: DmdResolvedConsent;\n sessionId: string;\n}\n\nfunction endpointFromConfig(config: DmdBrowserConfig): string {\n const host = config.apiHost ?? 'https://sdk.drivemetadata.com/v2';\n return `${host.replace(/\\/$/, '')}/data-collector`;\n}\n\nfunction requireConfigString(value: string | undefined, field: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`DMD SDK config ${field} is required`);\n }\n return value;\n}\n\nexport class DriveMetaDataSDK {\n public initialized = true;\n public queue: unknown[] = [];\n public offline = false;\n public gdprConsent: 'granted' | 'denied' | 'pending';\n\n private readonly endpoint: string;\n private readonly config: DmdNormalizedBrowserConfig;\n private readonly writeKey: string;\n private readonly delivery: DmdDeliveryManager;\n private readonly persistence: DmdBrowserPersistence;\n private readonly session: DmdSessionManager;\n private identity: DmdIdentityState;\n private consentState: DmdResolvedConsent;\n private droppedEvents = 0;\n private lastError: string | undefined;\n private lastDroppedEvent: DmdDroppedEventDiagnostic | undefined;\n private retryTimer: ReturnType<typeof setTimeout> | undefined;\n private retryDelayMs: number;\n private readonly initialRetryDelayMs: number;\n private readonly maxRetryDelayMs: number;\n private lifecycleCleanup: (() => void) | undefined;\n private autocaptureCleanup: (() => void) | undefined;\n\n constructor(config: DmdNormalizedBrowserConfig) {\n requireConfigString(config.clientId, 'clientId');\n requireConfigString(config.workspaceId, 'workspaceId');\n requireConfigString(config.appId, 'appId');\n requireConfigString(config.writeKey || config.token, 'writeKey or token');\n this.config = config;\n this.endpoint = endpointFromConfig(config);\n this.persistence = createBrowserPersistence(config.persistence);\n this.session = createSessionManager(this.persistence, config.sessionIdleTimeoutSeconds);\n const deliveryConfig: Parameters<typeof createDeliveryManager>[0] = {\n endpoint: this.endpoint,\n storage: this.persistence,\n };\n if (config.delivery?.maxQueueSize !== undefined) deliveryConfig.maxQueueSize = config.delivery.maxQueueSize;\n if (config.delivery?.queueTtlMs !== undefined) deliveryConfig.queueTtlMs = config.delivery.queueTtlMs;\n if (config.delivery?.retryDelayMs !== undefined) deliveryConfig.retryDelayMs = config.delivery.retryDelayMs;\n if (config.delivery?.maxRetryDelayMs !== undefined) deliveryConfig.maxRetryDelayMs = config.delivery.maxRetryDelayMs;\n if (config.delivery?.maxPayloadBytes !== undefined) deliveryConfig.maxPayloadBytes = config.delivery.maxPayloadBytes;\n if (config.delivery?.payloadSizePolicy !== undefined) deliveryConfig.payloadSizePolicy = config.delivery.payloadSizePolicy;\n if (config.delivery?.payloadTruncateStringLength !== undefined) {\n deliveryConfig.payloadTruncateStringLength = config.delivery.payloadTruncateStringLength;\n }\n if (config.delivery?.useBeacon !== undefined) deliveryConfig.useBeacon = config.delivery.useBeacon;\n if (config.delivery?.batchSize !== undefined) deliveryConfig.batchSize = config.delivery.batchSize;\n if (config.onDrop !== undefined) deliveryConfig.onDrop = config.onDrop;\n if (config.onError !== undefined) deliveryConfig.onError = config.onError;\n this.delivery = createDeliveryManager(deliveryConfig);\n this.initialRetryDelayMs = config.delivery?.retryDelayMs ?? 1_000;\n this.retryDelayMs = this.initialRetryDelayMs;\n this.maxRetryDelayMs = config.delivery?.maxRetryDelayMs ?? 30_000;\n this.writeKey = config.writeKey || config.token || '';\n this.identity = { anonymousId: resolveAnonymousId(this.persistence) };\n captureAttributionFromUrl(this.persistence);\n this.consentState = normalizeConsent(config.gdprConsent ?? config.consent);\n this.gdprConsent = this.consentState.analytics;\n this.installAutocapture();\n if (!config.delivery?.disableLifecycleFlush) {\n this.installLifecycleFlush();\n }\n }\n\n trackEvent(event: string, properties: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('track', event, properties, options);\n }\n\n page(name?: string, properties: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('page', 'page_view', { name, ...properties }, options);\n }\n\n trackPageview(): void {\n this.page();\n }\n\n identify(userId: string, traits: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.identity = { ...this.identity, userId, traits };\n this.sendPreparedEvent('identify', 'identify', { userId, traits }, options);\n }\n\n identifyUser(userId: string, traits: Record<string, unknown> = {}): void {\n this.identify(userId, traits);\n }\n\n group(groupId: string, traits: Record<string, unknown> = {}, options: DmdEventOptions = {}): void {\n this.identity = { ...this.identity, groupId };\n this.sendPreparedEvent('group', 'group', { groupId, traits }, options);\n }\n\n alias(previousId: string, userId: string, options: DmdEventOptions = {}): void {\n this.sendPreparedEvent('alias', 'alias', { previousId, userId }, options);\n }\n\n async flush(): Promise<void> {\n await this.delivery.flushQueue();\n const diagnostics = this.delivery.getDiagnostics();\n this.offline = diagnostics.queued > 0;\n this.lastError = diagnostics.lastError;\n if (diagnostics.queued > 0) {\n this.scheduleRetryFlush();\n } else {\n this.retryDelayMs = this.initialRetryDelayMs;\n }\n }\n\n reset(): void {\n this.identity = { anonymousId: resetAnonymousId(this.persistence) };\n this.session.reset();\n this.queue = [];\n this.offline = false;\n if (this.retryTimer !== undefined) {\n clearTimeout(this.retryTimer);\n this.retryTimer = undefined;\n }\n this.lifecycleCleanup?.();\n this.lifecycleCleanup = undefined;\n this.autocaptureCleanup?.();\n this.autocaptureCleanup = undefined;\n this.delivery.clearQueue('manual_clear');\n }\n\n disposeForTests(): void {\n if (this.retryTimer !== undefined) {\n clearTimeout(this.retryTimer);\n this.retryTimer = undefined;\n }\n this.lifecycleCleanup?.();\n this.lifecycleCleanup = undefined;\n this.autocaptureCleanup?.();\n this.autocaptureCleanup = undefined;\n }\n\n setConsent(consent: DmdConsentInput): void {\n this.consentState = typeof consent === 'object'\n ? mergeConsent(this.consentState, consent)\n : normalizeConsent(consent);\n this.gdprConsent = this.consentState.analytics;\n if (!canCollectPurpose(this.consentState, 'analytics')) {\n this.queue = [];\n this.delivery.clearQueue('consent_revoked');\n }\n }\n\n getHealth(): DmdHealthStatus {\n const deliveryDiagnostics = this.delivery.getDiagnostics();\n const health: DmdHealthStatus = {\n initialized: this.initialized,\n consent: this.gdprConsent,\n consentPurposes: this.consentState,\n persistence: this.persistence.getHealth(),\n queueSize: deliveryDiagnostics.queued,\n offline: this.offline || deliveryDiagnostics.queued > 0,\n droppedEvents: this.droppedEvents + deliveryDiagnostics.dropped.length,\n delivery: deliveryDiagnostics\n };\n const lastError = this.lastError ?? deliveryDiagnostics.lastError;\n if (lastError !== undefined) health.lastError = lastError;\n if (this.lastDroppedEvent !== undefined) health.lastDroppedEvent = this.lastDroppedEvent;\n return health;\n }\n\n sendEvent(payload: unknown): void {\n void this.delivery.send(payload as Record<string, unknown>).then(() => {\n const diagnostics = this.delivery.getDiagnostics();\n this.offline = diagnostics.queued > 0;\n if (diagnostics.lastError !== undefined) {\n this.lastError = diagnostics.lastError;\n }\n if (diagnostics.queued > 0) {\n this.scheduleRetryFlush();\n }\n });\n }\n\n private installLifecycleFlush(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow) return;\n if (typeof browserWindow.addEventListener !== 'function') return;\n if (typeof browserWindow.removeEventListener !== 'function') return;\n\n const flushOnLifecycle = () => {\n void this.flush();\n };\n const flushOnVisibility = () => {\n if (browserWindow.document?.visibilityState === 'hidden') {\n void this.flush();\n }\n };\n\n browserWindow.addEventListener('online', flushOnLifecycle);\n browserWindow.addEventListener('pagehide', flushOnLifecycle);\n if (typeof browserWindow.document?.addEventListener === 'function') {\n browserWindow.document.addEventListener('visibilitychange', flushOnVisibility);\n }\n\n this.lifecycleCleanup = () => {\n browserWindow.removeEventListener('online', flushOnLifecycle);\n browserWindow.removeEventListener('pagehide', flushOnLifecycle);\n if (typeof browserWindow.document?.removeEventListener === 'function') {\n browserWindow.document.removeEventListener('visibilitychange', flushOnVisibility);\n }\n };\n }\n\n private installAutocapture(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow) return;\n if (this.config.autocapture === false) return;\n\n const capturePageview = this.config.capturePageview !== false;\n const capturePageleave = this.config.capturePageleave !== false;\n const controller: DmdAutocaptureController = installAutocapture({\n browserWindow,\n capturePageview,\n capturePageleave,\n onPageView: () => {\n this.page();\n },\n onPageLeave: () => {\n this.trackEvent('page_leave', { url: browserWindow.location.href });\n },\n onRouteChange: () => {\n captureAttributionFromUrl(this.persistence);\n }\n });\n this.autocaptureCleanup = controller.cleanup;\n }\n\n private scheduleRetryFlush(): void {\n if (this.retryTimer !== undefined) return;\n\n const delay = Math.min(this.retryDelayMs, this.maxRetryDelayMs);\n this.retryTimer = setTimeout(() => {\n this.retryTimer = undefined;\n void this.flush().then(() => {\n if (this.delivery.getDiagnostics().queued > 0) {\n this.retryDelayMs = Math.min(this.retryDelayMs * 2, this.maxRetryDelayMs);\n this.scheduleRetryFlush();\n }\n });\n }, delay);\n }\n\n private sendPreparedEvent(\n type: DmdPreparedEvent['type'],\n event: string,\n properties: Record<string, unknown>,\n options: DmdEventOptions\n ): void {\n void this.prepareAndSendEvent(type, event, properties, options);\n }\n\n private async prepareAndSendEvent(\n type: DmdPreparedEvent['type'],\n event: string,\n properties: Record<string, unknown>,\n options: DmdEventOptions\n ): Promise<void> {\n if (!canCollectPurpose(this.consentState, 'analytics')) {\n this.recordDrop(type, 'consent_denied', event);\n return;\n }\n\n let prepared: DmdPreparedEvent = {\n type,\n event,\n properties: sanitizeProperties(properties),\n messageId: ensureUuid(options.messageId),\n timestamp: options.timestamp ?? new Date().toISOString(),\n context: options.context ?? {},\n anonymousId: this.identity.anonymousId,\n clientId: this.config.clientId,\n workspaceId: this.config.workspaceId,\n appId: this.config.appId,\n writeKey: this.writeKey,\n consent: this.consentState,\n sessionId: this.session.getSessionId()\n };\n\n if (this.identity.userId !== undefined) prepared.userId = this.identity.userId;\n if (this.identity.groupId !== undefined) prepared.groupId = this.identity.groupId;\n\n if (this.config.beforeSend !== undefined) {\n const beforeSendResult = await this.config.beforeSend(prepared);\n if (beforeSendResult === null) {\n this.recordDrop(type, 'before_send_dropped', event);\n return;\n }\n prepared = {\n ...prepared,\n ...beforeSendResult,\n properties: sanitizeProperties(beforeSendResult.properties ?? prepared.properties)\n };\n }\n\n const validation = validateEventEnvelope(prepared, { mode: this.config.schemaValidation ?? 'warn' });\n if (!validation.ok && this.config.schemaValidation === 'strict') {\n this.recordDrop(type, 'invalid_payload', event);\n return;\n }\n if (!validation.ok) {\n this.lastError = `DMD SDK schema warning: ${validation.errors.join(', ')}`;\n }\n\n const collectorPayload = this.toCollectorPayload(prepared);\n const backendValidation = validateBackendCollectorPayload(collectorPayload);\n if (!backendValidation.ok && this.config.schemaValidation === 'strict') {\n this.lastError = `DMD SDK backend schema warning: ${backendValidation.errors.join(', ')}`;\n this.recordDrop(type, 'invalid_payload', event);\n return;\n }\n if (!backendValidation.ok) {\n this.lastError = `DMD SDK backend schema warning: ${backendValidation.errors.join(', ')}`;\n }\n\n this.sendEvent(collectorPayload);\n }\n\n private toCollectorPayload(prepared: DmdPreparedEvent): Record<string, unknown> {\n const browserWindow = getBrowserWindow();\n return createBackendCollectorPayload({\n requestId: prepared.messageId,\n timestamp: prepared.timestamp,\n eventType: prepared.event,\n clientId: prepared.clientId,\n workspaceId: prepared.workspaceId,\n token: prepared.writeKey,\n anonymousId: prepared.anonymousId,\n sessionId: prepared.sessionId,\n ua: browserWindow?.navigator?.userAgent,\n appId: prepared.appId,\n pageUrl: browserWindow?.location?.href,\n eventData: mergeStoredAttribution({\n ...prepared.properties,\n anonymousId: prepared.anonymousId,\n sessionId: prepared.sessionId,\n timestamp: prepared.timestamp,\n requestSentAt: prepared.timestamp,\n requestReceivedAt: prepared.timestamp\n }, this.persistence)\n });\n }\n\n private recordDrop(type: DmdDroppedEventType, reason: DmdDroppedEventReason, event?: string): void {\n this.droppedEvents += 1;\n this.lastDroppedEvent = {\n type,\n reason,\n timestamp: new Date().toISOString()\n };\n if (event !== undefined) this.lastDroppedEvent.event = event;\n this.lastError = `DMD SDK ${type} dropped because ${reason}`;\n }\n}\n","import type { DmdDroppedEventDiagnostic, DmdDroppedEventType } from '../core/diagnostics';\nimport type {\n DmdBrowserClient,\n DmdBrowserConfig,\n DmdConsentInput,\n DmdEventOptions,\n DmdHealthStatus\n} from '../core/types';\nimport { normalizeBrowserConfig } from './core/browser-config';\nimport { DriveMetaDataSDK } from './core/DriveMetaDataSDK';\n\nlet singleton: DriveMetaDataSDK | undefined;\nlet publicSingleton: DmdBrowserClient | undefined;\nlet droppedEvents = 0;\nlet lastError: string | undefined;\nlet lastDroppedEvent: DmdDroppedEventDiagnostic | undefined;\n\nfunction createPublicClient(instance: DriveMetaDataSDK): DmdBrowserClient {\n return {\n track(event, properties, options) {\n instance.trackEvent(event, properties, options);\n },\n identify(userId, traits, options) {\n instance.identify(userId, traits, options);\n },\n page(name, properties, options) {\n instance.page(name, properties, options);\n },\n group(groupId, traits, options) {\n instance.group(groupId, traits, options);\n },\n alias(previousId, userId, options) {\n instance.alias(previousId, userId, options);\n },\n async flush() {\n await instance.flush();\n },\n reset() {\n instance.reset();\n singleton = undefined;\n publicSingleton = undefined;\n },\n setConsent(consent) {\n instance.setConsent(consent);\n },\n getHealth() {\n return instance.getHealth();\n }\n };\n}\n\nfunction setSingleton(instance: DriveMetaDataSDK): DmdBrowserClient {\n singleton = instance;\n publicSingleton = createPublicClient(instance);\n return publicSingleton;\n}\n\nfunction recordDroppedEvent(type: DmdDroppedEventType, event?: string): void {\n droppedEvents += 1;\n lastDroppedEvent = {\n type,\n reason: 'not_initialized',\n timestamp: new Date().toISOString()\n };\n if (event !== undefined) {\n lastDroppedEvent.event = event;\n }\n lastError = `DMD SDK ${type} called before initialization`;\n}\n\nexport function initDmdSDK(config: DmdBrowserConfig): DmdBrowserClient {\n if (publicSingleton) {\n return publicSingleton;\n }\n\n try {\n const instance = new DriveMetaDataSDK(normalizeBrowserConfig(config));\n return setSingleton(instance);\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n}\n\nexport function getDmdSDK(): DmdBrowserClient | undefined {\n return publicSingleton;\n}\n\nexport function track(event: string, properties?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('track', event);\n return;\n }\n sdk.track(event, properties, options);\n}\n\nexport function identify(userId: string, traits?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('identify');\n return;\n }\n sdk.identify(userId, traits, options);\n}\n\nexport function page(name?: string, properties?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('page');\n return;\n }\n sdk.page(name, properties, options);\n}\n\nexport function group(groupId: string, traits?: Record<string, unknown>, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('group');\n return;\n }\n sdk.group(groupId, traits, options);\n}\n\nexport function alias(previousId: string, userId: string, options?: DmdEventOptions): void {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('alias');\n return;\n }\n sdk.alias(previousId, userId, options);\n}\n\nexport async function flush(): Promise<void> {\n const sdk = getDmdSDK();\n if (!sdk) {\n recordDroppedEvent('flush');\n return;\n }\n await sdk.flush();\n}\n\nexport function reset(): void {\n singleton?.reset?.();\n singleton = undefined;\n publicSingleton = undefined;\n}\n\nexport function setConsent(consent: DmdConsentInput): void {\n getDmdSDK()?.setConsent(consent);\n}\n\nexport const consent = {\n update(state: DmdConsentInput): void {\n setConsent(state);\n }\n};\n\nexport async function ready(): Promise<DmdBrowserClient | undefined> {\n return getDmdSDK();\n}\n\nexport function getDmdHealth(): DmdHealthStatus {\n if (singleton) {\n return singleton.getHealth();\n }\n\n const health: DmdHealthStatus = {\n initialized: false,\n consent: 'pending',\n queueSize: 0,\n offline: false,\n droppedEvents\n };\n\n if (lastError !== undefined) {\n health.lastError = lastError;\n }\n if (lastDroppedEvent !== undefined) {\n health.lastDroppedEvent = lastDroppedEvent;\n }\n\n return health;\n}\n\nexport function resetDmdSDKForTests(): void {\n singleton?.disposeForTests();\n singleton = undefined;\n publicSingleton = undefined;\n droppedEvents = 0;\n lastError = undefined;\n lastDroppedEvent = undefined;\n}\n","import { InjectionToken } from '@angular/core';\nimport type { DmdBrowserConfig } from '../core/types';\n\nexport const DMD_BROWSER_CONFIG = new InjectionToken<DmdBrowserConfig>('DMD_BROWSER_CONFIG');\n","import type { EnvironmentProviders } from '@angular/core';\nimport { makeEnvironmentProviders } from '@angular/core';\nimport type { DmdBrowserConfig } from '../core/types';\nimport { DMD_BROWSER_CONFIG } from './tokens';\n\nexport function provideDmdAnalytics(config: DmdBrowserConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: DMD_BROWSER_CONFIG,\n useValue: config\n }\n ]);\n}\n"],"mappings":"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","names":["page","getCookie","getUrlParam","lastError"]}
|